Ejecuta el entrenamiento de modelos personalizados en Vertex Pipelines

1. Descripción general

En este lab, aprenderás a ejecutar un trabajo de entrenamiento de modelos personalizados con el SDK de Kubeflow Pipelines en Vertex Pipelines.

Qué aprenderá

Aprenderás a hacer lo siguiente:

  • Aprenderás a usar el SDK de canalizaciones de Kubeflow para compilar canalizaciones de AA escalables.
  • Crear y alojar en contenedores un trabajo de entrenamiento de modelos personalizados de scikit-learn que use conjuntos de datos administrados por Vertex AI y que se ejecute en Vertex AI Training dentro de una canalización
  • Ejecuta un trabajo de predicción por lotes en Vertex Pipelines
  • Aprenderás a usar componentes predefinidos para interactuar con los servicios de Vertex AI que se proporcionan mediante la biblioteca google_cloud_pipeline_components.

El costo total de la ejecución de este lab en Google Cloud es de aproximadamente USD 5.

2. Introducción a Vertex AI

En este lab, se usa Vertex AI, nuestra plataforma de AA administrada de extremo a extremo en Google Cloud. Vertex AI integra las ofertas de AA de Google en Google Cloud en una experiencia de desarrollo fluida. Además del entrenamiento de modelos y los servicios de implementación, Vertex AI también incluye una variedad de productos de MLOps, incluidos Vertex Pipelines (el producto en el que se enfoca este lab), Model Monitoring, Feature Store y muchos más. Puedes ver todas las ofertas de productos de Vertex AI en el diagrama que se muestra a continuación.

Descripción general del producto Vertex

Si tienes comentarios, consulta la página de asistencia.

¿Por qué son útiles las canalizaciones de AA?

Antes de comenzar, primero debes comprender por qué deberías usar canalizaciones. Imagina que estás creando un flujo de trabajo de AA que incluye procesar datos, entrenar un modelo, ajustar hiperparámetros y realizar evaluaciones, así como implementar modelos. Es posible que cada uno de estos pasos tenga dependencias diferentes, lo que podría ser difícil de manejar si tratas todo el flujo de trabajo como una aplicación monolítica. A medida que empiezas a escalar tu proceso de AA, es posible que quieras compartir el flujo de trabajo de AA con otras personas de tu equipo para que puedan ejecutarlo y agregar más código. Pero esto puede ser complicado sin un proceso confiable y reproducible. Con las canalizaciones, cada paso en tu proceso de AA tiene su propio contenedor. Así, podrás desarrollar pasos de forma independiente y hacer un seguimiento de la entrada y salida en cada paso de manera reproducible. Además, puedes programar o activar ejecuciones para tu canalización en función de otros eventos de tu entorno de Cloud, como iniciar la ejecución de una canalización cuando hay nuevos datos de entrenamiento disponibles.

Resumen: Las canalizaciones te ayudan a optimizar y reproducir tus flujos de trabajo de AA.

3. Configura el entorno de Cloud

Para ejecutar este codelab, necesitarás un proyecto de Google Cloud Platform que tenga habilitada la facturación. Para crear un proyecto, sigue estas instrucciones.

Paso 1: Inicia Cloud Shell

En este lab, trabajarás con una sesión de Cloud Shell, que es un intérprete de comandos alojado en una máquina virtual que se ejecuta en la nube de Google. Podrías ejecutar fácilmente esta sección de forma local, en tu computadora, pero Cloud Shell brinda una experiencia reproducible en un entorno coherente para todo el mundo. Después de este lab, puedes volver a probar esta sección en tu computadora.

Autoriza Cloud Shell

Activar Cloud Shell

En la parte superior derecha de la consola de Cloud, haz clic en el siguiente botón para Activar Cloud Shell:

Activar Cloud Shell

Si nunca has iniciado Cloud Shell, aparecerá una pantalla intermedia (mitad inferior de la página) en la que se describirá qué es. Si ese es el caso, haz clic en Continuar (y no volverás a verla). Así es como se ve la pantalla única:

Configuración de Cloud Shell

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

Inicial de Cloud Shell

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer simplemente con un navegador o tu Chromebook.

