Prototipazione alla produzione: addestramento di modelli personalizzati con Vertex AI

1. Panoramica

In questo lab utilizzerai Vertex AI per eseguire un job di addestramento personalizzato.

Questo lab fa parte della serie di video Prototype to Production. Creerai un modello di classificazione delle immagini utilizzando il set di dati Flowers. Per saperne di più, guarda il video allegato:

.

Cosa imparerai

Al termine del corso sarai in grado di:

  • Crea un blocco note gestito da Vertex AI Workbench
  • Configura e avvia un job di addestramento personalizzato dalla UI di Vertex AI
  • Configurare e lanciare un job di addestramento personalizzato con l'SDK Vertex AI Python

Il costo totale per eseguire questo lab su Google Cloud è di circa 1$.

2. Introduzione a Vertex AI

Questo lab utilizza la più recente offerta di prodotti AI disponibile su Google Cloud. Vertex AI integra le offerte ML di Google Cloud in un'esperienza di sviluppo fluida. In precedenza, i modelli addestrati con AutoML e i modelli personalizzati erano accessibili tramite servizi separati. La nuova offerta combina entrambi in un'unica API, insieme ad altri nuovi prodotti. Puoi anche migrare progetti esistenti su Vertex AI.

Vertex AI include molti prodotti diversi per supportare i flussi di lavoro ML end-to-end. Questo lab si concentrerà sui prodotti evidenziati di seguito: Training e Workbench

Panoramica dei prodotti Vertex

3. Configura l'ambiente

Per eseguire questo codelab, è necessario un progetto Google Cloud con fatturazione abilitata. Per creare un progetto, segui le istruzioni riportate qui.

Passaggio 1: abilita l'API Compute Engine

Passa a Compute Engine e seleziona Abilita se non è già abilitato.

Passaggio 2: attiva l'API Artifact Registry

Vai ad Artifact Registry e seleziona Attiva se non è già selezionato. Lo utilizzerai per creare un container per il tuo job di addestramento personalizzato.

Passaggio 3: attiva l'API Vertex AI

Vai alla sezione Vertex AI della tua console Cloud e fai clic su Abilita API Vertex AI.

Dashboard di Vertex AI

Passaggio 4: crea un'istanza di Vertex AI Workbench

Dalla sezione Vertex AI della console Cloud, fai clic su Workbench:

Menu Vertex AI

Abilita l'API Notebooks, se non lo è già.

Notebook_api

Dopo averla attivata, fai clic su NOTEBOOK GESTITI:

Notebooks_UI

Quindi seleziona NUOVO NOTEBOOK.

new_notebook

Assegna un nome al tuo blocco note e seleziona Account di servizio in Autorizzazione

create_notebook

Seleziona Impostazioni avanzate.

In Sicurezza, seleziona "Abilita terminale" se non è già attivato.

enable_terminal

Puoi lasciare invariate tutte le altre impostazioni avanzate.

Poi, fai clic su Crea. Il provisioning dell'istanza richiederà un paio di minuti.

Una volta creata l'istanza, seleziona APRI JUPYTERLAB.

open_jupyterlab

4. containerizza il codice dell'applicazione di addestramento

Invierai questo job di addestramento a Vertex AI inserendo il codice dell'applicazione di addestramento in un container Docker ed eseguendo il push di questo container in Google Artifact Registry. Utilizzando questo approccio, puoi addestrare un modello creato con qualsiasi framework.

Per iniziare, dal menu Avvio app, apri una finestra Terminale nell'istanza del blocco note:

Apri terminale nel blocco note

Passaggio 1: crea un bucket Cloud Storage

In questo job di addestramento, esporterai il modello TensorFlow addestrato in un bucket Cloud Storage. Archivierai inoltre i dati per l'addestramento in un bucket Cloud Storage.

Dal tuo terminale, esegui quanto segue per definire una variabile env per il tuo progetto, assicurandoti di sostituire your-cloud-project con l'ID del tuo progetto:

PROJECT_ID='your-cloud-project'

Successivamente, esegui il seguente comando nel terminale per creare un nuovo bucket nel progetto.

BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET

Passaggio 2: copia i dati nel bucket Cloud Storage

Dobbiamo inserire il nostro set di dati sui fiori in Cloud Storage. A scopo dimostrativo, scaricherai prima il set di dati in questa istanza di Workbench e poi lo copierai in un bucket.

Scaricare e decomprimere i dati.

wget https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
tar xvzf flower_photos.tgz

Poi copialo nel bucket che hai appena creato. Aggiungiamo -r perché vogliamo copiare l'intera directory e -m per eseguire una copia multi-elaborazione, il che velocizza le cose.

