Prepara il codice di addestramento

Esegui l'addestramento personalizzato su Vertex AI per eseguire il tuo codice di addestramento di machine learning (ML) nel cloud, anziché utilizzare AutoML. Questo documento descrive le best practice da tenere in considerazione per la scrittura del codice di addestramento.

di Google.

Scegli una struttura di codice di addestramento

Per prima cosa, determina quale struttura vuoi che utilizzi per il tuo codice di addestramento ML. Puoi fornire il codice di addestramento a Vertex AI in uno dei seguenti formati:

  • Uno script Python da utilizzare con un container predefinito. Utilizza l'SDK Vertex AI per creare un job personalizzato. Questo metodo consente di fornire l'applicazione di addestramento come singolo script Python.

  • Un'applicazione di addestramento Python da utilizzare con un container predefinito. Crea una distribuzione di origine Python con il codice che addestra un modello ML ed esportalo in Cloud Storage. Questa applicazione di addestramento può utilizzare qualsiasi delle dipendenze incluse nel container predefinito con cui prevedi di utilizzarla.

    Utilizza questa opzione se uno dei container predefiniti per l'addestramento di Vertex AI include tutte le dipendenze necessarie per l'addestramento. Ad esempio, se vuoi eseguire l'addestramento con PyTorch, scikit-learn, TensorFlow o XGBoost, probabilmente questa è l'opzione migliore.

    Per conoscere le best practice specifiche per questa opzione, leggi la guida alla creazione di un'applicazione di addestramento Python.

  • Un'immagine container personalizzata. Crea un'immagine container Docker con il codice che addestra un modello ML ed esportalo in Cloud Storage. Includi tutte le dipendenze richieste dal tuo codice nell'immagine container.

    Utilizza questa opzione se vuoi usare dipendenze non incluse in uno dei container predefiniti per l'addestramento di Vertex AI. Ad esempio, se vuoi addestrarlo con un framework ML Python non disponibile in un container predefinito, o se vuoi eseguire l'addestramento utilizzando un linguaggio di programmazione diverso da Python, questa è l'opzione migliore.

    Per conoscere le best practice specifiche per questa opzione, leggi la guida alla creazione di un'immagine container personalizzata.

Il resto del documento descrive le best practice pertinenti per entrambe le strutture del codice di addestramento.

Best practice per tutto il codice di addestramento personalizzato

Quando scrivi codice di addestramento personalizzato per Vertex AI, tieni presente che il codice verrà eseguito su una o più istanze di macchine virtuali (VM) gestite da Google Cloud. Questa sezione descrive le best practice applicabili a tutto il codice di addestramento personalizzato.

Accedi ai servizi Google Cloud nel tuo codice

Molte delle seguenti sezioni descrivono l'accesso ad altri servizi Google Cloud dal codice. Per accedere ai servizi Google Cloud, scrivi il codice di addestramento per utilizzare le Credenziali predefinite dell'applicazione (ADC). Molte librerie client di Google Cloud si autenticano con ADC per impostazione predefinita. Non è necessario configurare alcuna variabile di ambiente; Vertex AI configura automaticamente ADC in modo che esegua l'autenticazione come agente di servizio codice personalizzato Vertex AI per il progetto (per impostazione predefinita) o come account di servizio personalizzato (se ne hai configurato uno).

Tuttavia, quando utilizzi una libreria client di Google Cloud nel codice, Vertex AI potrebbe non connettersi sempre al progetto Google Cloud corretto per impostazione predefinita. Se riscontri errori di autorizzazione, il problema potrebbe essere la connessione al progetto sbagliato.

Questo problema si verifica perché Vertex AI non esegue il codice direttamente nel progetto Google Cloud. Vertex AI esegue invece il codice in uno dei vari progetti separati gestiti da Google. Vertex AI utilizza questi progetti esclusivamente per le operazioni correlate al progetto. Di conseguenza, non provare a dedurre un ID progetto dall'ambiente nel codice di addestramento o previsione; specifica gli ID progetto in modo esplicito.