Una vez conectado a Cloud Shell, debería ver que ya se autenticó y que el proyecto ya se configuró con tu ID del proyecto.

En Cloud Shell, ejecuta el siguiente comando para confirmar que tienes la autenticación:

gcloud auth list

En el resultado del comando, deberías ver algo como esto:

Salida de Cloud Shell

En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto:

gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puedes configurarlo con el siguiente comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

Cloud Shell tiene algunas variables de entorno, incluida GOOGLE_CLOUD_PROJECT, que contiene el nombre de nuestro proyecto de Cloud actual. Lo usaremos en varios lugares a lo largo de este lab. Para verla, debes ejecutar lo siguiente:

echo $GOOGLE_CLOUD_PROJECT

Paso 2: Habilitar las API

Más adelante, verás en qué momento se necesitan estos servicios y por qué. Por ahora, ejecuta este comando para que tu proyecto pueda acceder a los servicios de Compute Engine, Container Registry y Vertex AI:

gcloud services enable compute.googleapis.com         \
                       containerregistry.googleapis.com  \
                       aiplatform.googleapis.com

Si se realizó correctamente, se mostrará un mensaje similar a este:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

Paso 3: Crea un bucket de Cloud Storage

Para ejecutar un trabajo de entrenamiento en Vertex AI, necesitaremos un bucket de almacenamiento para almacenar los recursos del modelo guardados. El bucket debe ser regional. Aquí usaremos us-central, pero puedes utilizar otra región (solo reemplázala donde corresponda en el lab). Si ya tiene un bucket, puede omitir este paso.

Ejecuta los siguientes comandos en la terminal de Cloud Shell para crear un bucket:

BUCKET_NAME=gs://$GOOGLE_CLOUD_PROJECT-bucket
gsutil mb -l us-central1 $BUCKET_NAME

Luego, debemos dar a la cuenta de servicio de Compute acceso a este bucket. Esto garantizará que Vertex Pipelines tenga los permisos necesarios para escribir archivos en el bucket. Ejecute el siguiente comando para agregar este permiso:

gcloud projects describe $GOOGLE_CLOUD_PROJECT > project-info.txt
PROJECT_NUM=$(cat project-info.txt | sed -nre 's:.*projectNumber\: (.*):\1:p')
SVC_ACCOUNT="${PROJECT_NUM//\'/}-compute@developer.gserviceaccount.com"
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member serviceAccount:$SVC_ACCOUNT --role roles/storage.objectAdmin

Paso 4: Crea una instancia de Vertex AI Workbench

En la sección Vertex AI de Cloud Console, haz clic en Workbench:

Menú Vertex AI

Allí, en Notebooks administrados por el usuario, haz clic en Nuevo notebook:

Crear notebook nuevo

Luego, selecciona el tipo de instancia TensorFlow Enterprise 2.3 (con LTS) sin GPUs:

Instancia de TFE

Usa las opciones predeterminadas y, luego, haz clic en Crear.

Paso 5: Abre tu notebook

Una vez que se crea la instancia, selecciona Abrir JupyterLab:

Abrir notebook

4. Configuración de Vertex Pipelines

Existen algunas bibliotecas adicionales que debemos instalar para usar Vertex Pipelines:

  • Kubeflow Pipelines: Este es el SDK que usaremos para compilar nuestra canalización. Vertex Pipelines admite canalizaciones en ejecución compiladas con Kubeflow Pipelines o TFX.
  • Componentes de canalizaciones de Google Cloud: Esta biblioteca proporciona componentes predefinidos que facilitan la interacción con los servicios de Vertex AI durante los pasos de tu canalización.

Paso 1: Crea un notebook de Python y, luego, instala bibliotecas

Primero, en el menú Selector de tu instancia de notebook (al que puedes acceder haciendo clic en el ícono de + en la esquina superior izquierda del notebook), selecciona Python 3 para crear un notebook:

Crear notebook de Python 3

Para acceder al menú Selector, haz clic en Acceder + en la esquina superior izquierda de tu instancia de notebook.

Para instalar los dos servicios que usaremos en este lab, primero hay que establecer la marca de usuario en una celda del notebook:

