Como executar treinamentos de modelos personalizados no Vertex Pipelines

1. Visão geral

Neste laboratório, você vai aprender a executar um job de treinamento de modelo personalizado usando o SDK do Kubeflow Pipelines no Vertex Pipelines.

Conteúdo do laboratório

Você vai aprender a:

  • usar o SDK do Kubeflow Pipelines para criar pipelines de ML escalonáveis;
  • Criar e conteinerizar um job de treinamento de modelo personalizado do Scikit-learn que usa conjuntos de dados gerenciados na Vertex AI e será executado no Vertex AI Training em um pipeline
  • Executar um job de previsão em lote no Vertex Pipelines
  • Usar componentes pré-criados para interagir com os serviços da Vertex AI, usando a biblioteca google_cloud_pipeline_components

O custo total da execução deste laboratório no Google Cloud é de aproximadamente US$5.

2. Introdução à Vertex AI

Este laboratório usa a Vertex AI, nossa plataforma de ML gerenciada completa no Google Cloud. A Vertex AI integra as ofertas de ML do Google no Google Cloud em uma experiência de desenvolvimento intuitiva. Além de oferecer treinamento de modelos e serviços de implantação, a Vertex AI também inclui uma variedade de produtos de MLOps, como o Vertex Pipelines (o assunto desse laboratório), Monitoramento de modelos, Feature Store e outros. Confira todos as ofertas de produtos da Vertex AI no diagrama abaixo.

Visão geral do produto Vertex

Se você tiver algum feedback, consulte a página de suporte.

Por que pipelines de ML são úteis?

Antes de começar, primeiro entenda em quais situações você usaria um pipeline. Imagine que você está criando um fluxo de trabalho de ML que inclui processamento de dados, treinamento de modelos, ajuste de hiperparâmetros, avaliação e implantação de modelos. Cada uma dessas etapas pode ter dependências diferentes, o que pode ser difícil de administrar se você tratar o fluxo inteiro como algo monolítico. Ao começar a escalonar seu processo de ML, você pode querer compartilhar seu fluxo de trabalho de ML com outras pessoas da sua equipe para que elas possam executar e colaborar com código. Sem um processo confiável e possível de ser reproduzido, isso pode ser difícil. Com pipelines, cada etapa do seu processo de ML é um contêiner próprio, o que permite que você desenvolva as etapas independentemente e rastreie a entrada e a saída de cada etapa de maneira possível de ser reproduzida. Você também pode agendar ou acionar execuções do seu pipeline com base em outros eventos do seu ambiente do Cloud, como iniciar uma execução de pipeline quando novos dados de treinamento estiverem disponíveis.

Resumo: os pipelines ajudam a simplificar e reproduzir seus fluxos de trabalho de ML.

3. configure o ambiente do Cloud

Para executar este codelab, você vai precisar de um projeto do Google Cloud Platform com o faturamento ativado. Para criar um projeto, siga estas instruções.

Etapa 1: iniciar o Cloud Shell

Neste laboratório, você vai trabalhar em uma sessão do Cloud Shell, que é um interpretador de comandos hospedado por uma máquina virtual em execução na nuvem do Google. A sessão também pode ser executada localmente no seu computador, mas se você usar o Cloud Shell, todas as pessoas vão ter acesso a uma experiência reproduzível em um ambiente consistente. Após concluir o laboratório, é uma boa ideia testar a sessão no seu computador.

Autorizar o Cloud Shell

Ativar o Cloud Shell

No canto superior direito do Cloud Console, clique no botão abaixo para ativar o Cloud Shell:

Ativar o Cloud Shell

Se você nunca iniciou o Cloud Shell, vai aparecer uma tela intermediária (abaixo da dobra) com a descrição dele. Se esse for o caso, clique em Continuar e você não vai encontrar essa tela novamente. Esta é a aparência dessa tela única:

Configuração do Cloud Shell

Leva apenas alguns instantes para provisionar e se conectar ao Cloud Shell.

