PAI-EAS は、gRPC プロトコルを使用した高性能なモデル推論をサポートしています。HTTP/JSON と比較して、gRPC はより効率的なシリアル化と優れたストリーミングサポートを提供するため、レイテンシーの影響を受けやすいワークロードやストリーミング推論を必要とするシナリオに適しています。
前提条件
開始する前に、次の要件を満たしていることを確認してください。
PAI-EAS 推論サービスがデプロイ済みであること
Go 開発環境が設定済みであること (Go 1.18 以降を推奨)
必要な gRPC 依存関係パッケージがインストール済みであること
キーポイント
エンドポイントの形式
ゲートウェイ経由でサービスを呼び出すには、コンソールからサービスアドレスを取得し、ドメイン名を抽出して、ポート番号 :80 を追加します。詳細については、「アクセスエンドポイントとトークンの取得」をご参照ください。
PAI-EAS はポート 80 でリッスンするゲートウェイを介して gRPC サービスを公開するため、ポートは 80 に固定されています。
次の表にエンドポイントの例を示します。
アクセス方法 | コンソールエンドポイント | gRPC エンドポイント ( |
パブリックネットワーク |
|
|
VPC |
|
|
注: gRPC エンドポイントには http:// プレフィックスは含まれません。
トークン認証
PAI-EAS の gRPC 推論サービスを呼び出すには、リクエストメタデータで認証トークンを渡す必要があります。PAI-EAS はベアラートークン認証を使用します。gRPC 呼び出しを行う際に、メタデータの authorization フィールドを次のように設定します。
authorization: Bearer <Token>トークンには、プレフィックスとして Bearer を付け、その後にスペースを入れる必要があります。トークンは、PAI-EAS コンソールのサービス詳細ページから取得できます。
コード例
コードを記述する前に、サービスの proto ファイルを準備し、クライアントスタブをコンパイルします。
次の例は、gRPC を介して PAI-EAS 推論サービスを呼び出すための主要なワークフローを示しています。対応する 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 := "お使いのサービスエンドポイント:ポート番号"
// サービストークンに置き換えます。PAI-EAS コンソールのサービス詳細ページで確認できます。
token := "お使いのサービストークン"
log.Printf("PAI-EAS gRPC サービス (%s) に接続しています...", host)
// 1. 接続を確立します。接続はスレッドセーフです。1 つの接続を作成し、それを再利用することを推奨します。
conn, err := grpc.NewClient(
host,
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
log.Fatalf("接続に失敗しました: %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("呼び出しに失敗しました: %v", err)
}
log.Printf("受信したレスポンス: %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 = "お使いのサービスエンドポイント:ポート番号"
# サービストークンに置き換えます。PAI-EAS コンソールのサービス詳細ページで確認できます。
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("gRPC 呼び出しを開始しています...")
try:
# 5. 同期リクエストを実行します。認証のためにメタデータを渡します。
response = stub.SayHello(request, metadata=metadata, timeout=5.0)
print(response.message)
except grpc.RpcError as e:
print(f"呼び出しに失敗しました: {e.code()} - {e.details()}")
finally:
channel.close()ベストプラクティス
接続の再利用:gRPC 接続はスレッドセーフです。アプリケーションの起動時に接続を作成し、後続のすべてのリクエストで再利用することを推奨します。
重要アイドル状態の接続は、中間のネットワークデバイスによって切断される可能性があります。本番環境では、キープアライブハートビートを有効にする必要があります。Go では
KeepaliveParamsを、Python ではoptionsパラメーターを使用します。この方法により、接続がアクティブに保たれ、シームレスな自動再接続が可能になります。タイムアウト:ネットワークやサービスの問題によってリクエストが無期限にハングするのを防ぐため、各 gRPC 呼び出しに適切なタイムアウトを設定してください。
よくある質問
認証の失敗 (UNAUTHENTICATED)
トークンが正しく、有効期限が切れていないかを確認してください。また、メタデータ内の authorization フィールド名が正しく入力されていることを確認してください。トークンには、プレフィックスとして Bearer を付け、その後にスペースを入れる必要があります。
接続のタイムアウト (UNAVAILABLE)
gRPC エンドポイントが正しく、ネットワークが到達可能であることを確認してください。
VPC エンドポイントを使用する場合、クライアントと PAI-EAS サービスが同じ VPC およびリージョンにあることを確認してください。また、セキュリティグループのルールで、関連するポートでのトラフィックが許可されていることを確認してください。
付録
gRPC サービスデモ
API 定義
プロジェクトのルートディレクトリに
helloworld.protoという名前のファイルを作成し、SayHelloメソッドを含むGreeterServiceサービスを定義します。リクエスト:
nameという名前の文字列フィールドを含むHelloRequest。レスポンス:
messageという名前の文字列フィールドを含むHelloResponse。
.protoファイルをコンパイルして、helloworld_pb2_grpc.pyとhelloworld_pb2.pyのコードファイルを生成します。次のコマンドは Python の例です。python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto
サーバーのデプロイ
サービスを PAI-EAS にデプロイします。プロジェクトの構造は次のとおりです。
my-grpc-demo
├── helloworld_pb2_grpc.py
├── helloworld_pb2.py
└── server.py