Callback
Un callback est une fonction appelée à des moments définis par une boucle d’entraînement, par exemple à la fin de chaque époque, pour ajouter un arrêt anticipé, des points de contrôle ou la journalisation.
Un rappel est une fonction transmise à un autre bloc de code, qui la rappelle lorsqu’un événement précis se produit. Les gestionnaires d’événements d’interfaces utilisateur, les fonctions de complétion du code asynchrone et la fonction de comparaison fournie à une routine de tri sont tous des rappels. Dans les frameworks d’apprentissage profond, les événements correspondent à des moments de la boucle d’entraînement, comme son début, la fin de chaque lot ou époque, et la fin de la validation. Les rappels associés à un événement s’exécutent à ce moment-là et accèdent à l’état de l’entraîneur ; les utilisateurs peuvent ainsi ajouter un arrêt anticipé contre le surapprentissage, la sauvegarde de points de contrôle, des stratégies de taux d’apprentissage ou la journalisation, sans modifier la boucle elle-même.
Comment les rappels s’intègrent à l’entraînement#
Un framework conserve une liste de rappels pour chaque événement nommé et les appelle tous lorsque la boucle atteint cet événement, en transmettant l’objet entraîneur ou modèle afin qu’un rappel puisse lire les métriques et modifier les paramètres. Keras les regroupe dans son module keras.callbacks, PyTorch Lightning dans des sous-classes de Callback, et les Transformers de Hugging Face dans TrainerCallback. Les noms des méthodes varient selon les bibliothèques, mais les événements suivent la même boucle :
Comme les rappels s’exécutent dans la boucle, ils peuvent aussi la modifier : un rappel qui définit un indicateur d’arrêt met fin à l’entraînement après l’époque en cours, et un rappel qui modifie l’optimiseur change toutes les étapes suivantes. Les rappels d’un même événement s’exécutent dans l’ordre de leur enregistrement, et ceux qui interviennent au niveau des lots s’exécutent des milliers de fois par époque ; les opérations lentes, comme le téléversement de fichiers, doivent donc être réservées aux événements au niveau de l’époque. Lors de l’entraînement distribué, chaque processus exécute sa propre copie de la boucle et de ses rappels ; les rappels de journalisation et de sauvegarde des points de contrôle n’agissent donc généralement que sur le processus principal, de rang 0, afin d’éviter que plusieurs GPU écrivent le même fichier.
Rappels d’entraînement courants#
- Arrêt anticipé : interrompt l’entraînement lorsqu’une métrique de validation ne s’est pas améliorée pendant un nombre défini d’époques, appelé patience, ce qui limite le surapprentissage et économise de la puissance de calcul. Le rappel
EarlyStoppingde Keras peut aussi restaurer les meilleurs poids observés avant l’arrêt. - Sauvegarde de points de contrôle : enregistre le modèle à chaque époque ou chaque fois qu’une métrique surveillée s’améliore, afin de conserver les meilleurs poids et de pouvoir reprendre un entraînement interrompu par un plantage. Le rappel
BackupAndRestorede Keras utilise l’état sauvegardé pour reprendre automatiquement un entraînement interrompu. - Planification du taux d’apprentissage : réduit le taux d’apprentissage lorsqu’une métrique plafonne, comme le fait le rappel
ReduceLROnPlateaude Keras, ou suit un calendrier fixe, tel qu’une décroissance cosinus. - Suivi des expériences : envoie les pertes, les métriques et des images d’exemple à des outils comme TensorBoard, MLflow ou Weights & Biases après chaque époque.
- Réglage des hyperparamètres : transmet le score de chaque époque à un optimiseur comme Ray Tune, dont les ordonnanceurs interrompent rapidement les essais peu prometteurs.
Écrire un rappel personnalisé#
Ultralytics YOLO déclenche des événements nommés pendant l’entraînement, la validation, la prédiction et l’exportation, comme on_train_epoch_end et on_fit_epoch_end ; ses propres intégrations pour MLflow, Comet, ClearML, TensorBoard et Ultralytics Platform sont enregistrées comme rappels sur ces événements. Ce rappel lit la mAP50-95 de validation après chaque époque et arrête un entraînement YOLO26 dès qu’il atteint une cible :
from ultralytics import YOLO
def stop_at_target(trainer):
"""Stop training once validation mAP50-95 reaches 0.6."""
score = trainer.metrics["metrics/mAP50-95(B)"]
print(f"Epoch {trainer.epoch + 1}: mAP50-95 {score:.3f}")
if score >= 0.6:
trainer.stop = True # the trainer ends the run after this epoch
model = YOLO("yolo26n.pt")
model.add_callback("on_fit_epoch_end", stop_at_target) # runs after each epoch's validation
model.train(data="coco8.yaml", epochs=20)L’événement on_fit_epoch_end se déclenche après l’entraînement et la validation de l’époque ; trainer.metrics contient donc déjà les scores de cette époque. Définir trainer.stop fait sortir l’entraîneur de sa boucle d’époques, exécuter la validation finale habituelle sur les meilleurs poids et enregistrer les résultats, comme lorsque la limite intégrée patience est atteinte.
Rappels et hooks#
Les deux termes désignent souvent la même chose : dans PyTorch Lightning, les méthodes implémentées par un rappel sont appelées des points d’extension. Dans PyTorch lui-même, les points d’extension des modules enregistrés avec register_forward_hook ou register_full_backward_hook sont associés au passage avant ou arrière d’une seule couche, plutôt qu’à un événement de la boucle d’entraînement ; ils servent à lire les cartes de caractéristiques pour les visualiser ou à examiner et modifier les gradients pendant la rétropropagation.










