Passer au contenu principal
La bibliothèque Hugging Face Transformers simplifie l’utilisation de modèles NLP de pointe comme BERT et de techniques d’entraînement comme la précision mixte et le gradient checkpointing. L’intégration W&B ajoute un suivi des expériences riche et flexible ainsi que la gestion des versions des modèles dans des tableaux de bord centralisés interactifs, sans rien sacrifier à cette simplicité d’utilisation.

Journalisation avancée en quelques lignes

os.environ["WANDB_PROJECT"] = "<my-amazing-project>"  # nommez votre projet W&B
os.environ["WANDB_LOG_MODEL"] = "checkpoint"  # journalisez tous les points de contrôle du modèle

from transformers import TrainingArguments, Trainer

args = TrainingArguments(..., report_to="wandb")  # activez le logging W&B
trainer = Trainer(..., args=args)
tableau de bord HuggingFace
Si vous préférez passer directement à du code prêt à l’emploi, consultez ce Google Colab.

Premiers pas : suivre les expériences

Inscrivez-vous et créez une clé API

Une clé API permet d’authentifier votre machine auprès de W&B. Vous pouvez générer une clé API depuis votre profil.
Pour une méthode plus directe, créez une clé API en accédant directement aux Paramètres utilisateur. Copiez immédiatement la clé API nouvellement créée et conservez-la dans un endroit sûr, par exemple dans un gestionnaire de mots de passe.
  1. Cliquez sur l’icône de votre profil dans le coin supérieur droit.
  2. Sélectionnez Paramètres utilisateur, puis faites défiler jusqu’à la section Clés API.

Installez la bibliothèque wandb et connectez-vous

Pour installer la bibliothèque wandb localement et vous connecter :
  1. Définissez la variable d’environnement WANDB_API_KEY sur votre clé API.
    export WANDB_API_KEY=<your_api_key>
    
  2. Installez la bibliothèque wandb et connectez-vous.
    pip install wandb
    
    wandb login
    
Si vous utilisez W&B pour la première fois, vous pouvez consulter notre démarrage rapide

Nommez le projet

Un projet W&B est l’endroit où sont stockés tous les graphiques, les données et les modèles enregistrés à partir de runs liés. Donner un nom à votre projet vous aide à organiser votre travail et à regrouper au même endroit toutes les informations relatives à un même projet. Pour ajouter un run à un projet, définissez simplement la variable d’environnement WANDB_PROJECT sur le nom de votre projet. Le WandbCallback récupérera cette variable d’environnement et l’utilisera lors de la configuration de votre run.
WANDB_PROJECT=amazon_sentiment_analysis
Assurez-vous de définir le nom du projet avant d’initialiser le Trainer.
Si aucun nom de projet n’est spécifié, le nom du projet est huggingface par défaut.

Enregistrez vos runs d’entraînement dans W&B

Lorsque vous définissez les arguments d’entraînement de votre Trainer, dans votre code ou en ligne de commande, l’étape la plus importante consiste à définir report_to sur "wandb" afin d’activer la journalisation avec W&B. L’argument logging_steps dans TrainingArguments contrôle la fréquence à laquelle les métriques d’entraînement sont envoyées à W&B pendant l’entraînement. Vous pouvez aussi donner un nom au run d’entraînement dans W&B à l’aide de l’argument run_name. C’est tout. Désormais, vos modèles journaliseront les pertes, les métriques d’évaluation, l’architecture du modèle et les gradients dans W&B pendant leur entraînement.
python run_glue.py \     # exécutez votre script Python
  --report_to wandb \    # activez le logging vers W&B
  --run_name bert-base-high-lr \   # nom du run W&B (facultatif)
  # autres arguments de ligne de commande ici
Vous utilisez TensorFlow ? Remplacez simplement le Trainer de PyTorch par le TFTrainer de TensorFlow.

Activez l’enregistrement des points de contrôle du modèle

Avec Artifacts, vous pouvez stocker gratuitement jusqu’à 100 Go de modèles et de jeux de données, puis utiliser le registre W&B. Avec le registre, vous pouvez enregistrer des modèles pour les explorer et les évaluer, les préparer pour la préproduction ou les déployer dans votre environnement de production. Pour journaliser les points de contrôle de votre modèle Hugging Face dans Artifacts, définissez la variable d’environnement WANDB_LOG_MODEL sur l’une des valeurs suivantes :
  • checkpoint: Téléverse un point de contrôle tous les args.save_steps à partir de TrainingArguments.
  • end: Téléverse le modèle à la fin de l’entraînement, si load_best_model_at_end est également défini.
  • false: Ne téléverse pas le modèle.
