Platform for AI (PAI) のElastic Algorithm Service (EAS) を使用すると、公式SDKを使用するか、カスタムコールロジックを実装することにより、仮想プライベートクラウド (VPC) への直接接続を介してサービスを呼び出すことができます。 このトピックでは、VPC直接接続を介してサービスにアクセスするために使用できる2つの方法について説明します。
VPCダイレクト接続
次の図は、VPC直接接続、パブリックエンドポイント、およびVPCエンドポイントを介してサービスが呼び出される方法を示しています。
EASサービスがデプロイされているリソースグループに対してVPC直接接続を有効にすると、EASは指定したセキュリティグループにセカンダリelastic network interface (ENI) を自動的に関連付けます。 これにより、VPCとEASサービスインスタンス間のネットワーク接続を確立できます。 その後、ゲートウェイを経由せずにVPCからEASサービスに直接アクセスできるため、レイヤー4およびレイヤー7の負荷分散が不要になります。 EASの組み込みリモートプロシージャコール (RPC) テクノロジは、HTTPプロトコルスタックをサポートします。 これにより、イメージサービスなど、1秒あたりのクエリ数 (QPS) が高いサービスにアクセスする場合のレイテンシが大幅に削減されます。
前提条件
サービスをデプロイする専用リソースグループに対して、VPC直接接続機能が有効になっています。 詳細については、「ネットワーク接続の設定」をご参照ください。
セキュリティグループは、Elastic Compute Service (ECS) インスタンスのインバウンドトラフィックとアウトバウンドトラフィック、およびECSインスタンスとEASサービスインスタンス間のネットワーク通信を制御します。 基本セキュリティグループ内のインスタンスは、デフォルトで内部ネットワークを介して相互に通信します。 ECSインスタンスがEASサービスにアクセスできるようにするには、サービスのVPC直接接続機能を設定するときに、ECSインスタンスがデプロイされているセキュリティグループを選択します。 ECSインスタンスとEASサービスインスタンスが同じセキュリティグループにデプロイされていない場合は、セキュリティグループルールを設定してインスタンス間の接続を確立します。
メソッドの呼び出し
EASは、VPC直接接続を介してサービスを呼び出すための次のメソッドを提供します。
EASは呼び出しロジックをカプセル化し、Python、Java、Goの公式SDKを提供します。 公式SDKを使用して、VPC直接接続を介してサービスを呼び出すことができます。
最も効率的で安定した方法である公式SDKを使用してサービスを呼び出すことを推奨します。 他の言語またはカスタム呼び出しロジックを使用する場合は、このトピックの「カスタム呼び出しロジックの使用」セクションの手順を実行します。 カスタム呼び出しロジックを実装するには、特定のフレームワークに基づいてサービスリクエストを作成する必要があります。 詳細については、「TensorFlowサービスのリクエストの構築」をご参照ください。
公式SDKの使用
SDK for Python
公式SDK for Pythonを使用してサービスを呼び出すには、次の手順を実行します。
次のコードを実行してSDKをインストールします。
pip install -U eas-prediction --user
EAS SDK For Pythonの使用方法については、「SDK for Python」をご参照ください。
呼び出しプログラムをコンパイルします。
次の例では、入力と出力に文字列を使用するプログラムを使用しています。 TensorFlowやPyTorchテンソルなど、他の入出力形式を使用するサンプルプログラムについては、「SDK For Python」をご参照ください。
#!/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') # Replace the value with the service token. Find the service that you want to access on the EAS page and click Invocation Method in the Service Type column to obtain the token. client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****') client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # Specifies to access the service over a VPC direct connection. 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とservice_nameという入力パラメーターがあります。 endpointパラメーターはサービスへのアクセスに使用されるエンドポイントを指定し、service_nameパラメーターはサービス名を指定します。 エンドポイントは、pai-eas-vpc.{RegionI d}.aliyuncs.com
の形式でリージョンに関連付けられています。 たとえば、中国 (上海) リージョンのVPCダイレクト接続エンドポイントはpai-eas-vpc.cn-shanghai.aliyuncs.com
です。
SDK for Java
Java用の公式SDKを使用してサービスを呼び出すには、次の手順を実行します。
次のコードを実行して依存関係を追加します。 EAS SDKの最新バージョンを表示するには、MVNリポジトリに移動します。
<dependency> <groupId>com.aliyun.openservices.eas</groupId> <artifactId>eas-sdk</artifactId> <version>2.0.13</version> </dependency>
EAS SDK For Javaの使用方法については、「SDK for Java」をご参照ください。
呼び出しプログラムをコンパイルします。
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 { // To ensure that the client object is shared as expected, create and initialize the client object when you start the service instead of creating a client object for each request. PredictClient client = new PredictClient(new HttpConfig()); // Replace the value with the service token. Find the service that you want to access on the EAS page and click Invocation Method in the Service Type column to obtain the token. client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****"); // Use the setDirectEndpoint method for VPC direct connections and specify the endpoint in the following format: pai-eas-vpc.{region_id}.aliyuncs.com. For example, the VPC direct connection endpoint in the China (Shanghai) region is pai-eas-vpc.cn-shanghai.aliyuncs.com. client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com"); // Replace the value with the name of the service. client.setModelName("scorecard_pmml_example"); // Define the input strings. String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]"; System.out.println(request); // Obtain the output strings from EAS. try { String response = client.predict(request); System.out.println(response); } catch (Exception e) { e.printStackTrace(); } // Close the client. client.shutdown(); return; } }
SDK for Go
Go用のEAS SDKをインストールする必要はありません。 SDKは、コードのコンパイル中にGo言語のパッケージマネージャーによってGitHubから自動的にダウンロードされます。 EAS SDK For Goの使用方法については、「SDK for Go」をご参照ください。
次のサンプルコードは、Go用SDKを使用してサービスを呼び出す方法の例を示しています。
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
// Specify the endpoint in the following format: pai-eas-vpc.{region_id}.aliyuncs.com. For example, the VPC direct connection endpoint in the China (Shanghai) region is pai-eas-vpc.cn-shanghai.aliyuncs.com. Replace the values with the region in which the service is deployed and the name of the service.
client := eas.NewPredictClient("pai-eas-vpc.cn-shanghai.aliyuncs.com", "scorecard_pmml_example")
// Replace the value with the service token. Find the service that you want to access on the EAS page and click Invocation Method in the Service Type column to obtain the 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をVPC直接接続に使用することを推奨します。 他の言語またはカスタム呼び出しロジックを使用する場合は、次のメソッドを使用して、HTTPリクエストを送信してサービスを呼び出すことができます。 EASは、サービスをそのバックエンドアドレスにマッピングするためのサービス発見機能を提供する。 次の表に、さまざまなリージョンにデプロイされているサービスのバックエンドアドレスを取得するために使用できるURLを示します。
リージョン | URL |
中国 (上海) | http://pai-eas-vpc.cn-shanghai.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
中国 (北京) | http://pai-eas-vpc.cn-beijing.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
中国 (杭州) | http://pai-eas-vpc.cn-hangzhou.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
次のサンプルコードは、中国 (杭州) リージョンにデプロイされているmist_saved_model_exampleサービスのバックエンドアドレスを取得する方法の例を示しています。 このサービスには2つのインスタンスがあります。
$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
}
]
}
}
返される結果には、2つのインスタンスのIPアドレス、ポート番号、および重みが含まれます。 IPアドレスを使用して、モデルのデプロイ時に設定したVPCからサービスにアクセスできます。
サービス検出を実装して直接接続を確立するには、次の手順を実行します。
クライアントにバックグラウンドスレッドを作成して、定期的にサービス検出を実装します。 最新のインスタンスリストが返され、ローカルキャッシュに格納されます。 間隔を5秒に設定することを推奨します。
推論リクエストを送信する際に、ローカルキャッシュからインスタンスのIPアドレスとポート番号を取得します。 重み付きラウンドロビンアルゴリズムを使用して、IPアドレスとポート番号を取得したり、ビジネス要件に基づいてコードでIPアドレスとポート番号を指定したりできます。
接続が失敗した場合、サービスインスタンスで例外が発生する可能性があります。 たとえば、インスタンスは応答しませんでした。 サービスに複数のインスタンスがある場合、クライアントは別のインスタンスのIPアドレスとポート番号を取得し、ネットワーク接続の再確立を試みる必要があります。
サービスアクセスの失敗を防ぐには、次のルールに注意してください。
サービス検出はバイパスサービスです。 推論リクエストを送信するたびにサービス検出を呼び出すことはできません。
返されたステータスコードが200で、結果が空でない場合にのみ、キャッシュされたデータを更新します。
VPC直接接続を介してサービスを呼び出すと、負荷分散と再試行のロジックがクライアントに実装されます。 プラットフォームは、フォールトトレランスメカニズムを提供しない。 サービスの継続性を確保するには、上記の手順を実行する必要があります。 それ以外の場合、プラットフォームはサービスレベル契約 (SLA) に記載されているパフォーマンスを保証できません。
詳細については、「SDK For Python」をご参照ください。
関連ドキュメント
サービスを呼び出す他の方法については、「概要」をご参照ください。