Monitoraggio e debug dell'addestramento con una shell interattiva

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

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

  • Esegui strumenti di monitoraggio e profilazione.
  • Analizza l'utilizzo della GPU.
  • Controlla le autorizzazioni Google Cloud disponibili per il contenitore.

Puoi anche utilizzare Cloud Profiler per eseguire il debug delle prestazioni dell'addestramento dei modelli per i tuoi job di addestramento personalizzati. Per maggiori dettagli, consulta Valutare le 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 personalizzata TrainingPipeline. Quando prepari il codice di addestramento e configuri la risorsa di addestramento personalizzato che preferisci, assicurati di soddisfare i seguenti requisiti:

  • Assicurati che nel contenitore di addestramento sia installato bash.

    Tutti i container di addestramento predefiniti sono stati installati conbash. Se crei un container personalizzato per la formazione, utilizza un container di base che includa bash o installa bash nel tuo Dockerfile.

  • Esegui l'addestramento personalizzato in una regione che supporta i prompt interattivi.

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

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

    Se avvii l'addestramento personalizzato autonomamente, molto probabilmente disponi già di queste autorizzazioni e puoi accedere a una shell interattiva. Tuttavia, se vuoi usare una shell interattiva per ispezionare una risorsa di formazione personalizzata creata da qualcun altro nella 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 colleghi un account di servizio personalizzato alla tua risorsa di addestramento personalizzata, assicurati che qualsiasi utente che voglia accedere a una shell interattiva disponga dell'autorizzazione iam.serviceAccounts.actAs per l'account di servizio collegato.

    La guida agli account di servizio personalizzati indica che devi disporre di questa autorizzazione per collegare un account di servizio. Questa autorizzazione è necessaria anche per visualizzare una shell interattiva durante l'addestramento personalizzato.

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

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

    • Non puoi utilizzare l'IP privato per l'addestramento personalizzato. Se hai bisogno di VPC-SC con peering VPC, è necessaria una configurazione aggiuntiva per utilizzare la shell interattiva. Segui le istruzioni riportate in Ray Dashboard e shell interattiva con VPC-SC + peering VPC per configurare la configurazione della shell interattiva con VPC-SC e peering VPC nel tuo progetto utente.

    • Da una shell interattiva, non puoi accedere a internet pubblico o alle risorse Google Cloud al di fuori del perimetro del servizio.

    • Per proteggere l'accesso alle shell interattive, devi aggiungerenotebooks.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 esterne al perimetro del servizio, il che riduce il vantaggio in termini di sicurezza dell'utilizzo di Controlli di servizio VPC.

Attiva le shell interattive

Per attivare le shell interattive per una risorsa di formazione personalizzata, imposta il true nel enableWebAccess quando crei un CustomJob, un HyperparameterTuningJob o un personalizzato TrainingPipeline.

Gli esempi seguenti 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 del modello, procedi nel seguente modo:

  1. Fai clic su Opzioni avanzate.

  2. Seleziona la casella di controllo Attiva il debug dell'addestramento.

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

gcloud

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

API

I seguenti corpi di richieste REST parziali mostrano dove specificare il enableWebAccess campo per ogni tipo di risorsa di formazione personalizzata:

CustomJob

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

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

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

HyperparameterTuningJob

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

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

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

TrainingPipeline personalizzato

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

Senza ottimizzazione degli iperparametri

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

Con l'ottimizzazione degli iperparametri

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

Per un esempio di invio di una richiesta API per creare un personalizzatoTrainingPipeline, consulta Creare 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 riportate nella sezione precedente, Vertex AI genera uno o più URI che puoi utilizzare per accedere alle shell interattive. Vertex AI genera un URI unico 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
  • Utilizza l'API Vertex AI per ottenere l'URI di accesso web della shell
  1. Nella console Google Cloud, nella sezione Vertex AI, vai a una delle seguenti pagine:

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

    Se hai creato un TrainingPipeline per la formazione personalizzata, fai clic sul nome del CustomJob o del HyperparameterTuningJob creato dal tuo TrainingPipeline. Ad esempio, se la pipeline ha il nome PIPELINE_NAME, potrebbe essere chiamata PIPELINE_NAME-custom-job o PIPELINE_NAME-hyperparameter-tuning-job.

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

    Tieni presente che puoi accedere a una shell interattiva solo durante l'esecuzione del job. Se non vedi Avvia terminale web, è possibile che Vertex AI non abbia ancora iniziato a eseguire il job o che il job sia già terminato o abbia avuto esito negativo. Se lo stato del job è Queued o Pending, attendi un minuto e poi prova ad aggiornare la pagina.

    Se utilizzi l'ottimizzazione degli iperparametri, sono disponibili link di avvio del terminale web separati per ogni prova.

Recupera l'URI di accesso web dall'API

Utilizza 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 formazione personalizzata che utilizzi, seleziona una delle seguenti schede per vedere esempi di come trovare il campo dell'API webAccessUris, che contiene un URI shell interattivo per ogni nodo del tuo job:

CustomJob

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

gcloud

Esegui il gcloud ai custom-jobs describe comando:

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

Sostituisci quanto segue:

  • JOB_ID: l'ID numerico del tuo 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 tuo job, puoi eseguire il gcloud ai custom-jobs list comando e cercare il job appropriato.

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

REST

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

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

  • PROJECT_ID: il tuo ID progetto.

  • JOB_ID: l'ID numerico del tuo 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 https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs/JOB_ID

Per inviare la richiesta, espandi una di queste opzioni:

 

Nell'output, cerca quanto segue:

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

Se non vedi il campo webAccessUris, è possibile che Vertex AI non abbia ancora iniziato a eseguire il 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 gcloud ai hp-tuning-jobs describe comando:

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