WANDB_LOG_MODEL="checkpoint"
Tous les Trainer Transformers que vous initialisez à partir de maintenant téléverseront des modèles dans votre projet W&B. Les points de contrôle du modèle que vous journalisez seront visibles dans l’interface Artifacts et incluront la traçabilité complète du modèle (voir un exemple de point de contrôle du modèle dans l’interface ici).
Par défaut, votre modèle sera enregistré dans W&B Artifacts sous la forme model-{run_id} lorsque WANDB_LOG_MODEL est défini sur end, ou checkpoint-{run_id} lorsque WANDB_LOG_MODEL est défini sur checkpoint. Cependant, si vous transmettez un run_name dans vos TrainingArguments, le modèle sera enregistré sous la forme model-{run_name} ou checkpoint-{run_name}.

W&B registre

Une fois vos checkpoints enregistrés dans Artifacts, vous pouvez enregistrer les checkpoints de vos meilleurs modèles et les centraliser au sein de votre équipe avec registre. Avec le registre, vous pouvez organiser vos meilleurs modèles par tâche, gérer le cycle de vie des modèles, suivre et auditer l’ensemble du cycle de vie du machine learning, et automatiser les actions en aval. Pour lier un Artifact de modèle, reportez-vous à registre.

Visualiser les sorties d’évaluation pendant l’entraînement

Visualiser les sorties de votre modèle pendant l’entraînement ou l’évaluation est souvent essentiel pour bien comprendre comment votre modèle s’entraîne. En utilisant le système de callbacks du Transformers Trainer, vous pouvez journaliser dans W&B des données supplémentaires utiles, comme les sorties de génération de texte de vos modèles ou d’autres prédictions, dans W&B Tables. Voir la section de journalisation personnalisée ci-dessous pour un guide complet expliquant comment journaliser les sorties d’évaluation pendant l’entraînement dans W&B Tables, comme ceci :
Montre une table W&B avec des sorties d’évaluation

Terminez votre run W&B (Notebook uniquement)

Si votre entraînement est encapsulé dans un script Python, le run W&B se terminera à la fin de l’exécution du script. Si vous utilisez un notebook Jupyter ou Google Colab, vous devrez nous indiquer que l’entraînement est terminé en appelant run.finish().
run = wandb.init()
trainer.train()  # démarrer l'entraînement et la journalisation dans W&B

# analyse post-entraînement, tests, autre code journalisé

run.finish()

Visualisez vos résultats

Une fois les résultats de votre entraînement enregistrés, vous pouvez les explorer de façon dynamique dans le tableau de bord W&B. Vous pouvez facilement comparer des dizaines de runs à la fois, zoomer sur des résultats intéressants et tirer des enseignements de données complexes grâce à des visualisations flexibles et interactives.

Fonctionnalités avancées et FAQ

Comment puis-je enregistrer le meilleur modèle ?

Si vous transmettez TrainingArguments avec load_best_model_at_end=True à votre Trainer, W&B enregistre le point de contrôle du modèle le plus performant dans Artifacts. Si vous enregistrez les points de contrôle de votre modèle dans Artifacts, vous pouvez les promouvoir vers le registre. Dans le registre, vous pouvez :
  • Organiser les versions de votre meilleur modèle par tâche de ML.
  • Centraliser les modèles et les partager avec votre équipe.
  • Préparer les modèles pour la production ou les marquer pour une évaluation plus approfondie.
  • Déclencher des processus CI/CD en aval.

Comment puis-je charger un modèle enregistré ?

Si vous avez enregistré votre modèle dans W&B Artifacts avec WANDB_LOG_MODEL, vous pouvez télécharger les poids de votre modèle pour poursuivre l’entraînement ou effectuer de l’inférence. Il vous suffit ensuite de les recharger dans la même architecture Hugging Face que celle utilisée précédemment.
# Créer un nouveau run
with wandb.init(project="amazon_sentiment_analysis") as run:
    # Transmettre le nom et la version de l'Artifact
    my_model_name = "model-bert-base-high-lr:latest"
    my_model_artifact = run.use_artifact(my_model_name)

    # Télécharger les poids du modèle dans un dossier et retourner le chemin
    model_dir = my_model_artifact.download()

    # Charger votre modèle Hugging Face depuis ce dossier
    #  en utilisant la même classe de modèle
    model = AutoModelForSequenceClassification.from_pretrained(
        model_dir, num_labels=num_labels
    )

    # Effectuer un entraînement supplémentaire ou lancer une inférence

Comment puis-je reprendre l’entraînement à partir d’un checkpoint ?