Se non vuoi impostare come hardcoded un ID progetto nel tuo codice di addestramento, puoi fare riferimento alla variabile di ambiente CLOUD_ML_PROJECT_ID. Vertex AI imposta questa variabile di ambiente in ogni container di addestramento personalizzato in modo che contenga il numero di progetto del progetto in cui hai avviato l'addestramento personalizzato. Molti strumenti Google Cloud possono accettare un numero di progetto ovunque prendano un ID progetto.

Ad esempio, se vuoi utilizzare il client Python per Google BigQuery per accedere a una tabella BigQuery nello stesso progetto, non provare a dedurre il progetto nel codice di addestramento:

Selezione implicita del progetto

from google.cloud import bigquery

client = bigquery.Client()

Utilizza invece codice che seleziona esplicitamente un progetto:

Selezione esplicita del progetto

import os

from google.cloud import bigquery

project_number = os.environ["CLOUD_ML_PROJECT_ID"]

client = bigquery.Client(project=project_number)

Se si verificano errori di autorizzazione dopo aver configurato il codice in questo modo, leggi la seguente sezione sulle risorse a cui può accedere il codice per modificare le autorizzazioni disponibili per il codice di addestramento.

Risorse a cui può accedere il tuo codice

Per impostazione predefinita, l'applicazione di addestramento può accedere a tutte le risorse Google Cloud disponibili per l'agente di servizio codice personalizzato Vertex AI (CCSA) del progetto. Puoi concedere al CCSA e, di conseguenza, alla tua applicazione di addestramento, l'accesso a un numero limitato di altre risorse seguendo le istruzioni riportate in Concedere agli agenti di servizio Vertex AI l'accesso ad altre risorse. Se la tua applicazione di addestramento richiede più dell'accesso a livello di lettura alle risorse Google Cloud non elencate in questa pagina, deve acquisire un token di accesso OAuth 2.0 con l'ambito https://www.googleapis.com/auth/cloud-platform, operazione che può essere eseguita solo utilizzando un account di servizio personalizzato.

Ad esempio, considera l'accesso del tuo codice di addestramento alle risorse di Cloud Storage:

Per impostazione predefinita, Vertex AI può accedere a qualsiasi bucket Cloud Storage nel progetto Google Cloud in cui stai eseguendo l'addestramento personalizzato. Puoi anche concedere a Vertex AI l'accesso ai bucket Cloud Storage in altri progetti oppure personalizzare con precisione i bucket a cui può accedere un job specifico utilizzando un account di servizio personalizzato.

Leggere e scrivere file di Cloud Storage con Cloud Storage FUSE

In tutti i job di addestramento personalizzato, Vertex AI monta i bucket Cloud Storage a cui hai accesso nella directory /gcs/ del file system di ciascun nodo di addestramento. Come comoda alternativa all'utilizzo del client Python per Cloud Storage o di un'altra libreria per accedere a Cloud Storage, puoi leggere e scrivere direttamente nel file system locale per leggere i dati da Cloud Storage o scrivere dati in Cloud Storage. Ad esempio, per caricare dati da gs://BUCKET/data.csv, puoi utilizzare il seguente codice Python:

file = open('/gcs/BUCKET/data.csv', 'r')

Vertex AI utilizza Cloud Storage FUSE per montare i bucket di archiviazione. Tieni presente che le directory montate da Cloud Storage FUSE non sono conformi a POSIX.

Le credenziali utilizzate per l'addestramento personalizzato determinano a quali bucket puoi accedere in questo modo. La sezione precedente sulle risorse a cui può accedere il codice descrive esattamente i bucket a cui puoi accedere per impostazione predefinita e come personalizzare questo accesso.

Carica dati di input

Il codice ML solitamente opera sui dati di addestramento per addestrare un modello. Non archiviare i dati di addestramento insieme al codice, sia che tu crei un'applicazione di addestramento Python sia un'immagine container personalizzata. L'archiviazione dei dati con il codice può portare a un progetto mal organizzato, rendere difficile il riutilizzo del codice in set di dati diversi e causare errori per set di dati di grandi dimensioni.

Puoi caricare i dati da un set di dati gestito Vertex AI o scrivere il tuo codice per caricarli da un'origine esterna a Vertex AI, come BigQuery o Cloud Storage.

