Passer au contenu principal
Utilisez les callbacks Keras de W&B pour suivre les expériences, enregistrer les points de contrôle du modèle et visualiser les prédictions du modèle pendant l’entraînement. Utilisez cette intégration pour ajouter le suivi des expériences et la gestion des versions des modèles à vos flux de travail d’entraînement Keras sans réécrire votre boucle d’entraînement. Les callbacks Keras sont disponibles dans le module wandb.integration.keras à partir de la version 0.13.4 du SDK Python. L’intégration Keras de W&B fournit les callbacks suivants :
  • WandbMetricsLogger : Utilisez ce callback pour le suivi des expériences. Il enregistre vos métriques d’entraînement et de validation, ainsi que les métriques système, dans W&B.
  • WandbModelCheckpoint : Utilisez ce callback pour enregistrer les points de contrôle du modèle de votre modèle dans les Artifacts W&B.
  • WandbEvalCallback: Ce callback de base enregistre les prédictions du modèle dans les Tables W&B pour une visualisation interactive.

Installer et importer l’intégration Keras

Installez la dernière version de W&B.
Pour utiliser l’intégration Keras, importez les classes requises à partir de wandb.integration.keras.
Les sections suivantes décrivent en détail chaque callback, avec des exemples de code.

Suivre les expériences avec WandbMetricsLogger

wandb.integration.keras.WandbMetricsLogger() enregistre le dictionnaire logs de Keras, passé en argument aux méthodes de callback telles que on_epoch_end et on_batch_end. L’exemple partiel suivant montre comment utiliser WandbMetricsLogger() dans un flux de travail Keras. Commencez par compiler le modèle avec l’optimiseur, la fonction de perte et les métriques souhaités. Ensuite, initialisez un run W&B à l’aide de wandb.init(). Enfin, transmettez le callback WandbMetricsLogger() à model.fit().
L’exemple précédent consigne dans W&B les métriques d’entraînement et de validation, telles que loss, accuracy et top@5_accuracy, à la fin de chaque époque.

Référence de WandbMetricsLogger

Créer un point de contrôle d’un modèle avec WandbModelCheckpoint

Utilisez le callback WandbModelCheckpoint pour enregistrer périodiquement le modèle Keras (au format SavedModel) ou les poids du modèle, puis les envoyer à W&B sous forme de wandb.Artifact pour la gestion des versions du modèle. Ce callback est une sous-classe de tf.keras.callbacks.ModelCheckpoint(). La logique de création de points de contrôle est donc gérée par le callback parent. Ce callback enregistre :
  • Le modèle ayant obtenu les meilleures performances en fonction de la métrique surveillée.
  • Le modèle à la fin de chaque époque, indépendamment des performances.
  • Le modèle à la fin de l’époque ou après un nombre fixe de lots d’entraînement.
  • Soit uniquement les poids du modèle, soit le modèle complet.
  • Le modèle soit au format SavedModel, soit au format .h5.
Utilisez ce callback avec WandbMetricsLogger().

Référence WandbModelCheckpoint

Enregistrer des points de contrôle du modèle après N époques

Par défaut (save_freq="epoch"), le callback crée un point de contrôle du modèle et le téléverse comme artifact après chaque époque. Pour créer un point de contrôle du modèle après un nombre précis de lots, définissez save_freq sur un entier. Pour créer un point de contrôle du modèle après N époques, calculez la cardinalité du dataloader train et passez-la à save_freq :

Journaliser efficacement les points de contrôle du modèle sur une architecture TPU