USER_FLAG = "--user"

Luego, ejecuta el siguiente comando en tu notebook:

!pip3 install {USER_FLAG} google-cloud-aiplatform==1.7.0 --upgrade
!pip3 install {USER_FLAG} kfp==1.8.9 google-cloud-pipeline-components==0.2.0

Luego de instalar estos paquetes, deberá reiniciar el kernel:

import os

if not os.getenv("IS_TESTING"):
    # Automatically restart kernel after installs
    import IPython

    app = IPython.Application.instance()
    app.kernel.do_shutdown(True)

Finalmente, verifique que instaló los paquetes de forma correcta. La versión del SDK de KFP debe ser igual o superior a 1.8:

!python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
!python3 -c "import google_cloud_pipeline_components; print('google_cloud_pipeline_components version: {}'.format(google_cloud_pipeline_components.__version__))"

Paso 2: Configura tu ID del proyecto y bucket

Durante este lab, podrá hacer referencia al ID del proyecto de Cloud y al bucket que creó anteriormente. A continuación, crearemos variables para cada uno de ellos.

Si desconoce el ID de su proyecto, probablemente logre obtenerlo mediante la ejecución del siguiente comando:

import os
PROJECT_ID = ""

# Get your Google Cloud project ID from gcloud
if not os.getenv("IS_TESTING"):
    shell_output=!gcloud config list --format 'value(core.project)' 2>/dev/null
    PROJECT_ID = shell_output[0]
    print("Project ID: ", PROJECT_ID)

De lo contrario, configúralo aquí:

if PROJECT_ID == "" or PROJECT_ID is None:
    PROJECT_ID = "your-project-id"  # @param {type:"string"}

Luego, cree una variable para almacenar el nombre de su bucket. Si lo creó en este lab, lo siguiente funcionará. De lo contrario, deberá configurarlo de forma manual:

BUCKET_NAME="gs://" + PROJECT_ID + "-bucket"

Paso 3: Importa bibliotecas

Agrega lo siguiente para importar las bibliotecas que utilizaremos durante este codelab:

from kfp.v2 import compiler, dsl
from kfp.v2.dsl import pipeline

from google.cloud import aiplatform
from google_cloud_pipeline_components import aiplatform as gcc_aip

Paso 4: Define las constantes

Lo último que debemos hacer antes de crear nuestra canalización es definir algunas variables constantes. PIPELINE_ROOT es la ruta de Cloud Storage en la que se escribirán los artefactos que cree nuestra canalización. Aquí estamos usando us-central1 como la región, pero si usaste una región diferente cuando creaste tu bucket, actualiza la variable REGION en el siguiente código:

PATH=%env PATH
%env PATH={PATH}:/home/jupyter/.local/bin
REGION="us-central1"

PIPELINE_ROOT = f"{BUCKET_NAME}/pipeline_root/"
PIPELINE_ROOT

Luego de ejecutar el código anterior, debería ver impreso el directorio raíz de su canalización. Esta es la ubicación de Cloud Storage en la que se escribirán los artefactos de su canalización, y tendrá el siguiente formato: gs://YOUR-BUCKET-NAME/pipeline_root/.

5. Configura un trabajo de entrenamiento de modelos personalizados

Antes de configurar nuestra canalización, debemos escribir el código de nuestro trabajo de entrenamiento de modelos personalizados. Para entrenar el modelo, usaremos el conjunto de datos de frijoles secos de UCI Machine Learning de KOKLU, M. y OZKAN, I.A., (2020), “Multiclass Classification of Dry Beans Using Computer Vision and Machine Learning Techniques”.En Computers and Electronics in Agriculture, 174, 105507. DOI.

En nuestro primer paso de canalización, crearemos un conjunto de datos administrado en Vertex AI con una tabla de BigQuery que contenga una versión de estos datos de frijoles. El conjunto de datos se pasará como entrada a nuestro trabajo de entrenamiento. En nuestro código de entrenamiento, tendremos acceso a la variable de entorno para acceder a este conjunto de datos administrado.

