TensorBoard est une suite d'applications Web permettant d'inspecter et de comprendre vos exécutions et graphiques TensorFlow.
Ce README donne un aperçu des concepts clés de TensorBoard, ainsi que la manière d'interpréter les visualisations fournies par TensorBoard. Pour un exemple détaillé d'utilisation de TensorBoard, consultez le didacticiel : TensorBoard : Getting Started. La documentation sur la façon d'utiliser TensorBoard pour travailler avec des images, des graphiques, des hyperparamètres, etc. est liée à partir de là, ainsi que des didacticiels pas à pas dans Colab.
TensorBoard est conçu pour fonctionner entièrement hors ligne, sans nécessiter aucun accès à Internet. Par exemple, cela peut être sur votre ordinateur local, derrière un pare-feu d'entreprise ou dans un centre de données.
Avant d'exécuter TensorBoard, assurez-vous d'avoir généré des données récapitulatives dans un répertoire de journaux en créant un rédacteur de résumé :
# sess.graph contains the graph definition; that enables the Graph Visualizer.
file_writer = tf . summary . FileWriter ( '/path/to/logs' , sess . graph )
Pour plus de détails, consultez le didacticiel TensorBoard. Une fois que vous disposez des fichiers d'événements, exécutez TensorBoard et fournissez le répertoire des journaux. Si vous utilisez un package TensorFlow précompilé (par exemple, vous l'avez installé via pip), exécutez :
tensorboard --logdir path/to/logs
Ou, si vous construisez à partir des sources :
bazel build tensorboard:tensorboard
./bazel-bin/tensorboard/tensorboard --logdir path/to/logs
# or even more succinctly
bazel run tensorboard -- --logdir path/to/logs
Cela devrait indiquer que TensorBoard a démarré. Ensuite, connectez-vous à http://localhost:6006.
TensorBoard nécessite un logdir
pour lire les journaux. Pour plus d'informations sur la configuration de TensorBoard, exécutez tensorboard --help
.
TensorBoard peut être utilisé dans Google Chrome ou Firefox. D'autres navigateurs peuvent fonctionner, mais il peut y avoir des bugs ou des problèmes de performances.
La première étape de l'utilisation de TensorBoard consiste à acquérir les données de votre exécution TensorFlow. Pour cela, vous avez besoin d’opérations récapitulatives. Les opérations récapitulatives sont des opérations, tout comme tf.matmul
et tf.nn.relu
, ce qui signifie qu'elles intègrent des tenseurs, produisent des tenseurs et sont évaluées à partir d'un graphe TensorFlow. Cependant, les opérations récapitulatives ont une particularité : les Tensors qu'elles produisent contiennent des protobufs sérialisés, qui sont écrits sur le disque et envoyés à TensorBoard. Pour visualiser les données récapitulatives dans TensorBoard, vous devez évaluer l'opération récapitulative, récupérer le résultat, puis écrire ce résultat sur le disque à l'aide d'un summary.FileWriter. Une explication complète, avec des exemples, se trouve dans le didacticiel.
Les opérations de résumé prises en charge incluent :
tf.summary.scalar
tf.summary.image
tf.summary.audio
tf.summary.text
tf.summary.histogram
Lorsque vous effectuez une opération récapitulative, vous lui attribuez également une tag
. La balise est essentiellement un nom pour les données enregistrées par cette opération et sera utilisée pour organiser les données dans le frontend. Les tableaux de bord scalaire et histogramme organisent les données par balise et regroupent les balises dans des dossiers selon un répertoire/like/hiérarchie. Si vous avez beaucoup de balises, nous vous recommandons de les regrouper avec des barres obliques.
summary.FileWriters
récupère les données récapitulatives de TensorFlow, puis les écrit dans un répertoire spécifié, appelé logdir
. Plus précisément, les données sont écrites dans un vidage d'enregistrement en ajout uniquement qui contiendra "tfevents" dans le nom de fichier. TensorBoard lit les données d'un répertoire complet et les organise dans l'historique d'une seule exécution TensorFlow.
Pourquoi lit-il le répertoire entier plutôt qu’un fichier individuel ? Vous avez peut-être utilisé superviseur.py pour exécuter votre modèle, auquel cas si TensorFlow plante, le superviseur le redémarrera à partir d'un point de contrôle. Lorsqu'il redémarrera, il commencera à écrire dans un nouveau fichier d'événements et TensorBoard assemblera les différents fichiers d'événements pour produire un historique cohérent de ce qui s'est passé.
Vous souhaiterez peut-être comparer visuellement plusieurs exécutions de votre modèle ; par exemple, supposons que vous ayez modifié les hyperparamètres et que vous souhaitiez voir s'ils convergent plus rapidement. TensorBoard permet cela via différentes « exécutions ». Lorsque TensorBoard reçoit un logdir
au démarrage, il parcourt de manière récursive l'arborescence des répertoires enracinée dans logdir
à la recherche de sous-répertoires contenant des données tfevents. Chaque fois qu'il rencontre un tel sous-répertoire, il le charge comme une nouvelle run
et le frontend organisera les données en conséquence.
Par exemple, voici un répertoire de journaux TensorBoard bien organisé, avec deux exécutions, "run1" et "run2".
/some/path/mnist_experiments/
/some/path/mnist_experiments/run1/
/some/path/mnist_experiments/run1/events.out.tfevents.1456525581.name
/some/path/mnist_experiments/run1/events.out.tfevents.1456525585.name
/some/path/mnist_experiments/run2/
/some/path/mnist_experiments/run2/events.out.tfevents.1456525385.name
/tensorboard --logdir /some/path/mnist_experiments
Vous pouvez également transmettre une liste de répertoires de journaux séparés par des virgules, et TensorBoard surveillera chaque répertoire. Vous pouvez également attribuer des noms à des répertoires de journaux individuels en plaçant deux points entre le nom et le chemin, comme dans
tensorboard --logdir_spec name1:/path/to/logs/1,name2:/path/to/logs/2
Cet indicateur ( --logdir_spec
) est déconseillé et peut généralement être évité . TensorBoard parcourt les répertoires de journaux de manière récursive ; pour un contrôle plus fin, préférez utiliser un arbre de liens symboliques. Certaines fonctionnalités peuvent ne pas fonctionner lors de l'utilisation --logdir_spec
au lieu de --logdir
.
Le tableau de bord scalaire de TensorBoard visualise des statistiques scalaires qui varient dans le temps ; par exemple, vous souhaiterez peut-être suivre la perte ou le taux d'apprentissage du modèle. Comme décrit dans Concepts clés , vous pouvez comparer plusieurs exécutions et les données sont organisées par balise. Les graphiques linéaires ont les interactions suivantes :
Cliquer sur la petite icône bleue dans le coin inférieur gauche de chaque graphique développera le graphique
Faire glisser une région rectangulaire sur le graphique fera un zoom avant
Double-cliquez sur le graphique pour effectuer un zoom arrière
Passer la souris sur le graphique produira un réticule, avec les valeurs de données enregistrées dans le sélecteur d'exécution sur la gauche.
De plus, vous pouvez créer de nouveaux dossiers pour organiser les balises en écrivant des expressions régulières dans la zone en haut à gauche du tableau de bord.
Le tableau de bord de l'histogramme affiche comment la distribution statistique d'un Tensor a varié au fil du temps. Il visualise les données enregistrées via tf.summary.histogram
. Chaque graphique montre des « tranches » temporelles de données, où chaque tranche est un histogramme du tenseur à une étape donnée. Il est organisé avec le pas de temps le plus ancien à l'arrière et le pas de temps le plus récent devant. En changeant le mode histogramme de « décalage » à « superposition », la perspective pivotera de sorte que chaque tranche d'histogramme soit rendue sous forme de ligne et se superpose les unes aux autres.
Le tableau de bord de distribution est un autre moyen de visualiser les données d'histogramme de tf.summary.histogram
. Il montre des statistiques de haut niveau sur une distribution. Chaque ligne du graphique représente un centile dans la distribution sur les données : par exemple, la ligne du bas montre l'évolution de la valeur minimale au fil du temps et la ligne du milieu montre l'évolution de la médiane. En lisant de haut en bas, les lignes ont la signification suivante : [maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]
Ces centiles peuvent également être considérés comme des limites d'écart type sur une distribution normale : [maximum, μ+1.5σ, μ+σ, μ+0.5σ, μ, μ-0.5σ, μ-σ, μ-1.5σ, minimum]
de sorte que les régions colorées, lues de l’intérieur vers l’extérieur, ont respectivement des largeurs [σ, 2σ, 3σ]
.
Le tableau de bord d'images peut afficher les png enregistrés via un tf.summary.image
. Le tableau de bord est configuré de manière à ce que chaque ligne corresponde à une balise différente et que chaque colonne corresponde à une exécution. Étant donné que le tableau de bord des images prend en charge les fichiers png arbitraires, vous pouvez l'utiliser pour intégrer des visualisations personnalisées (par exemple, des nuages de points matplotlib) dans TensorBoard. Ce tableau de bord vous montre toujours la dernière image pour chaque balise.
Le tableau de bord audio peut intégrer des widgets audio lisibles pour l'audio enregistré via un tf.summary.audio
. Le tableau de bord est configuré de manière à ce que chaque ligne corresponde à une balise différente et que chaque colonne corresponde à une exécution. Ce tableau de bord intègre toujours le dernier audio pour chaque balise.
L'explorateur de graphiques peut visualiser un graphique TensorBoard, permettant l'inspection du modèle TensorFlow. Pour tirer le meilleur parti du visualiseur de graphiques, vous devez utiliser des étendues de noms pour regrouper hiérarchiquement les opérations dans votre graphique. Dans le cas contraire, le graphique pourrait être difficile à déchiffrer. Pour plus d'informations, y compris des exemples, consultez le didacticiel d'examen du graphique TensorFlow.
Le projecteur d'intégration vous permet de visualiser des données de grande dimension ; par exemple, vous pouvez visualiser vos données d'entrée après qu'elles aient été intégrées dans un espace de grande dimension par votre modèle. Le projecteur d'intégration lit les données de votre fichier de point de contrôle de modèle et peut être configuré avec des métadonnées supplémentaires, comme un fichier de vocabulaire ou des images de sprite. Pour plus de détails, consultez le didacticiel d'intégration du projecteur.
Le tableau de bord texte affiche des extraits de texte enregistrés via tf.summary.text
. Les fonctionnalités Markdown, notamment les hyperliens, les listes et les tableaux, sont toutes prises en charge.
Le tableau de bord des séries chronologiques affiche une interface unifiée contenant tous vos scalaires, histogrammes et images enregistrés via tf.summary.scalar
, tf.summary.image
ou tf.summary.histogram
. Il permet de visualiser votre graphique linéaire de « précision » côte à côte avec des histogrammes d'activation et des exemples d'images de formation, par exemple.
Les fonctionnalités incluent :
Couleurs de run personnalisées : cliquez sur les cercles colorés dans le sélecteur de run pour modifier la couleur d'un run.
Cartes épinglées : cliquez sur l'icône « épingler » sur n'importe quelle carte pour l'ajouter à la section épinglée en haut pour une comparaison rapide.
Paramètres : le volet de droite propose des paramètres pour les graphiques et autres visualisations. Les paramètres importants persisteront dans les sessions TensorBoard, lorsqu'ils sont hébergés à la même origine d'URL.
Saisie semi-automatique dans le filtre de balises : recherchez plus facilement des graphiques spécifiques.
Tout d’abord, vérifiez que le répertoire passé à --logdir
est correct. Vous pouvez également le vérifier en accédant au tableau de bord Scalars (sous le menu « Inactif ») et en recherchant le chemin du répertoire des journaux en bas de la barre latérale gauche.
Si vous chargez à partir du chemin approprié, assurez-vous que les fichiers d'événements sont présents. TensorBoard parcourra de manière récursive son répertoire de journal, ce n'est pas grave si les données sont imbriquées dans un sous-répertoire. Assurez-vous que ce qui suit affiche au moins un résultat :
find DIRECTORY_PATH | grep tfevents
Vous pouvez également vérifier que les fichiers d'événements contiennent réellement des données en exécutant Tensorboard en mode inspection pour inspecter le contenu de vos fichiers d'événements.
tensorboard --inspect --logdir DIRECTORY_PATH
La sortie d'un fichier d'événements correspondant à un TensorBoard vierge peut parfois afficher quelques étapes, représentant quelques événements initiaux qui ne sont pas affichés par TensorBoard (par exemple, lors de l'utilisation du rappel Keras TensorBoard) :
tensor
first_step 0
last_step 2
max_step 2
min_step 0
num_steps 2
outoforder_steps [(2, 0), (2, 0), (2, 0)]
En revanche, la sortie d'un fichier d'événements contenant plus de données pourrait ressembler à ceci :
tensor
first_step 0
last_step 55
max_step 250
min_step 0
num_steps 60
outoforder_steps [(2, 0), (2, 0), (2, 0), (2, 0), (50, 9), (100, 19), (150, 29), (200, 39), (250, 49)]
Mise à jour : après la version 2.3.0, TensorBoard ne se recharge plus automatiquement toutes les 30 secondes. Pour réactiver le comportement, veuillez ouvrir les paramètres en cliquant sur l'icône d'engrenage en haut à droite de l'interface Web TensorBoard et activer « Recharger les données ».
Mise à jour : l'option expérimentale
--reload_multifile=true
peut désormais être utilisée pour interroger tous les fichiers "actifs" d'un répertoire à la recherche de nouvelles données, plutôt que les plus récentes comme décrit ci-dessous. Un fichier est "actif" tant qu'il a reçu de nouvelles données il y a--reload_multifile_inactive_secs
secondes, la valeur par défaut étant 86400.
Ce problème survient généralement en raison de la façon dont TensorBoard parcourt les fichiers tfevents
: il progresse dans le fichier d'événements dans l'ordre d'horodatage et ne lit qu'un seul fichier à la fois. Supposons que nous ayons des fichiers avec des horodatages a
et b
, où a . Une fois que TensorBoard a lu tous les événements d'
a
, il n'y reviendra jamais, car il suppose que tous les nouveaux événements sont écrits dans le fichier le plus récent. Cela pourrait poser un problème si, par exemple, deux FileWriters
écrivent simultanément dans le même répertoire. Si vous disposez de plusieurs rédacteurs de résumés, chacun doit écrire dans un répertoire distinct.
Mise à jour : l'option expérimentale
--reload_multifile=true
peut désormais être utilisée pour interroger tous les fichiers "actifs" d'un répertoire à la recherche de nouvelles données, définies comme tout fichier ayant reçu de nouvelles données il y a--reload_multifile_inactive_secs
secondes, la valeur par défaut étant 86400.
Non. TensorBoard s'attend à ce qu'un seul fichier d'événements soit écrit à la fois, et plusieurs rédacteurs de résumé signifient plusieurs fichiers d'événements. Si vous exécutez une instance TensorFlow distribuée, nous vous encourageons à désigner un seul travailleur comme « chef » responsable de tous les traitements récapitulatifs. Voir superviseur.py pour un exemple.
Si vous voyez des données qui semblent voyager dans le temps et se chevaucher, il existe quelques explications possibles.
Vous pouvez avoir plusieurs exécutions de TensorFlow qui ont toutes été écrites dans le même répertoire de journaux. Veuillez demander à chaque exécution TensorFlow d'écrire dans son propre répertoire de journal.
Mise à jour : l'option expérimentale
--reload_multifile=true
peut désormais être utilisée pour interroger tous les fichiers "actifs" d'un répertoire à la recherche de nouvelles données, définies comme tout fichier ayant reçu de nouvelles données il y a--reload_multifile_inactive_secs
secondes, la valeur par défaut étant 86400.
Vous pouvez avoir un bug dans votre code où la variable global_step (transmise à FileWriter.add_summary
) n'est pas gérée correctement.
Il se peut que votre tâche TensorFlow soit tombée en panne et ait été redémarrée à partir d'un point de contrôle antérieur. Consultez Comment gérer les redémarrages de TensorFlow ci-dessous.
Pour contourner le problème, essayez de modifier l'affichage de l'axe x dans TensorBoard de steps
à wall_time
. Cela résoudra souvent le problème.
TensorFlow est conçu avec un mécanisme de récupération progressive en cas de panne ou d'arrêt d'une tâche : TensorFlow peut écrire périodiquement des fichiers de point de contrôle de modèle, ce qui vous permet de redémarrer TensorFlow sans perdre toute la progression de votre formation.
Cependant, cela peut compliquer les choses pour TensorBoard ; imaginez que TensorFlow a écrit un point de contrôle à l'étape a
, puis a continué à s'exécuter jusqu'à l'étape b
, puis s'est écrasé et a redémarré à l'horodatage a
. Tous les événements écrits entre a
et b
étaient « orphelins » par l'événement de redémarrage et doivent être supprimés.
Pour faciliter cela, nous avons un message SessionLog
dans tensorflow/core/util/event.proto
qui peut enregistrer SessionStatus.START
en tant qu'événement ; comme tous les événements, une step
peut lui être associée. Si TensorBoard détecte un événement SessionStatus.START
avec l'étape a
, il supposera que chaque événement avec une étape supérieure à a
était orphelin et ignorera ces événements. Ce comportement peut être désactivé avec l'indicateur --purge_orphaned_data false
(dans les versions postérieures à 0.7).
Le tableau de bord scalaire prend en charge l'exportation de données ; vous pouvez cliquer sur l'option « Activer les liens de téléchargement » dans la barre de gauche. Ensuite, chaque parcelle fournira des liens de téléchargement pour les données qu'elle contient.
Si vous avez besoin d'accéder à l'ensemble de données complet, vous pouvez lire les fichiers d'événements consommés par TensorBoard à l'aide de la méthode summary_iterator
.
Oui! Vous pouvez cloner et bricoler l'un des exemples et créer vos propres visualisations étonnantes. Plus de documentation sur le système de plugins est décrite dans le guide ADDING_A_PLUGIN. N'hésitez pas à déposer des demandes de fonctionnalités ou des questions sur les fonctionnalités du plugin.
Une fois satisfait de votre propre nouveau plugin révolutionnaire, consultez la section distribution pour savoir comment publier sur PyPI et le partager avec la communauté.
À l'aide du plugin scalaires personnalisés, vous pouvez créer des tracés scalaires avec des lignes pour des paires de balises d'exécution personnalisées. Cependant, dans le tableau de bord des scalaires d'origine, chaque tracé scalaire correspond aux données d'une balise spécifique et contient des lignes pour chaque exécution incluant cette balise.
Des tracés de marge (qui visualisent les limites inférieures et supérieures) peuvent être créés avec le plugin scalaires personnalisés. Le plugin scalaires d'origine ne prend pas en charge la visualisation des marges.
Ce n'est pas encore possible. Pour contourner le problème, vous pouvez créer votre tracé personnalisé dans votre propre code (par exemple matplotlib), puis l'écrire dans un SummaryProto
( core/framework/summary.proto
) et l'ajouter à votre FileWriter
. Ensuite, votre tracé personnalisé apparaîtra dans l'onglet Image TensorBoard.
TensorBoard utilise l'échantillonnage de réservoir pour sous-échantillonner vos données afin qu'elles puissent être chargées dans la RAM. Vous pouvez modifier le nombre d'éléments qu'il conservera par balise en utilisant l'argument de ligne de commande --samples_per_plugin
(ex : --samples_per_plugin=scalars=500,images=20
). Voir cette question Stack Overflow pour plus d'informations.
Les versions de TensorBoard antérieures à TensorBoard 2.0 seraient diffusées par défaut sur l'hôte 0.0.0.0
, qui est accessible au public. Pour ces versions de TensorBoard, vous pouvez arrêter les fenêtres contextuelles en spécifiant --host localhost
au démarrage.
Dans TensorBoard 2.0 et versions ultérieures, --host localhost
est la valeur par défaut. Utilisez --bind_all
pour restaurer l'ancien comportement de service sur le réseau public sur IPv4 et IPv6.
tensorboard
sans installation TensorFlow ?TensorBoard 1.14+ peut être exécuté avec un ensemble de fonctionnalités réduit si TensorFlow n'est pas installé. La principale limitation est qu'à partir de la version 1.14, seuls les plugins suivants sont pris en charge : scalaires, scalaires personnalisés, image, audio, graphique, projecteur (partiel), distributions, histogrammes, texte, courbes PR, maillage. De plus, les répertoires de journaux ne sont pas pris en charge sur Google Cloud Storage.
Voir DÉVELOPPEMENT.md.
Tout d’abord, essayez de rechercher nos problèmes GitHub et Stack Overflow. Il se peut que quelqu'un d'autre ait déjà eu le même problème ou la même question.
Les questions d'utilisation générale (ou les problèmes pouvant être spécifiques à votre configuration locale) doivent être adressées à Stack Overflow.
Si vous avez trouvé un bogue dans TensorBoard, veuillez signaler un problème GitHub avec autant d'informations à l'appui que vous pouvez fournir (par exemple, en joignant des fichiers d'événements, y compris la sortie de tensorboard --inspect
, etc.).