Monitora ed esegui il debug dell'addestramento con una shell interattiva

Questa pagina mostra come utilizzare una shell interattiva per ispezionare il container su cui viene eseguito il codice di addestramento. Puoi sfogliare il file system ed eseguire utilità di debug in ogni container predefinito o personalizzato in esecuzione su Vertex AI.

L'uso di una shell interattiva per ispezionare il container di addestramento può aiutarti a eseguire il debug dei problemi relativi al codice di addestramento o alla configurazione di Vertex AI. Ad esempio, puoi utilizzare una shell interattiva per fare quanto segue:

  • Esegui strumenti di tracciamento e profilazione.
  • Analizzare l'utilizzo della GPU.
  • Controlla le autorizzazioni di Google Cloud disponibili per il container.

Vertex AI è inoltre integrato con TensorFlow Profiler, che consente di eseguire il debug delle prestazioni di addestramento dei modelli per i job di addestramento personalizzato. Per maggiori dettagli, consulta Prestazioni dell'addestramento del modello di profilo utilizzando Profiler.

Prima di iniziare

Puoi utilizzare una shell interattiva quando esegui l'addestramento personalizzato con una risorsa CustomJob, una risorsa HyperparameterTuningJob o una risorsa TrainingPipeline personalizzata. Durante la preparazione del codice di addestramento e la configurazione della risorsa di addestramento personalizzata di tua scelta, assicurati che siano soddisfatti i seguenti requisiti:

  • Assicurati che sul container di addestramento sia bash installato.

    Tutti i container di addestramento predefiniti hanno installato bash. Se crei un container personalizzato per l'addestramento, usa un container di base che includa bash o installa bash nel tuo Dockerfile.

  • Esegui l'addestramento personalizzato in una regione che supporta le shell interattive.

  • Assicurati che chiunque voglia accedere a una shell interattiva disponga delle seguenti autorizzazioni per il progetto Google Cloud in cui è in esecuzione l'addestramento personalizzato:

    • aiplatform.customJobs.create
    • aiplatform.customJobs.get
    • aiplatform.customJobs.cancel

    Se avvii l'addestramento personalizzato, molto probabilmente hai già queste autorizzazioni e puoi accedere a una shell interattiva. Tuttavia, se vuoi utilizzare una shell interattiva per esaminare una risorsa di addestramento personalizzato creata da qualcun altro della tua organizzazione, potresti dover ottenere queste autorizzazioni.

    Un modo per ottenere queste autorizzazioni è chiedere a un amministratore della tua organizzazione di concederti il ruolo Utente Vertex AI (roles/aiplatform.user).

Requisiti per le richieste avanzate

Se utilizzi determinate funzionalità avanzate, devi soddisfare i seguenti requisiti aggiuntivi:

  • Se collega un account di servizio personalizzato alla risorsa di addestramento personalizzato, assicurati che tutti gli utenti che vogliono accedere a una shell interattiva abbiano l'autorizzazione iam.serviceAccounts.actAs per l'account di servizio collegato.

    Nella guida agli account di servizio personalizzati è indicato che devi disporre di questa autorizzazione per collegare un account di servizio. Hai bisogno di questa autorizzazione anche per visualizzare una shell interattiva durante l'addestramento personalizzato.

    Ad esempio, per creare un CustomJob a un account di servizio collegato, devi avere l'autorizzazione iam.serviceAccounts.actAs per l'account di servizio. Se uno dei tuoi colleghi vuole quindi visualizzare una shell interattiva per questo CustomJob, deve avere la stessa autorizzazione iam.serviceAccounts.actAs.

  • Se hai configurato il progetto per utilizzare i Controlli di servizio VPC con Vertex AI, tieni conto delle seguenti limitazioni aggiuntive:

    • Non puoi utilizzare l'IP privato per l'addestramento personalizzato.

    • Da una shell interattiva, non puoi accedere alla rete internet pubblica o alle risorse Google Cloud al di fuori del tuo perimetro di servizio.

    • Per proteggere l'accesso alle shell interattive, devi aggiungere notebooks.googleapis.com come servizio limitato nel perimetro di servizio, oltre a aiplatform.googleapis.com. Se limiti solo aiplatform.googleapis.com e non notebooks.googleapis.com, gli utenti possono accedere alle shell interattive da macchine al di fuori del perimetro di servizio, il che riduce i vantaggi per la sicurezza derivanti dall'utilizzo dei Controlli di servizio VPC.

Abilita shell interattive

Per abilitare shell interattive per una risorsa di addestramento personalizzato, imposta il campo API enableWebAccess su true quando crei un elemento TrainingPipeline CustomJob, HyperparameterTuningJob o personalizzato.