Así es como configuraremos nuestro trabajo de entrenamiento personalizado:

  • Escribir un modelo DecisionTreeClassifier de scikit-learn para clasificar los tipos de granos en nuestros datos
  • Empaqueta el código de entrenamiento en un contenedor de Docker y envíalo a Container Registry

Desde allí, podremos iniciar un trabajo de entrenamiento de Vertex AI directamente desde nuestra canalización. Comencemos.

Paso 1: Define nuestro código de entrenamiento en un contenedor de Docker

En tu instancia de Notebooks, abre el selector y selecciona Terminal:

Cómo abrir la terminal

Luego, ejecuta el siguiente comando para configurar un directorio en el que agregarás tu código en contenedor:

mkdir traincontainer
cd traincontainer
touch Dockerfile

mkdir trainer
touch trainer/train.py

Después de ejecutar esos comandos, deberías ver un directorio llamado traincontainer/ creado a la izquierda (es posible que debas hacer clic en el ícono de actualizar para verlo). En el directorio traincontainer/, verás lo siguiente:

+ Dockerfile
+ trainer/
    + train.py

El primer paso para alojar el código en un contenedor es crear un Dockerfile. En nuestro Dockerfile, incluiremos todos los comandos necesarios para ejecutar nuestra imagen. Se instalarán todas las bibliotecas que utilicemos y se configurará el punto de entrada para nuestro código de entrenamiento. Abre el Dockerfile que acabas de crear y agrega lo siguiente:

FROM gcr.io/deeplearning-platform-release/sklearn-cpu.0-23
WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

RUN pip install sklearn google-cloud-bigquery joblib pandas google-cloud-storage

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.train"]

Para guardar archivos a medida que los editas en la instancia de tu notebook, puedes usar ctrl+s.

A continuación, abre el archivo train.py. Aquí es donde agregaremos nuestro código de entrenamiento. Copia lo siguiente en train.py. Esto recupera los datos de nuestro conjunto de datos administrado, los coloca en un DataFrame de Pandas, entrena un modelo de Scikit-learn y lo sube a Cloud Storage:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_curve
from sklearn.model_selection import train_test_split
from google.cloud import bigquery
from google.cloud import storage
from joblib import dump

import os
import pandas as pd

bqclient = bigquery.Client()
storage_client = storage.Client()

def download_table(bq_table_uri: str):
    prefix = "bq://"
    if bq_table_uri.startswith(prefix):
        bq_table_uri = bq_table_uri[len(prefix):]

    table = bigquery.TableReference.from_string(bq_table_uri)
    rows = bqclient.list_rows(
        table,
    )
    return rows.to_dataframe(create_bqstorage_client=False)

# These environment variables are from Vertex AI managed datasets
training_data_uri = os.environ["AIP_TRAINING_DATA_URI"]
test_data_uri = os.environ["AIP_TEST_DATA_URI"]

# Download data into Pandas DataFrames, split into train / test
df = download_table(training_data_uri)
test_df = download_table(test_data_uri)
labels = df.pop("Class").tolist()
data = df.values.tolist()
test_labels = test_df.pop("Class").tolist()
test_data = test_df.values.tolist()

# Define and train the Scikit model
skmodel = DecisionTreeClassifier()
skmodel.fit(data, labels)
score = skmodel.score(test_data, test_labels)
print('accuracy is:',score)

# Save the model to a local file
dump(skmodel, "model.joblib")

# Upload the saved model file to GCS
bucket = storage_client.get_bucket("YOUR_GCS_BUCKET")
model_directory = os.environ["AIP_MODEL_DIR"]
storage_path = os.path.join(model_directory, "model.joblib")
blob = storage.blob.Blob.from_string(storage_path, client=storage_client)
blob.upload_from_filename("model.joblib")

Luego, regresa a tu notebook y ejecuta el siguiente comando para reemplazar YOUR_GCS_BUCKET de la secuencia de comandos anterior por el nombre de tu bucket de Cloud Storage:

BUCKET = BUCKET_NAME[5:] # Trim the 'gs://' before adding to train script
!sed -i -r 's@YOUR_GCS_BUCKET@'"$BUCKET"'@' traincontainer/trainer/train.py

