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 presenti quando scrivi il codice di addestramento.

Scegliere una struttura del codice di addestramento

In primo luogo, determina quale struttura vuoi che assuma il codice di addestramento ML. Puoi fornire il codice di addestramento a Vertex AI in uno dei seguenti modi:

  • Uno script Python da utilizzare con un container predefinito. Utilizza la SDK Vertex AI per creando un job personalizzato. Questo metodo ti 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 codice che addestra un modello ML e lo esporta in Cloud Storage. Questa applicazione di addestramento può utilizzare qualsiasi dipendenza inclusa nel container predefinito con cui prevedi di utilizzarla.

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

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

  • Un'immagine container personalizzata. Crea un container Docker immagine con codice che addestra un modello ML e lo esporta di archiviazione ideale in Cloud Storage. Includi eventuali dipendenze richieste dal codice nella nell'immagine container.

    Utilizza questa opzione se vuoi usare dipendenze che non sono incluse in un dei container predefiniti di Vertex AI addestramento. Ad esempio, se vuoi l'addestramento mediante un framework ML Python non disponibile in un o se vuoi eseguire l'addestramento utilizzando un linguaggio di programmazione diverso Python, allora questa è l'opzione migliore.

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

Il resto di questo documento descrive le best practice pertinenti a entrambe le strutture di codice di addestramento.

Best practice per tutto il codice di addestramento personalizzato

Quando scrivi il 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.

Accedere ai servizi Google Cloud nel codice

Alcune delle seguenti sezioni descrivono l'accesso ad altri servizi Google Cloud i servizi dal tuo codice. Per accedere ai servizi Google Cloud, scrivi il codice di addestramento in modo che utilizzi le credenziali predefinite dell'applicazione (ADC). Molte librerie client di Google Cloud eseguono l'autenticazione con ADC per impostazione predefinita. Non è necessario configurare variabili di ambiente. Vertex AI configura automaticamente ADC per l'autenticazione come Agente di servizio Vertex AI Custom Code per il tuo progetto (per impostazione predefinita) o un account di servizio personalizzato (se ne hai configurato uno).

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

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

Se non vuoi codificare un ID progetto nel codice di addestramento, puoi fare riferimento alla variabile di ambiente CLOUD_ML_PROJECT_ID: Vertex AI imposta questa variabile di ambiente in ogni contenitore di addestramento personalizzato in modo che contenga il numero del progetto del progetto in cui hai avviato l'addestramento personalizzato. Molti strumenti Google Cloud possono accettare ogni volta che prendono 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 un codice che selezioni 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 dopo aver configurato il codice in questo modo riscontri errori di autorizzazione, consulta la sezione seguente sulle risorse a cui può accedere il codice per modificare le autorizzazioni disponibili per il codice di addestramento.

Le risorse a cui può accedere il codice

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

Ad esempio, considera l'accesso del codice di addestramento alle risorse 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 puoi personalizzare con precisione i bucket a cui può accedere un determinato job utilizzando un account di servizio personalizzato.

Leggi e scrivi file 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 un'altra libreria per accedere a Cloud Storage, può leggere e scrivere direttamente nel file system locale per leggere i dati Cloud Storage o scrivere dati in Cloud Storage. Ad esempio, per caricare i 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 che usi per l'addestramento personalizzato determinano i bucket a cui puoi accedere in questo modo. La sezione precedente relativa alle risorse a cui può accedere il tuo codice descrive esattamente a quali bucket puoi accedere per impostazione predefinita e come personalizzare questo accesso.

Carica i dati di input

Il codice ML di solito opera sui dati di addestramento per addestrare un modello. Non archiviare dati e il tuo codice, indipendentemente dal fatto che tu stia creando un o un'immagine container personalizzata. L'archiviazione dei dati con codice può comportare un progetto disorganizzato, rendono difficile il riutilizzo del codice su set di dati diversi, causando errori per set di dati di grandi dimensioni.

Puoi caricare i dati da un Set di dati gestito da Vertex AI o scrivere codice per caricare i dati da un'origine esterna Vertex AI, come BigQuery di archiviazione ideale in Cloud Storage.

Per ottenere prestazioni ottimali quando carichi i dati da Cloud Storage, utilizza un'istanza nella regione in cui ti trovi l'addestramento personalizzato. Per scoprire come archiviare i dati in Cloud Storage, leggi Creazione di spazi di archiviazione bucket e Caricamento oggetti.