I seguenti esempi mostrano come eseguire questa operazione utilizzando diversi strumenti:

Console

Segui la guida per la creazione di un TrainingPipeline personalizzato nella console Google Cloud. Nel riquadro Addestra nuovo modello, quando raggiungi il passaggio Dettagli modello, procedi nel seguente modo:

  1. Fai clic su Opzioni avanzate.

  2. Seleziona la casella di controllo Attiva debug addestramento.

Quindi, completa il resto del flusso di lavoro Addestra nuovo modello.

gcloud

Per informazioni su come utilizzare questi comandi, consulta la guida alla creazione di un CustomJob e la guida alla creazione di un HyperparameterTuningJob.

API

I seguenti corpi delle richieste REST parziali mostrano dove specificare il campo enableWebAccess per ogni tipo di risorsa di addestramento personalizzato:

CustomJob

L'esempio seguente è un corpo della richiesta parziale per il metodo API projects.locations.customJobs.create:

{
  ...
  "jobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

Per un esempio di invio di una richiesta API per creare un CustomJob, consulta Creazione di job di addestramento personalizzato.

HyperparameterTuningJob

L'esempio seguente è un corpo della richiesta parziale per il metodo API projects.locations.hyperparameterTuningJobs.create:

{
  ...
  "trialJobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}

Per un esempio di invio di una richiesta API per creare un HyperparameterTuningJob, consulta Utilizzo dell'ottimizzazione degli iperparametri.

TrainingPipeline personalizzato

I seguenti esempi mostrano il corpo delle richieste parziali per il metodo API projects.locations.trainingPipelines.create. Seleziona una delle seguenti schede, a seconda che tu stia utilizzando l'ottimizzazione degli iperparametri:

Senza ottimizzazione degli iperparametri

{
  ...
  "trainingTaskInputs": {
    ...
    "enableWebAccess": true
  }
  ...
}

Con ottimizzazione degli iperparametri

{
  ...
  "trainingTaskInputs": {
    ...
    "trialJobSpec": {
      ...
      "enableWebAccess": true
    }
  }
  ...
}

Per un esempio di invio di una richiesta API per creare un elemento TrainingPipeline personalizzato, consulta la sezione sulla creazione di pipeline di addestramento.

Python

Per scoprire come installare o aggiornare l'SDK Vertex AI per Python, consulta Installare l'SDK Vertex AI per Python. Per saperne di più, consulta la documentazione di riferimento dell'API Python.

Imposta il parametro enable_web_access su true quando esegui uno dei seguenti metodi:

Dopo aver avviato l'addestramento personalizzato in base alle indicazioni nella sezione precedente, Vertex AI genera uno o più URI che puoi utilizzare per accedere alle shell interattive. Vertex AI genera un URI univoco per ogni nodo di addestramento nel job.

Puoi accedere a una shell interattiva in uno dei seguenti modi:

  • Fare clic su un link nella console Google Cloud
  • Usa l'API Vertex AI per ottenere l'URI di accesso web della shell
  1. Nella sezione Vertex AI della console Google Cloud, vai a una delle pagine seguenti:

  2. Fai clic sul nome della risorsa di addestramento personalizzato.

    Se hai creato un TrainingPipeline per l'addestramento personalizzato, fai clic sul nome della CustomJob o del HyperparameterTuningJob creato da TrainingPipeline. Ad esempio, se la pipeline ha il nome PIPELINE_NAME, potrebbe chiamarsi PIPELINE_NAME-custom-job o PIPELINE_NAME-hyperparameter-tuning-job.

  3. Nella pagina del job, fai clic su Avvia terminale web. Se il job utilizza più nodi, fai clic su Avvia terminale web accanto al nodo per il quale vuoi una shell interattiva.

    Tieni presente che puoi accedere a una shell interattiva solo mentre il job è in esecuzione. Se non vedi Avvia terminale web, è possibile che Vertex AI non abbia ancora iniziato a eseguire il job o che il job è già stato completato o non è riuscito. Se lo stato del job è Queued o Pending, attendi un minuto, quindi prova ad aggiornare la pagina.

    Se utilizzi l'ottimizzazione degli iperparametri, esistono link Avvia terminale web separati per ogni prova.

Recupera l'URI di accesso web dall'API

Usa il metodo API projects.locations.customJobs.get o il metodo API projects.locations.hyperparameterTuningJobs.get per visualizzare gli URI che puoi utilizzare per accedere alle shell interattive.

A seconda del tipo di risorsa di addestramento personalizzato in uso, seleziona una delle seguenti schede per visualizzare esempi su come trovare il campo dell'API webAccessUris, che contiene un URI shell interattivo per ogni nodo nel tuo job:

CustomJob

Le seguenti schede mostrano diversi modi per inviare una richiesta projects.locations.customJobs.get:

gcloud

Esegui il comando gcloud ai custom-jobs describe:

gcloud ai custom-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

Sostituisci quanto segue:

  • JOB_ID: l'ID numerico del job. Questo ID è l'ultima parte del campo name del job. Potresti aver visto l'ID quando hai creato il job. (Se non conosci l'ID del job, puoi eseguire il comando gcloud ai custom-jobs list e cercare il job appropriato.)

  • LOCATION: la regione in cui hai creato il job.

REST

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • LOCATION: la regione in cui hai creato il job.

  • PROJECT_ID: il tuo ID progetto.

  • JOB_ID: l'ID numerico del job. Questo ID è l'ultima parte del campo name del job. Potresti aver visto l'ID quando hai creato il job.

Metodo HTTP e URL:

GET http://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs/JOB_ID

Per inviare la richiesta, espandi una di queste opzioni:

 

Cerca quanto segue nell'output:

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "webAccessUris": {
    "workerpool0-0": "INTERACTIVE_SHELL_URI"
  }
}