Inicialização do Cloud Shell

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Praticamente todo o seu trabalho neste codelab pode ser feito em um navegador ou no seu Chromebook.

Depois de se conectar ao Cloud Shell, você já estará autenticado e o projeto já estará configurado com seu ID do projeto.

Execute o seguinte comando no Cloud Shell para confirmar se a conta está autenticada:

gcloud auth list

A saída do comando vai ser parecida com esta:

Saída do Cloud Shell

Execute o comando a seguir no Cloud Shell para confirmar se o comando gcloud sabe sobre seu projeto:

gcloud config list project

Resposta ao comando

[core]
project = <PROJECT_ID>

Se o projeto não estiver configurado, configure-o usando este comando:

gcloud config set project <PROJECT_ID>

Resposta ao comando

Updated property [core/project].

O Cloud Shell tem algumas variáveis de ambiente, incluindo GOOGLE_CLOUD_PROJECT, que contém o nome do nosso projeto atual do Cloud. Vamos usar esses dados várias vezes neste laboratório. É possível ver essa variável ao executar:

echo $GOOGLE_CLOUD_PROJECT

Etapa 2: ativar as APIs

Nas próximas etapas, você vai entender onde e por que esses serviços são necessários. Por enquanto, apenas execute este comando para conceder ao seu projeto acesso aos serviços do Compute Engine, Container Registry e Vertex AI:

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

Uma mensagem semelhante a esta vai aparecer:

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

Etapa 3: criar um bucket do Cloud Storage

Para executar um job de treinamento na Vertex AI, precisamos de um bucket de armazenamento para armazenar os recursos de modelo salvos. O bucket precisa ser regional. Estamos usando us-central aqui, mas você pode usar qualquer outra, é só fazer a substituição durante o laboratório. Se você já tem um bucket, pule esta etapa.

Execute os comandos a seguir no terminal do Cloud Shell para criar um bucket:

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

A próxima etapa é configurar o acesso da conta de serviço do computador a esse bucket. Isso garante que o Vertex Pipelines tenha as permissões necessárias para gravar arquivos no bucket. Execute o comando a seguir para adicionar essa permissão:

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

Etapa 4: criar uma instância do Vertex AI Workbench

Na seção Vertex AI do Console do Cloud, clique em "Workbench":

Menu da Vertex AI

Em Notebooks gerenciados pelo usuário, clique em Novo notebook:

Criar um novo notebook

Em seguida, selecione o tipo de instância TensorFlow Enterprise 2.3 (com LTS) sem GPUs:

Instância do TFE

Use as opções padrão e clique em Criar.

Etapa 5: abrir o notebook

Depois que a instância for criada, selecione Abrir JupyterLab:

Abrir Notebook

4. Configuração do Vertex Pipelines

É preciso instalar algumas bibliotecas adicionais para usar o Vertex Pipelines:

  • Kubeflow Pipelines: é o SDK que vamos usar para criar o pipeline. O Vertex Pipelines suporta pipelines em execução criados com o Kubeflow Pipelines ou o TFX.
  • Componentes de pipeline do Google Cloud: essa biblioteca oferece componentes pré-criados que facilitam a interação com os serviços da Vertex AI nas etapas do seu pipeline.

Etapa 1: criar o notebook Python e instalar as bibliotecas

Primeiro, no menu inicial da sua instância do Notebook (que pode ser acessado clicando no ícone + no canto superior esquerdo do notebook), crie um notebook selecionando Python 3:

Criar notebook Python3

Para acessar o menu inicial, clique no sinal de + no canto superior esquerdo da sua instância do notebook.

Para instalar os serviços que vamos usar neste laboratório, primeiro configure a sinalização do usuário em uma célula do notebook:

USER_FLAG = "--user"

Em seguida, execute o seguinte no seu 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

Depois de instalar esses pacotes, será necessário reiniciar o 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)

