EAS支援通過Python官方SDK或自行實現調用邏輯的方式對服務進行VPC高速直連調用。本文詳細介紹這兩種調用方式的實現方法。
調用原理
VPC高速直連調用、公網調用及VPC地址調用的鏈路如下圖所示。
開啟服務運行所在資源群組的VPC高速直連功能後,EAS會在您指定的安全性群組內綁定輔助網卡,打通您的VPC和EAS服務執行個體之間的網路。之後您可以在自己的VPC中直接存取EAS執行個體,無需通過網關訪問服務,避免了四層SLB和七層網路轉寄。同時,EAS預置的RPC實現了HTTP相關協議棧,對於高QPS(Queries Per Second)的大Cellular Data Package(例如映像服務),可以大幅度提高訪問效能、降低訪問延時。
前提條件
如果您使用專屬資源群組部署服務,則部署服務前,需要為專屬資源群組開通VPC高速直連功能,詳情請參見配置網路連通。
安全性群組控制ECS執行個體機器的出入流量,使用者的ECS執行個體和EAS服務執行個體之間的網路互連也受安全性群組的配置控制。預設普通安全性群組內,執行個體之間是內網互連的,您可以在配置VPC高速直連時,選擇需要訪問線上服務的ECS執行個體所在安全性群組,從而支援執行個體之間網路互連。當需要配置使用不同的安全性群組時,請設定安全性群組的規則支援ECS執行個體之間能夠互連。
調用方式
為方便使用者調用服務,EAS提供了以下兩種方式實現VPC高速直連調用:
EAS封裝了調用邏輯並提供了Python SDK、Java SDK和Golang SDK的調用方法,您可以直接使用SDK實現VPC高速直連調用。
推薦使用官方SDK調用服務,從而有效減少編寫調用邏輯的時間並提高服務調用穩定性。如果您需要使用其他語言或希望自己編寫實現調用邏輯,下文也提供了方法指導供您參考。此外,自行實現調用邏輯需要根據不同架構構建服務要求,詳情請參見構建通用Processor服務要求。
使用官方SDK調用
Python SDK調用
使用Python官方SDK調用服務的方法如下:
安裝。
pip install -U eas-prediction --user
該Python SDK的調用詳情請參見Python SDK使用說明。
編寫調用程式。
以字串作為輸入輸出的程式樣本如下,其他格式(TensorFlow或PyTorch等)的輸入輸出的程式樣本請參見Python SDK使用說明。
#!/usr/bin/env python from eas_prediction import PredictClient from eas_prediction import StringRequest from eas_prediction import TFRequest from eas_prediction import ENDPOINT_TYPE_DIRECT if __name__ == '__main__': client = PredictClient('http://pai-eas-vpc.cn-shanghai.aliyuncs.com', 'mnist_saved_model_example') # 替換為服務Token。您可以單擊目標服務的服務方式列下的調用資訊來查看Token資訊。 client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****') client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # 表示通過直連通道訪問服務。 client.init() # request = StringRequest('[{}]') req = TFRequest('predict_images') req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784) for x in range(0, 1000000): resp = client.predict(req) print(resp)
其中
client = PredictClient()
的函數入參分別為高速直連Endpoint地址(endpoint參數),服務的名稱(service_name參數)。高速直連Endpoint地址和地區綁定的,他的格式是pai-eas-vpc.{RegionId}.aliyuncs.com
,例如華東2(上海)地區的高速直連Endpoint地址為pai-eas-vpc.cn-shanghai.aliyuncs.com
。
Java SDK調用
使用Java官方SDK調用服務的方法如下:
添加依賴項,EAS SDK的最新版本以Maven倉庫中顯示的為準。
<dependency> <groupId>com.aliyun.openservices.eas</groupId> <artifactId>eas-sdk</artifactId> <version>2.0.13</version> </dependency>
該Java SDK的調用詳情請參見Java SDK使用說明。
編寫調用程式。
import com.aliyun.openservices.eas.predict.http.PredictClient; import com.aliyun.openservices.eas.predict.http.HttpConfig; public class TestString { public static void main(String[] args) throws Exception { // 為了確保client對象被正確共用,應當在啟動時建立並初始化client對象,而不是在每個請求中都建立一個新的client對象。 PredictClient client = new PredictClient(new HttpConfig()); // 替換為服務Token。您可以單擊目標服務的服務方式列下的調用資訊來查看Token資訊。 client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****"); // 直連訪問時請使用setDirectEndpoint方法,設定pai-eas-vpc.{region_id}.aliyuncs.com的網域名稱進行訪問,例如華東2(上海)為cn-shanghai。 client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com"); // 替換為服務名稱。 client.setModelName("scorecard_pmml_example"); // 定義輸入字串。 String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]"; System.out.println(request); // 通過EAS返回字串。 try { String response = client.predict(request); System.out.println(response); } catch (Exception e) { e.printStackTrace(); } // 關閉用戶端。 client.shutdown(); return; } }
Golang SDK調用
使用Golang SDK進行服務調用時,由於在編譯代碼時,Golang的包管理工具會自動從Github上將Golang SDK的代碼下載到本地,因此您無需提前安裝Golang SDK。該Golang SDK的調用詳情請參見Golang SDK使用說明。
使用Golang官方SDK調用服務的方法如下:
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
// 設定pai-eas-vpc.{region_id}.aliyuncs.com的網域名稱進行訪問,例如華東2(上海)為cn-shanghai。請替換為目標服務所在地區和服務名稱。
client := eas.NewPredictClient("pai-eas-vpc.cn-shanghai.aliyuncs.com", "scorecard_pmml_example")
// 替換為服務Token。您可以單擊目標服務的服務方式列下的調用資訊來查看Token資訊。
client.SetToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****")
client.SetEndpointType(eas.EndpointTypeDirect)
client.Init()
req := "[{\"fea1\": 1, \"fea2\": 2}]"
for i := 0; i < 100; i++ {
resp, err := client.StringPredict(req)
if err != nil {
fmt.Printf("failed to predict: %v\n", err.Error())
} else {
fmt.Printf("%v\n", resp)
}
}
}
自行實現調用邏輯
推薦您使用PAI提供的官方SDK來進行直連訪問,如果您有特殊業務情境的需求,需要使用其他語言或希望自己編寫調用邏輯,則可以參見如下方法,自行實現直連訪問功能,採用HTTP介面調用。EAS提供服務發現機制,在VPC環境中,通過如下地址即可獲得服務的後端地址清單。
地區 | 地址 |
華東2(上海) | http://pai-eas-vpc.cn-shanghai.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
華北2(北京) | http://pai-eas-vpc.cn-beijing.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
華東1(杭州) | http://pai-eas-vpc.cn-hangzhou.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
例如訪問華東1(杭州)的mnist_saved_model_example服務(該服務有兩個Instance),樣本如下。
$curl http://pai-eas-vpc.cn-hangzhou.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example
獲得的服務後端地址清單如下。
{
"correlative": [
"mnist_saved_model_example"
],
"endpoints": {
"items": [
{
"app": "mnist-saved-model-example",
"ip": "172.16.XX.XX",
"port": 50000,
"weight": 100
},
{
"app": "mnist-saved-model-example",
"ip": "172.16.XX.XX",
"port": 50000,
"weight": 100
}
]
}
}
如上所示,通過服務發現可以獲得客戶模型服務mnist_saved_model_example的兩個執行個體的ip、port及weight資訊。相關的IP在使用者部署服務時選擇的VPC中即可直接連通。
對於通過服務發現來進行直連訪問的方法請參考如下步驟:
用戶端代碼中建立後台線程,定時訪問上述的服務探索服務,建議每5秒訪問一次,擷取當前服務最新的執行個體列表,並將其儲存在本機快取中。
在發起推理請求時,從本機快取中擷取一個執行個體IP+連接埠發起訪問,可使用Weighted Round Robin演算法進行擷取,也可根據自己的商務邏輯來進行選擇。
發起請求時,如遇串連失敗等情況,則表示服務執行個體可能發生異常(如使用者執行個體發生crash等),用戶端需要進行重試,重新從緩衝中擷取一個新的執行個體,在本機快取中執行個體數多於1的情況下,新IP+Port組合應該避免與已經失敗的IP+Port相同,即確保更換一個執行個體進行重試。
在使用服務發現進行直連訪問時,請遵循下面幾條原則,否則可能導致服務訪問異常:
服務探索服務是一個旁路的服務,不可在每次發起請求時對服務探索服務進行請求。
訪問服務探索服務時,在返回狀態代碼為200且返回執行個體數不為空白時,再更新緩衝,返回非200時,千萬不能清空緩衝。
直連的方式負載平衡和重試邏輯都需要在用戶端側完成,穩定性依賴用戶端實現,平台側不負責直連情境的用戶端請求容錯,在實現時請嚴格遵循上述的步驟來實現容錯邏輯,否則平台側無法保障SLA。
完整的實現流程,請參見Python SDK的實現。
相關文檔
更多的服務調用方式,請參見調用方式概覽。