Si vous avez défini WANDB_LOG_MODEL='checkpoint', vous pouvez également reprendre l’entraînement en utilisant model_dir comme valeur de l’argument model_name_or_path dans vos TrainingArguments, puis en passant resume_from_checkpoint=True à Trainer.
last_run_id = "xxxxxxxx"  # récupérez le run_id depuis votre wandb workspace

# reprendre le run wandb à partir du run_id
with wandb.init(
    project=os.environ["WANDB_PROJECT"],
    id=last_run_id,
    resume="must",
) as run:
    # Connecter un Artifact au run
    my_checkpoint_name = f"checkpoint-{last_run_id}:latest"
    my_checkpoint_artifact = run.use_artifact(my_model_name)

    # Télécharger le checkpoint dans un dossier et retourner le chemin
    checkpoint_dir = my_checkpoint_artifact.download()

    # réinitialiser votre modèle et votre trainer
    model = AutoModelForSequenceClassification.from_pretrained(
        "<model_name>", num_labels=num_labels
    )
    # vos arguments d'entraînement ici.
    training_args = TrainingArguments()

    trainer = Trainer(model=model, args=training_args)

    # assurez-vous d'utiliser le répertoire du checkpoint pour reprendre l'entraînement depuis le checkpoint
    trainer.train(resume_from_checkpoint=checkpoint_dir)

Comment puis-je journaliser et afficher des échantillons d’évaluation pendant l’entraînement

La journalisation dans W&B via le Trainer de Transformers est assurée par le WandbCallback de la bibliothèque Transformers. Si vous devez personnaliser votre journalisation Hugging Face, vous pouvez modifier ce callback en créant une sous-classe de WandbCallback et en ajoutant des fonctionnalités supplémentaires qui s’appuient sur d’autres méthodes de la classe Trainer. Vous trouverez ci-dessous le schéma général pour ajouter ce nouveau callback au Trainer HF, puis plus bas un exemple de code complet pour journaliser les sorties d’évaluation dans un tableau W&B :
# Instancier le Trainer normalement
trainer = Trainer()

# Instancier le nouveau callback de journalisation, en lui passant l'objet Trainer
evals_callback = WandbEvalsCallback(trainer, tokenizer, ...)

# Ajouter le callback au Trainer
trainer.add_callback(evals_callback)

# Lancer l'entraînement du Trainer normalement
trainer.train()

Afficher des échantillons d’évaluation pendant l’entraînement

La section suivante montre comment personnaliser le WandbCallback pour exécuter les prédictions du modèle et journaliser des échantillons d’évaluation dans un tableau W&B pendant l’entraînement. Nous le faisons tous les eval_steps en utilisant la méthode on_evaluate du callback du Trainer. Ici, nous avons écrit une fonction decode_predictions pour décoder les prédictions et les labels à partir de la sortie du modèle à l’aide du tokenizer. Ensuite, nous créons un dataframe pandas à partir des prédictions et des labels, puis nous ajoutons une colonne epoch au dataframe. Enfin, nous créons un wandb.Table à partir du dataframe et le journalisons dans wandb. De plus, nous pouvons contrôler la fréquence de la journalisation en journalisant les prédictions toutes les freq époques. Remarque : contrairement au WandbCallback standard, ce callback personnalisé doit être ajouté au trainer après l’instanciation du Trainer, et non pendant l’initialisation du Trainer. Cela s’explique par le fait que l’instance Trainer est transmise au callback lors de l’initialisation.
from transformers.integrations import WandbCallback
import pandas as pd


def decode_predictions(tokenizer, predictions):
    labels = tokenizer.batch_decode(predictions.label_ids)
    logits = predictions.predictions.argmax(axis=-1)
    prediction_text = tokenizer.batch_decode(logits)
    return {"labels": labels, "predictions": prediction_text}