También puedes hacerlo de forma manual si lo prefieres. Si lo haces, asegúrate de no incluir gs:// en el nombre del bucket cuando actualices la secuencia de comandos.

Ahora, nuestro código de entrenamiento está en un contenedor de Docker y tenemos todo listo para ejecutar el entrenamiento en la nube.

Paso 2: Envía el contenedor a Container Registry

Ahora que completamos el código de entrenamiento, podemos enviarlo a Google Container Registry. Más adelante, cuando configuremos el componente de entrenamiento de nuestra canalización, apuntaremos Vertex Pipelines a este contenedor.

Vuelve a la terminal y, desde la raíz del directorio traincontainer/, define una variable con el URI de la imagen de contenedor en Container Registry.

PROJECT_ID=$(gcloud config get-value project)
IMAGE_URI="gcr.io/$PROJECT_ID/scikit:v1"

Luego, ejecuta el siguiente comando para compilar el contenedor:

docker build ./ -t $IMAGE_URI

Por último, envía el contenedor a Container Registry:

docker push $IMAGE_URI

Navega a la sección de Container Registry de la consola de Cloud para verificar que el contenedor esté allí. Tendrá un aspecto similar a este:

Container Registry

6. Configura un trabajo de predicción por lotes

El último paso de nuestra canalización ejecutará un trabajo de predicción por lotes. Para que esto funcione, debemos proporcionar un archivo CSV en Cloud Storage que contenga los ejemplos sobre los que queremos obtener predicciones. Crearemos este archivo CSV en nuestro notebook y lo copiaremos en Cloud Storage con la herramienta de línea de comandos gsutil.

Cómo copiar ejemplos de predicciones por lotes en Cloud Storage

El siguiente archivo contiene 3 ejemplos de cada clase en nuestro conjunto de datos de frijoles. El siguiente ejemplo no incluye la columna Class, ya que eso es lo que nuestro modelo predecirá. Ejecuta el siguiente comando para crear este archivo CSV de forma local en tu notebook:

%%writefile batch_examples.csv
Area,Perimeter,MajorAxisLength,MinorAxisLength,AspectRation,Eccentricity,ConvexArea,EquivDiameter,Extent,Solidity,roundness,Compactness,ShapeFactor1,ShapeFactor2,ShapeFactor3,ShapeFactor4
23288,558.113,207.567738,143.085693,1.450653336,0.7244336162,23545,172.1952453,0.8045881703,0.9890847314,0.9395021523,0.8295857874,0.008913077034,0.002604069884,0.6882125787,0.9983578734
23689,575.638,205.9678003,146.7475015,1.403552348,0.7016945718,24018,173.6714472,0.7652721693,0.9863019402,0.8983750474,0.8431970773,0.00869465998,0.002711119968,0.7109813112,0.9978994889
23727,559.503,189.7993849,159.3717704,1.190922235,0.5430731512,24021,173.8106863,0.8037601626,0.9877607094,0.952462433,0.9157600082,0.007999299741,0.003470231343,0.8386163926,0.9987269085
31158,641.105,212.0669751,187.1929601,1.132879009,0.4699241567,31474,199.1773023,0.7813134733,0.989959967,0.9526231013,0.9392188582,0.0068061806,0.003267009878,0.8821320637,0.9993488983
32514,649.012,221.4454899,187.1344232,1.183349841,0.5346736437,32843,203.4652564,0.7849831,0.9899826447,0.9700068737,0.9188051492,0.00681077351,0.002994124691,0.8442029022,0.9989873701
33078,659.456,235.5600775,178.9312328,1.316483846,0.6503915309,33333,205.2223615,0.7877214708,0.9923499235,0.9558229607,0.8712102818,0.007121351881,0.002530662194,0.7590073551,0.9992209221
33680,683.09,256.203255,167.9334938,1.525623324,0.7552213942,34019,207.081404,0.80680321,0.9900349805,0.9070392732,0.8082699962,0.007606985006,0.002002710402,0.6533003868,0.9966903078
33954,716.75,277.3684803,156.3563259,1.773951126,0.825970469,34420,207.9220419,0.7994819873,0.9864613597,0.8305492781,0.7496238998,0.008168948587,0.001591181142,0.5619359911,0.996846984
36322,719.437,272.0582306,170.8914975,1.591993952,0.7780978465,36717,215.0502424,0.7718560075,0.9892420405,0.8818487005,0.7904566678,0.007490177594,0.001803782407,0.6248217437,0.9947124371
36675,742.917,285.8908964,166.8819538,1.713132487,0.8119506999,37613,216.0927123,0.7788277766,0.9750618137,0.8350248381,0.7558572692,0.0077952528,0.001569528272,0.5713202115,0.9787472145
37454,772.679,297.6274753,162.1493177,1.835514817,0.8385619338,38113,218.3756257,0.8016695205,0.9827093118,0.7883332637,0.7337213257,0.007946480356,0.001420623993,0.5383469838,0.9881438654
37789,766.378,313.5680678,154.3409867,2.031657789,0.8704771226,38251,219.3500608,0.7805870567,0.9879218844,0.8085170916,0.6995293312,0.008297866252,0.001225659709,0.4893412853,0.9941740339
47883,873.536,327.9986493,186.5201272,1.758516115,0.822571799,48753,246.9140116,0.7584464543,0.9821549443,0.7885506623,0.7527897207,0.006850002074,0.00135695419,0.5666923636,0.9965376533
49777,861.277,300.7570338,211.6168613,1.42123379,0.7105823885,50590,251.7499649,0.8019106536,0.9839296304,0.843243269,0.8370542883,0.00604208839,0.001829706116,0.7006598815,0.9958014989
49882,891.505,357.1890036,179.8346914,1.986207449,0.8640114945,51042,252.0153467,0.7260210171,0.9772736178,0.7886896753,0.7055518063,0.007160679276,0.001094585314,0.4978033513,0.9887407248
53249,919.923,325.3866286,208.9174205,1.557489212,0.7666552108,54195,260.3818974,0.6966846347,0.9825445152,0.7907120655,0.8002231025,0.00611066177,0.001545654241,0.6403570138,0.9973491406
61129,964.969,369.3481688,210.9473449,1.750902193,0.8208567513,61796,278.9836198,0.7501135067,0.9892064211,0.8249553283,0.7553404711,0.006042110436,0.001213219664,0.5705392272,0.9989583843
61918,960.372,353.1381442,224.0962377,1.575832543,0.7728529173,62627,280.7782864,0.7539207091,0.9886790043,0.8436218213,0.7950947556,0.005703319619,0.00140599258,0.6321756704,0.9962029945
141953,1402.05,524.2311633,346.3974998,1.513380332,0.7505863011,143704,425.1354762,0.7147107987,0.9878152313,0.9074598849,0.8109694843,0.003692991084,0.0009853172185,0.6576715044,0.9953071199
145285,1440.991,524.9567463,353.0769977,1.486805285,0.7400216694,146709,430.0960442,0.7860466375,0.9902937107,0.8792413513,0.8192980608,0.003613289371,0.001004269363,0.6712493125,0.9980170255
146153,1476.383,526.1933264,356.528288,1.475881001,0.7354662103,149267,431.3789276,0.7319360978,0.9791380546,0.8425962592,0.8198107159,0.003600290972,0.001003163512,0.6720896099,0.991924286

Luego, copia el archivo en tu bucket de Cloud Storage:

!gsutil cp batch_examples.csv $BUCKET_NAME

Consultaremos este archivo en el siguiente paso cuando definamos nuestra canalización.

7. Cómo compilar una canalización con componentes creados previamente

Ahora que nuestro código de entrenamiento está en la nube, tenemos todo listo para llamarlo desde nuestra canalización. La canalización que definiremos usará tres componentes precompilados de la biblioteca google_cloud_pipeline_components que instalamos antes. Estos componentes predefinidos simplifican el código que debemos escribir para configurar nuestra canalización y nos permitirán usar servicios de Vertex AI, como el entrenamiento de modelos y la predicción por lotes.

