Jean Zay : Outil de visualisation TensorBoard pour TensorFlow et PyTorch

Les algorithmes d'apprentissage automatique sont généralement coûteux en calcul. Il est donc essentiel de quantifier les performances de votre application de Machine Learning. L'outil graphique TensorBoard a été créé pour ce genre d'étude.

L'outil de visualisation TensorBoard est disponible sur Jean Zay via le JupyterHub de l'IDRIS.

La manière d'y accéder est décrite précisément dans la documentation dédiée : Jean Zay JupyterHub Documentation | JupyterLab Usage | Jupyter interface | Applications.

Attention : pour accéder à Tensorboard, il faut se placer dans un environnement dans lequel l'outil a été installé :
- si vous avez ouvert une instance JupyterLab, il faudra préalablement charger un module (tensorflow, pytorch, …) contenant TensorBoard comme indiqué dans Jean Zay JupyterHub Documentation | JupyterLab Usage | Jupyter interface | Environment modules.
- si vous avez ouvert directement une instance TensorBoard sur un noeud de calcul (Spawn server on SLURM node + Frontend = Tensorboard), l'outil est disponible sans autre action de votre part.

Les fonctionnalités TensorBoard

TensorBoard propose différents onglets de visualisation. Les principaux outils sont :

  • Scalars affiche l'évolution du loss et des métriques à chaque époque par défaut (Il est possible de l'adapter pour suivre la vitesse d'entraînement, le taux d'apprentissage et d'autres valeurs scalaires.)
  • Graphs aide à visualiser la structure de votre modèle
  • Distributions et Histograms montrent la distribution des poids et des biais à chaque époque

Vous avez également accès aux onglets et aux fonctionnalités Image Data, Hyperparameter Tuning, Embedding projector pour les applications de Natural Language Processing, What If Tool et Debugger V2.

Former un modèle avec les rappels TensorBoard

Pour bénéficier des fonctionnalités offertes par TensorBoard, il faut instrumenter votre code.

Instrumenter votre code TensorFlow

Pour générer des logs TensorBoard au format adéquat en sortie de votre application TensorFlow, il faut :

  • créer un rappel TensorBoard pour capturer les métriques (ici profile_batch = 0 pour désactiver le profiler)
# Create a TensorBoard callback
logs = "logs/" + datetime.now().strftime("%Y%m%d-%H%M%S")
 
tboard_callback = tf.keras.callbacks.TensorBoard(log_dir = logs,
                                                 histogram_freq = 1,
                                                 profile_batch = 0)
  • l'appeler pendant l'entraînement du modèle
# Train model
model.fit(ds_train,
         epochs=2,
         validation_data=ds_test,
         callbacks = [tboard_callback])

Instrumenter votre code PyTorch

Pour générer des logs TensorBoard en sortie de votre application PyTorch, il faut

  • définir un writer
from torch.utils.tensorboard import SummaryWriter
 
# default `log_dir` is "runs" - we'll be more specific here
writer = SummaryWriter('runs/fashion_mnist_experiment_1')
  • insérer des ordres de rappels TensorBoard adaptés aux résultats que vous souhaitez visualiser. Par exemple :
# TensorBoard callback for Scalars visualisation
# here we report running loss value at each iteration i
writer.add_scalar('training loss',
                  running_loss / 1000,
                  epoch * len(trainloader) + i)
# TensorBoard callback for ImageData visualisation 
writer.add_image('four_fashion_mnist_images', img_grid)
# TensorBoard callback for Graphs visualisation
writer.add_graph(net, images)
# TensorBoard callback for Embedding Projector visualisation
writer.add_embedding(features,
                    metadata=class_labels,
                    label_img=images.unsqueeze(1))
# TensorBoard callback for Weights/Bias histogramms
writer.add_histogram('distribution_weight', np.concatenate([j[1].detach().cpu().numpy().flatten() 
                                                    for j in model.named_parameters()
                                                    if 'bn' not in j[0] and 'weight' in j[0]]), epoch + 1)
writer.add_histogram('distribution_bias', np.concatenate([j[1].detach().cpu().numpy().flatten() 
                                                    for j in model.named_parameters()
                                                    if 'bn' not in j[0] and 'bias' in j[0]]), epoch + 1)

Documentation officielle