Gradient Accumulation
Erfahre, wie die Gradientenakkumulation größere effektive Batch-Größen bei begrenztem GPU-Speicher ermöglicht, mit praktischer Anleitung zum Training von PyTorch und Ultralytics YOLO.
Gradientenakkumulation ist eine Trainingstechnik, bei der Gradienten aus mehreren kleinen Batches, sogenannten Mikrobatches, addiert werden, bevor eine einzelne Aktualisierung der Modellgewichte durchgeführt wird. Sie approximiert das Training mit einer größeren Batch-Größe, wenn der verfügbare GPU-Speicher den vollständigen Batch nicht auf einmal fassen kann. Dies macht speicherintensive Gradientenabstieg-Verfahren praktikabel, ohne die Modellarchitektur zu verändern oder die Eingabeauflösung zu verringern.
Wie Gradientenakkumulation funktioniert#
Während des normalen Trainings durchläuft jeder Batch drei Hauptschritte: Berechnen des Verlusts, Verwenden von Backpropagation zur Berechnung der Gradienten und das Aktualisieren der Modellgewichte durch den Optimierer. Die Gradienten werden dann vor dem nächsten Batch gelöscht.
Gradientenakkumulation verzögert die Aktualisierung durch den Optimierer. Jeder Mikrobatch führt einen Vorwärts- und Rückwärtsdurchlauf durch, aber seine Gradienten verbleiben im Speicher und werden zu denen nachfolgender Mikrobatches addiert. Dieses Verhalten ergibt sich natürlicherweise aus der PyTorch-Rückwärtsoperation, die Werte im Gradientenfeld jedes Parameters akkumuliert.
Nach der konfigurierten Anzahl von Akkumulationsschritten:
- Aktualisiert der Optimierer die Modellgewichte.
- Werden die Gradienten mithilfe einer Operation wie Optimizer.zero_grad zurückgesetzt.
- Beginnt ein neues Akkumulationsfenster.
Die effektive Batch-Größe ist:
microbatch size x accumulation steps x number of training devices
Zum Beispiel verhält sich ein Mikrobatch von 4 Bildern, der über 8 Schritte akkumuliert wird, ungefähr wie ein Batch von 32 Bildern auf einer GPU. Mit vier GPUs wird die globale effektive Batch-Größe 128.
Auswirkungen auf Speicher, Geschwindigkeit und Lernen#
Gradientenakkumulation reduziert den für Aktivierungen erforderlichen Spitzenspeicher, da immer nur ein Mikrobatch das Netzwerk durchläuft. Sie reduziert nicht wesentlich den von Modellparametern, Gradienten oder dem Optimiererzustand verwendeten Speicher.
Sie beschleunigt das Training normalerweise auch nicht. Die Verarbeitung von acht Mikrobatches erfordert nach wie vor acht Vorwärts- und Rückwärtsdurchläufe, und kleinere Batches nutzen die GPU möglicherweise weniger effizient. Der Hauptvorteil besteht darin, einen gewünschten effektiven Batch in begrenzten Speicher einzupassen. Ein sekundärer Vorteil kann beim verteilten Training auftreten, bei dem Implementierungen möglicherweise vermeiden, Gradienten bis zum Ende eines Akkumulationsfensters zu synchronisieren, indem Funktionen wie DistributedDataParallel no_sync verwendet werden.
Eine manuelle Implementierung teilt üblicherweise den Verlust jedes Mikrobatches durch die Anzahl der Akkumulationsschritte, sodass der resultierende Gradient einen Durchschnitt statt einer Summe darstellt. High-Level-Trainer verarbeiten die Normalisierung möglicherweise automatisch, sodass das Anwenden zusätzlicher Skalierung zu inkorrekten Updates führen kann.
Akkumulation kann einen echten großen Batch approximieren, aber die Ergebnisse sind nicht immer identisch. Batch-Normalisierungsstatistiken werden aus einzelnen Mikrobatches berechnet, während stochastische Operationen und Gleitkomma-Reihenfolge ebenfalls Unterschiede verursachen können. Die Lernrate erfordert daher möglicherweise eine Validierung anstelle einer automatischen Skalierung.
Verwandte Techniken und Hauptunterschiede#
Gradientenakkumulation wird häufig mit anderen Speicher- oder Stabilitätstechniken verwechselt:
- Gradient Checkpointing reduziert den Aktivierungsspeicher, indem ausgewählte Vorwärtsdurchlauf-Operationen während der Backpropagation neu berechnet werden. Die PyTorch Activation Checkpointing-Dokumentation beschreibt diesen Kompromiss zwischen Rechenleistung und Speicher. Die Akkumulation teilt stattdessen einen großen Batch in kleinere Mikrobatches auf.
- Mixed Precision speichert oder berechnet ausgewählte Operationen mit Datentypen geringerer Präzision. Sie kann den Speicher reduzieren und den Durchsatz verbessern, während die Akkumulation ändert, wie oft der Optimierer aktualisiert. Die Techniken können kombiniert werden, indem der korrekte Workflow für die automatische Mixed-Precision-Akkumulation befolgt wird.
- Gradient Clipping begrenzt die Gradientenmagnitude, um Instabilität durch ungewöhnlich große Updates zu reduzieren. Es erzeugt keinen größeren effektiven Batch. In Kombination mit Akkumulation sollte das Clipping normalerweise nach Abschluss der vollständigen Gradientenakkumulation erfolgen, unter Verwendung einer Operation wie clip_grad_norm.
Praxisanwendungen#
Bei der hochauflösenden medizinischen Bildsegmentierung passt auf eine 12-GB-GPU möglicherweise nur ein einzelner großer Scan oder zwei auf einmal. Die Akkumulation von Gradienten über acht Mikrobatches erzeugt einen effektiven Batch von 16 bei gleichzeitiger Wahrung der Auflösung, die erforderlich ist, um kleine anatomische Strukturen zu identifizieren. Der Kompromiss ist ein längeres Intervall zwischen Optimierer-Updates.
Für die Objekterkennung in Luftbildern trainiert ein Engineering-Team möglicherweise über vier GPUs hinweg mit sechs Bildern pro Gerät und vier Akkumulationsschritten. Der effektive globale Batch beträgt 96 Bilder. Dies kann Updates für Szenen stabilisieren, die viele kleine Fahrzeuge oder Gebäude enthalten, während jedes Gerät innerhalb seiner Speicherbegrenzung bleibt. Teams können Cloud-Experimente, Datensätze und Trainingsläufe über das Ultralytics Platform Cloud Training verwalten.
Gradientenakkumulation mit Ultralytics YOLO#
Der Ultralytics-Modelltraining-Workflow leitet das Akkumulationsverhalten von den physischen batch- und nominalen nbs-Einstellungen ab. Mit batch=4 und nbs=64 zielt der Trainer auf einen nominalen Batch von 64 ab, indem Optimierer-Updates über mehrere Mikrobatches hinweg aufgeschoben werden.
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 High-Level-Trainer verwaltet Backpropagation, Akkumulation, Optimiererschritte und Gradientenbereinigung. Sein Verhalten ist in der Ultralytics BaseTrainer-Referenz dokumentiert. Wählen Sie in der Praxis den größten Mikrobatch aus, der zuverlässig passt, berechnen Sie den beabsichtigten effektiven Batch und vergleichen Sie die Validierungsergebnisse, wenn Sie Akkumulationsschritte, Lernrate oder Geräteanzahl ändern.






