Acquisizione dei profili

Per utilizzare Xprof, devi prima abilitare l'acquisizione del profilo nel codice del carico di lavoro del modello. Esistono due modi per acquisire i profili, descritti di seguito.

Acquisizione programmatica

Con l'acquisizione programmatica, devi annotare il codice del modello per specificare in quale punto del codice vuoi acquisire i profili. In genere, gli utenti raccolgono i profili per alcuni passaggi durante il ciclo di addestramento o profilano un blocco specifico all'interno del modello. Esistono diversi modi per acquisire le tracce nei diversi framework JAX, Pytorch XLA e TensorFlow: avvio/interruzione della traccia basato su API o basato su gestore di contesto.

Acquisizione on demand (nota anche come acquisizione manuale)

L'acquisizione di profili on demand viene utilizzata quando vuoi acquisire profili ad hoc durante la corsa, per i periodi di tempo in cui non hai attivato l'acquisizione programmatica dei profili. Questo viene in genere utilizzato quando si riscontrano problemi con le metriche del modello durante l'esecuzione e si vogliono acquisire profili in quel momento per un determinato periodo di tempo per diagnosticare il problema.

Per attivare l'acquisizione dei profili on demand, devi comunque avviare il server xprof all'interno del codice. In JAX, ad esempio, l'attivazione di jax.profiler.start_server avvierà un server xprof sul tuo workload ML che è in ascolto del trigger di acquisizione on demand per avviare l'acquisizione dei profili.

Più sessioni per corsa

Quando acquisisci i profili, puoi acquisire i profili per una singola corsa come più sessioni. Supponiamo di acquisire i profili in una sessione di allenamento dai passaggi 1-3 e successivamente dai passaggi 8-10. Quindi, questi sono profili per la stessa corsa, ma la prima acquisizione dei passaggi 1-3 sarà sessione1 e la seconda acquisizione dei passaggi 8-10 sarà sessione2. Le diverse sessioni saranno indicate con date diverse in ogni corsa. Puoi acquisire profili in sessioni diverse in modo programmatico, on demand o una combinazione di entrambi.

Snapshot di profilazione continua

Gli snapshot di profilazione continua vengono utilizzati per acquisire un profilo che termina in un momento specifico, a differenza della profilazione on demand, in cui i profili vengono acquisiti per un periodo di tempo successivo. Questa opzione è utile per i job a lunga esecuzione in cui vuoi acquisire un profilo nell'istante in cui viene diagnosticato il problema.

Per attivare gli snapshot di profilazione continua, devi avviare il server xprof all'interno del codice. In JAX, ad esempio, l'attivazione di jax.profiler.start_server avvierà un server xprof sul tuo carico di lavoro ML che è in attesa del trigger di profilazione degli snapshot per iniziare l'acquisizione dei profili.

XProf e Tensorboard su Google Cloud

Su Google Cloud, ti consigliamo di utilizzare la libreria cloud-diagnostics-xprof per semplificare l'hosting di TensorBoard e XProf. Alcuni dei principali vantaggi dell'utilizzo di questa libreria su GCP:

  • Configurazione e packaging semplici delle dipendenze di XProf e TensorBoard.
  • Archivia i tuoi profili in GCS, il che può essere utile per la conservazione a lungo termine e l'analisi post-esecuzione (i profili locali acquisiti verranno eliminati al termine dell'esecuzione da parte del ricercatore).
  • Caricamento rapido di profili di grandi dimensioni e di più profili mediante il provisioning di TensorBoard su VM GCE o pod GKE, con la possibilità di modificare il tipo di macchina in base alle esigenze dell'utente in termini di velocità di caricamento e costi.
  • Crea un link per condividere facilmente i profili e collaborare con i membri del team e gli ingegneri di Google.
  • Profilazione on demand più semplice dei carichi di lavoro su GKE e GCE per scegliere qualsiasi host che esegue il carico di lavoro per acquisire i profili.

Istruzioni specifiche per il framework

Scopri come attivare la profilazione programmatica e on demand in diversi framework:

Risoluzione dei problemi

Profilazione GPU

I programmi in esecuzione sulla GPU devono produrre tracce per gli stream della GPU vicino alla parte superiore del visualizzatore di tracce. Se visualizzi solo le tracce host, controlla i log e/o l'output del programma per i seguenti messaggi di errore.