gsutil -m cp -r flower_photos $BUCKET

Passaggio 3: scrivi il codice di addestramento

Crea una nuova directory denominata flowers e accedi tramite cd:

mkdir flowers
cd flowers

Esegui quanto segue per creare una directory per il codice di addestramento e un file Python in cui aggiungerai il codice.

mkdir trainer
touch trainer/task.py

Ora dovresti avere quanto segue nella tua directory flowers/:

+ trainer/
    + task.py

Per maggiori dettagli su come strutturare il codice dell'applicazione di addestramento, consulta la documentazione.

Successivamente, apri il file task.py che hai appena creato e copia il codice riportato di seguito.

Dovrai sostituire {your-gcs-bucket} con il nome del bucket Cloud Storage che hai appena creato.

Tramite lo strumento Cloud Storage FUSE, i job di addestramento in Vertex AI Training possono accedere ai dati su Cloud Storage come file nel file system locale. Quando avvii un job di addestramento personalizzato, il job vede una directory /gcs contenente tutti i bucket Cloud Storage come sottodirectory. Ecco perché i percorsi dei dati nel codice di addestramento iniziano con /gcs.

import tensorflow as tf
import numpy as np
import os

## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'

# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32

IMG_HEIGHT = 180
IMG_WIDTH = 180

DATA_DIR = f'{BUCKET_ROOT}/flower_photos'

def create_datasets(data_dir, batch_size):
  '''Creates train and validation datasets.'''
  
  train_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  validation_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
  validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

  return train_dataset, validation_dataset


def create_model():
  '''Creates model.'''

  model = tf.keras.Sequential([
    tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
    tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
    tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
  ])
  return model

# CREATE DATASETS
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

# CREATE/COMPILE MODEL
model = create_model()
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])

# TRAIN MODEL
history = model.fit(
  train_dataset,
  validation_data=validation_dataset,
  epochs=EPOCHS
)

# SAVE MODEL
model.save(f'{BUCKET_ROOT}/model_output')

Passaggio 4: crea un Dockerfile

Per containerizzare il codice, devi creare un Dockerfile. Nel Dockerfile includerai tutti i comandi necessari per eseguire l'immagine. Installerà tutte le librerie necessarie e configurerà il punto di accesso per il codice di addestramento.

Dal tuo terminale, crea un Dockerfile vuoto nella radice della directory flowers:

touch Dockerfile

Ora dovresti avere quanto segue nella tua directory flowers/:

+ Dockerfile
+ trainer/
    + task.py

Apri il Dockerfile e copia al suo interno quanto segue:

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

WORKDIR /

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

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

Esaminiamo i comandi in questo file.

Il comando FROM specifica l'immagine di base, ovvero l'immagine principale su cui verrà creata l'immagine. Come immagine di base utilizzerai l'immagine Docker GPU TensorFlow Enterprise 2.8 del container deep learning. Deep Learning Containers su Google Cloud è dotato di molti framework comuni di ML e data science preinstallati.

Il comando WORKDIR specifica la directory dell'immagine in cui vengono eseguite le istruzioni successive.

Il comando COPY copia il codice dell'addestratore nell'immagine Docker. Tieni presente che in questo esempio abbiamo un solo file Python nella directory del trainer, ma per un esempio più realistico probabilmente avrai file aggiuntivi. Ad esempio, uno chiamato data.py, che gestisce la preelaborazione dei dati, e uno chiamato model.py, che contiene solo il codice del modello e così via. Per un codice di addestramento più complesso, consulta la documentazione di Python sul packaging dei progetti Python.

Se vuoi aggiungere altre librerie, puoi utilizzare il comando RUN per installarle con pip (ad es. RUN pip install -r requirements.txt). Tuttavia, per il nostro esempio non abbiamo bisogno di altro.

Infine, il comando ENTRYPOINT configura il punto di ingresso per richiamare l'addestratore. Questo è ciò che verrà eseguito quando avvieremo il job di addestramento. Nel nostro caso, stiamo eseguendo il file task.py.

Scopri di più sulla scrittura di file Docker per l'addestramento di Vertex AI qui.

Passaggio 4: crea il container

Dal terminale del notebook Workbench, esegui quanto segue per definire una variabile env per il tuo progetto, assicurandoti di sostituire your-cloud-project con l'ID del progetto:

PROJECT_ID='your-cloud-project'

Crea un repository in Artifact Registry

REPO_NAME='flower-app'

gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=us-central1 --description="Docker repository"

Definisci una variabile con l'URI dell'immagine container in Google Artifact Registry:

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image:latest

Configura Docker