Esto es lo que hará nuestra canalización de tres pasos:

  • Crea un conjunto de datos administrado en Vertex AI
  • Ejecuta un trabajo de entrenamiento en Vertex AI con el contenedor personalizado que configuramos
  • Ejecuta un trabajo de predicción por lotes en nuestro modelo de clasificación de scikit-learn entrenado

Paso 1: Define nuestra canalización

Debido a que usamos componentes previamente compilados, podemos configurar nuestra canalización completa en la definición de la canalización. Agrega lo siguiente a una celda de notebook:

@pipeline(name="automl-beans-custom",
                  pipeline_root=PIPELINE_ROOT)
def pipeline(
    bq_source: str = "bq://sara-vertex-demos.beans_demo.large_dataset",
    bucket: str = BUCKET_NAME,
    project: str = PROJECT_ID,
    gcp_region: str = REGION,
    bq_dest: str = "",
    container_uri: str = "",
    batch_destination: str = ""
):
    dataset_create_op = gcc_aip.TabularDatasetCreateOp(
        display_name="tabular-beans-dataset",
        bq_source=bq_source,
        project=project,
        location=gcp_region
    )

    training_op = gcc_aip.CustomContainerTrainingJobRunOp(
        display_name="pipeline-beans-custom-train",
        container_uri=container_uri,
        project=project,
        location=gcp_region,
        dataset=dataset_create_op.outputs["dataset"],
        staging_bucket=bucket,
        training_fraction_split=0.8,
        validation_fraction_split=0.1,
        test_fraction_split=0.1,
        bigquery_destination=bq_dest,
        model_serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.0-24:latest",
        model_display_name="scikit-beans-model-pipeline",
        machine_type="n1-standard-4",
    )
    batch_predict_op = gcc_aip.ModelBatchPredictOp(
        project=project,
        location=gcp_region,
        job_display_name="beans-batch-predict",
        model=training_op.outputs["model"],
        gcs_source_uris=["{0}/batch_examples.csv".format(BUCKET_NAME)],
        instances_format="csv",
        gcs_destination_output_uri_prefix=batch_destination,
        machine_type="n1-standard-4"
    )

Paso 2: Compila y ejecuta la canalización

Luego de que definas la canalización, la podrás compilar. El siguiente comando generará un archivo JSON que utilizará para ejecutarla:

compiler.Compiler().compile(
    pipeline_func=pipeline, package_path="custom_train_pipeline.json"
)

A continuación, crea una variable TIMESTAMP. Lo usaremos en nuestro ID de trabajo:

from datetime import datetime

TIMESTAMP = datetime.now().strftime("%Y%m%d%H%M%S")

Luego, define tu trabajo de canalización y pasa algunos parámetros específicos del proyecto:

pipeline_job = aiplatform.PipelineJob(
    display_name="custom-train-pipeline",
    template_path="custom_train_pipeline.json",
    job_id="custom-train-pipeline-{0}".format(TIMESTAMP),
    parameter_values={
        "project": PROJECT_ID,
        "bucket": BUCKET_NAME,
        "bq_dest": "bq://{0}".format(PROJECT_ID),
        "container_uri": "gcr.io/{0}/scikit:v1".format(PROJECT_ID),
        "batch_destination": "{0}/batchpredresults".format(BUCKET_NAME)
    },
    enable_caching=True,
)

Por último, ejecuta el trabajo para crear una ejecución de canalización nueva:

pipeline_job.submit()

Después de ejecutar esta celda, deberías ver registros con un vínculo para ver la ejecución de la canalización en tu consola:

Registros de trabajos de canalización

Navega a ese vínculo. También puedes acceder a él abriendo el panel de canalizaciones. Tu canalización debería verse de la siguiente manera cuando se complete:

Canalización de introducción completada

Esta canalización demorará de 5 a 10 minutos en ejecutarse, pero puedes continuar con el siguiente paso antes de completarse. A continuación, obtendrás más información sobre lo que sucede en cada uno de estos pasos de canalización.

8. Comprende la ejecución de tu canalización

Analicemos con más detalle cada uno de los tres pasos de la canalización.

Paso 1 de la canalización: Crea un conjunto de datos administrado