Per ottenere prestazioni ottimali quando carichi dati da Cloud Storage, utilizza un bucket nella regione in cui esegui l'addestramento personalizzato. Per informazioni su come archiviare i dati in Cloud Storage, consulta Creazione di bucket di archiviazione e Caricamento di oggetti.

Per informazioni sui bucket Cloud Storage da cui puoi caricare i dati, leggi la sezione precedente relativa alle risorse a cui può accedere il codice.

Per caricare i dati da Cloud Storage nel codice di addestramento, utilizza la funzionalità Cloud Storage FUSE descritta nella sezione precedente oppure utilizza qualsiasi libreria che supporti ADC. Non è necessario fornire esplicitamente le credenziali di autenticazione nel codice.

Ad esempio, puoi utilizzare una delle librerie client illustrate nella guida di Cloud Storage al download di oggetti. In particolare, il client Python per Cloud Storage è incluso nei container predefiniti. Anche la classe tf.io.gfile.GFile di TensorFlow supporta ADC.

Carica un set di dati di grandi dimensioni

A seconda dei tipi di macchine che prevedi di utilizzare durante l'addestramento personalizzato, le tue VM potrebbero non essere in grado di caricare in memoria l'intero set di dati di grandi dimensioni.

Se devi leggere dati troppo grandi per essere inseriti in memoria, inviali in flussi o leggili in modo incrementale. A tal fine, framework ML diversi utilizzano best practice diverse. Ad esempio, la classe tf.data.Dataset di TensorFlow può trasmettere dati TFRecord o di testo da Cloud Storage.

L'addestramento personalizzato su più VM con parallelismo dei dati è un altro modo per ridurre la quantità di dati caricati da ogni VM in memoria. Consulta la sezione Scrittura di codice per l'addestramento distribuito di questo documento.

Esporta un modello ML addestrato

In genere, il codice ML esporta un modello addestrato al termine dell'addestramento sotto forma di uno o più artefatti del modello. Puoi quindi utilizzare gli artefatti del modello per ottenere previsioni.

Una volta completato l'addestramento personalizzato, non potrai più accedere alle VM che hanno eseguito il tuo codice di addestramento. Di conseguenza, il codice di addestramento deve esportare gli artefatti del modello in una località esterna a Vertex AI.

Ti consigliamo di esportare gli artefatti del modello in un bucket Cloud Storage. Come descritto nella sezione precedente sulle risorse a cui può accedere il codice, Vertex AI può accedere a qualsiasi bucket Cloud Storage nel progetto Google Cloud in cui stai eseguendo l'addestramento personalizzato. Usa una libreria che supporti ADC per esportare gli artefatti del modello. Ad esempio, le API TensorFlow per il salvataggio dei modelli Keras possono esportare gli artefatti direttamente in un percorso di Cloud Storage.

Se vuoi utilizzare il tuo modello addestrato per fornire previsioni su Vertex AI, il codice deve esportare gli artefatti del modello in un formato compatibile con uno dei container predefiniti per la previsione. Scopri di più, consulta la guida all'esportazione degli artefatti del modello per la previsione.

Variabili di ambiente per directory Cloud Storage speciali

Se specifichi il campo API baseOutputDirectory, Vertex AI imposta le seguenti variabili di ambiente quando esegue il codice di addestramento:

I valori di queste variabili di ambiente variano leggermente a seconda che utilizzi o meno l'ottimizzazione degli iperparametri. Per scoprire di più, consulta il riferimento API per baseOutputDirectory.

L'utilizzo di queste variabili di ambiente semplifica il riutilizzo dello stesso codice di addestramento più volte, ad esempio con dati diversi o opzioni di configurazione, e il salvataggio degli artefatti e dei checkpoint del modello in posizioni diverse, semplicemente modificando il campo dell'API baseOutputDirectory. Tuttavia, non è obbligatorio utilizzare le variabili di ambiente nel codice. Ad esempio, in alternativa, puoi impostare come hardcoded le posizioni per salvare i checkpoint e esportare gli artefatti del modello.