gcloud auth configure-docker \
    us-central1-docker.pkg.dev

Quindi, crea il container eseguendo quanto segue dalla radice della directory flower:

docker build ./ -t $IMAGE_URI

Infine, esegui il push in Artifact Registry:

docker push $IMAGE_URI

Dopo il push del container in Artifact Registry, puoi avviare il job di addestramento.

5. Eseguire un job di addestramento personalizzato su Vertex AI

Questo lab utilizza l'addestramento personalizzato tramite un container personalizzato su Google Artifact Registry, ma puoi anche eseguire un job di addestramento con i container predefiniti.

Per iniziare, vai alla sezione Addestramento nella sezione Vertex della console Cloud:

menu del treno

Passaggio 1: configura il job di addestramento

Fai clic su Crea per inserire i parametri per il tuo job di addestramento.

create_training

  • In Set di dati, seleziona Nessun set di dati gestito
  • Quindi, seleziona Addestramento personalizzato (avanzato) come metodo di addestramento e fai clic su Continua.
  • Seleziona Addestra nuovo modello, poi inserisci flowers-model (o come preferisci chiamare il tuo modello) in Nome modello.
  • Fai clic su Continua.

Nel passaggio Impostazioni contenitore, seleziona Container personalizzato:

Opzione per il contenitore personalizzato

Nella prima casella (Immagine container), inserisci il valore della variabile IMAGE_URI della sezione precedente. Dovrebbe essere: us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest, con il tuo ID progetto. Lascia vuoti gli altri campi e fai clic su Continua.

Salta il passaggio sugli iperparametri facendo di nuovo clic su Continua.

Passaggio 2: configura il cluster di calcolo

Configura Pool di worker 0 come segue:

worker_pool_0

Per il momento salta il passaggio 6 e configura il contenitore di previsione nel lab successivo di questa serie.

Fai clic su INIZIA ADDESTRAMENTO per avviare il job di addestramento. Nella sezione Addestramento della console, nella scheda PIPELINE DI FORMAZIONE, vedrai il job che hai appena avviato:

Job di addestramento

🎉 Complimenti! 🎉

Hai imparato come utilizzare Vertex AI per:

  • Avvia un job di addestramento personalizzato per il codice di addestramento fornito in un container personalizzato. In questo esempio hai utilizzato un modello TensorFlow, ma puoi addestrare un modello creato con qualsiasi framework utilizzando container personalizzati o integrati.

Per scoprire di più sulle diverse parti di Vertex, consulta la documentazione.

6. [Facoltativo] Utilizza l'SDK Vertex AI Python

La sezione precedente ha mostrato come avviare il job di addestramento tramite l'interfaccia utente. In questa sezione viene visualizzato un modo alternativo per inviare il job di addestramento mediante l'SDK Vertex AI per Python.

Torna all'istanza del blocco note e crea un blocco note TensorFlow 2 dall'Avvio app:

new_notebook

Importa l'SDK Vertex AI.

from google.cloud import aiplatform

Poi crea un CustomContainerTrainingJob. Dovrai sostituire {PROJECT_ID} in container_uri con il nome del tuo progetto e dovrai sostituire {BUCKET} in staging_bucket con il bucket che hai creato in precedenza.

my_job = aiplatform.CustomContainerTrainingJob(display_name='flower-sdk-job',
                                               container_uri='us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest',
                                               staging_bucket='gs://{BUCKET}')

Quindi, esegui il job.

my_job.run(replica_count=1,
           machine_type='n1-standard-8',
           accelerator_type='NVIDIA_TESLA_V100',
           accelerator_count=1)

A scopo dimostrativo, questo job è stato configurato per l'esecuzione su una macchina più grande rispetto alla sezione precedente. Inoltre, eseguiamo il servizio con una GPU. Se non specifichi machine-type, accelerator_type o accelerator_count, il job verrà eseguito per impostazione predefinita su un n1-standard-4.

Potrai vedere il tuo job di addestramento nella sezione Addestramento della console, nella scheda JOB PERSONALIZZATI.

7. Esegui la pulizia

Poiché i notebook gestiti di Vertex AI Workbench dispongono di una funzionalità di arresto in caso di inattività, non dobbiamo preoccuparci di arrestare l'istanza. Se vuoi arrestare manualmente l'istanza, fai clic sul pulsante Interrompi nella sezione Vertex AI Workbench della console. Per eliminare completamente il blocco note, fai clic sul pulsante Elimina.

Arresta istanza

Per eliminare il bucket di archiviazione, utilizza il menu di navigazione nella console Cloud, vai su Storage, seleziona il bucket e fai clic su Elimina:

Elimina spazio di archiviazione