Se ricevi un errore come: Could not load dynamic library 'libcupti.so.10.1'
Errore completo:

W external/org_tensorflow/tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcupti.so.10.1'; dlerror: libcupti.so.10.1: cannot open shared object file: No such file or directory
2020-06-12 13:19:59.822799: E external/org_tensorflow/tensorflow/core/profiler/internal/gpu/cupti_tracer.cc:1422] function cupti_interface_->Subscribe( &subscriber_, (CUpti_CallbackFunc)ApiCallback, this)failed with error CUPTI could not be loaded or symbol could not be found.

Aggiungi il percorso a libcupti.so alla variabile di ambiente LD_LIBRARY_PATH. Prova locate libcupti.so per trovare il percorso. Ad esempio:

export LD_LIBRARY_PATH=/usr/local/cuda-10.1/extras/CUPTI/lib64/:$LD_LIBRARY_PATH

Se continui a ricevere il messaggio Could not load dynamic library dopo aver eseguito questa operazione, controlla se la traccia della GPU viene comunque visualizzata nel visualizzatore di tracce. Questo messaggio a volte viene visualizzato anche quando tutto funziona, perché cerca la libreria libcupti in più posizioni.

Se ricevi un errore come: failed with error CUPTI_ERROR_INSUFFICIENT_PRIVILEGES
Errore completo:

E external/org_tensorflow/tensorflow/core/profiler/internal/gpu/cupti_tracer.cc:1445] function cupti_interface_->EnableCallback( 0 , subscriber_, CUPTI_CB_DOMAIN_DRIVER_API, cbid)failed with error CUPTI_ERROR_INSUFFICIENT_PRIVILEGES
2020-06-12 14:31:54.097791: E external/org_tensorflow/tensorflow/core/profiler/internal/gpu/cupti_tracer.cc:1487] function cupti_interface_->ActivityDisable(activity)failed with error CUPTI_ERROR_NOT_INITIALIZED

Esegui questi comandi (tieni presente che è necessario riavviare il sistema):

echo 'options nvidia "NVreg_RestrictProfilingToAdminUsers=0"' | sudo tee -a /etc/modprobe.d/nvidia-kernel-common.conf
sudo update-initramfs -u
sudo reboot now

Per saperne di più, consulta la documentazione di NVIDIA su questo errore.

Profilazione su una macchina remota

Se il programma di cui vuoi creare il profilo è in esecuzione su una macchina remota, una possibilità è eseguire tutte le istruzioni riportate sopra sulla macchina remota (in particolare, avvia il server XProf sulla macchina remota), quindi utilizza il port forwarding SSH locale per accedere alla UI web di XProf dalla tua macchina locale. Utilizza il seguente comando SSH per inoltrare la porta XProf predefinita 8791 dalla macchina locale a quella remota:

ssh -L 8791:localhost:8791 <remote server address>

o se utilizzi Google Cloud:

$ gcloud compute ssh <machine-name> -- -L 8791:localhost:8791

Più installazioni di TensorBoard

Se l'avvio di TensorBoard non va a buon fine e viene visualizzato un errore come: ValueError: Duplicate plugins for name projector

Spesso il problema è dovuto alla presenza di due versioni di TensorBoard e/o TensorFlow installate (ad es. i pacchetti pip tensorflow, tf-nightly, tensorboard e tb-nightly includono tutti TensorBoard). La disinstallazione di un singolo pacchetto pip può comportare la rimozione dell'eseguibile tensorboard, che è poi difficile sostituire, quindi potrebbe essere necessario disinstallare tutto e reinstallare una singola versione:

pip uninstall tensorflow tf-nightly tensorboard tb-nightly xprof xprof-nightly tensorboard-plugin-profile tbp-nightly
pip install tensorboard xprof

Risolvere i problemi relativi ai privilegi

Quando esegui la profilazione con CUDA® Toolkit in un ambiente Docker o su Linux, potresti riscontrare problemi relativi a privilegi CUPTI insufficienti (CUPTI_ERROR_INSUFFICIENT_PRIVILEGES). Visita la documentazione per sviluppatori NVIDIA per scoprire di più su come risolvere questi problemi su Linux.

Per risolvere i problemi relativi ai privilegi CUPTI in un ambiente Docker, esegui

docker run option '--privileged=true'