Per scoprire da quali bucket Cloud Storage puoi caricare i dati, leggi nella sezione precedente su a quali risorse può accedere il tuo codice.

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

Ad esempio, puoi utilizzare una delle librerie client mostrate nella guida di Cloud Storage al download degli oggetti. Il client Python per Cloud Storage, in particolare, è incluso nei container predefiniti. La tf.io.gfile.GFile class di TensorFlow supporta anche l'ADC.

Carica un set di dati di grandi dimensioni

In base al computer tipi che prevedi da utilizzare durante l'addestramento personalizzato, le VM potrebbero non essere in grado l'intero set di dati di grandi dimensioni.

Se hai necessità di leggere dati troppo grandi per essere contenuti nella memoria, invia i dati in modalità flusso o leggili in modo incrementale. Per farlo, le best practice variano a seconda del framework ML. Ad esempio, lo strumento tf.data.Dataset di TensorFlow classe possono trasmettere dati di testo o TFRecord da Cloud Storage.

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

Esporta un modello ML addestrato

Il codice ML in genere esporta un modello addestrato al termine dell'addestramento sotto forma di uno o più artefatti del modello. Dopodiché puoi utilizzare gli artefatti del modello per ottenere predizioni.

Una volta completato l'addestramento personalizzato, non potrai più accedere alle VM che hanno eseguito il codice di addestramento. Pertanto, il codice di addestramento deve esportare gli artefatti del modello al di fuori di Vertex AI.

Ti consigliamo di esportare gli artefatti del modello in un bucket Cloud Storage. Come descritto nella sezione precedente relativa alle risorse a cui può accedere il tuo codice, Vertex AI può accedere a qualsiasi bucket Cloud Storage nel progetto Google Cloud in cui stai eseguendo l'addestramento personalizzato. Utilizza una libreria che supporta Credenziali predefinite dell'applicazione per esportare gli artefatti del tuo 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 modello addestrato per generare 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ù nella guida alle esporta gli artefatti del modello per la previsione.

Variabili di ambiente per directory Cloud Storage speciali

Se specifichi l'API baseOutputDirectory , Vertex AI imposta le seguenti variabili di ambiente durante l'esecuzione il codice di addestramento:

I valori di queste variabili di ambiente differiscono leggermente a seconda che tu stia utilizzando la regolazione degli iperparametri. Per ulteriori informazioni, 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 o opzioni di configurazione diversi, e consente di salvare gli elementi del modello e i checkpoint in posizioni diverse semplicemente modificando il campo dell'API baseOutputDirectory. Tuttavia, non è obbligatorio utilizzare le variabili di ambiente nel codice se non vuoi. Ad esempio, in alternativa puoi impostare in modo hardcode le posizioni per salvare i checkpoint ed esportare gli elementi del modello.

Inoltre, se usi un TrainingPipeline per le richieste di addestramento e non specificare modelToUpload.artifactUri , quindi Vertex AI utilizza il valore dell'ambiente AIP_MODEL_DIR per modelToUpload.artifactUri. Per l'ottimizzazione degli iperparametri, Vertex AI utilizza il valore della variabile AIP_MODEL_DIR dell'ambiente della prova migliore.

Garantisci la resilienza per riavviare

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 si riavvia, Vertex AI ricomincia a eseguire il codice dall'inizio.

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

  • Esporta spesso i progressi dell'addestramento in Cloud Storage, una volta ogni quattro ore, per non perdere i progressi se le VM si riavviano.

  • All'inizio del codice di addestramento, controlla se esistono già progressi nell'addestramento nella posizione di esportazione. In questo caso, carica lo stato di addestramento salvato. anziché iniziare l'addestramento da zero.

Quattro ore è una linea guida, non un limite fisso. Se la resilienza è una priorità, ti consigliamo di aggiungere questi comportamenti al codice anche se non prevedi che venga eseguito per così tanto tempo.

La modalità di attuazione di questi comportamenti dipende dal framework di ML utilizzato. Ad esempio, se utilizzi TensorFlow Keras, scopri come utilizzare il callback ModelCheckpoint per questo scopo.

Per scoprire di più su come Vertex AI gestisce le VM, consulta Informazioni sul servizio di addestramento personalizzato.

Best practice per le funzionalità di addestramento personalizzato facoltative