Por fim, verifique se os pacotes foram instalados corretamente. A versão do SDK do KFP precisa ser igual ou mais recente do que 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__))"

Etapa 2: configurar o ID do projeto e o bucket

Neste laboratório, você vai fazer referência ao ID do projeto do Cloud e ao bucket que você criou anteriormente. Em seguida, vamos criar variáveis para cada um.

Se não souber o ID do projeto, você pode consegui-lo executando o seguinte:

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)

Caso contrário, defina aqui:

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

Depois, crie uma variável para armazenar o nome do seu bucket. Se você criou neste laboratório, as próximas etapas vão funcionar. Caso contrário, configure manualmente o que é mostrado a seguir:

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

Etapa 3: importar as bibliotecas

Adicione o seguinte para importar as bibliotecas que vamos usar 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

Etapa 4: definir as constantes

Por último, precisamos definir algumas variáveis constantes antes de criar o pipeline. PIPELINE_ROOT é o caminho do Cloud Storage em que os artefatos criados pelo seu pipeline foram gravados. Aqui, estamos usando us-central1 como a região, mas, se você usou uma região diferente quando criou o bucket, atualize a variável REGION no código abaixo:

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

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

Depois de executar o código acima, você verá o diretório raiz do seu pipeline. Esse é o local do Cloud Storage em que os artefatos do seu pipeline serão gravados. Ele estará no formato gs://YOUR-BUCKET-NAME/pipeline_root/

5. Como configurar um job de treinamento de modelo personalizado

Antes de configurar o pipeline, precisamos escrever o código para o job de treinamento do modelo personalizado. Para treinar o modelo, vamos usar o conjunto de dados Dry beans (feijões secos) do UCI Machine Learning, de: KOKLU, M. e OZKAN, I.A., (2020), "Multiclass Classification of Dry Beans Using Computer Vision and Machine Learning Techniques."In Computers and Electronics in Agriculture, 174, 105507. DOI

Nossa primeira etapa do pipeline vai criar um conjunto de dados gerenciado na Vertex AI usando uma tabela do BigQuery com uma versão desses dados de grãos. O conjunto de dados será transmitido como entrada para nosso job de treinamento. No código de treinamento, teremos acesso à variável de ambiente para acessar esse conjunto de dados gerenciado.

Veja como vamos configurar nosso job de treinamento personalizado:

  • Crie um modelo DecisionTreeClassifier do Scikit-learn para classificar os tipos de grão nos dados
  • Empacotar o código de treinamento em um contêiner do Docker e enviar para o Container Registry

Depois disso, será possível iniciar um job do Vertex AI Training diretamente pelo pipeline. Vamos começar!

Etapa 1: definir o código de treinamento em um contêiner do Docker

Na instância de notebooks, abra o Launcher e selecione Terminal:

Abrir terminal

Em seguida, execute o seguinte para configurar um diretório em que você vai adicionar o código conteinerizado:

mkdir traincontainer
cd traincontainer
touch Dockerfile

mkdir trainer
touch trainer/train.py

Depois de executar esses comandos, um diretório chamado traincontainer/ será criado à esquerda. Talvez seja necessário clicar no ícone de atualização para vê-lo. Você verá o seguinte no diretório traincontainer/:

+ Dockerfile
+ trainer/
    + train.py

A primeira etapa na conteinerização do código é criar um Dockerfile. No Dockerfile, vamos incluir todos os comandos necessários para executar a imagem. Isso vai resultar na instalação de todas as bibliotecas que você estiver usando e na configuração do ponto de entrada do seu código de treinamento. Abra o Dockerfile que você acabou de criar e adicione o seguinte:

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 salvar arquivos enquanto os edita na instância do notebook, use ctrl+s.

Em seguida, abra o arquivo train.py. É aqui que vamos adicionar o código de treinamento. Copie o seguinte para train.py. Isso recupera os dados do nosso conjunto de dados gerenciado, os coloca em um DataFrame do Pandas, treina um modelo Scikit-learn e faz o upload do modelo treinado para o 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")

