Del prototipo a la producción: Obtén predicciones a partir de modelos entrenados de forma personalizada

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

Descripción general del producto Vertex

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.

training_prediction

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.

menú Modelos

Selecciona IMPORTAR (IMPORT).

import_model

Selecciona Importar como modelo nuevo (Import as new model) y, luego, asígnale un nombre al modelo.

new_model

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.

flower_model

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).

deploy_model

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).

endpoint_name

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).

endpoint_compute

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.

tf_kernel

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.

test_image

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.

endpoint_id

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.

project_number

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).

model_id

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.

batch_pred

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.

undeploy_model

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).

Detener instancias

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):

Borrar almacenamiento