Callback
Ein Callback ist eine Funktion, die eine Trainingsschleife bei festgelegten Ereignissen aufruft, etwa am Ende jeder Epoche, um frühzeitiges Beenden, Prüfpunkte oder Protokollierung hinzuzufügen.
Ein Callback ist eine Funktion, die an einen anderen Codeabschnitt übergeben wird und von diesem bei einem bestimmten Ereignis aufgerufen wird. Ereignisbehandlungsroutinen in Benutzeroberflächen, Abschlussfunktionen in asynchronem Code und die Vergleichsfunktion einer Sortierroutine sind allesamt Callbacks. In Frameworks für Deep Learning sind die Ereignisse bestimmte Punkte in der Trainingsschleife, etwa der Trainingsbeginn, das Ende jedes Batches oder jeder Epoche sowie der Abschluss der Validierung. Für ein Ereignis registrierte Callbacks werden an dieser Stelle mit Zugriff auf den Status des Trainers ausgeführt. So können Nutzer vorzeitigen Abbruch gegen Überanpassung, Checkpoints, Lernraten-Zeitpläne oder Protokollierung hinzufügen, ohne die Schleife selbst zu bearbeiten.
Wie Callbacks in das Training eingreifen#
Ein Framework verwaltet für jedes benannte Ereignis eine Liste von Callbacks und ruft jeden davon auf, wenn die Schleife das Ereignis erreicht. Dabei wird das Trainer- oder Modellobjekt übergeben, sodass ein Callback Metriken auslesen und Einstellungen ändern kann. Keras verwaltet sie im Modul keras.callbacks, PyTorch Lightning in Unterklassen von Callback und Hugging Face Transformers in TrainerCallback. Die Methodennamen unterscheiden sich je nach Bibliothek, die Ereignisse folgen jedoch derselben Schleife:
Da Callbacks innerhalb der Schleife ausgeführt werden, können sie diese auch verändern: Ein Callback, der eine Stoppmarkierung setzt, beendet das Training nach der aktuellen Epoche; ein Callback, der den Optimierer verändert, wirkt sich auf jeden folgenden Schritt aus. Callbacks für dasselbe Ereignis werden in der Reihenfolge ihrer Registrierung ausgeführt. Da Callbacks auf Batch-Ebene Tausende Male pro Epoche laufen, gehören langsame Aufgaben wie das Hochladen von Dateien zu den Ereignissen auf Epochenebene. Beim verteilten Training führt jeder Prozess eine eigene Kopie der Schleife und ihrer Callbacks aus. Daher werden Protokollierungs- und Checkpoint-Callbacks üblicherweise nur im Hauptprozess, Rang 0, ausgeführt, damit nicht mehrere GPUs dieselbe Datei schreiben.
Gängige Trainings-Callbacks#
- Vorzeitiger Abbruch: Beendet das Training, wenn sich eine Validierungsmetrik während einer festgelegten Anzahl von Epochen, der sogenannten Geduld, nicht verbessert hat. Das begrenzt Überanpassung und spart Rechenleistung. Keras'
EarlyStoppingkann außerdem die besten Gewichte wiederherstellen, die es vor dem Abbruch gesehen hat. - Checkpoint-Erstellung: Speichert das Modell nach jeder Epoche oder immer dann, wenn sich eine überwachte Metrik verbessert, damit die besten Gewichte erhalten bleiben und ein abgestürzter Lauf fortgesetzt werden kann. Keras'
BackupAndRestore-Callback verwendet den gespeicherten Zustand, um einen unterbrochenen Lauf automatisch fortzusetzen. - Lernratensteuerung: Senkt die Lernrate, wenn eine Metrik stagniert, wie es Keras'
ReduceLROnPlateautut, oder folgt einem festen Zeitplan wie dem kosinusförmigen Abfall. - Experimentverfolgung: Übermittelt nach jeder Epoche Verluste, Metriken und Beispielbilder an Tools wie TensorBoard, MLflow oder Weights & Biases.
- Hyperparameteroptimierung: Meldet den Score jeder Epoche an ein Optimierungswerkzeug wie Ray Tune, dessen Scheduler wenig aussichtsreiche Durchläufe frühzeitig abbrechen.
Einen eigenen Callback schreiben#
Ultralytics YOLO löst während des Trainings, der Validierung, der Vorhersage und des Exports benannte Ereignisse aus, etwa on_train_epoch_end und on_fit_epoch_end. Die eigenen Integrationen für MLflow, Comet, ClearML, TensorBoard und Ultralytics Platform sind als Callbacks für diese Ereignisse registriert. Dieser Callback liest nach jeder Epoche die Validierungsmetrik mAP50-95 aus und beendet einen YOLO26-Lauf, sobald ein Zielwert erreicht wird:
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)Das Ereignis on_fit_epoch_end wird nach dem Training und der Validierung der Epoche ausgelöst. Daher enthält trainer.metrics bereits die Werte dieser Epoche. Durch das Setzen von trainer.stop verlässt der Trainer seine Epochen-Schleife, führt wie üblich eine abschließende Validierung mit den besten Gewichten durch und speichert die Ergebnisse – genauso wie beim Erreichen der integrierten Grenze patience.
Callbacks und Hooks im Vergleich#
Die beiden Begriffe bezeichnen oft dasselbe: PyTorch Lightning nennt die Methoden, die ein Callback implementiert, Hooks. In PyTorch selbst werden Modul-Hooks, die mit register_forward_hook oder register_full_backward_hook registriert wurden, an den Vorwärts- oder Rückwärtsdurchlauf einer einzelnen Schicht angehängt statt an ein Ereignis der Trainingsschleife. Sie dienen dazu, Merkmalskarten zur Visualisierung auszulesen oder Gradienten während der Rückpropagation zu untersuchen und zu verändern.