Em seguida, volte ao seu notebook e execute o seguinte comando para substituir YOUR_GCS_BUCKET do script acima pelo nome do bucket do 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

Você também pode fazer isso manualmente, se preferir. Se você fizer isso, não inclua gs:// no nome do bucket ao atualizar o script.

Agora nosso código de treinamento está em um contêiner do Docker, e estamos prontos para executar o treinamento na nuvem.

Etapa 2: enviar o contêiner para o Container Registry

Depois de concluir o código de treinamento, podemos enviá-lo para o Google Container Registry. Mais tarde, ao configurar o componente de treinamento do nosso pipeline, vamos apontar o Vertex Pipelines para esse contêiner.

Volte para o terminal e, na raiz do diretório traincontainer/, defina uma variável com o URI da imagem do contêiner no Container Registry.

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

Em seguida, crie o contêiner executando o seguinte:

docker build ./ -t $IMAGE_URI

Por fim, envie o contêiner para o Container Registry:

docker push $IMAGE_URI

Acesse a seção "Container Registry" do console do Cloud para verificar se o contêiner está lá. Algo parecido com isto será exibido:

Container Registry

6. Como configurar um job de previsão em lote

A última etapa do pipeline vai executar um job de previsão em lote. Para que isso funcione, precisamos fornecer um arquivo CSV no Cloud Storage com os exemplos sobre os quais queremos fazer previsões. Vamos criar esse arquivo CSV no seu notebook e copiá-lo para o Cloud Storage usando a ferramenta de linha de comando gsutil.

Como copiar exemplos de previsão em lote para o Cloud Storage

O arquivo a seguir contém três exemplos de cada classe no conjunto de dados de feijões. O exemplo abaixo não inclui a coluna Class, já que é ela que o modelo vai prever. Execute o comando a seguir para criar esse arquivo CSV localmente no 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

Em seguida, copie o arquivo para o bucket do Cloud Storage:

!gsutil cp batch_examples.csv $BUCKET_NAME

Vamos fazer referência a esse arquivo na próxima etapa, quando definirmos o pipeline.

7. Criar um pipeline com componentes pré-criados

Agora que o código de treinamento está na nuvem, podemos fazer a chamada dele no pipeline. O pipeline que vamos definir vai usar três componentes pré-criados da biblioteca google_cloud_pipeline_components que instalamos anteriormente. Esses componentes predefinidos simplificam o código que precisamos escrever para configurar nosso pipeline e nos permitem usar serviços da Vertex AI, como treinamento de modelos e previsão em lote.

Veja o que nosso pipeline de três etapas fará:

  • Criar um conjunto de dados gerenciado na Vertex AI
  • Executar um job de treinamento na Vertx AI usando o contêiner personalizado que configuramos
  • Executar um job de previsão em lote no nosso modelo de classificação treinado do Scikit-learn

Etapa 1: definir o pipeline

Como estamos usando componentes pré-criados, podemos configurar todo o pipeline na definição dele. Adicione o seguinte a uma célula do 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"
    )

Etapa 2: compilar e executar o pipeline

Com seu pipeline definido, está tudo pronto para compilá-lo. O código a seguir gera um arquivo JSON que você vai usar para executar o pipeline:

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

Em seguida, crie uma variável TIMESTAMP. Vamos usar isso no nosso ID de trabalho:

from datetime import datetime

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

Em seguida, defina o job do pipeline, passando alguns parâmetros específicos do projeto:

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 fim, execute o job para criar uma nova execução de pipeline:

pipeline_job.submit()

Depois de executar essa célula, você verá registros com um link para visualizar a execução do pipeline no console:

Registros de jobs de pipeline

Acesse esse link. Também é possível acessar esse recurso abrindo o painel de pipelines. Seu pipeline vai ficar assim quando concluído:

Pipeline de introdução concluído

