EAS支持使用通用公网对服务进行公网地址调用,通用公网调用又包括使用官方的Python SDK、Java SDK及自行实现调用逻辑三种方式。本文介绍详细介绍每种调用方式的实现方法。
通用公网调用
在PAI-EAS部署模型服务后,系统会自动生成一个公网调用的服务地址。您可以在模型在线服务(EAS)页面,单击待调用服务服务方式列下的调用信息,查看公网访问地址调用文档链接和Token。通过该调用信息可以进行调用测试,示例如下。
$ curl http://166408185518****.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}]'
您可以将http替换成https,进行更安全的加密传输。
调用测试成功后,即可调用服务。为方便您调用服务,PAI-EAS提供了以下三种通用公网调用方式:
PAI-EAS封装了调用逻辑并提供了Python官方SDK。
PAI-EAS封装了调用逻辑并提供了Java官方SDK。
推荐使用以上两种官方SDK调用服务,从而有效减少编写调用逻辑的时间并提高调用稳定性。如果您需要使用其他语言或自己编写实现调用逻辑,下文也提供了调用Demo供您参考。此外,自行实现调用逻辑需要根据不同框架构建服务请求,详情请参见构建通用Processor服务请求。
使用官方SDK调用(Python)
安装。
pip install -U eas-prediction --user
该Python SDK的调用详情请参见GitHub官网。
编写调用程序。
以字符串作为输入输出的程序为例,其他格式(TensorFlow或PyTorch等)的输入输出程序示例请参见GitHub官网。
#!/usr/bin/env python from eas_prediction import PredictClient from eas_prediction import StringRequest if __name__ == '__main__': #下面的client = PredictClient()入参源于公网调用的访问地址。 client = PredictClient('http://166408185518****.cn-hangzhou.pai-eas.aliyuncs.com','heart_predict_online') #Token可以在公网地址调用信息中获取,详情请参见通用公网调用部分。 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()
的函数入参源于公网调用的访问地址。例如公网调用的访问地址为http://166408185518****.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/heart_predict_online,则PredictClient()
函数的调用格式为client = PredictClient('http://166408185518****.cn-hangzhou.pai-eas.aliyuncs.com','heart_predict_online')
。执行调用程序。
$ 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客户端代码需要使用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官网。
编写调用程序。
以字符串作为输入输出的程序为例,其他格式(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可以在公网地址调用信息中获取,详情请参见通用公网调用部分。 client.setToken("ZGI1YWYxNmQwYjMzMDM1YTNlMmFmNmEzYjIzZTVlZGQ0NDJhYTRm****"); //下面的Endpoint信息源于公网调用的访问地址。 client.setEndpoint("166408185518****.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()
的函数入参源于公网调用的访问地址。例如公网调用的访问地址为http://166408185518****.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/heart_predict_online,则client.setEndpoint()
函数的调用格式为client.setEndpoint("166408185518****.cn-hangzhou.pai-eas.aliyuncs.com")
,client.setModelName()
函数的调用格式为client.setModelName("heart_predict_online")
。执行调用程序。
执行调用逻辑程序可以获得如下结果。
[{"p_0":0.9941226679708888,"p_1":0.005877332029111252}]
自行实现调用逻辑
PAI-EAS支持使用Python、Java或其他语言自行实现调用逻辑,您需要根据不同框架构建服务请求,详情请参见构建通用Processor服务请求。编写调用逻辑的示例如下。
import requests
#URL信息可以在公网地址调用信息中获取,详情请参见通用公网调用部分。
url = 'http://166408185518****.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/heart_predict_online'
#header信息(Token)可以在公网地址调用信息中获取,详情请参见通用公网调用部分。
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)