Capturer des profils

Avant d'utiliser Xprof, vous devez d'abord activer la capture de profil dans le code de charge de travail de votre modèle. Il existe deux façons de capturer des profils, comme indiqué ci-dessous.

Capture programmatique

Avec la capture programmatique, vous devez annoter le code de votre modèle pour spécifier les endroits où capturer les profils dans le code. En règle générale, les utilisateurs collectent des profils pour quelques étapes de leur boucle d'entraînement ou profilent un bloc spécifique dans leur modèle. Il existe différentes manières de capturer des traces dans les différents frameworks JAX, Pytorch XLA et TensorFlow : soit avec une API qui démarre ou arrête la trace, soit avec un gestionnaire de contexte.

Capture à la demande (ou capture manuelle)

La capture de profil à la demande est utilisée lorsque vous souhaitez capturer des profils de manière ad hoc pendant votre exécution, pour des périodes où vous n'avez pas activé la capture de profil programmatique. Cette méthode est généralement utilisée lorsque vous constatez un problème dans les métriques de votre modèle pendant l'exécution, et que vous souhaitez capturer des profils à ce moment précis et pendant un certain temps en vue de diagnostiquer le problème.

Pour activer la capture de profil à la demande, vous devrez toujours démarrer le serveur xprof dans votre code. Dans JAX, par exemple, l'activation de jax.profiler.start_server démarre un serveur xprof sur votre charge de travail de ML, qui attend le déclencheur de capture à la demande pour commencer à capturer les profils.

Plusieurs sessions par exécution

Lorsque vous capturez des profils, vous pouvez capturer des profils pour une seule exécution en tant que sessions multiples. Supposons que vous capturez des profils dans un cycle d'entraînement lors des étapes 1 à 3, puis lors des étapes 8 à 10. Ces profils font partie du même cycle, mais la première capture des étapes 1 à 3 sera la session1 et la deuxième capture des étapes 8 à 10 sera la session2. Dans chaque cycle, les différentes sessions portent des codes temporels distincts. Les profils capturés lors de ces différentes sessions peuvent l'être de manière programmatique, à la demande ou en combinant les deux.

XProf et Tensorboard sur Google Cloud

Sur Google Cloud, nous vous recommandons d'utiliser la bibliothèque cloud-diagnostics-xprof pour faciliter l'hébergement de Tensorboard et XProf. Voici quelques-uns des principaux avantages de l'utilisation de cette bibliothèque sur GCP :

  • Configuration et packaging faciles des dépendances XProf et TensorBoard.
  • Stockage de vos profils dans GCS, utile pour la conservation à long terme et l'analyse post-exécution (les profils locaux capturés seront supprimés une fois l'exécution terminée).
  • Chargement rapide de profils volumineux et de plusieurs profils grâce au provisionnement de TensorBoard sur une VM GCE ou un pod GKE, avec la possibilité de modifier le type de machine en fonction des besoins de l'utilisateur en termes de vitesse de chargement et de coût.
  • Création d'un lien facilitant le partage des profils et la collaboration entre les membres d'équipe et les ingénieurs Google ;
  • Profilage à la demande des charges de travail sur GKE et GCE facilité : n'importe quel hôte exécutant votre charge de travail peut être sélectionné pour la capture des profils.

Instructions spécifiques au framework

Découvrez comment activer le profilage programmatique et à la demande dans différents frameworks :

Dépannage

Profilage du GPU

Les programmes exécutés sur le GPU doivent générer des traces pour les flux GPU en haut du visualiseur de trace. Si vous ne voyez que les traces de l'hôte, vérifiez les journaux et/ou la sortie de votre programme pour les messages d'erreur suivants.

Si vous obtenez une erreur semblable à celle-ci : Could not load dynamic library 'libcupti.so.10.1'
Erreur complète :

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.

Ajoutez le chemin d'accès à libcupti.so à la variable d'environnement LD_LIBRARY_PATH. (Essayez locate libcupti.so pour trouver le chemin.) Exemple :

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

Si le message Could not load dynamic library s'affiche toujours après cela, vérifiez si la trace GPU apparaît quand même dans le trace viewer. Ce message s'affiche parfois même lorsque tout fonctionne, car il recherche la bibliothèque libcupti à plusieurs endroits.

Si vous obtenez une erreur semblable à celle-ci : failed with error CUPTI_ERROR_INSUFFICIENT_PRIVILEGES
Erreur complète :

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

Exécutez les commandes suivantes (notez que cela nécessite un redémarrage) :

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

Pour en savoir plus, consultez la documentation de NVIDIA sur cette erreur.

Profiler sur une machine distante

Si le programme que vous souhaitez profiler s'exécute sur une machine distante, vous pouvez exécuter toutes les instructions ci-dessus sur la machine distante (en particulier, démarrer le serveur XProf sur la machine distante), puis utiliser le transfert de port local SSH pour accéder à l'interface utilisateur Web XProf depuis votre machine locale. Utilisez la commande SSH suivante pour transférer le port XProf par défaut 8791 de la machine locale vers la machine distante :

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

ou si vous utilisez Google Cloud :

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

Installations TensorBoard multiples

Si le démarrage de TensorBoard échoue et qu'une erreur de ce type s'affiche : ValueError: Duplicate plugins for name projector

Cela est souvent dû à l'installation de deux versions de TensorBoard et/ou TensorFlow (par exemple, les packages pip tensorflow, tf-nightly, tensorboard et tb-nightly incluent tous TensorBoard). La désinstallation d'un seul package pip peut entraîner la suppression de l'exécutable tensorboard, qui est ensuite difficile à remplacer. Il peut donc être nécessaire de tout désinstaller et de réinstaller une seule version :

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

Résoudre les problèmes de droits d'accès

Lorsque vous exécutez le profilage avec CUDA® Toolkit dans un environnement Docker ou sous Linux, vous pouvez rencontrer des problèmes liés à des privilèges CUPTI insuffisants (CUPTI_ERROR_INSUFFICIENT_PRIVILEGES). Consultez la documentation NVIDIA Developer pour savoir comment résoudre ces problèmes sous Linux.

Pour résoudre les problèmes de droits CUPTI dans un environnement Docker, exécutez

docker run option '--privileged=true'