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)