Se non vedi il campo webAccessUris, è possibile che Vertex AI non abbia ancora avviato l'esecuzione del job. Verifica che sia visualizzato JOB_STATE_RUNNING nel campo state. Se lo stato è JOB_STATE_QUEUED o JOB_STATE_PENDING, attendi un minuto, quindi riprova a recuperare le informazioni sul progetto.

HyperparameterTuningJob

Le seguenti schede mostrano diversi modi per inviare una richiesta projects.locations.hyperparameterTuningJobs.get:

gcloud

Esegui il comando gcloud ai hp-tuning-jobs describe:

gcloud ai hp-tuning-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json

Sostituisci quanto segue:

  • JOB_ID: l'ID numerico del job. Questo ID è l'ultima parte del campo name del job. Potresti aver visto l'ID quando hai creato il job. (Se non conosci l'ID del job, puoi eseguire il comando gcloud ai hp-tuning-jobs list e cercare il job appropriato.)

  • LOCATION: la regione in cui hai creato il job.

REST

Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:

  • LOCATION: la regione in cui hai creato il job.

  • PROJECT_ID: il tuo ID progetto.

  • JOB_ID: l'ID numerico del job. Questo ID è l'ultima parte del campo name del job. Potresti aver visto l'ID quando hai creato il job.

Metodo HTTP e URL:

GET http://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/hyperparameterTuningJobs/JOB_ID

Per inviare la richiesta, espandi una di queste opzioni:

 

Cerca quanto segue nell'output:

{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "trials": [
    ...
    {
      ...
      "state": "ACTIVE",
      ...
      "webAccessUris": {
        "workerpool0-0": "INTERACTIVE_SHELL_URI"
      }
    }
  ],
}

Se non vedi il campo webAccessUris, è possibile che Vertex AI non abbia ancora avviato l'esecuzione del job. Verifica che sia visualizzato JOB_STATE_RUNNING nel campo state. Se lo stato è JOB_STATE_QUEUED o JOB_STATE_PENDING, attendi un minuto, quindi riprova a recuperare le informazioni sul progetto.

Vertex AI fornisce un set di URI shell interattivi per ogni prova di ottimizzazione degli iperparametri quando la prova entra nello stato ACTIVE. Se vuoi ottenere URI shell interattivi per le prove successive, recupera le informazioni sul job dopo l'inizio delle prove.

L'esempio precedente mostra l'output previsto per l'addestramento a replica singola: un URI per il nodo di addestramento principale. Se esegui l'addestramento distribuito, l'output contiene un URI per ciascun nodo di addestramento, identificato dal pool di worker.

Ad esempio, se il job ha un pool di worker principale con una replica e un pool di worker secondario con due repliche, il campo webAccessUris è simile al seguente:

{
  "workerpool0-0": "URI_FOR_PRIMARY",
  "workerpool1-0": "URI_FOR_FIRST_SECONDARY",
  "workerpool1-1": "URI_FOR_SECOND_SECONDARY"
}

Usa una shell interattiva

Per utilizzare la shell interattiva per un nodo di addestramento, vai a uno degli URI che hai trovato nella sezione precedente. Nel browser viene visualizzata una shell Bash, che ti permette di accedere al file system del container in cui Vertex AI esegue il codice di addestramento.

Le seguenti sezioni descrivono alcuni aspetti da considerare durante l'utilizzo della shell e forniscono alcuni esempi di strumenti di monitoraggio che potresti utilizzare nella shell.

Impedisci il termine del job

Al termine dell'esecuzione del job o della prova da parte di Vertex AI, perderai immediatamente l'accesso alla shell interattiva. In questo caso, potresti visualizzare il messaggio command terminated with exit code 137 o la shell potrebbe smettere di rispondere. Se hai creato dei file nel file system del container, questi non verranno mantenuti al termine del job.

