O serviço de previsão online do Vertex AI permite-lhe fazer pedidos síncronos ao seu próprio ponto final do modelo de previsão.
Esta página mostra como enviar pedidos para o seu modelo para que possa publicar previsões online com baixa latência.
Antes de começar
Antes de poder começar a usar a API Online Prediction, tem de ter um projeto e credenciais adequadas.
Siga estes passos antes de obter uma previsão online:
- Configure um projeto para o Vertex AI.
Para receber as autorizações necessárias para aceder à previsão online, peça ao administrador de IAM do projeto para lhe conceder a função de utilizador de previsão do Vertex AI (
vertex-ai-prediction-user).Para informações sobre esta função, consulte o artigo Prepare as autorizações de IAM.
Crie e prepare um modelo de previsão que segmente um dos contentores suportados.
Crie o cluster de previsão e certifique-se de que o seu projeto permite tráfego externo de entrada.
Mostrar detalhes do recurso personalizado
Endpointdo seu modelo de previsão:kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get endpoint PREDICTION_ENDPOINT -n PROJECT_NAMESPACE -o jsonpath='{.status.endpointFQDN}'Substitua o seguinte:
PREDICTION_CLUSTER_KUBECONFIG: o caminho para o ficheiro kubeconfig no cluster de previsão.PREDICTION_ENDPOINT: o nome do ponto final.PROJECT_NAMESPACE: o nome do espaço de nomes do projeto de previsão.
O resultado tem de mostrar o campo
status, apresentando o nome de domínio totalmente qualificado do ponto final no campoendpointFQDN. Registe este caminho do URL do ponto final para o usar nos seus pedidos.
Defina as variáveis de ambiente
Se quiser enviar um pedido para o ponto final do seu modelo através de um script Python e configurar uma conta de serviço no seu projeto para fazer chamadas de API autorizadas de forma programática, pode definir variáveis de ambiente no script para aceder a valores como as chaves da conta de serviço durante a execução.
Siga estes passos para definir as variáveis de ambiente necessárias num script Python:
Crie um notebook do JupyterLab para interagir com a API Online Prediction.
Crie um script Python no bloco de notas do JupyterLab.
Adicione o seguinte código ao script Python:
import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "APPLICATION_DEFAULT_CREDENTIALS_FILENAME"Substitua
APPLICATION_DEFAULT_CREDENTIALS_FILENAMEpelo nome do ficheiro JSON que contém as chaves da conta de serviço que criou no projeto, comomy-service-key.json.Guarde o script Python com um nome, como
prediction.py.Execute o script Python para definir as variáveis de ambiente:
python SCRIPT_NAMESubstitua
SCRIPT_NAMEpelo nome que deu ao seu script Python, comoprediction.py.
Envie um pedido para um ponto final
Faça um pedido ao ponto final do modelo para obter uma previsão online:
curl
Siga estes passos para fazer um pedido curl:
Crie um ficheiro JSON denominado
request.jsonpara o corpo do pedido.Tem de adicionar e formatar a sua entrada para a previsão online com os detalhes do corpo do pedido que o contentor de destino requer.
Faça o pedido:
curl -X POST -H "Content-Type: application/json; charset=utf-8" -H "Authorization: Bearer TOKEN" https://ENDPOINT_HOSTNAME:443/v1/model:predict -d @request.jsonSubstitua o seguinte:
TOKEN: o token de autenticação que obteve.ENDPOINT_HOSTNAME: o FQDN do ponto final do modelo para o pedido de previsão online.
Se tiver êxito, recebe uma resposta JSON ao seu pedido de previsão online.
O resultado seguinte mostra um exemplo:
{
"predictions": [[-357.10849], [-171.621658]
]
}
Para mais informações sobre as respostas, consulte os detalhes do corpo da resposta.
Python
Siga estes passos para usar o serviço de previsão online a partir de um script Python:
Crie um ficheiro JSON denominado
request.jsonpara o corpo do pedido.Tem de adicionar e formatar a sua entrada para a previsão online com os detalhes do corpo do pedido que o contentor de destino requer.
Instale a versão mais recente da biblioteca cliente da Vertex AI Platform.
Defina as variáveis de ambiente necessárias num script Python.
Adicione o seguinte código ao script Python que criou:
import json import os from typing import Sequence import grpc from absl import app from absl import flags import google from google.auth.transport import requests from google.protobuf import json_format from google.protobuf.struct_pb2 import Value from google.cloud.aiplatform_v1.services import prediction_service _INPUT = flags.DEFINE_string("input", None, "input", required=True) _ENDPOINT_HOSTNAME = flags.DEFINE_string("endpoint_hostname", None, "Prediction endpoint FQDN", required=True) _PROJECT_NAME = flags.DEFINE_string("project_name", None, "project name", required=True) _ENDPOINT_NAME = flags.DEFINE_string("endpoint_name", None, "endpoint name", required=True) os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "path-to-ca-cert-file.cert" def get_sts_token(endpoint_hostname): creds = None try: creds, _ = google.auth.default() creds = creds.with_gdch_audience("https://"+endpoint_hostname+":443") req = requests.Request() creds.refresh(req) print("Got token: ") print(creds.token) except Exception as e: print("Caught exception" + str(e)) raise e return creds.token # predict_client_secure builds a client that requires TLS def predict_client_secure(endpoint_hostname, token): with open(os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"], 'rb') as f: channel_creds = grpc.ssl_channel_credentials(f.read()) call_creds = grpc.access_token_call_credentials(token) creds = grpc.composite_channel_credentials( channel_creds, call_creds, ) client = prediction_service.PredictionServiceClient( transport=prediction_service.transports.grpc.PredictionServiceGrpcTransport( channel=grpc.secure_channel(target=endpoint_hostname+":443", credentials=creds))) return client def predict_func(client, instances): # The endpoint resource name is required for authorization. # A wrong value might lead to an access denied error. endpoint_resource_name = f"projects/{_PROJECT_NAME.value}/locations/{_PROJECT_NAME.value}/endpoints/{_ENDPOINT_NAME.value}" resp = client.predict( endpoint=endpoint_resource_name, instances=instances, metadata=[("x-vertex-ai-endpoint-id", _ENDPOINT_NAME.value)] ) print(resp) def main(argv: Sequence[str]): del argv # Unused. with open(_INPUT.value) as json_file: data = json.load(json_file) instances = [json_format.ParseDict(s, Value()) for s in data["instances"]] token = get_sts_token(_ENDPOINT_HOSTNAME.value) client = predict_client_secure(_ENDPOINT_HOSTNAME.value, token) predict_func(client=client, instances=instances) if __name__=="__main__": app.run(main)Guarde o script Python com um nome, como
prediction.py.Faça o pedido ao servidor de previsão:
python SCRIPT_NAME --input request.json \ --endpoint_hostname ENDPOINT_FQDN \ --project_name PROJECT_NAME \ --endpoint_name ENDPOINT_NAME \Substitua o seguinte:
SCRIPT_NAME: o nome do script Python, comoprediction.py.ENDPOINT_FQDN: nome do domínio totalmente qualificado do ponto final para o pedido de previsão online.PROJECT_NAME: nome do projeto do ponto final.ENDPOINT_NAME: o nome do ponto final a chamar.
Se tiver êxito, recebe uma resposta JSON ao seu pedido de previsão online. Para mais informações sobre as respostas, consulte os detalhes do corpo da resposta.