Inoltre, se utilizzi un valore TrainingPipeline per l'addestramento personalizzato e non specifichi il campo modelToUpload.artifactUri, Vertex AI utilizza il valore della variabile di ambiente AIP_MODEL_DIR per modelToUpload.artifactUri. (Per l'ottimizzazione degli iperparametri, Vertex AI utilizza il valore della variabile di ambiente AIP_MODEL_DIR della prova migliore.)

Garantisci la resilienza ai riavvii

Le VM che eseguono il codice di addestramento si riavviano occasionalmente. Ad esempio, Google Cloud potrebbe dover riavviare una VM per motivi di manutenzione. Quando una VM viene riavviata, Vertex AI ricomincia a eseguire il codice dall'inizio.

Se prevedi che il codice di addestramento durerà più di quattro ore, aggiungi diversi comportamenti al codice per renderlo resiliente ai riavvii:

  • Esporta spesso l'avanzamento dell'addestramento in Cloud Storage, almeno una volta ogni quattro ore, in modo da non perdere l'avanzamento in caso di riavvio delle VM.

  • All'inizio del codice di addestramento, verifica se nella posizione di esportazione sono già presenti progressi nell'addestramento. In tal caso, carica lo stato di addestramento salvato anziché avviarlo da zero.

Quattro ore sono un riferimento, non un limite fisso. Se garantire la resilienza è una priorità, valuta la possibilità di aggiungere questi comportamenti al tuo codice anche se non prevedi che duri così a lungo.

Il modo in cui eseguire questi comportamenti dipende dal framework ML utilizzato. Ad esempio, se utilizzi TensorFlow Keras, scopri come utilizzare il callback ModelCheckpoint per questo scopo.

Per saperne di più su come Vertex AI gestisce le VM, consulta Comprendere il servizio di addestramento personalizzato.

Best practice per le funzionalità di addestramento personalizzato facoltative

Se vuoi utilizzare determinate funzionalità facoltative di addestramento personalizzato, potresti dover apportare ulteriori modifiche al codice di addestramento. Questa sezione descrive le best practice relative al codice per ottimizzazione degli iperparametri, GPU, addestramento distribuito e Vertex AI TensorBoard.

Scrivi il codice per attivare il logging automatico

Puoi abilitare l'auotologging utilizzando l'SDK Vertex AI per Python per acquisire automaticamente parametri e metriche sulle prestazioni quando invii il job personalizzato. Per i dettagli, consulta Esecuzione di un job di addestramento con il monitoraggio degli esperimenti.

Scrittura del codice per l'ottimizzazione degli iperparametri

Vertex AI può eseguire l'ottimizzazione degli iperparametri sul codice di addestramento ML. Scopri di più su come funziona l'ottimizzazione degli iperparametri su Vertex AI e su come configurare una risorsa HyperparameterTuningJob.

Se vuoi utilizzare l'ottimizzazione degli iperparametri, il codice di addestramento deve:

  • Analizza gli argomenti della riga di comando che rappresentano gli iperparametri da ottimizzare e utilizza i valori analizzati per impostare gli iperparametri per l'addestramento.

  • Segnala a intermittenza la metrica di ottimizzazione degli iperparametri a Vertex AI.

Analizza gli argomenti della riga di comando

Per l'ottimizzazione degli iperparametri, Vertex AI esegue il codice di addestramento più volte, con argomenti della riga di comando diversi ogni volta. Il codice di addestramento deve analizzare questi argomenti della riga di comando e utilizzarli come iperparametri per l'addestramento. Ad esempio, per ottimizzare il tasso di apprendimento dell'ottimizzatore, potresti voler analizzare un argomento della riga di comando denominato --learning_rate. Scopri come configurare gli argomenti della riga di comando forniti da Vertex AI.

Ti consigliamo di utilizzare la libreria argparse di Python per analizzare gli argomenti della riga di comando.

Report sulla metrica di ottimizzazione degli iperparametri