class WandbPredictionProgressCallback(WandbCallback):
    """WandbCallback personnalisé pour journaliser les prédictions du modèle pendant l'entraînement.

    Ce callback journalise les prédictions et les étiquettes du modèle dans un wandb.Table à chaque
    étape de journalisation pendant l'entraînement. Il permet de visualiser les
    prédictions du modèle au fur et à mesure de la progression de l'entraînement.

    Attributes:
        trainer (Trainer): L'instance Hugging Face Trainer.
        tokenizer (AutoTokenizer): Le tokenizer associé au modèle.
        sample_dataset (Dataset): Un sous-ensemble du jeu de données de validation
          pour générer des prédictions.
        num_samples (int, optional): Nombre d'échantillons à sélectionner dans
          le jeu de données de validation pour générer des prédictions. Par défaut : 100.
        freq (int, optional): Fréquence de journalisation. Par défaut : 2.
    """

    def __init__(self, trainer, tokenizer, val_dataset, num_samples=100, freq=2):
        """Initialise l'instance WandbPredictionProgressCallback.

        Args:
            trainer (Trainer): L'instance Hugging Face Trainer.
            tokenizer (AutoTokenizer): Le tokenizer associé
              au modèle.
            val_dataset (Dataset): Le jeu de données de validation.
            num_samples (int, optional): Nombre d'échantillons à sélectionner dans
              le jeu de données de validation pour générer des prédictions.
              Par défaut : 100.
            freq (int, optional): Fréquence de journalisation. Par défaut : 2.
        """
        super().__init__()
        self.trainer = trainer
        self.tokenizer = tokenizer
        self.sample_dataset = val_dataset.select(range(num_samples))
        self.freq = freq

    def on_evaluate(self, args, state, control, **kwargs):
        super().on_evaluate(args, state, control, **kwargs)
        # contrôler la fréquence de journalisation en enregistrant les prédictions
        # toutes les `freq` époques
        if state.epoch % self.freq == 0:
            # générer des prédictions
            predictions = self.trainer.predict(self.sample_dataset)
            # décoder les prédictions et les étiquettes
            predictions = decode_predictions(self.tokenizer, predictions)
            # ajouter les prédictions à un wandb.Table
            predictions_df = pd.DataFrame(predictions)
            predictions_df["epoch"] = state.epoch
            records_table = self._wandb.Table(dataframe=predictions_df)
            # enregistrer le tableau dans wandb
            self._wandb.log({"sample_predictions": records_table})


# Commencer par instancier le Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=lm_datasets["train"],
    eval_dataset=lm_datasets["validation"],
)

# Instancier le WandbPredictionProgressCallback
progress_callback = WandbPredictionProgressCallback(
    trainer=trainer,
    tokenizer=tokenizer,
    val_dataset=lm_dataset["validation"],
    num_samples=10,
    freq=2,
)

# Ajouter le callback au trainer
trainer.add_callback(progress_callback)
Pour un exemple plus détaillé, veuillez vous référer à ce colab

Quels paramètres W&B supplémentaires sont disponibles ?

Vous pouvez affiner la configuration de ce qui est enregistré avec Trainer en définissant des variables d’environnement. Une liste complète des variables d’environnement W&B est disponible ici.
Variable d’environnementUtilisation
WANDB_PROJECTDonnez un nom à votre projet (huggingface par défaut)
WANDB_LOG_MODEL

Enregistre le point de contrôle du modèle en tant qu’Artifact W&B (false par défaut)

  • false (par défaut) : aucun point de contrôle du modèle
  • checkpoint : un point de contrôle sera téléversé tous les args.save_steps (défini dans les TrainingArguments de Trainer).
  • end : le point de contrôle final du modèle sera téléversé à la fin de l’entraînement.
WANDB_WATCH

Définit si vous souhaitez enregistrer, pour vos modèles, les gradients, les paramètres ou aucun des deux

  • false (par défaut) : aucune journalisation des gradients ni des paramètres
  • gradients : enregistre des histogrammes des gradients
  • all : enregistre des histogrammes des gradients et des paramètres
WANDB_DISABLEDDéfinissez true pour désactiver complètement la journalisation (false par défaut)
WANDB_QUIET.Définissez true pour limiter la sortie standard aux seuls messages critiques (false par défaut)
WANDB_SILENTDéfinissez true pour supprimer la sortie affichée par wandb (false par défaut)
WANDB_WATCH=all
WANDB_SILENT=true

Comment puis-je personnaliser wandb.init?

Le WandbCallback utilisé par Trainer appelle wandb.init en interne lors de l’initialisation de Trainer. Vous pouvez aussi configurer vos runs manuellement en appelant wandb.init avant l’initialisation de Trainer. Cela vous donne un contrôle total sur la configuration de votre run W&B. Voici un exemple de ce que vous pouvez passer à init. Pour plus de détails sur wandb.init(), voir la référence \wandb.init()“.
wandb.init(
    project="amazon_sentiment_analysis",
    name="bert-base-high-lr",
    tags=["baseline", "high-lr"],
    group="bert",
)

Ressources supplémentaires

Voici 6 articles liés à Transformers et à W&B qui pourraient vous intéresser

Obtenir de l’aide ou suggérer des fonctionnalités

Pour tout problème, toute question ou toute demande de fonctionnalité concernant l’intégration W&B de Hugging Face, n’hésitez pas à publier dans ce fil de discussion sur les forums Hugging Face ou à ouvrir une issue dans le dépôt GitHub Transformers de Hugging Face.