Lors de la création de points de contrôle du modèle sur des TPU, vous pouvez rencontrer le message d’erreur UnimplementedError: File system scheme '[local]' not implemented. Cela se produit parce que le répertoire du modèle (filepath) doit utiliser un chemin de bucket de stockage cloud (gs://bucket-name/...), et que ce bucket doit être accessible depuis le serveur TPU. À la place, W&B utilise le chemin local pour créer les points de contrôle du modèle, que W&B téléverse ensuite en tant qu’artifact.

Visualiser les prédictions du modèle avec WandbEvalCallback

WandbEvalCallback() est une classe de base abstraite permettant de créer des callbacks Keras, principalement pour la prédiction de modèle et, dans un second temps, pour la visualisation du jeu de données. Ce callback abstrait est indépendant du jeu de données et de la tâche. Pour l’utiliser, héritez de cette classe de base WandbEvalCallback() et implémentez les méthodes add_ground_truth et add_model_prediction. WandbEvalCallback() est une classe utilitaire qui fournit des méthodes pour :
  • Créer des instances wandb.Table() pour les données et les prédictions.
  • Journaliser les Tables de données et de prédictions en tant que wandb.Artifact().
  • Journaliser le tableau de données dans on_train_begin.
  • Journaliser le tableau de prédictions dans on_epoch_end.
L’exemple suivant utilise WandbClfEvalCallback pour une tâche de classification d’images. Ce callback d’exemple journalise les données de validation (data_table) dans W&B, effectue l’inférence, puis journalise les prédictions (pred_table) dans W&B à la fin de chaque époque.

Référence de WandbEvalCallback

Détails de l’empreinte mémoire

W&B journalise data_table lors de l’appel de la méthode on_train_begin. Après que W&B l’a téléversé en tant qu’artefact W&B, vous obtenez une référence à ce tableau, accessible via la variable de classe data_table_ref. data_table_ref est une liste 2D que vous pouvez indexer comme self.data_table_ref[idx][n], où idx est le numéro de ligne et n le numéro de colonne. Voir son utilisation dans l’exemple suivant.

Personnaliser le callback

Pour mieux contrôler quand les données et les prédictions sont enregistrées, vous pouvez redéfinir les méthodes de callback par défaut. Vous pouvez redéfinir les méthodes on_train_begin ou on_epoch_end pour bénéficier d’un contrôle plus précis. Si vous souhaitez journaliser les échantillons après N lots, vous pouvez implémenter la méthode on_train_batch_end.
Si vous implémentez un callback pour visualiser les prédictions du modèle en héritant de WandbEvalCallback et que certains points doivent être clarifiés ou corrigés, ouvrez une issue.

WandbCallback obsolète

WandbCallback est le callback tout-en-un obsolète. Pour les nouveaux projets, utilisez les callbacks dédiés décrits dans les sections précédentes (WandbMetricsLogger, WandbModelCheckpoint et WandbEvalCallback). Utilisez la classe WandbCallback() de la bibliothèque W&B pour enregistrer toutes les métriques et valeurs de perte suivies dans model.fit().
Vous pouvez regarder la courte vidéo Premiers pas avec Keras et W&B en moins d’une minute. Pour une vidéo plus détaillée, regardez Intégrer W&B à Keras. Vous pouvez également consulter le notebook Jupyter Colab. Pour des scripts d’exemple supplémentaires, voir le dépôt d’exemples W&B, notamment un exemple Fashion MNIST et le tableau de bord W&B qu’il génère. La classe WandbCallback prend en charge des options de configuration de journalisation : spécifier une métrique à surveiller, suivre les poids et les gradients, journaliser les prédictions sur training_data et validation_data, entre autres. Consultez la documentation de référence de keras.WandbCallback pour plus de détails. WandbCallback :
  • Journalise les données d’historique de toutes les métriques collectées par Keras : la perte et tout ce qui est transmis à keras_model.compile().
  • Définit les métriques de synthèse pour le run associé à la « meilleure » étape d’entraînement, telle que définie par les attributs monitor et mode. Par défaut, il s’agit de l’époque où val_loss est minimale. Par défaut, WandbCallback enregistre le modèle associé à la meilleure epoch.
  • Journalise de façon facultative les histogrammes des gradients et des paramètres.
  • Enregistre de façon facultative les données d’entraînement et de validation pour que wandb puisse les visualiser.

Référence de WandbCallback

Questions fréquentes

Utiliser le mode multiprocessing de Keras avec wandb

Lorsque vous définissez use_multiprocessing=True, cette erreur peut se produire :
Pour contourner ce problème :
  1. Lors de l’instanciation de la classe Sequence, ajoutez : wandb.init(group='...').
  2. Dans main, assurez-vous d’utiliser if __name__ == "__main__": et placez-y le reste de la logique de votre script.