El servicio de predicción online de Vertex AI te permite hacer solicitudes síncronas a tu propio endpoint de modelo de predicción.
En esta página se explica cómo enviar solicitudes a tu modelo para que pueda ofrecer predicciones online con baja latencia.
Antes de empezar
Para poder empezar a usar la API Online Prediction, debes tener un proyecto y las credenciales adecuadas.
Sigue estos pasos antes de obtener una predicción online:
- Configura un proyecto para Vertex AI.
Para obtener los permisos que necesitas para acceder a Predicción online, pide al administrador de gestión de identidades y accesos de tu proyecto que te asigne el rol Usuario de predicción de Vertex AI (
vertex-ai-prediction-user).Para obtener información sobre este rol, consulta Preparar permisos de gestión de identidades y accesos.
Crea y entrena un modelo de predicción dirigido a uno de los contenedores admitidos.
Crea el clúster de predicción y asegúrate de que tu proyecto permita el tráfico externo entrante.
Muestra los detalles del recurso personalizado
Endpointde tu modelo de predicción:kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get endpoint PREDICTION_ENDPOINT -n PROJECT_NAMESPACE -o jsonpath='{.status.endpointFQDN}'Haz los cambios siguientes:
PREDICTION_CLUSTER_KUBECONFIG: la ruta al archivo kubeconfig del clúster de predicción.PREDICTION_ENDPOINT: el nombre del endpoint.PROJECT_NAMESPACE: el nombre del espacio de nombres del proyecto de predicción.
En el resultado debe mostrarse el campo
status, que contiene el nombre de dominio completo del endpoint en el campoendpointFQDN. Registre esta ruta de URL de endpoint para usarla en sus solicitudes.
Definir las variables de entorno
Si quieres enviar una solicitud al endpoint de tu modelo mediante una secuencia de comandos de Python y configurar una cuenta de servicio en tu proyecto para hacer llamadas a la API autorizadas de forma programática, puedes definir variables de entorno en la secuencia de comandos para acceder a valores como las claves de la cuenta de servicio al ejecutarla.
Sigue estos pasos para definir las variables de entorno necesarias en una secuencia de comandos de Python:
Crea un cuaderno de JupyterLab para interactuar con la API Online Prediction.
Crea una secuencia de comandos de Python en el cuaderno de JupyterLab.
Añade el siguiente código a la secuencia de comandos de Python:
import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "APPLICATION_DEFAULT_CREDENTIALS_FILENAME"Sustituye
APPLICATION_DEFAULT_CREDENTIALS_FILENAMEpor el nombre del archivo JSON que contiene las claves de la cuenta de servicio que has creado en el proyecto, comomy-service-key.json.Guarda la secuencia de comandos de Python con un nombre, como
prediction.py.Ejecuta la secuencia de comandos de Python para definir las variables de entorno:
python SCRIPT_NAMESustituye
SCRIPT_NAMEpor el nombre que le hayas dado a tu script de Python, comoprediction.py.
Enviar una solicitud a un endpoint
.Envía una solicitud al endpoint del modelo para obtener una predicción online:
curl
Para hacer una solicitud de curl, sigue estos pasos:
Crea un archivo JSON llamado
request.jsonpara el cuerpo de la solicitud.Debes añadir y dar formato a tu entrada para la predicción online con los detalles del cuerpo de la solicitud que el contenedor de destino requiere.
Haz la solicitud:
curl -X POST -H "Content-Type: application/json; charset=utf-8" -H "Authorization: Bearer TOKEN" https://ENDPOINT_HOSTNAME:443/v1/model:predict -d @request.jsonHaz los cambios siguientes:
TOKEN: el token de autenticación que has obtenido.ENDPOINT_HOSTNAME: el nombre de dominio cualificado del endpoint de tu modelo para la solicitud de predicción online.
Si se realiza correctamente, recibirás una respuesta JSON a tu solicitud de predicción online.
En el siguiente resultado se muestra un ejemplo:
{
"predictions": [[-357.10849], [-171.621658]
]
}
Para obtener más información sobre las respuestas, consulta Detalles del cuerpo de la respuesta.
Python
Sigue estos pasos para usar el servicio de predicción online desde una secuencia de comandos de Python:
Crea un archivo JSON llamado
request.jsonpara el cuerpo de la solicitud.Debes añadir y dar formato a tu entrada para la predicción online con los detalles del cuerpo de la solicitud que el contenedor de destino requiere.
Instala la última versión de la biblioteca de cliente de la plataforma Vertex AI.
Define las variables de entorno necesarias en una secuencia de comandos de Python.
Añade el siguiente código a la secuencia de comandos de Python que has creado:
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)Guarda la secuencia de comandos de Python con un nombre, como
prediction.py.Envía la solicitud al servidor de predicción:
python SCRIPT_NAME --input request.json \ --endpoint_hostname ENDPOINT_FQDN \ --project_name PROJECT_NAME \ --endpoint_name ENDPOINT_NAME \Haz los cambios siguientes:
SCRIPT_NAME: el nombre de la secuencia de comandos de Python, comoprediction.py.ENDPOINT_FQDN: nombre de dominio completo del endpoint de la solicitud de predicción online.PROJECT_NAME: nombre del proyecto del endpoint.ENDPOINT_NAME: el nombre del endpoint al que se va a llamar.
Si se realiza correctamente, recibirás una respuesta JSON a tu solicitud de predicción online. Para obtener más información sobre las respuestas, consulta Detalles del cuerpo de la respuesta.