Se vuoi utilizzare delle caratteristiche di addestramento personalizzato facoltative, potresti dover apportare ulteriori modifiche al codice di addestramento. Questa sezione descrive il codice best practice per l'ottimizzazione degli iperparametri, le GPU, l'addestramento distribuito Vertex AI TensorBoard.

Scrivi il codice per abilitare la registrazione automatica

Puoi abilitare l'auotologging utilizzando l'SDK Vertex AI per Python in modo che acquisire parametri e metriche delle prestazioni quando si invia il job personalizzato. Per i dettagli, vedi Esegui il job di addestramento con il monitoraggio degli esperimenti.

Scrivi il codice per restituire i log del contenitore

Quando scrivi i log dal tuo servizio o job, questi vengono rilevati automaticamente da Cloud Logging, a condizione che vengano scritti in una di queste posizioni:

La maggior parte degli sviluppatori dovrebbe scrivere i log utilizzando output standard e .

I log dei container scritti in queste località supportate vengono automaticamente associati al servizio di addestramento personalizzato di Vertex AI, alla revisione località o con il job di addestramento personalizzato. Eccezioni contenute in questi log vengono acquisiti e inseriti nei report Error Reporting.

Usa testo semplice o JSON strutturato nei log

Quando scrivi i log, puoi inviare una semplice stringa di testo o una singola riga di JSON serializzato, chiamato anche "structured" e i dati di Google Cloud. Viene rilevato e interpretato da Cloud Logging e inserito in jsonPayload. Invece, il messaggio di testo semplice viene inserito in textPayload.

Scrittura di log strutturati

Puoi trasmettere log JSON strutturati in diversi modi. I modi più comuni sono utilizzando Libreria Logging Python oppure passando un file JSON non elaborato tramite print.

Libreria di logging Python

import json
import logging
from pythonjsonlogger import jsonlogger


class CustomJsonFormatter(jsonlogger.JsonFormatter):
 """Formats log lines in JSON."""
  def process_log_record(self, log_record):
    """Modifies fields in the log_record to match Cloud Logging's expectations."""
    log_record['severity'] = log_record['levelname']
    log_record['timestampSeconds'] = int(log_record['created'])
    log_record['timestampNanos'] = int(
        (log_record['created'] % 1) * 1000 * 1000 * 1000)


    return log_record




def configure_logger():
  """Configures python logger to format logs as JSON."""
  formatter = CustomJsonFormatter(
        '%(name)s|%(levelname)s|%(message)s|%(created)f'
        '|%(lineno)d|%(pathname)s', '%Y-%m-%dT%H:%M:%S')
  root_logger = logging.getLogger()
  handler = logging.StreamHandler()
  handler.setFormatter(formatter)
  root_logger.addHandler(handler)
  root_logger.setLevel(logging.WARNING)


logging.warning("This is a warning log")

JSON non elaborato

import json


def log(severity, message):
  global_extras = {"debug_key": "debug_value"}
  structured_log = {"severity": severity, "message": message, **global_extras}
  print(json.dumps(structured_log))


def main(args):
  log("DEBUG", "Debugging the application.")
  log("INFO", "Info.")
  log("WARNING", "Warning.")
  log("ERROR", "Error.")
  log("CRITICAL", "Critical.")

Campi JSON speciali nei messaggi

Quando fornisci un log strutturato come dizionario JSON, alcuni campi speciali vengono rimosse da jsonPayload e vengono scritte nel campo corrispondente in la generazione LogEntry come descritto in la documentazione per i campi speciali.

Ad esempio, se il file JSON include una proprietà severity, questa viene rimossa dal jsonPayload e viene visualizzato come severity della voce di log. La proprietà message viene utilizzata come testo di visualizzazione principale della voce di log, se presente.

Correlare i log dei contenitori con un log delle richieste (solo servizi)

In Esplora log, i log correlati allo stesso trace sono visualizzabili in "genitore-figlio" formato: quando fai clic sull'icona a forma di triangolo a sinistra dell' di voce di log delle richieste, i log dei container relativi a quella richiesta sono nidificati nel log delle richieste.

I log dei container non vengono correlati automaticamente ai log delle richieste, a meno che non utilizzi un Libreria client di Cloud Logging. Per correlare i log dei contenitori con i log delle richieste senza utilizzare una libreria client, puoi utilizzare una riga di log JSON strutturata contenente un campo logging.googleapis.com/trace con l'identificatore traccia estratto dall'X-Cloud-Trace-Context intestazione.

Visualizza i log

