Gradient Accumulation
Erfahre, wie Gradient Accumulation größere effektive Batch-Größen bei begrenztem GPU-Speicher ermöglicht – mit praktischen Anleitungen zu PyTorch und dem Training von Ultralytics YOLO.
Gradientenakkumulation ist eine Trainingstechnik, bei der Gradienten aus mehreren kleinen Batches, sogenannten Mikrobatches, gesammelt werden, bevor eine einzelne Aktualisierung der Modellgewichte durchgeführt wird. Sie approximiert das Training mit einer größeren Batchgröße, wenn der verfügbare GPU-Speicher nicht den gesamten Batch auf einmal aufnehmen kann. Dadurch wird speicherintensiver Gradientenabstieg praktikabel, ohne die Modellarchitektur zu ändern oder die Eingabeauflösung zu verringern.
Funktionsweise der Gradientenakkumulation#
Beim normalen Training durchläuft jeder Batch drei Hauptschritte: den Loss berechnen, mithilfe von Backpropagation die Gradienten berechnen und den Optimierer die Modellgewichte aktualisieren lassen. Anschließend werden die Gradienten vor dem nächsten Batch gelöscht.
Die Gradientenakkumulation verzögert die Aktualisierung durch den Optimierer. Jeder Mikrobatch durchläuft einen Forward- und einen Backward-Pass, aber seine Gradienten bleiben im Speicher und werden zu denen nachfolgender Mikrobatches addiert. Dieses Verhalten ergibt sich unmittelbar aus der PyTorch-Backward-Operation, die Werte im Gradientenfeld jedes Parameters akkumuliert.
Nach der konfigurierten Anzahl von Akkumulationsschritten:
- Der Optimierer aktualisiert die Modellgewichte.
- Die Gradienten werden mithilfe einer Operation wie Optimizer.zero_grad zurückgesetzt.
- Ein neues Akkumulationsfenster beginnt.
Die effektive Batchgröße ist:
microbatch size x accumulation steps x number of training devices
Beispielsweise verhält sich ein Mikrobatch mit 4 Bildern, der über 8 Schritte akkumuliert wird, ungefähr wie ein Batch mit 32 Bildern auf einer GPU. Mit vier GPUs beträgt die globale effektive Batchgröße 128.
Auswirkungen auf Speicher, Geschwindigkeit und Lernen#
Die Gradientenakkumulation reduziert den erforderlichen maximalen Speicher für Aktivierungen, da immer nur ein Mikrobatch gleichzeitig das Netzwerk durchläuft. Den von Modellparametern, Gradienten oder dem Optimiererzustand belegten Speicher reduziert sie jedoch nicht wesentlich.
Normalerweise beschleunigt sie das Training auch nicht. Die Verarbeitung von acht Mikrobatches erfordert weiterhin acht Forward- und Backward-Pässe, und kleinere Batches nutzen die GPU möglicherweise weniger effizient. Der Hauptvorteil besteht darin, einen gewünschten effektiven Batch in einem begrenzten Speicher unterzubringen. Ein zusätzlicher Vorteil kann beim verteilten Training entstehen, wenn Implementierungen die Synchronisierung der Gradienten mithilfe von Funktionen wie DistributedDataParallel no_sync bis zum Ende eines Akkumulationsfensters vermeiden.
Bei einer manuellen Implementierung wird der Loss jedes Mikrobatches üblicherweise durch die Anzahl der Akkumulationsschritte geteilt, sodass der resultierende Gradient einen Durchschnitt statt einer Summe darstellt. Trainer auf höherer Abstraktionsebene übernehmen die Normalisierung möglicherweise automatisch. Eine zusätzliche Skalierung kann daher zu fehlerhaften Aktualisierungen führen.
Die Akkumulation kann einen tatsächlich großen Batch approximieren, aber die Ergebnisse sind nicht immer identisch. Die Statistiken der Batch-Normalisierung werden aus einzelnen Mikrobatches berechnet, während auch stochastische Operationen und die Reihenfolge von Gleitkommaoperationen Unterschiede verursachen können. Daher muss die Lernrate möglicherweise validiert werden, anstatt sie automatisch zu skalieren.
Verwandte Techniken und wichtige Unterschiede#
Die Gradientenakkumulation wird häufig mit anderen Techniken für Speicherverwaltung oder Stabilität verwechselt:
- Gradienten-Checkpointing reduziert den Speicherbedarf für Aktivierungen, indem ausgewählte Operationen des Forward-Passes während der Backpropagation erneut berechnet werden. Die Dokumentation zum Aktivierungs-Checkpointing in PyTorch beschreibt diesen Kompromiss zwischen Rechenaufwand und Speicher. Die Akkumulation teilt stattdessen einen großen Batch in kleinere Mikrobatches auf.
- Gemischte Präzision speichert ausgewählte Operationen mit Datentypen geringerer Präzision oder führt sie mit diesen aus. Sie kann den Speicherbedarf reduzieren und den Durchsatz erhöhen, während die Akkumulation ändert, wie häufig der Optimierer Aktualisierungen durchführt. Die Techniken können mithilfe des korrekten Ablaufs für die Akkumulation mit automatischer gemischter Präzision kombiniert werden.
- Gradienten-Clipping begrenzt den Betrag der Gradienten, um Instabilitäten durch ungewöhnlich große Aktualisierungen zu reduzieren. Es erzeugt keinen größeren effektiven Batch. In Kombination mit der Akkumulation sollte das Clipping normalerweise erst nach der vollständigen Akkumulation des Gradienten erfolgen, mithilfe einer Operation wie clip_grad_norm.
Anwendungen in der Praxis#
Bei der Segmentierung medizinischer Bilder mit hoher Auflösung kann eine GPU mit 12 GB möglicherweise nur zwei große Aufnahmen gleichzeitig verarbeiten. Die Akkumulation von Gradienten über acht Mikrobatches ergibt einen effektiven Batch von 16 und erhält dabei die zur Erkennung kleiner anatomischer Strukturen erforderliche Auflösung. Der Nachteil ist ein längeres Intervall zwischen den Aktualisierungen durch den Optimierer.
Bei der Objekterkennung aus der Luft könnte ein Entwicklungsteam mit vier GPUs trainieren, wobei auf jedem Gerät sechs Bilder und vier Akkumulationsschritte verwendet werden. Der effektive globale Batch umfasst 96 Bilder. Dadurch lassen sich Aktualisierungen für Szenen mit vielen kleinen Fahrzeugen oder Gebäuden stabilisieren, während jedes Gerät innerhalb seines Speicherlimits bleibt. Teams können Cloud-Experimente, Datensätze und Trainingsläufe über das Ultralytics Platform-Cloud-Training verwalten.
Gradientenakkumulation mit Ultralytics YOLO#
Der Trainingsablauf für Modelle von Ultralytics leitet das Akkumulationsverhalten aus den Einstellungen für batch (physischer Batch) und nbs (nominaler Batch) ab. Mit batch=4 und nbs=64 strebt der Trainer einen nominalen Batch von 64 an, indem er die Aktualisierungen durch den Optimierer über mehrere Mikrobatches hinweg zurückstellt.
from ultralytics import YOLO
# Load a pretrained YOLO26 detection model
model = YOLO("yolo26n.pt")
# Use a small physical batch and a larger nominal batch
results = model.train(
data="coco8.yaml",
epochs=10,
batch=4,
nbs=64,
)Der Trainer auf höherer Abstraktionsebene verwaltet Backpropagation, Akkumulation, Optimizerschritte und das Löschen der Gradienten. Sein Verhalten ist in der Referenz zu Ultralytics BaseTrainer dokumentiert. Wähle in der Praxis den größten Mikrobatch, der zuverlässig in den Speicher passt, berechne den beabsichtigten effektiven Batch und vergleiche die Validierungsergebnisse, wenn du Akkumulationsschritte, Lernrate oder Geräteanzahl änderst.









