El servicio de predicción online de Vertex AI te permite enviar 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 usar la API de predicción online, 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 la predicción online, pide a tu administrador de IAM del proyecto que te asigne el rol de usuario de predicción de Vertex AI (
vertex-ai-prediction-user).Para obtener información sobre este rol, consulta el artículo Preparar permisos de IAM.
Crea y entrena un modelo de predicción que esté 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
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: ruta al archivo kubeconfig del clúster de predicción.PREDICTION_ENDPOINT: nombre del endpoint.PROJECT_NAMESPACE: 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. Registra esta ruta de URL del endpoint para usarla en tus solicitudes.
Definir 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 durante la ejecución.
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 de predicción online.
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 has dado a tu secuencia de comandos 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
Sigue estos pasos para enviar una solicitud curl:
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 requiere el contenedor de destino.
Envía 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: nombre de dominio completo del 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.
A continuación, se muestra un ejemplo:
{
"predictions": [[-357.10849], [-171.621658]
]
}
Para obtener más información sobre las respuestas, consulta el artículo 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 requiere el contenedor de destino.
Instala la versión más reciente de la biblioteca de cliente de Vertex AI Platform.
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: nombre de la secuencia de comandos de Python, comoprediction.py.ENDPOINT_FQDN: nombre de dominio completo del endpoint para la solicitud de predicción online.PROJECT_NAME: nombre del proyecto del endpoint.ENDPOINT_NAME: nombre del endpoint al que se va a llamar.
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 el artículo Detalles del cuerpo de la respuesta.