全部產品
Search
文件中心

Platform For AI:通過gRPC協議調用PAI-EAS推理服務

更新時間:May 15, 2026

PAI-EAS支援通過gRPC協議進行高效能的模型推理調用。與HTTP/JSON相比,gRPC具有更高的序列化效率和更好的串流支援,適用於對效能敏感或需要流式推理的情境。

前提條件

在開始之前,請確保已滿足以下條件:

  1. 已部署EAS推理服務

  2. Golang 開發環境已配置(推薦 Go 1.18 及以上版本)

  3. 已安裝必要的 gRPC 依賴包

核心要點

服務地址格式

通過網關調用時,從控制台擷取對應地址後,提取網域名稱部分並追加連接埠號碼:80即可,步驟參見擷取訪問地址和Token

重要

連接埠固定為80,因為EAS通過網關對外提供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://首碼。

Token 鑒權

調用 PAI-EAS gRPC 推理服務的核心在於通過 Metadata傳遞鑒權Token。PAI-EAS 使用 Bearer Token 進行身分識別驗證,在發起gRPC調用時,需要在Metadata中如下設定authorization欄位:

authorization: Bearer <Token>

其中Token值必須使用Bearer首碼(注意Bearer與Token之間有一個空格),Token本身可在EAS控制台的目標服務詳情頁面擷取。

程式碼範例

在編寫調用代碼之前,請先準備好對應服務的 proto 檔案並編譯產生用戶端代碼。

以下樣本展示通過gRPC協議調用PAI-EAS推理服務的核心流程。其相關的proto檔案及服務端代碼參見gRPC服務demo

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服務地址(可從EAS控制台調用資訊面板擷取)
	// 公網調用地址格式為:服務名.{uid}.{region}.pai-eas.aliyuncs.com:80 (連接埠固定80)
	host := "your-service-endpoint:your port"
	// 替換為您的服務Token(可在EAS控制台服務詳情頁面擷取)
	token := "your-service-token"

	log.Printf("正在串連EAS gRPC服務 (%s)...", host)
        
        // 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 metadata 注入鑒權 Token
	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服務地址(可從EAS控制台調用資訊面板擷取)
# 公網調用地址格式為:服務名.{uid}.{region}.pai-eas.aliyuncs.com:80 (連接埠固定80)
host = "your-service-endpoint:your port"
# 替換為您的服務Token(可在EAS控制台服務詳情頁面擷取)
token = "your-service-token"

# 1. 建立通道 (串連服務端)
channel = grpc.insecure_channel(host)

# 2. 初始化 Stub (用戶端控制代碼)
stub = helloworld_pb2_grpc.GreeterServiceStub(channel)

# 3. 構造請求
request = helloworld_pb2.HelloRequest(name="World")

# 4. 構造鑒權metadata,將Token傳遞給PAI-EAS服務
metadata = (("authorization",  "Bearer " + token),)

print("正在發起 gRPC 調用...")

try:
    # 5. 發起請求 (同步調用),注意傳入metadata以完成鑒權
    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串連是安全執行緒的,建議在應用啟動時建立串連並複用,而不是每次請求建立。

    重要

    預設情況下空閑串連可能被網路裝置切斷。生產環境中務必啟用 Keepalive 心跳(Go 使用 KeepaliveParams,Python 使用 options),以主動維持串連活躍,實現真正的無感自動重連。

  • 逾時設定:強烈建議為每次gRPC調用設定合理的逾時時間,避免因網路或服務異常導致請求長時間阻塞。

常見問題

Q:鑒權失敗(UNAUTHENTICATED)

請檢查Token是否正確、是否已到期,以及Metadata中的authorization欄位名是否拼字正確。注意Token值必須使用Bearer首碼,且Bearer與Token之間有一個空格。

Q:連線逾時(UNAVAILABLE)

確認gRPC端點是否正確,以及網路是否可達。

如使用VPC調用地址,請確保用戶端與EAS服務在同一地區的VPC網路內,並檢查安全性群組規則是否允許存取了對應連接埠。

附錄

gRPC服務demo

介面定義

  1. 在專案根目錄建立檔案 helloworld.proto,定義一個 GreeterService 服務,包含一個 SayHello 方法:

    • 請求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.pyhelloworld_pb2.py(以 Python 為例):

    python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto

2. 服務端部署

部署服務到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()

單擊查看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
            }
        }
    ]
}