1. Descripción general
En este lab, usarás Vertex AI para obtener predicciones en línea y por lotes a partir de un modelo entrenado de forma personalizada.
Este lab forma parte de la serie de videos Del prototipo a la producción. Asegúrate de completar los labs anteriores antes de realizar este. Puedes mirar el video complementario para obtener más información:
.
Qué aprenderás
Aprenderás a hacer lo siguiente:
- Importar modelos a Vertex AI Model Registry
- Implementar un modelo en un extremo
- Obtener predicciones en línea y por lotes con la IU y el SDK
El costo total de la ejecución de este lab en Google Cloud es de aproximadamente $1.
2. Introducción a Vertex AI
En este lab, se utiliza la oferta de productos de IA más reciente de Google Cloud. Vertex AI integra las ofertas de AA de Google Cloud en una experiencia de desarrollo fluida. Anteriormente, se podía acceder a los modelos personalizados y a los entrenados con AutoML mediante servicios independientes. La nueva oferta combina ambos en una sola API, junto con otros productos nuevos. También puedes migrar proyectos existentes a Vertex AI.
Vertex AI incluye muchos productos distintos para respaldar flujos de trabajo de AA de extremo a extremo. Este lab se enfocará en los productos que se destacan a continuación: Prediction y Workbench
3. Configura tu entorno
Completa los pasos en el lab Entrenamiento de modelos personalizados con Vertex AI para configurar tu entorno.
4. Sube el modelo a Registry
Antes de poder usar el modelo para obtener predicciones, tenemos que subirlo a Vertex AI Model Registry, que es un repositorio en el que puedes administrar el ciclo de vida de tus modelos de AA.
Puedes subir modelos cuando configures un trabajo de entrenamiento personalizado, como se muestra a continuación.
También puedes importar modelos después de que se complete el trabajo de entrenamiento, siempre que almacenes los artefactos del modelo guardado en un bucket de Cloud Storage. Esta es la opción que usaremos en el lab.
Ve a la sección Modelos (Models) de la consola.
Selecciona IMPORTAR (IMPORT).
Selecciona Importar como modelo nuevo (Import as new model) y, luego, asígnale un nombre al modelo.
En Configuración del modelo, importa el modelo con un contenedor compilado previamente y usa TensorFlow 2.8. Puedes ver la lista completa de contenedores de predicción compilados previamente aquí.
Luego, proporciona la ruta de acceso al bucket de Cloud Storage en el que guardaste los artefactos del modelo del trabajo de entrenamiento personalizado. Se verá de la siguiente manera: gs://{PROJECT_ID}-bucket/model_output
.
Omitiremos la sección Explicabilidad, pero si quieres obtener más información sobre Vertex Explainable AI, consulta la documentación.
Cuando se importe el modelo, lo verás en el registro.
Ten en cuenta que si quieres hacer esto mediante el SDK en lugar de la IU, puedes ejecutar el siguiente código desde tu notebook de Workbench para subir el modelo.
from google.cloud import aiplatform
my_model = aiplatform.Model.upload(display_name='flower-model',
artifact_uri='gs://{PROJECT_ID}-bucket/model_output',
serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')
5. Implementa el modelo en un extremo
Existen dos tipos de trabajos de predicción que se pueden ejecutar en Vertex AI: por lotes y en línea.
La predicción por lotes es una solicitud asíncrona. Es una buena opción cuando no necesitas una respuesta inmediata y quieres procesar datos acumulados en una sola solicitud.
Por otro lado, si quieres obtener predicciones de baja latencia a partir de los datos que se pasaron a tu modelo sobre la marcha, puedes usar la predicción en línea.
Ahora que el modelo se encuentra en el registro, podemos usarlo para las predicciones por lotes.
Pero si queremos obtener predicciones en línea, tendremos que implementar el modelo en un extremo. De esta manera, se asocian los artefactos del modelo guardado con recursos físicos para la entrega de predicciones de latencia baja.
Para realizar la implementación en un extremo, selecciona los tres puntos que se encuentran a la derecha del modelo y selecciona Implementar en el extremo (Deploy to endpoint).
Asígnale un nombre al extremo, deja el resto de los parámetros de configuración tal como están y haz clic en CONTINUAR (CONTINUE).
Los extremos admiten el ajuste de escala automático, lo que significa que puedes establecer un mínimo y un máximo, y los nodos de procesamiento se escalarán para ajustarse a la demanda de tráfico dentro de esos límites.
Ya que este lab es solo demostrativo y no usaremos este extremo para el tráfico alto, puedes establecer la Cantidad máxima de nodos de procesamiento (Maximum number of compute nodes) en 1 y seleccionar n1-standard-4 como el Tipo de máquina (Machine type).
Omitiremos la supervisión de modelos, pero si quieres obtener más información sobre esta función, consulta la documentación.
Luego, haz clic en IMPLEMENTAR
La implementación tardará algunos minutos, pero cuando se complete, verás que el estado de tu modelo cambió a Implementado en Vertex AI.
Si quieres implementar un modelo mediante el SDK, ejecuta el siguiente comando.
my_model = aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")
endpoint = my_model.deploy(
deployed_model_display_name='my-endpoint',
traffic_split={"0": 100},
machine_type="n1-standard-4",
accelerator_count=0,
min_replica_count=1,
max_replica_count=1,
)
6. Obtén predicciones
Predicciones en línea
Cuando tu modelo está implementado en un extremo, puedes seleccionarlo como cualquier otro extremo de REST, lo que significa que puedes llamarlo desde una Cloud Function, un chatbot, una app web, etcétera.
Para la demostración, llamaremos a este extremo desde Workbench.
Regresa al notebook que creaste en el lab anterior. En el selector, crea un nuevo notebook de TensorFlow 2.
Importa el SDK de Vertex AI para Python, NumPy y PIL.
from google.cloud import aiplatform
import numpy as np
from PIL import Image
Descarga la siguiente imagen y súbela a tu instancia de Workbench. Probaremos el modelo en esta imagen de un diente de león.
Primero, define el extremo. Deberás reemplazar {PROJECT_NUMBER}
y {ENDPOINT_ID}
, que aparecen a continuación.
endpoint = aiplatform.Endpoint(
endpoint_name="projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")
Puedes encontrar tu endpoint_id en la sección Extremos (Endpoints) de la consola de Cloud.
El Número del proyecto (Project Number) aparece en la página principal de la consola. Ten en cuenta que es diferente del ID del proyecto.
Con el siguiente código, se abre la imagen con PIL y se cambia su tamaño.
IMAGE_PATH = "test-image.jpg"
im = Image.open(IMAGE_PATH)
Luego, convierte los datos de NumPy al tipo float32 y a una lista. Los convertimos a una lista porque estos datos no se pueden serializar con JSON, por lo que no podemos enviarlos en el cuerpo de la solicitud.
x_test = np.asarray(im).astype(np.float32).tolist()
Por último, llama a endpoint.predict
.
endpoint.predict(instances=x_test).predictions
El resultado que obtienes es el resultado del modelo, que es una capa de softmax con 5 unidades. Si quisieras escribir lógica personalizada para mostrar la etiqueta de cadena en lugar del índice, podrías usar rutinas de predicción personalizadas.
Predicciones por lotes
Existen diferentes maneras de dar formato a tus datos para la predicción por lotes. Para que sea sencillo, vuelca los datos de NumPy en un archivo JSON, el que guardaremos en Cloud Storage.
with open('test-data.json', 'w') as fp:
json.dump(x_test, fp)
!gsutil cp test-data.json gs://{YOUR_BUCKET}
Luego, define el modelo. Esto es similar a definir el extremo, con la excepción que deberás proporcionar un MODEL_ID
en lugar de un ENDPOINT_ID
.
my_model=aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")
Puedes encontrar el ID del modelo seleccionando su nombre y versión en la sección Modelos (Models) de la consola y, luego, seleccionando DETALLES DE LA VERSIÓN (VERSION DETAILS).
Por último, usa el SDK para llamar a un trabajo de predicción por lotes, pasa la ruta de acceso de Cloud Storage en la que almacenaste el archivo JSON y proporciona una ubicación de Cloud Storage para que se almacenen en ella los resultados de la predicción.
batch_prediction_job = my_model.batch_predict(
job_display_name='flower_batch_predict',
gcs_source='gs://{YOUR_BUCKET}/test-data.json',
gcs_destination_prefix='gs://{YOUR_BUCKET}/prediction-results',
machine_type='n1-standard-4',)
Puedes hacer un seguimiento del progreso del trabajo en la sección Predicciones por lotes (Batch Predictions) de la consola. Ten en cuenta que ejecutar un trabajo de predicciones por lotes para una sola imagen no es eficiente.
Próximos pasos
En este ejemplo, convertimos la imagen de prueba a NumPy antes de realizar la llamada de predicción. En los casos de uso más realistas, te recomendamos enviar la imagen por sí sola, sin cargarla primero en NumPy. Para ello, deberás ajustar tu función de TensorFlow Serving para decodificar los bytes de la imagen. Esto requiere un poco más de trabajo, pero será más eficiente para las imágenes de mayor tamaño y la compilación de aplicaciones. Puedes ver un ejemplo en este notebook.
🎉 ¡Felicitaciones! 🎉
Aprendiste a usar Vertex AI para hacer lo siguiente:
- Importar modelos a Vertex AI Model Registry
- Obtener predicciones por lotes y en línea
Para obtener más información sobre las distintas partes de Vertex, consulta la documentación.
7. Realiza una limpieza
Te recomendamos anular la implementación de los modelos en el extremo si no planeas usarlos. También puedes borrar todo el extremo. Puedes volver a implementar los modelos si lo necesitas.
El tiempo de espera de los notebooks administrados de Workbench se agota automáticamente después de 180 minutos de inactividad, por lo que no necesitas preocuparte de cerrar la instancia. Si quieres cerrar la instancia de forma manual, haz clic en el botón Detener (Stop) en la sección Vertex AI Workbench de la consola. Si quieres borrar el notebook por completo, haz clic en el botón Borrar (Delete).
Para borrar el bucket de almacenamiento, en el menú de navegación de la consola de Cloud, navega a Almacenamiento, selecciona tu bucket y haz clic en Borrar (Delete):