El servicio de predicción online de Vertex AI te permite hacer solicitudes síncronas al endpoint de tu propio 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 orientado 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
Endpoint
de 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.
El resultado debe mostrar 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 has configurado 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_FILENAME
por 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_NAME
Sustituye
SCRIPT_NAME
por 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.json
para 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 requiera.
Haz la solicitud:
curl -X POST -H "Content-Type: application/json; charset=utf-8" -H "Authorization: Bearer TOKEN" https://ENDPOINT:443/v1/model:predict -d @request.json
Haz los cambios siguientes:
TOKEN
: el token de autenticación que has obtenido.ENDPOINT
: el endpoint de tu modelo para la solicitud de predicción online.
Si la solicitud 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.json
para 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 requiera.
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 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) _HOST = flags.DEFINE_string("host", None, "Prediction endpoint", required=True) _ENDPOINT_ID = flags.DEFINE_string("endpoint_id", None, "endpoint id", required=True) os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "path-to-ca-cert-file.cert" # ENDPOINT_RESOURCE_NAME is a placeholder value that doesn't affect prediction behavior. ENDPOINT_RESOURCE_NAME="projects/000000000000/locations/us-central1/endpoints/00000000000000" def get_sts_token(host): creds = None try: creds, _ = google.auth.default() creds = creds.with_gdch_audience(host+":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(host, 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=host+":443", credentials=creds))) return client def predict_func(client, instances): resp = client.predict( endpoint=ENDPOINT_RESOURCE_NAME, instances=instances, metadata=[("x-vertex-ai-endpoint-id", _ENDPOINT_ID.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(_HOST.value) client = predict_client_secure(_HOST.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 \ --host ENDPOINT \ --endpoint_id ENDPOINT_ID \
Haz los cambios siguientes:
SCRIPT_NAME
: el nombre de la secuencia de comandos de Python, comoprediction.py
.ENDPOINT
: el endpoint de tu modelo para la solicitud de predicción online.ENDPOINT_ID
: el valor del ID del endpoint.
Si la solicitud 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.