Per visualizzare i log dei container nella console Google Cloud:

  1. Nella console Google Cloud, vai alla pagina Job personalizzati Vertex AI.

    Vai a Job personalizzati

  2. Fai clic sul nome del job personalizzato di cui vuoi visualizzare i log.

  3. Fai clic su Visualizza log.

Scrivi il codice per l'ottimizzazione degli iperparametri

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

Se vuoi usare l'ottimizzazione degli iperparametri, il codice di addestramento deve eseguire seguenti:

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

  • Segnalare in modo intermittente 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, ogni volta con argomenti della riga di comando diversi. La tua formazione il codice deve analizzare questi argomenti della riga di comando e utilizzarli come iperparametri addestramento. Ad esempio, per ottimizzare l'apprendimento percentuale, può essere utile analizzare un argomento della riga di comando denominato --learning_rate. Scopri come configurare gli argomenti a riga di comando forniti da Vertex AI.

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

Segnalare la metrica di ottimizzazione degli iperparametri

Il codice di addestramento deve segnalare a intermittenza la metrica degli iperparametri stanno provando a ottimizzare Vertex AI. Ad esempio, se vuoi massimizzare l'accuratezza del tuo modello, ti consigliamo di registrare questa metrica alla fine di ogni epoca di addestramento. Vertex AI utilizza queste informazioni per decidere quali iperparametri usare per la prossima prova di addestramento. Scopri di più su selezionando e specificando l'ottimizzazione degli iperparametri .

Utilizza la libreria Python cloudml-hypertune per segnalare l'ottimizzazione degli iperparametri o una metrica di valutazione. Questa libreria è inclusa in tutti i container predefiniti per addestramento e puoi utilizzare pip per installare in un container personalizzato.

Per scoprire come installare e utilizzare questa libreria, consulta la cloudml-hypertune GitHub repository oppure fare riferimento Codelab Vertex AI: ottimizzazione degli iperparametri.

Scrivi il codice per le GPU

Puoi selezionare VM con unità di elaborazione grafica (GPU) per eseguire le tue di addestramento personalizzato. Scopri di più sulla configurazione dell'addestramento personalizzato per l'utilizzo di VM con GPU.

Se vuoi eseguire l'addestramento con le GPU, assicurati che il codice di addestramento possa sfruttarle. A seconda del framework ML utilizzato, questa operazione potrebbe richiedere modifiche al codice. Ad esempio, se utilizzi TensorFlow Keras, devi solo regolare il codice se vuoi utilizzarne più di uno GPU. Alcuni framework ML non possono affatto utilizzare le GPU.

Inoltre, assicurati che il container supporti le GPU: seleziona un container precompilato per l'addestramento che supporti le GPU o installa il toolkit NVIDIA CUDA e NVIDIA cuDNN nel tuo container personalizzato. Un modo per farlo è utilizzare l'immagine di base dal Docker nvidia/cuda repository; in un altro modo è per utilizzare un'istanza Deep Learning Containers come base dell'immagine.

Scrivere codice per l'addestramento distribuito

Per addestrare 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, ti consente di eseguire un codice di addestramento identico su più macchine che coordinano automaticamente come dividere il lavoro in base all'ambiente su ogni macchina. Scopri se Vertex AI imposta variabili di ambiente per rendere possibile questo per il tuo framework di ML.

In alternativa, puoi eseguire un container diverso su ciascuno dei vari worker piscine. Un pool di worker è un gruppo di VM che configuri per utilizzare le stesse opzioni di calcolo e lo stesso container. In questo caso, probabilmente ti consigliamo di fare affidamento sulle 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 lo fai dipende dal tuo obiettivo e dal framework ML che utilizzi.

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 di ML, per poi condividerli con il tuo team. Puoi anche utilizzare Cloud Profiler per individuare e risolvere i colli di bottiglia delle prestazioni al fine di addestrare i modelli in modo più rapido e conveniente.

Per utilizzare Vertex AI TensorBoard con l'addestramento personalizzato, devi svolgere i seguenti passaggi:

  • Crea un'istanza Vertex AI TensorBoard nel progetto per archiviare (vedi Creare un'istanza TensorBoard).

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

  • Modifica il codice di addestramento personalizzato per scrivere i log compatibili con TensorBoard in Cloud Storage (consulta Modifiche allo script di addestramento)

Per una guida passo passo, consulta Utilizzo di Vertex AI TensorBoard con addestramento personalizzato.

Passaggi successivi