El primer paso de nuestra canalización crea un conjunto de datos administrado en Vertex AI. Si haces clic en el siguiente vínculo del conjunto de datos en la sección Canalizaciones de tu consola:

Vínculo al conjunto de datos desde la canalización

Verás tu conjunto de datos en Vertex AI, que incluye un vínculo a la fuente de datos en BigQuery junto con información sobre las diferentes columnas de tu conjunto de datos. Una vez que subas un conjunto de datos administrado a Vertex AI, se podrá usar para entrenar un modelo de AutoML o personalizado.

En el caso de los trabajos de modelos personalizados que usan conjuntos de datos administrados, Vertex AI pasa variables de entorno especiales a tus trabajos de entrenamiento y se encarga de dividir tus datos en conjuntos de entrenamiento y prueba. Lo usaremos en el siguiente paso de la canalización.

Paso 2 de la canalización: Entrena un modelo en Vertex AI Training

Mientras se ejecuta tu trabajo de entrenamiento personalizado, puedes hacer clic para ver los registros directamente en la consola de Vertex Pipelines:

Registros de entrenamiento personalizados

También puedes ver los detalles en el trabajo de entrenamiento personalizado en tu panel de Vertex AI Training. Cuando se complete el trabajo de entrenamiento, se creará un recurso de modelo en Vertex AI. A continuación, podemos implementar este modelo en un extremo para realizar predicciones en línea o crear un trabajo de predicción por lotes, que haremos en el siguiente paso de la canalización.

Paso 3 de la canalización: Ejecuta un trabajo de predicción por lotes en nuestro modelo

Por último, nuestra canalización obtendrá predicciones sobre los ejemplos que pasamos a través de un archivo CSV. Cuando se complete el trabajo de predicción por lotes, Vertex AI escribirá un archivo CSV en la ubicación que especificamos en Cloud Storage. Cuando este paso de la canalización empiece a ejecutarse, puedes navegar a la sección Predicciones por lotes de la consola de Vertex AI para ver el trabajo creado.

Haz clic en el trabajo cuando se complete para ver la URL de Cloud Storage de tus predicciones por lotes:

Trabajo de predicción por lotes

Haz clic en ese vínculo para ir al directorio de Cloud Storage en el que puedes encontrar los resultados de la predicción y, luego, haz clic para descargar uno de los archivos prediction.results. En el archivo, deberías ver filas que se ven de la siguiente manera:

{"instance": [33954.0, 716.75, 277.3684803, 156.3563259, 1.773951126, 0.825970469, 34420.0, 207.9220419, 0.7994819873, 0.9864613597, 0.8305492781, 0.7496238998, 0.008168948587, 0.001591181142, 0.5619359911, 0.996846984], "prediction": "HOROZ"}

Esto incluye los valores de atributos de una instancia particular, junto con la clase que predijo nuestro modelo. En este ejemplo, nuestro modelo considera que se trataba de un grano de "HOROZ".

Con eso, habrás terminado el lab.

🎉 ¡Felicitaciones! 🎉

Aprendiste a usar Vertex AI para hacer lo siguiente:

  • Usa el SDK de Kubeflow Pipelines para compilar canalizaciones de extremo a extremo con componentes personalizados
  • Ejecuta tus canalizaciones en Vertex Pipelines y, luego, inicia las ejecuciones de estas con el SDK
  • Ver y analizar tu gráfico de Vertex Pipelines en la consola
  • Usar componentes de canalizaciones compilados previamente para agregar servicios de Vertex AI a tu canalización
  • Programa trabajos de canalización recurrentes

Para obtener más información sobre las distintas partes de Vertex, consulte la documentación.

9. Limpieza

Para que no se te cobre, te recomendamos que borres los recursos que creaste a lo largo de este lab.

Paso 1: Detén o borra la instancia de Notebooks

Si quieres continuar usando el notebook que creaste en este lab, te recomendamos que lo desactives cuando no lo utilices. En la IU de Notebooks de la consola de Cloud, selecciona el notebook y, luego, haz clic en Detener. Si quieres borrar la instancia por completo, selecciona Borrar:

Detener instancias

Paso 2: Borra el bucket de Cloud Storage

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