In alcuni casi, potrebbe essere opportuno prolungare l'esecuzione del job per eseguire il debug con una shell interattiva. Ad esempio, puoi aggiungere al tuo codice di addestramento codice simile al seguente, in modo da mantenere l'esecuzione del job per almeno un'ora dopo che si verifica un'eccezione:

import time
import traceback

try:
    # Replace with a function that runs your training code
    train_model()
except Exception as e:
    traceback.print_exc()
    time.sleep(60 * 60)  # 1 hour

Tuttavia, tieni presente che ti vengono addebitati i costi di addestramento Vertex AI finché il job continua a essere in esecuzione.

Controlla i problemi relativi alle autorizzazioni

L'ambiente shell interattivo viene autenticato utilizzando le credenziali predefinite dell'applicazione (ADC) per l'account di servizio che Vertex AI utilizza per eseguire il tuo codice di addestramento. Puoi eseguire gcloud auth list nella shell per ulteriori dettagli.

Nella shell, puoi utilizzare gsutil, bq e altri strumenti che supportano ADC. In questo modo puoi verificare che il job sia in grado di accedere a un particolare bucket Cloud Storage, a una tabella BigQuery o a un'altra risorsa Google Cloud necessaria per il tuo codice di addestramento.

Visualizza l'esecuzione di Python con py-spy

py-spy consente di profilare un programma Python in esecuzione, senza modificarlo. Per utilizzare py-spy in una shell interattiva, segui questi passaggi:

  1. Installa py-spy:

    pip3 install py-spy
    
  2. Esegui ps aux nella shell e cerca il PID del programma di addestramento Python.

  3. Esegui uno dei sottocomandi descritti nella documentazione di py-spy, utilizzando il PID che hai trovato nel passaggio precedente.

  4. Se utilizzi py-spy record per creare un file SVG, copialo in un bucket Cloud Storage per poterlo visualizzare in seguito sul tuo computer locale. Ad esempio:

    gsutil cp profile.svg gs://BUCKET
    

    Sostituisci BUCKET con il nome di un bucket a cui hai accesso.

Analizza il rendimento con perf

perf consente di analizzare le prestazioni del nodo di addestramento. Per installare la versione di perf appropriata per il kernel Linux del tuo nodo, esegui questi comandi:

apt-get update
apt-get install -y linux-tools-generic
rm /usr/bin/perf
LINUX_TOOLS_VERSION=$(ls /usr/lib/linux-tools | tail -n 1)
ln -s "/usr/lib/linux-tools/${LINUX_TOOLS_VERSION}/perf" /usr/bin/perf

Successivamente, puoi eseguire uno dei sottocomandi descritti nella documentazione di perf.

Recuperare informazioni sull'utilizzo della GPU

In genere, nei container abilitati per GPU in esecuzione su nodi con GPU sono preinstallati diversi strumenti a riga di comando che consentono di monitorare l'utilizzo della GPU. Ad esempio:

  • Utilizza nvidia-smi per monitorare l'utilizzo della GPU di vari processi.

  • Utilizza nvprof per raccogliere una serie di informazioni sulla profilazione della GPU. Poiché nvprof non può collegarsi a un processo esistente, ti consigliamo di utilizzare lo strumento per avviare un processo aggiuntivo che esegue il codice di addestramento. Ciò significa che il codice di addestramento verrà eseguito due volte sul nodo. Ad esempio:

    nvprof -o prof.nvvp python3 -m MODULE_NAME
    

    Sostituisci MODULE_NAME con il nome completo del modulo del punto di ingresso dell'applicazione di addestramento, ad esempio trainer.task.

    Poi trasferisci il file di output in un bucket Cloud Storage per poterlo analizzare in seguito sul tuo computer locale. Ad esempio:

    gsutil cp prof.nvvp gs://BUCKET
    

    Sostituisci BUCKET con il nome di un bucket a cui hai accesso.

  • Se si verifica un errore della GPU (non un problema con la configurazione o con Vertex AI), utilizza nvidia-bug-report.sh per creare una segnalazione di bug.

    Poi trasferisci il report in un bucket Cloud Storage per poterlo analizzare in un secondo momento sul computer locale o inviarlo a NVIDIA. Ad esempio:

    gsutil cp nvidia-bug-report.log.gz gs://BUCKET
    

    Sostituisci BUCKET con il nome di un bucket a cui hai accesso.

Se bash non riesce a trovare nessuno di questi comandi NVIDIA, prova ad aggiungere /usr/local/nvidia/bin e /usr/local/cuda/bin al PATH della shell:

export PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}"

Passaggi successivi