Sostituisci quanto segue:

  • JOB_ID: l'ID numerico del tuo 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 gcloud ai hp-tuning-jobs list comando e cercare il job appropriato.

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

REST

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

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

  • PROJECT_ID: il tuo ID progetto.

  • JOB_ID: l'ID numerico del tuo 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 https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/hyperparameterTuningJobs/JOB_ID

Per inviare la richiesta, espandi una di queste opzioni:

 

Nell'output, cerca quanto segue:

{
  ...
  "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 iniziato a eseguire il 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 insieme di URI shell interattivi per ogni prova di ottimizzazione degli iperparametri quando la prova entra nello stato ACTIVE. Se vuoi ottenere gli URI della shell interattiva per le prove successive, recupera di nuovo le informazioni sul job dopo l'avvio delle prove.

L'esempio precedente mostra l'output previsto per l'addestramento con una singola replica: un URI per il nodo di addestramento principale. Se esegui l'addestramento distribuito, l'output contiene un URI per ogni 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"
}

Utilizzare una shell interattiva

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

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

Impedire il termine del job

Quando Vertex AI termina l'esecuzione del job o della prova, perderai immediatamente l'accesso alla shell interattiva. In questo caso, potresti vedere il messaggio command terminated with exit code 137 o la shell potrebbe smettere di rispondere. Se hai creato file nel file system del contenitore, questi non rimangono al termine del job.

In alcuni casi, potresti voler prolungare intenzionalmente l'esecuzione del job per eseguire il debug con una shell interattiva. Ad esempio, puoi aggiungere codice come quello riportato di seguito al codice di addestramento per fare in modo che il job continui a funzionare per almeno un'ora dopo l'occorrenza di 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 costi di Vertex AI Training finché il job continua a essere eseguito.

Verificare i problemi relativi alle autorizzazioni

L'ambiente della shell interattiva viene autenticato utilizzando le credenziali predefinite dell'applicazione (ADC) per l'account di servizio utilizzato da Vertex AI per eseguire il codice di addestramento. Puoi eseguire gcloud auth list nella shell per maggiori dettagli.

Nella shell, puoi utilizzare bq e altri strumenti che supportano l'ADC. In questo modo puoi verificare che il job sia in grado di accedere a un determinato bucket Cloud Storage, a una tabella BigQuery o a un'altra risorsa Google Cloud di cui ha bisogno il codice di addestramento.

Visualizza l'esecuzione di Python con py-spy

py-spy consente di eseguire il profiling di un programma Python in esecuzione senza modificarlo. Per utilizzare py-spy in una shell interattiva:

  1. Installa py-spy:

    pip3 install py-spy
    
  2. Esegui ps aux nella shell e cerca il PID del programma di formazione in 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 in modo da poterlo visualizzare in seguito sul tuo computer locale. Ad esempio:

    gcloud storage cp profile.svg gs://BUCKET
    

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

Analizza il rendimento con perf

perf ti consente di analizzare il rendimento del tuo nodo di addestramento. Per installare la versione di perf appropriata per il kernel Linux del tuo nodo, esegui i seguenti 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

Dopodiché puoi eseguire uno dei sottocomandi descritti nella documentazione di perf.

Recuperare informazioni sull'utilizzo della GPU

I container abilitati per GPU in esecuzione su nodi con GPU in genere hanno diversi strumenti a riga di comando preinstallati che possono aiutarti a 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 sul profiling della GPU. Poiché nvprof non può collegarsi a un processo esistente, potresti scegliere 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 accesso dell'applicazione di formazione, ad esempio trainer.task.

    Trasferisci poi il file di output in un bucket Cloud Storage per poterlo analizzare in un secondo momento sul computer locale. Ad esempio:

    gcloud storage 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.

    Trasferisci poi il report in un bucket Cloud Storage per analizzarlo in un secondo momento sul tuo computer locale o inviarlo a NVIDIA. Ad esempio:

    gcloud storage 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 a PATH della shell:

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

Dashboard di Ray e shell interattiva con VPC-SC + peering VPC

  1. Configura peered-dns-domains.

    {
      VPC_NAME=NETWORK_NAME
      REGION=LOCATION
      gcloud services peered-dns-domains create training-cloud \
      --network=$VPC_NAME \
      --dns-suffix=$REGION.aiplatform-training.cloud.google.com.
    
      # Verify
      gcloud beta services peered-dns-domains list --network $VPC_NAME);
    }
        
    • NETWORK_NAME: passa alla rete connessa in peer.

    • LOCATION: posizione desiderata (ad esempio us-central1).

  2. Configura DNS managed zone.

    {
      PROJECT_ID=PROJECT_ID
      ZONE_NAME=$PROJECT_ID-aiplatform-training-cloud-google-com
      DNS_NAME=aiplatform-training.cloud.google.com
      DESCRIPTION=aiplatform-training.cloud.google.com
    
      gcloud dns managed-zones create $ZONE_NAME  \
      --visibility=private  \
      --networks=https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/$VPC_NAME  \
      --dns-name=$DNS_NAME  \
      --description="Training $DESCRIPTION"
    }
        
    • PROJECT_ID: l'ID del tuo progetto. Puoi trovare questi ID nella pagina di benvenuto della console Google Cloud.

  3. Registra la transazione DNS.

    {
      gcloud dns record-sets transaction start --zone=$ZONE_NAME
    
      gcloud dns record-sets transaction add \
      --name=$DNS_NAME. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction add \
      --name=*.$DNS_NAME. \
      --type=CNAME $DNS_NAME. \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction execute --zone=$ZONE_NAME
    }
        
  4. Invia un job di addestramento con la shell interattiva + VPC-SC + VPC Peering abilitati.

Passaggi successivi