Esse pipeline vai levar de 5 a 10 minutos para ser executado, mas você pode continuar para a próxima etapa antes que ele seja concluído. A seguir, você aprenderá mais sobre o que acontece em cada uma dessas etapas do pipeline.

8. Entender a execução do pipeline

Vamos analisar melhor cada uma das três etapas do pipeline.

Etapa 1 do pipeline: criar um conjunto de dados gerenciado

A primeira etapa do pipeline cria um conjunto de dados gerenciado na Vertex AI. Se você clicar no link do conjunto de dados na seção "Pipelines" do console:

Link do pipeline para o conjunto de dados

O conjunto de dados vai aparecer na Vertex AI, incluindo um link para a fonte de dados no BigQuery e informações sobre as diferentes colunas. Depois de fazer upload de um conjunto de dados gerenciado para a Vertex AI, ele pode ser usado para treinar um modelo AutoML ou personalizado.

Para jobs de modelos personalizados que usam conjuntos de dados gerenciados, a Vertex AI transmite variáveis de ambiente especiais para os jobs de treinamento e lida com a divisão dos dados em conjuntos de treinamento e teste. Vamos usar isso na próxima etapa do pipeline.

Etapa 2 do pipeline: treinar um modelo no Vertex AI Training

Enquanto o job de treinamento personalizado estiver em execução, clique para ver os registros diretamente no console do Vertex Pipelines:

Registros de treinamento personalizados

Também é possível conferir detalhes sobre o job de treinamento personalizado no painel de treinamento da Vertex AI. Quando o job de treinamento for concluído, um recurso modelo será criado na Vertex AI. Em seguida, é possível implantar esse modelo em um endpoint para previsões on-line ou para criar um job de previsão em lote, o que será feito na próxima etapa do pipeline.

Etapa 3 do pipeline: executar um job de previsão em lote no modelo

Por fim, o pipeline vai receber previsões sobre os exemplos que transmitimos por um arquivo CSV. Quando o job de previsão em lote é concluído, a Vertex AI grava um arquivo CSV no local especificado no Cloud Storage. Quando a execução dessa etapa do pipeline começar, acesse a seção "Previsões em lote" do console da Vertex AI para conferir o job criado.

Clique no job quando ele for concluído para conferir o URL do Cloud Storage das previsões em lote:

Job de previsão em lote

Clique nesse link para acessar o diretório do Cloud Storage, onde você encontra os resultados da previsão, e clique para fazer o download de um dos arquivos prediction.results. No arquivo, você vai encontrar linhas parecidas com esta:

{"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"}

Isso inclui os valores de atributo de uma instância específica e a classe prevista pelo modelo. Neste exemplo, nosso modelo acha que se trata de um bean "HOROZ".

Com isso, você concluiu o laboratório.

Parabéns! 🎉

Você aprendeu a usar a Vertex AI para:

  • Usar o SDK do Kubeflow Pipelines para criar pipelines completos com componentes personalizados
  • Executar pipelines no Vertex Pipelines e iniciar execuções do pipeline com o SDK
  • Acessar e analisar o gráfico do Vertex Pipelines no console
  • Usar componentes de pipeline pré-criados para adicionar serviços da Vertex AI ao pipeline
  • Programar jobs recorrentes de pipeline

Para saber mais sobre as diferentes partes da Vertex, consulte a documentação.

9. Limpeza

Para que você não seja cobrado, recomendamos que exclua os recursos criados neste laboratório.

Etapa 1: interromper ou excluir a instância do Notebooks

Se você quiser continuar usando o notebook que criou neste laboratório, é recomendado que você o desligue quando não estiver usando. A partir da interface de Notebooks no seu Console do Cloud, selecione o notebook e depois clique em Parar. Se quiser excluir a instância por completo, selecione Excluir:

Interromper instância

Etapa 2: excluir o bucket do Cloud Storage

Para excluir o bucket do Storage, use o menu de navegação do console do Cloud, acesse o Storage, selecione o bucket e clique em "Excluir":

Excluir armazenamento