全部產品
Search
文件中心

Platform For AI:VPC高速直連調用

更新時間:Aug 28, 2024

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高速直連調用:

  • 使用官方SDK調用

    EAS封裝了調用邏輯並提供了Python SDK、Java SDK和Golang SDK的調用方法,您可以直接使用SDK實現VPC高速直連調用。

  • 自行實現調用邏輯

    推薦使用官方SDK調用服務,從而有效減少編寫調用邏輯的時間並提高服務調用穩定性。如果您需要使用其他語言或希望自己編寫實現調用邏輯,下文也提供了方法指導供您參考。此外,自行實現調用邏輯需要根據不同架構構建服務要求,詳情請參見構建通用Processor服務要求

使用官方SDK調用

Python SDK調用

使用Python官方SDK調用服務的方法如下:

  1. 安裝。

    pip install -U eas-prediction --user

    該Python SDK的調用詳情請參見Python SDK使用說明

  2. 編寫調用程式。

    以字串作為輸入輸出的程式樣本如下,其他格式(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調用服務的方法如下:

  1. 添加依賴項,EAS SDK的最新版本以Maven倉庫中顯示的為準。

    <dependency>
      <groupId>com.aliyun.openservices.eas</groupId>
      <artifactId>eas-sdk</artifactId>
      <version>2.0.13</version>
    </dependency>

    該Java SDK的調用詳情請參見Java SDK使用說明

  2. 編寫調用程式。

    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的兩個執行個體的ipportweight資訊。相關的IP在使用者部署服務時選擇的VPC中即可直接連通。

對於通過服務發現來進行直連訪問的方法請參考如下步驟:

  1. 用戶端代碼中建立後台線程,定時訪問上述的服務探索服務,建議每5秒訪問一次,擷取當前服務最新的執行個體列表,並將其儲存在本機快取中。

  2. 在發起推理請求時,從本機快取中擷取一個執行個體IP+連接埠發起訪問,可使用Weighted Round Robin演算法進行擷取,也可根據自己的商務邏輯來進行選擇。

  3. 發起請求時,如遇串連失敗等情況,則表示服務執行個體可能發生異常(如使用者執行個體發生crash等),用戶端需要進行重試,重新從緩衝中擷取一個新的執行個體,在本機快取中執行個體數多於1的情況下,新IP+Port組合應該避免與已經失敗的IP+Port相同,即確保更換一個執行個體進行重試。

重要

在使用服務發現進行直連訪問時,請遵循下面幾條原則,否則可能導致服務訪問異常:

  1. 服務探索服務是一個旁路的服務,不可在每次發起請求時對服務探索服務進行請求。

  2. 訪問服務探索服務時,在返回狀態代碼為200且返回執行個體數不為空白時,再更新緩衝,返回非200時,千萬不能清空緩衝。

  3. 直連的方式負載平衡和重試邏輯都需要在用戶端側完成,穩定性依賴用戶端實現,平台側不負責直連情境的用戶端請求容錯,在實現時請嚴格遵循上述的步驟來實現容錯邏輯,否則平台側無法保障SLA。

完整的實現流程,請參見Python SDK的實現

相關文檔

更多的服務調用方式,請參見調用方式概覽