Il codice di addestramento deve segnalare a intermittenza la metrica dell'iperparametro che stai cercando di ottimizzare in Vertex AI. Ad esempio, se vuoi massimizzare la precisione del modello, potresti voler segnalare questa metrica alla fine di ogni periodo di addestramento. Vertex AI usa queste informazioni per decidere quali iperparametri usare per la prova di addestramento successiva. Scopri di più sulla selezione e sulla specifica di una metrica di ottimizzazione degli iperparametri.

Utilizza la libreria Python cloudml-hypertune per generare report sulla metrica di ottimizzazione degli iperparametri. Questa libreria è inclusa in tutti i container predefiniti per l'addestramento e puoi utilizzare pip per installarla in un container personalizzato.

Per scoprire come installare e utilizzare questa libreria, consulta il repository GitHub di cloudml-hypertune o consulta il codelab di Vertex AI: ottimizzazione degli iperparametri.

Scrittura del codice per le GPU

Puoi selezionare VM con GPU (Graphics Processing Unit) per eseguire il tuo codice di addestramento personalizzato. Scopri di più sulla configurazione dell'addestramento personalizzato per l'utilizzo di VM abilitate per GPU.

Se vuoi eseguire l'addestramento con le GPU, assicurati che il tuo codice di addestramento possa sfruttarle. A seconda del framework ML utilizzato, potrebbero essere necessarie modifiche al codice. Ad esempio, se utilizzi TensorFlow Keras, devi modificare il codice solo se vuoi utilizzare più di una GPU. Alcuni framework ML non possono utilizzare affatto le GPU.

Assicurati inoltre che il container supporti le GPU: seleziona un container predefinito per l'addestramento che supporti le GPU oppure installa il kit di strumenti NVIDIA CUDA e NVIDIA cuDNN sul tuo container personalizzato. Un modo per farlo è utilizzare un'immagine di base dal repository Docker nvidia/cuda; un altro modo è utilizzare un'istanza di Deep Learning Containers come immagine di base.

Scrivi il codice per l'addestramento distribuito

Per l'addestramento su set di dati di grandi dimensioni, puoi eseguire il codice su più VM in un cluster distribuito gestito da Vertex AI. Scopri come configurare più VM per l'addestramento.

Alcuni framework ML, come TensorFlow e PyTorch, consentono di eseguire codice di addestramento identico su più macchine coordinando automaticamente la suddivisione del lavoro in base alle variabili di ambiente impostate su ogni macchina. Scopri se Vertex AI imposta le variabili di ambiente per rendere possibile tutto ciò per il tuo framework ML.

In alternativa, puoi eseguire un container diverso su ciascuno dei numerosi pool di worker. Un pool di worker è un gruppo di VM da te configurate in modo da utilizzare le stesse opzioni di calcolo e lo stesso container. In questo caso, dovrai comunque affidarti alle variabili di ambiente impostate da Vertex AI per coordinare la comunicazione tra le VM. Puoi personalizzare il codice di addestramento di ogni pool di worker per eseguire qualsiasi attività arbitraria; il modo in cui esegui questa operazione dipende dall'obiettivo e dal framework ML utilizzato.

Monitora e visualizza gli esperimenti di addestramento personalizzati utilizzando Vertex AI TensorBoard

Vertex AI TensorBoard è una versione gestita di TensorBoard, un progetto open source di Google per la visualizzazione degli esperimenti di machine learning. Con Vertex AI TensorBoard puoi monitorare, visualizzare e confrontare gli esperimenti ML e poi condividerli con il tuo team. Puoi anche utilizzare TensorBoard Profiler per individuare e risolvere i colli di bottiglia delle prestazioni per addestrare i modelli in modo più rapido ed economico.

Per utilizzare Vertex AI TensorBoard con l'addestramento personalizzato, devi:

  • Crea un'istanza Vertex AI TensorBoard nel progetto per archiviare gli esperimenti.

  • Configura un account di servizio per eseguire il job di addestramento personalizzato con le autorizzazioni appropriate.

  • Modifica il tuo codice di addestramento personalizzato per scrivere log compatibili con TensorBoard in Cloud Storage.

Per una guida passo passo, consulta Utilizzare Vertex AI TensorBoard con l'addestramento personalizzato.

Passaggi successivi