すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:gRPC を介した PAI-EAS 推論サービスの呼び出し

最終更新日:May 15, 2026

PAI-EAS は、gRPC プロトコルを使用した高性能なモデル推論をサポートしています。HTTP/JSON と比較して、gRPC はより効率的なシリアル化と優れたストリーミングサポートを提供するため、レイテンシーの影響を受けやすいワークロードやストリーミング推論を必要とするシナリオに適しています。

前提条件

開始する前に、次の要件を満たしていることを確認してください。

  1. PAI-EAS 推論サービスがデプロイ済みであること

  2. Go 開発環境が設定済みであること (Go 1.18 以降を推奨)

  3. 必要な gRPC 依存関係パッケージがインストール済みであること

キーポイント

エンドポイントの形式

ゲートウェイ経由でサービスを呼び出すには、コンソールからサービスアドレスを取得し、ドメイン名を抽出して、ポート番号 :80 を追加します。詳細については、「アクセスエンドポイントとトークンの取得」をご参照ください。

重要

PAI-EAS はポート 80 でリッスンするゲートウェイを介して gRPC サービスを公開するため、ポートは 80 に固定されています。

次の表にエンドポイントの例を示します。

アクセス方法

コンソールエンドポイント

gRPC エンドポイント (:80 を追加)

パブリックネットワーク

http://grpc-test.123456***.cn-hangzhou.pai-eas.aliyuncs.com/

grpc-test.123456***.cn-hangzhou.pai-eas.aliyuncs.com:80

VPC

http://grpc-test.123456***.vpc.cn-hangzhou.pai-eas.aliyuncs.com/

grpc-test.123456***.vpc.cn-hangzhou.pai-eas.aliyuncs.com:80

: 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 定義

  1. プロジェクトのルートディレクトリに helloworld.proto という名前のファイルを作成し、SayHello メソッドを含む GreeterService サービスを定義します。

    • リクエストname という名前の文字列フィールドを含む HelloRequest

    • レスポンスmessage という名前の文字列フィールドを含む HelloResponse

    クリックして helloworld.proto を表示

    syntax = "proto3";
    
    package helloworld;
    
    option go_package = "ご自身のプロジェクト/proto;helloworld";
    
    message HelloRequest {
      string name = 1;
    }
    
    message HelloResponse {
      string message = 1;
    }
    
    service GreeterService {
      rpc SayHello (HelloRequest) returns (HelloResponse);
    }
  2. .proto ファイルをコンパイルして、helloworld_pb2_grpc.pyhelloworld_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  

クリックして server.py を表示

import grpc
from concurrent import futures
import helloworld_pb2
import helloworld_pb2_grpc

# サービスロジックを実装します。
class GreeterServicer(helloworld_pb2_grpc.GreeterServiceServicer):
    def SayHello(self, request, context):
        # ビジネスロジック: 文字列を連結します。
        response_msg = f"Hello, {request.name}!"
        return helloworld_pb2.HelloResponse(message=response_msg)


def serve():
    # 1. スレッドプールを使用してサーバーを作成します。
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
  
    # 2. サービスの実装をサーバーに登録します。
    helloworld_pb2_grpc.add_GreeterServiceServicer_to_server(GreeterServicer(), server)
   
    # 3. ポートをリッスンします。これがデプロイアドレスです。
    port = "[::]:50051"
    server.add_insecure_port(port)
   
    print(f"サーバーが起動し、{port} でリッスンしています...")
    server.start()
   
    # 4. メインスレッドをブロックして、サービスの実行を継続させます。
    server.wait_for_termination()

if __name__ == "__main__":
    serve()

クリックして PAI-EAS サービスの JSON 設定を表示

{
    "cloud": {
        "computing": {
            "instances": [
                {
                    "type": "ecs.c7.large"
                }
            ]
        }
    },
    "containers": [
        {
            "image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/python-inference:py39-ubuntu2004",
            "port": 50051,
            "prepare": {
                "pythonRequirements": [
                    "grpcio",
                    "grpcio-tools"
                ]
            },
            "script": "python /mnt/data/server.py"
        }
    ],
    "metadata": {
        "cpu": 2,
        "disk": "30Gi",
        "enable_grpc": true,
        "instance": 1,
        "memory": 4000,
        "name": "grpc_test",
        "rpc": {
            "keepalive": 5000
        },
        "workspace_id": "お使いのワークスペースID"
    },
    "storage": [
        {
            "mount_path": "/mnt/data/",
            "oss": {
                "path": "oss://my-oss/eas/my-grpc-demo/",
                "readOnly": false
            }
        }
    ]
}