Outil Lecteur de traces
Vous pouvez utiliser le lecteur de traces pour visualiser la chronologie des événements survenus pendant la session de profilage. Il affiche les durées des opérations exécutées par votre modèle sur différentes parties du système, telles que l'hôte (CPU) et les accélérateurs (GPU ou TPU). Vous pouvez ainsi comprendre comment votre modèle utilise les ressources matérielles, identifier les goulots d'étranglement des performances et optimiser votre modèle pour une exécution plus rapide. L'UI du lecteur de traces est basée sur celle utilisée dans chrome://tracing
et nécessite donc d'utiliser le navigateur Chrome.
Plates-formes compatibles
TPU: compatible
GPU: compatible
Le lecteur de traces pour les GPU regroupe les événements sur des chronologies par puce GPU et par flux, tandis que pour les TPU, il organise les événements sur des chronologies par puce et par cœur TPU. Dans les deux cas, l'Observateur de traces présente également des événements sur des chronologies par thread pour le processeur hôte auquel les accélérateurs sont connectés.
Interagir avec la chronologie
Le visionneuse de traces fournit plusieurs outils et méthodes pour naviguer et examiner la chronologie:
- Navigation: vous pouvez utiliser les raccourcis clavier suivants :
- W:zoom avant.
- S:zoom arrière.
- A: Faire un panoramique vers la gauche.
- D: Faire un panoramique vers la droite.
- Sélecteur d'outils: vous pouvez cliquer sur un outil dans le sélecteur d'outils ou utiliser le raccourci clavier correspondant :
- Outil de sélection (1 ou !) : cliquez sur un événement pour le sélectionner et afficher ses détails dans le volet "Détails". Sélectionnez plusieurs événements via Ctrl+clic pour afficher un résumé.
- Outil de panoramique (2 ou @) : faites glisser pour déplacer la chronologie horizontalement ou verticalement.
- Outil de zoom (3 ou #) : faites glisser pour faire un zoom avant sur une zone spécifique de la chronologie.
- Outil de synchronisation (4 ou $) : faites glisser pour marquer un intervalle de temps. La durée de l'intervalle marqué s'affiche. Vous pouvez également utiliser la touche "m" pour marquer une sélection et déterminer sa durée totale.
- Zoom sur les événements sélectionnés (f): sélectionnez un ou plusieurs événements, puis appuyez sur la touche f pour effectuer un zoom rapide sur cette partie de la chronologie. Cela permet de se concentrer sur une étape de formation spécifique.
Lorsque vous gérez un grand nombre d'événements de trace, le lecteur de traces fonctionne en mode streaming. Cela signifie qu'il charge les données à la demande lorsque vous faites un panoramique et un zoom sur la chronologie, comme le font les applications cartographiques. Si vous effectuez un zoom plus rapidement que les données ne peuvent être chargées, vous verrez peut-être une représentation basse résolution des données jusqu'à ce qu'elles soient chargées.
Composants de l'interface du lecteur de traces
Voici les principaux composants de l'UI du lecteur de traces:
- L'axe temporel s'étend horizontalement en haut, et indique le temps par rapport au début de la trace.
- Les chronologies sont organisées par sections et pistes, avec des libellés situés sur l'axe vertical de gauche. Chaque section représente un élément de traitement (par exemple, un nœud d'appareil ou des threads hôtes) et peut être développée ou réduite. Chaque section contient des pistes, qui sont des chronologies d'activités spécifiques.
- Les événements sont les blocs rectangulaires colorés sur les pistes de la chronologie. Ils représentent la durée d'une opération ou d'un méta-événement, comme une étape d'entraînement. La couleur des événements n'a pas de signification spécifique.
- Le volet d'informations affiche des informations supplémentaires sur les événements sélectionnés dans le volet de chronologie, comme leur nom, leur heure de début et leur durée.
Sections et pistes standards
Le lecteur de traces fournit les sections et les pistes suivantes.
- Une section pour chaque nœud TPU, avec les pistes suivantes :
- Module XLA: programme XLA en cours d'exécution.
- Opérations XLA: affiche les opérations HLO XLA exécutées sur le cœur TPU. Chaque opération de framework de niveau supérieur (JAX, Tensorflow ou PyTorch, par exemple) est traduite en une ou plusieurs opérations XLA, qui sont ensuite compilées pour s'exécuter sur le TPU. Lorsque vous cliquez sur une opération XLA, vous pouvez voir des liens vers l'opération dans l'Afficheur de graphiques, ainsi que des informations supplémentaires sur l'opération, telles que les heures de début/d'arrêt, la durée et la trace de la pile source (si elle est mise à disposition par le framework et le compilateur).
- XLA TraceMe: annotations spécifiées par l'utilisateur dans son code décrivant les unités de travail logiques qu'il a l'intention de suivre. Vous pouvez toujours voir des données ici, même si vous n'avez ajouté aucune annotation. Celles-ci sont généralement ajoutées par XLA (par exemple, les cœurs de barrière) ou par XProf lui-même (par exemple, les entrées de trace supprimées).
- Étape: indique la durée des étapes d'entraînement exécutées sur ce cœur de TPU, si elles sont correctement annotées dans le programme ou le framework utilisateur.
- Opérations du framework: affiche les opérations du framework (JAX, Tensorflow ou PyTorch, par exemple) exécutées sur le cœur du TPU, si elles sont correctement annotées dans le programme ou le framework utilisateur.
- Champ d'application du nom du framework: pour chaque opération de framework, une visualisation de la trace de la pile. Par souci de concision, cette piste n'apparaît que pour un seul appareil.
- Code source: chemin d'accès au code source exécuté, le cas échéant dans le profil.
- Unité scalaire: pour les TPU, événements exécutés sur l'unité scalaire, représentés s'ils sont présents dans le profil.
- TensorCore Sync Flags: mécanisme de synchronisation sur les TPU, représenté s'il est présent dans le profil.
- Déchargement de l'hôte: opérations qui déplacent de manière asynchrone des données entre la mémoire de l'hôte et la mémoire de l'accélérateur. Des opérations de démarrage et d'arrêt correspondantes apparaissent généralement sur la ligne "Opérations XLA", indiquant que l'accélérateur se prépare au transfert de données (par exemple, en marquant les régions de mémoire source/destination comme "en cours d'utilisation" pendant la durée du transfert). Plusieurs lignes d'offload hôte peuvent être présentes si plusieurs opérations d'offload s'exécutent en parallèle, ce qui oblige le lecteur de traces à afficher simultanément plusieurs événements.
- Une section pour chaque nœud Sparsecore: certaines générations de TPU (par exemple, Les TPU v5p et TPU v6e sont équipés d'une ou de plusieurs unités SparseCore en plus des unités MXU de calcul dense. Les modules, les opérations et les TraceMes associés à ces cœurs s'affichent dans cette section.
- Une section pour chaque nœud GPU, avec les pistes suivantes :
- Modules XLA, opérations de framework, portée du nom du framework, étapes, code source. Ils sont tous semblables aux sections TPU.
- Un canal par flux, le nom du flux incluant également des informations sur les types d'opérations exécutées sur le flux (Memcpy, Compute, etc.).
- XLA TraceMe n'est pas compatible avec les GPU.
- Les opérations XLA apparaissent dans les sections GPU, mais elles ne sont pas toujours exactes, car elles sont dérivées des données de flux. Ils ne peuvent donc pas entièrement tenir compte du modèle d'exécution du GPU, où il peut y avoir un mappage N:M des opérations XLA sur les noyaux réels exécutés sur les différents flux, et la planification dynamique de plusieurs flux sur différents SM du matériel.
- Une section pour chaque composant (par exemple, un threadpool) exécuté sur le processeur de la machine hôte, avec une piste par thread, dans le cas des threadpools. C'est également là que vous verrez les traces Python si elles ont été activées lors de la collecte de profil.
Notez que seules les opérations XLA pour les TPU et les données de flux pour les GPU sont directement basées sur le profil collecté. Toutes les autres lignes sont des "lignes dérivées", qui impliquent des informations facultatives "sideband" fournies par le compilateur, des annotations utilisateur facultatives et/ou des heuristiques appliquées par XProf. Par conséquent, ces lignes dérivées peuvent apparaître ou non dans certains profils.
Autres fonctionnalités
- Vous pouvez rechercher des noms d'événements spécifiques à l'aide de la barre de recherche "Rechercher des événements…". Pour le moment, cette recherche ne s'effectue que dans la période visible à l'écran, et non dans la trace complète.
- Événements de flux: en activant cette option en cliquant sur le bouton "Événements de flux" dans la barre supérieure, vous ajoutez des visualisations qui associent les événements d'un fil de discussion ou d'une ligne à ceux d'un autre fil de discussion ou d'une autre ligne. Par exemple, une flèche peut être tracée entre l'opération sur l'hôte qui met en file d'attente ou lance une tâche pour un accélérateur et l'opération sur l'accélérateur qui exécute cette tâche. XProf détermine ces liens via une combinaison d'annotations utilisateur, d'heuristiques intégrées et d'informations post-traitées qu'il reçoit de différents composants (par exemple, Pilotes CUPTI, ID de lancement du kernel, informations d'exécution TPU, etc.)
- Cliquez sur une opération XLA pour afficher des informations supplémentaires dans le volet d'informations. Par exemple, il renvoie vers l'opération dans l'outil Graph Viewer. Il peut également fournir des pointeurs vers le code source et/ou la trace de la pile Python, l'opération de framework ayant entraîné la génération de cette opération XLA, etc. (si elle est présente dans le profil). Il peut également afficher les FLOPS (nombre d'opérations à virgule flottante exécutées par l'opération) et les octets auxquels l'opération accède. Ces informations sont acquises de manière statique auprès de XLA lors de la compilation, plutôt que des informations d'exécution du profil.