PAI-EAS支持通过Python官方SDK、Java官方SDK或自行实现调用逻辑的方式对服务进行VPC地址调用。本文详细介绍每种调用方式的实现方法。

优势

  • 避免了公网调用中的网络性能开销,可以提升调用速度。
  • 内网传输可以节省流量费用。

使用限制

  • 调用服务的服务器必须与部署的模型服务位于同一地域。例如,如果服务部署在华东2(上海),则只能从华东2(上海)的ECS服务器发送调用请求。
  • PAI-DSW关于MaxCompute的服务,无法使用VPC地址调用。

调用方式

在PAI-EAS部署模型服务后,系统会自动生成一个VPC调用的服务地址。您可以在PAI EAS模型在线服务页面,单击待调用服务服务方式列下的调用信息,查看VPC地址调用的访问地址Token。通过该调用信息可以进行调用测试,示例如下。
$ curl http://http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/heart_predict_online -H 'Authorization: ZGI1YWYxNmQwYjMzMDM1YTNlMmFmNmEzYjIzZTVlZGQ0NDJhYTRm****' -d '[{"sex":0,"cp":0,"fbs":0,"restecg":0,"exang":0,"slop":0,"thal":0,"age":0,"trestbps":0,"chol":0,"thalach":0,"oldpeak":0,"ca":0}]'
调用测试成功后,即可调用服务。为方便用户调用服务,PAI-EAS提供了以下三种调用方式:

使用官方SDK调用(Python)

使用Python官方SDK调用服务的方法如下:
  1. 安装。
    pip install -U eas-prediction --user
    该Python SDK调用详情请参见GitHub官网
  2. 编写调用程序。
    以字符串作为输入输出的程序为例,其他格式(TensorFlow或PyTorch等)的输入输出程序示例请参见GitHub官网
    #!/usr/bin/env python
    from eas_prediction import PredictClient
    from eas_prediction import StringRequest
    if __name__ == '__main__':
        #下面的client = PredictClient()入参源于VPC地址调用的访问地址。
        client = PredictClient('http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com','heart_predict_online')
        #Token可以在VPC地址调用信息中获取,详情请参见调用方式部分。
        client.set_token('ZGI1YWYxNmQwYjMzMDM1YTNlMmFmNmEzYjIzZTVlZGQ0NDJhYTRm****')    
        client.init()
        #输入请求需要根据模型进行构造,此处仅以字符串作为输入输出的程序为例。
        request = StringRequest('[{"sex":0,"cp":0,"fbs":0,"restecg":0,"exang":0,"slop":0,"thal":0,"age":0,"trestbps":0,"chol":0,"thalach":0,"oldpeak":0,"ca":0}]')    
        for x in range(0, 1):
            resp = client.predict(request)
            print(resp)
    其中client = PredictClient()的函数入参源于VPC调用的访问地址。例如VPC调用的访问地址为http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/heart_predict_online,则 PredictClient()函数的调用格式为client = PredictClient('http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com','heart_predict_online')
  3. 执行调用程序。
    $ python heart_predict.py
    其中heart_predict.py为Python程序的文件名,需要根据实际情况修改。获得的预测结果如下。
    IT-C02YJ0V8JHD2:Desktop wowei$ python heart_predict.py
    [{"p_0":0.9941226679708888,"p_1":0.005877332029111252}]

使用官方SDK调用(Java)

使用Java官方SDK调用服务的方法如下:
  1. 添加依赖包。
    因为编写Java客户端代码需要使用Maven管理项目,所以需要在pom.xml文件中添加客户端依赖包eas-sdk。最新Release版本为2.0.1,代码示例如下。
    <dependency>
      <groupId>com.aliyun.openservices.eas</groupId>
      <artifactId>eas-sdk</artifactId>
      <version>2.0.1</version>
    </dependency>
    该Java SDK调用详情请参见GitHub官网
  2. 编写调用程序。
    以字符串作为输入输出的程序为例,其他格式(TensorFlow或PyTorch等)的输入输出程序示例请参见GitHub官网
    import com.aliyun.openservices.eas.predict.http.PredictClient;
    import com.aliyun.openservices.eas.predict.http.HttpConfig;
    public class Test_String {
        public static void main(String[] args) throws Exception{
            //启动并初始化客户端。
            PredictClient client = new PredictClient(new HttpConfig());
            //Token可以在VPC地址调用信息中获取,详情请参见调用方式部分。
            client.setToken("ZGI1YWYxNmQwYjMzMDM1YTNlMmFmNmEzYjIzZTVlZGQ0NDJhYTRm****");
            //下面的Endpoint信息源于VPC调用的访问地址。
            client.setEndpoint("http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com");
            //配置服务名称。
            client.setModelName("heart_predict_online");
            //定义输入字符串。输入请求需要根据模型进行构造,此处仅以字符串作为输入输出的程序为例。
            String request = "[{\"sex\":0,\"cp\":0,\"fbs\":0,\"restecg\":0,\"exang\":0,\"slop\":0,\"thal\":0,\"age\":0,\"trestbps\":0,\"chol\":0,\"thalach\":0,\"oldpeak\":0,\"ca\":0}]";
            System.out.println(request);
            //通过PAI-EAS返回字符串。 
            try {
                String response = client.predict(request);
                System.out.println(response);
            } catch(Exception e) {
                e.printStackTrace();
            }
            //关闭客户端。
            client.shutdown();
            return;
        }
    }
    其中 client.setEndpoint()client.setModelName()的函数入参源于VPC调用的访问地址。例如VPC调用的访问地址为http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/heart_predict_online,则 client.setEndpoint()函数的调用格式为client.setEndpoint("http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com")client.setModelName()函数的调用格式为client.setModelName("heart_predict_online")
  3. 执行调用程序。
    执行调用逻辑程序可以获得如下结果。
    [{"p_0":0.9941226679708888,"p_1":0.005877332029111252}]

自行实现调用逻辑

PAI-EAS支持使用Python、Java或其他语言自行实现调用逻辑,您需要根据不同框架构建服务请求,详情请参见构建通用Processor服务请求。自行实现调用逻辑的示例如下,采用HTTP接口调用。
import requests
#URL信息可以在VPC地址调用信息中获取,详情请参见调用方式部分。
url = 'http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/heart_predict_online'
#header信息(Token)可以在VPC地址调用信息中获取,详情请参见调用方式部分。
headers = {"Authorization": 'ZGI1YWYxNmQwYjMzMDM1YTNlMmFmNmEzYjIzZTVlZGQ0NDJhYTRm****'}
#根据具体模型要求的数据格式构造服务请求,此处仅以字符串作为输入输出的程序为例。
data = '[{"sex":0,"cp":0,"fbs":0,"restecg":0,"exang":0,"slop":0,"thal":0,"age":0,"trestbps":0,"chol":0,"thalach":0,"oldpeak":0,"ca":0}]'
resp = requests.post(url, data=data, headers=headers)
print resp
print resp.content