O PAI-EAS oferece suporte à inferência de modelos via gRPC. Em comparação com HTTP/JSON, o gRPC proporciona serialização mais eficiente e melhor suporte a streaming, sendo ideal para cargas de trabalho de inferência sensíveis à latência ou baseadas em streaming.
Pré-requisitos
Antes de começar:
Implante um service de inferência do PAI-EAS.
Configure um ambiente de desenvolvimento Go (Go 1.18 ou posterior).
Instale os pacotes de dependência necessários para gRPC.
Pontos principais
Formato do endpoint
Para chamar um service pelo gateway, obtenha o endpoint no console do PAI-EAS, extraia o nome de domínio e adicione a porta :80, conforme descrito em Obtain the access endpoint and token.
A porta é fixa em 80 porque o PAI-EAS expõe os serviços gRPC por meio de um gateway que escuta na porta 80.
Exemplos de endpoints:
|
Método de acesso |
Endpoint no console |
Endpoint gRPC (adicionar :80) |
|
Rede pública |
|
|
|
VPC |
|
|
Nota: Um endpoint gRPC não inclui o prefixo http://.
Autenticação por token
O PAI-EAS utiliza autenticação Bearer Token. Passe o token nos metadados da requisição gRPC definindo o campo authorization da seguinte forma:
authorization: Bearer <Token>
Adicione o prefixo Bearer seguido de um espaço ao token. Obtenha seu token na página de detalhes do service no console do PAI-EAS.
Exemplos de código
Antes de programar, prepare o arquivo proto do seu service e compile o stub do cliente.
Estes exemplos demonstram o fluxo principal de chamada gRPC. O arquivo proto correspondente e o código do servidor estão disponíveis no apêndice gRPC service 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() {
// Replace with your gRPC endpoint. You can find it in the call info panel in the PAI-EAS console.
// The public network endpoint format is: service-name.{uid}.{region}.pai-eas.aliyuncs.com:80 (the port is fixed at 80).
host := "your-service-endpoint:your port"
// Replace with your service token. You can find it on the service details page in the PAI-EAS console.
token := "your-service-token"
log.Printf("Connecting to the PAI-EAS gRPC service (%s)...", host)
// 1. Establish a connection. Connections are thread-safe. We recommend that you create one connection and reuse it.
conn, err := grpc.NewClient(
host,
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
log.Fatalf("Failed to connect: %v", err)
}
defer conn.Close()
// 2. Create a client.
client := pb.NewGreeterServiceClient(conn)
// 3. Inject the authentication token by using gRPC metadata.
md := metadata.Pairs("authorization", "Bearer " + token)
ctx := metadata.NewOutgoingContext(context.Background(), md)
// 4. Set a timeout.
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
// 5. Construct the request.
req := &pb.HelloRequest{Name: "World"}
// 6. Make the call.
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
# Replace with your gRPC endpoint. You can find it in the call info panel in the PAI-EAS console.
# The public network endpoint format is: service-name.{uid}.{region}.pai-eas.aliyuncs.com:80 (the port is fixed at 80).
host = "your-service-endpoint:your port"
# Replace with your service token. You can find it on the service details page in the PAI-EAS console.
token = "your-service-token"
# 1. Create a channel to connect to the server.
channel = grpc.insecure_channel(host)
# 2. Initialize the stub (client handle).
stub = helloworld_pb2_grpc.GreeterServiceStub(channel)
# 3. Construct the request.
request = helloworld_pb2.HelloRequest(name="World")
# 4. Construct the authentication metadata to pass the token to the PAI-EAS service.
metadata = (("authorization", "Bearer " + token),)
print("Initiating gRPC call...")
try:
# 5. Make a synchronous request. Pass the metadata for authentication.
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()Melhores práticas
-
Reutilização de conexões: As conexões gRPC são seguras para threads. Crie uma única conexão na inicialização da aplicação e reutilize-a para todas as requisições.
ImportanteDispositivos intermediários podem encerrar conexões ociosas. Em produção, ative o keepalive: use
KeepaliveParamsem Go ou o parâmetrooptionsem Python. Timeout: Defina um timeout para cada chamada a fim de evitar que requisições fiquem pendentes devido a falhas de rede ou do service.
Perguntas frequentes
Falha na autenticação (UNAUTHENTICATED)
Verifique se o seu token é válido e não expirou. Confirme se o campo de metadados está nomeado exatamente como authorization e se o valor começa com Bearer seguido de um espaço.
Timeout de conexão (UNAVAILABLE)
Verifique se o endpoint gRPC está correto e se a rede está acessível.
Para endpoints de VPC, confirme se o cliente e o service PAI-EAS estão na mesma VPC e região. Verifique também se as regras do grupo de segurança permitem tráfego na porta relevante.
Apêndice
Demonstração de service gRPC
Definição da API
-
No diretório raiz do seu projeto, crie um arquivo chamado
helloworld.protopara definir um serviceGreeterServiceque inclui um métodoSayHello.Requisição:
HelloRequest, contendo um campo string chamadoname.Resposta:
HelloResponse, contendo um campo string chamadomessage.
-
Compile o arquivo
.protopara gerar os arquivos de códigohelloworld_pb2_grpc.pyehelloworld_pb2.py. O comando abaixo usa Python como exemplo.python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto
2. Implantação do servidor
Implante o service no PAI-EAS. A estrutura do projeto é a seguinte:
my-grpc-demo
├── helloworld_pb2_grpc.py
├── helloworld_pb2.py
└── server.py