Jean Zay : Utiliser DLProf avec PyTorch
DLProf est un outil de profilage fourni par NVIDIA et dédié au Deep Learning. Il se base sur l'outil Nsight Systems, également développé par NVIDIA. DLProf, par le biais de Nsight Systems, recueille et enregistre les instructions exécutées par les différents GPU.
L'application dlprofviewer sert d'interface entre les fichiers de logs générés par DLProf et le tableau de bord à partir duquel on pourra visualiser les différents rapports de l'outil.
Disponibilité sur Jean Zay
Sur Jean Zay, l'outil DLProf est disponible dans les modules PyTorch à partir de la version pytorch-gpu/py3/1.8.1.
Vous pouvez charger un de nos modules en lançant par exemple :
module load pytorch-gpu/py3/1.9.0
La dernière release de DLProf se base sur PyTorch 1.11. Il n'est pas garanti que DLProf fonctionne encore sur les versions plus récentes de PyTorch.
Implémentation de DLProf
Pour faire fonctionner DLProf dans votre code vous devez ajouter quelques lignes de code.
Dans le script Python
Tout d'abord il faut charger le plugin et l'initialiser :
import nvidia_dlprof_pytorch_nvtx as dlprof
dlprof.init()
Ensuite il faut lancer la boucle d'entraînement dans le contexte emit_nvtx de PyTorch. Ce contexte se chargera de récolter des valeurs pour le rapport Nsight Systems.
with torch.autograd.profiler.emit_nvtx():
for epoch in range(2):
for i, (texts, labels) in enumerate(train_loader):
...
Dans le script Slurm
De la même manière qu'avec Nsight, il faut éviter de surcharger le dossier système
/tmp qui est utilisé par défaut (espace très petit sur les nœuds de calcul). Pour cela, il faut s'assurer que les fichiers temporaires soient placés dans l'espace appelé $JOBSCRATCH.
En séquentiel
Si votre code s'exécute sur un seul processus, vous pourrez utiliser les instructions suivantes dans votre script de lancement pour utiliser DLProf :
export TMPDIR=$JOBSCRATCH
ln -s $JOBSCRATCH /tmp/nvidia
srun dlprof --mode pytorch python script.py
En parallèle
Avec les instructions ci-dessus, lorsque plusieurs processus sont utilisés (en multi-GPU avec un processus par GPU), tous les processus DLProf chercheront à écrire dans un seul et même fichier qui sera alors corrompu. Pour pallier ce problème, il faut spécifier un fichier de sortie différent pour chaque processus.
De plus, si vous travaillez en multi-noeuds, il faut créer un dossier temporaire TMPDIR différent pour chaque nœud.
Un exemple de commande fonctionnelle :
srun bash -c 'export TMPDIR=${JOBSCRATCH}/${SLURM_PROCID};\
mkdir -p ${TMPDIR}/tmp;\
ln -s ${TMPDIR}/tmp /tmp/nvidia;\
dlprof -m pytorch\
--output_path ./${SLURM_PROCID}\
--nsys_base_name nsys_${SLURM_PROCID}\
--profile_name dlprof_rank${SLURM_PROCID}\
python script.py'
Vous obtiendrez un fichier de log par processus.
Visualisation avec DLProf Viewer
Les fichiers de logs de DLProf (dlprof_dldb.sqlite) doivent être téléchargés sur votre machine personnelle afin d'être visualisés via une installation locale de DLProf Viewer. Toutes les informations nécessaires pour l'utilisation et l'installation sont disponibles dans la documentation officielle de NVIDIA : DLProf Viewer User Guide.
Il faudra choisir une version de DLProf Viewer compatible avec la version de PyTorch utilisée à l'exécution.
Le tableau de bord de visualisation s'affiche simplement en ouvrant le bon fichier de log avec la commande :
dlprofviewer dlprof_dldb.sqlite
Tableau de bord DLProf

Visualisation de la Timeline avec l'outil Nsight Systems
Pour visualiser les traces chronologiques, il faut ouvrir les rapports Nsight Systems générés par dlprof.
Pour cela il faut :
- se connecter à Jean Zay avec l'option graphique (forwarding X11) activée
:
ssh -X <login_jean-zay>@jean-zay.idris.fr - charger un module comportant la bonne version de Nsight Systems,
par exemple :
module load nvidia-nsight-systems/2021.2.1 - ouvrir le fichier de trace avec l'outil graphique de Nsight Systems, par
exemple :
nsys-ui nsys_0.qdrep
Visualisation Nsight Systems

Bonne utilisation du profiler
Dans le cas où le profiler ralentirait drastiquement l'entraînement, créerait des out of memory ou d'autres erreurs en raison de la surcharge d'opérations qu'il engendre, il est conseillé de réduire le nombre d'itérations (par exemple à 50, voire 10), avec les commandes --iter_start et --iter_stop (voir la documentation DLProf User Guide), et/ou de réduire la taille du dataset.
Le profiler n'est pas destiné à être utilisé pendant un entraînement complet.
Documentation officielle
- Documentation DLProf User Guide
- Documentation DLProf Viewer User Guide