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

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

最終更新日:Sep 11, 2026

PAI-EAS は、gRPC を介したモデル推論をサポートしています。HTTP/JSON と比較して、gRPC はより効率的なシリアル化と優れたストリーミングサポートを提供し、レイテンシーの影響を受けやすいワークロードやストリーミング推論ワークロードに最適です。

前提条件

開始する前に、次の準備をしてください:

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

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

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

キーポイント

エンドポイントの形式

ゲートウェイ経由でサービスを呼び出すには、「アクセスエンドポイントとトークンの取得」で説明されているように、PAI-EAS コンソールからエンドポイントを取得し、ドメイン名を抽出してポート :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 は 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 の定義

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

    • リクエスト:HelloRequest。これには name という名前の文字列フィールドが含まれます。

    • レスポンス:HelloResponse。これには message という名前の文字列フィールドが含まれます。

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

    syntax = "proto3";
    
    package helloworld;
    
    option go_package = "your-project/proto;helloworld";
    
    message HelloRequest {
      string name = 1;
    }
    
    message HelloResponse {
      string message = 1;
    }
    
    service GreeterService {
      rpc SayHello (HelloRequest) returns (HelloResponse);
    }
  2. .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  

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"Server started, listening on {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": "your-workspace-id"
    },
    "storage": [
        {
            "mount_path": "/mnt/data/",
            "oss": {
                "path": "oss://my-oss/eas/my-grpc-demo/",
                "readOnly": false
            }
        }
    ]
}