PAI-EAS は、gRPC を介したモデル推論をサポートしています。HTTP/JSON と比較して、gRPC はより効率的なシリアル化と優れたストリーミングサポートを提供し、レイテンシーの影響を受けやすいワークロードやストリーミング推論ワークロードに最適です。
前提条件
開始する前に、次の準備をしてください:
-
PAI-EAS 推論サービスをデプロイ済みであること。
-
Go 開発環境 (Go 1.18 以降) を設定済みであること。
-
必要な gRPC 依存パッケージをインストール済みであること。
キーポイント
エンドポイントの形式
ゲートウェイ経由でサービスを呼び出すには、「アクセスエンドポイントとトークンの取得」で説明されているように、PAI-EAS コンソールからエンドポイントを取得し、ドメイン名を抽出してポート :80 を追加します。
PAI-EAS はポート 80 でリッスンするゲートウェイを介して gRPC サービスを公開するため、ポートは 80 に固定されています。
エンドポイントの例:
|
アクセス方法 |
コンソールエンドポイント |
gRPC エンドポイント ( |
|
パブリックネットワーク |
|
|
|
VPC |
|
|
注:gRPC エンドポイントには http:// プレフィックスは含まれません。
トークン認証
PAI-EAS は Bearer トークン認証を使用します。gRPC リクエストメタデータで authorization フィールドを次のように設定して、トークンを渡します:
authorization: Bearer <Token>
トークンの前に Bearer とスペースを付けてください。トークンは PAI-EAS コンソールのサービス詳細ページから取得してください。
コード例
コーディングの前に、サービス用の proto ファイルを準備し、クライアントスタブをコンパイルしてください。
これらの例は、gRPC 呼び出しの主要なワークフローを示しています。対応する proto ファイルとサーバーコードは、付録の「gRPC サービスデモ」にあります。
package main
import (
"context"
"log"
"time"
pb "your-project/proto"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/metadata"
)
func main() {
// ご自身の gRPC エンドポイントに置き換えてください。PAI-EAS コンソールの呼び出し情報パネルで確認できます。
// パブリックネットワークエンドポイントの形式は service-name.{uid}.{region}.pai-eas.aliyuncs.com:80 (ポートは 80 に固定) です。
host := "your-service-endpoint:80"
// ご自身のサービストークンに置き換えてください。PAI-EAS コンソールのサービス詳細ページで確認できます。
token := "your-service-token"
log.Printf("Connecting to the PAI-EAS gRPC service (%s)...", host)
// 1. 接続を確立します。接続はスレッドセーフです。1 つの接続を作成して再利用することを推奨します。
conn, err := grpc.NewClient(
host,
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
log.Fatalf("Failed to connect: %v", err)
}
defer conn.Close()
// 2. クライアントを作成します。
client := pb.NewGreeterServiceClient(conn)
// 3. gRPC メタデータを使用して認証トークンを挿入します。
md := metadata.Pairs("authorization", "Bearer " + token)
ctx := metadata.NewOutgoingContext(context.Background(), md)
// 4. タイムアウトを設定します。
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
// 5. リクエストを構築します。
req := &pb.HelloRequest{Name: "World"}
// 6. 呼び出しを実行します。
resp, err := client.SayHello(ctx, req)
if err != nil {
log.Fatalf("Call failed: %v", err)
}
log.Printf("Received response: %s", resp.Message)
}import grpc
import helloworld_pb2
import helloworld_pb2_grpc
# ご自身の gRPC エンドポイントに置き換えてください。PAI-EAS コンソールの呼び出し情報パネルで確認できます。
# パブリックネットワークエンドポイントの形式は service-name.{uid}.{region}.pai-eas.aliyuncs.com:80 (ポートは 80 に固定) です。
host = "your-service-endpoint:80"
# ご自身のサービストークンに置き換えてください。PAI-EAS コンソールのサービス詳細ページで確認できます。
token = "your-service-token"
# 1. サーバーに接続するためのチャネルを作成します。
channel = grpc.insecure_channel(host)
# 2. スタブ (クライアントハンドル) を初期化します。
stub = helloworld_pb2_grpc.GreeterServiceStub(channel)
# 3. リクエストを構築します。
request = helloworld_pb2.HelloRequest(name="World")
# 4. PAI-EAS サービスにトークンを渡すための認証メタデータを構築します。
metadata = (("authorization", "Bearer " + token),)
print("Initiating gRPC call...")
try:
# 5. 同期リクエストを実行します。認証のためにメタデータを渡します。
response = stub.SayHello(request, metadata=metadata, timeout=5.0)
print(response.message)
except grpc.RpcError as e:
print(f"Call failed: {e.code()} - {e.details()}")
finally:
channel.close()ベストプラクティス
-
接続の再利用:gRPC 接続はスレッドセーフです。アプリケーションの起動時に 1 つの接続を作成し、すべてのリクエストで再利用してください。
重要アイドル状態の接続は、中間デバイスによって切断される場合があります。本番環境では、キープアライブを有効にしてください。Go では
KeepaliveParamsを、Python ではoptionsパラメーターを使用します。 -
タイムアウト:ネットワークやサービスの障害でリクエストがハングするのを防ぐため、各呼び出しにタイムアウトを設定してください。
よくある質問
認証の失敗 (UNAUTHENTICATED)
トークンが有効で期限切れでないことを確認してください。メタデータフィールドの名前が正確に authorization であり、値が Bearer とスペースで始まっていることを確認してください。
接続のタイムアウト (UNAVAILABLE)
gRPC エンドポイントが正しく、ネットワークが到達可能であることを確認してください。
VPC エンドポイントの場合、クライアントと PAI-EAS サービスが同じ VPC とリージョンにあることを確認してください。セキュリティグループのルールが関連ポートでのトラフィックを許可していることを確認してください。
付録
gRPC サービスデモ
API の定義
-
プロジェクトのルートディレクトリに
helloworld.protoという名前のファイルを作成し、SayHelloメソッドを含むGreeterServiceサービスを定義してください。-
リクエスト:
HelloRequest。これにはnameという名前の文字列フィールドが含まれます。 -
レスポンス:
HelloResponse。これにはmessageという名前の文字列フィールドが含まれます。
-
-
.protoファイルをコンパイルして、helloworld_pb2_grpc.pyとhelloworld_pb2.pyコードファイルを生成してください。次のコマンドは Python を例として使用しています。python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto
2. サーバーのデプロイ
サービスを PAI-EAS にデプロイします。プロジェクトの構造は次のとおりです:
my-grpc-demo
├── helloworld_pb2_grpc.py
├── helloworld_pb2.py
└── server.py