Gradient Accumulation
Découvre comment l’accumulation des gradients permet d’utiliser des tailles de batch effectives plus grandes avec une mémoire GPU limitée, grâce à des conseils pratiques sur PyTorch et l’entraînement d’Ultralytics YOLO.
L’accumulation des gradients est une technique d’entraînement qui additionne les gradients de plusieurs petits lots, appelés micro-lots, avant d’effectuer une seule mise à jour des poids du modèle. Elle permet d’approcher un entraînement avec une taille de lot plus grande lorsque la mémoire du GPU disponible ne peut pas contenir le lot complet en une seule fois. Elle rend ainsi la descente de gradient gourmande en mémoire plus pratique sans modifier l’architecture du modèle ni réduire la résolution d’entrée.
Fonctionnement de l’accumulation des gradients#
Lors d’un entraînement normal, chaque lot suit trois étapes principales : calculer la perte, utiliser la rétropropagation pour calculer les gradients, puis laisser l’optimiseur mettre à jour les poids du modèle. Les gradients sont ensuite effacés avant le lot suivant.
L’accumulation des gradients retarde la mise à jour de l’optimiseur. Chaque micro-lot effectue une passe avant et une passe arrière, mais ses gradients restent en mémoire et sont ajoutés à ceux des micro-lots suivants. Ce comportement découle naturellement de l’opération backward de PyTorch, qui accumule les valeurs dans le champ de gradient de chaque paramètre.
Une fois le nombre configuré d’étapes d’accumulation atteint :
- L’optimiseur met à jour les poids du modèle.
- Les gradients sont réinitialisés à l’aide d’une opération telle que Optimizer.zero_grad.
- Une nouvelle fenêtre d’accumulation commence.
La taille de lot effective est la suivante :
microbatch size x accumulation steps x number of training devices
Par exemple, un micro-lot de 4 images accumulé sur 8 étapes se comporte approximativement comme un lot de 32 images sur un seul GPU. Avec quatre GPU, la taille de lot effective globale atteint 128.
Effets sur la mémoire, la vitesse et l’apprentissage#
L’accumulation des gradients réduit la mémoire maximale nécessaire aux activations, car un seul micro-lot traverse le réseau à la fois. Elle ne réduit pas sensiblement la mémoire utilisée par les paramètres du modèle, les gradients ou l’état de l’optimiseur.
Elle n’accélère généralement pas non plus l’entraînement. Le traitement de huit micro-lots nécessite toujours huit passes avant et arrière, et les lots plus petits peuvent utiliser le GPU moins efficacement. Le principal avantage est de faire tenir une taille de lot effective souhaitée dans une mémoire limitée. Un avantage secondaire peut apparaître lors de l’entraînement distribué, lorsque les implémentations peuvent éviter de synchroniser les gradients jusqu’à la fin d’une fenêtre d’accumulation grâce à des fonctionnalités telles que DistributedDataParallel no_sync.
Une implémentation manuelle divise généralement la perte de chaque micro-lot par le nombre d’étapes d’accumulation afin que le gradient obtenu représente une moyenne plutôt qu’une somme. Les entraîneurs de haut niveau peuvent gérer automatiquement la normalisation ; appliquer une mise à l’échelle supplémentaire peut donc produire des mises à jour incorrectes.
L’accumulation peut approcher le comportement d’un véritable grand lot, mais les résultats ne sont pas toujours identiques. Les statistiques de normalisation par lot sont calculées à partir de micro-lots individuels, tandis que les opérations stochastiques et l’ordre des calculs en virgule flottante peuvent également introduire des différences. Le taux d’apprentissage peut donc nécessiter une validation plutôt qu’une mise à l’échelle automatique.
Techniques associées et principales différences#
L’accumulation des gradients est souvent confondue avec d’autres techniques de gestion de la mémoire ou de stabilité :
- Le checkpointing des gradients réduit la mémoire des activations en recalculant certaines opérations de la passe avant pendant la rétropropagation. La documentation de PyTorch sur le checkpointing des activations décrit cet arbitrage entre calcul et mémoire. L’accumulation divise quant à elle un grand lot en micro-lots plus petits.
- La précision mixte stocke certaines opérations ou les calcule avec des types de données de précision inférieure. Elle peut réduire la mémoire et améliorer le débit, tandis que l’accumulation modifie la fréquence à laquelle l’optimiseur effectue ses mises à jour. Les techniques peuvent être combinées en suivant le workflow d’accumulation avec la précision mixte automatique approprié.
- La limitation des gradients limite l’amplitude des gradients afin de réduire l’instabilité due à des mises à jour exceptionnellement importantes. Elle ne crée pas de lot effectif plus grand. Lorsqu’elle est combinée à l’accumulation, la limitation doit normalement être effectuée une fois le gradient entièrement accumulé, à l’aide d’une opération telle que clip_grad_norm.
Applications concrètes#
Pour la segmentation d’images médicales haute résolution, un GPU de 12 Go peut ne contenir que deux grandes analyses à la fois. L’accumulation des gradients sur huit micro-lots produit un lot effectif de 16 tout en préservant la résolution nécessaire à l’identification de petites structures anatomiques. Le compromis est un intervalle plus long entre les mises à jour de l’optimiseur.
Pour la détection d’objets aériens, une équipe d’ingénierie peut entraîner un modèle sur quatre GPU avec six images par appareil et quatre étapes d’accumulation. Le lot global effectif contient 96 images. Cela peut stabiliser les mises à jour pour les scènes contenant de nombreux petits véhicules ou bâtiments, tout en maintenant chaque appareil dans sa limite de mémoire. Les équipes peuvent gérer les expériences cloud, les jeux de données et les exécutions d’entraînement via l’entraînement cloud d’Ultralytics Platform.
Accumulation des gradients avec Ultralytics YOLO#
Le workflow d’entraînement des modèles Ultralytics déduit le comportement de l’accumulation à partir des paramètres batch physique et nbs nominal. Avec batch=4 et nbs=64, l’entraîneur vise un lot nominal de 64 en retardant les mises à jour de l’optimiseur sur plusieurs micro-lots.
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,
)L’entraîneur de haut niveau gère la rétropropagation, l’accumulation, les étapes de l’optimiseur et l’effacement des gradients. Son comportement est documenté dans la référence Ultralytics BaseTrainer. En pratique, choisis le micro-lot le plus grand qui tient de manière fiable, calcule le lot effectif visé et compare les résultats de validation lorsque tu modifies le nombre d’étapes d’accumulation, le taux d’apprentissage ou le nombre d’appareils.









