Gradient Accumulation
Apprends comment l'accumulation de gradients permet d'obtenir des tailles de lots effectives plus grandes sur une mémoire GPU limitée, avec des conseils pratiques d'entraînement pour PyTorch et Ultralytics YOLO.
L'accumulation de gradients est une technique d'entraînement qui ajoute les gradients de plusieurs petits lots, appelés micro-lots, avant d'effectuer une seule mise à jour des poids du modèle. Elle simule un entraînement avec une taille de lot plus grande lorsque la mémoire GPU disponible ne peut pas contenir le lot complet en une seule fois. Cela rend la descente de gradient, gourmande en mémoire, pratique sans modifier l'architecture du modèle ni réduire la résolution d'entrée.
Fonctionnement de l'accumulation de gradients#
Pendant un entraînement normal, chaque lot suit trois étapes principales : calculer la perte, utiliser la rétropropagation pour calculer les gradients, et laisser l'optimiseur mettre à jour les poids du modèle. Les gradients sont ensuite effacés avant le lot suivant.
L'accumulation de gradients retarde la mise à jour de l'optimiseur. Chaque micro-lot effectue une passe avant et 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 arrière de PyTorch, qui accumule les valeurs dans le champ de gradient de chaque paramètre.
Après le nombre configuré d'étapes d'accumulation :
- 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 effective du lot est :
microbatch size x accumulation steps x number of training devices
Par exemple, un micro-lot de 4 images accumulées sur 8 étapes se comporte approximativement comme un lot de 32 images sur un seul GPU. Avec quatre GPU, la taille de lot globale effective devient 128.
Effets sur la mémoire, la vitesse et l'apprentissage#
L'accumulation de gradients réduit la mémoire de crête requise pour les activations car un seul micro-lot traverse le réseau à la fois. Elle ne réduit pas substantiellement 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 des lots plus petits peuvent utiliser le GPU de manière moins efficace. Le principal avantage est de faire tenir un lot effectif souhaité dans une mémoire limitée. Un avantage secondaire peut se produire dans l'entraînement distribué, où les implémentations peuvent éviter de synchroniser les gradients jusqu'à la fin d'une fenêtre d'accumulation en utilisant 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 résultant représente une moyenne plutôt qu'une somme. Les entraîneurs de haut niveau peuvent gérer la mise à l'échelle automatiquement, donc l'application d'une mise à l'échelle supplémentaire peut produire des mises à jour incorrectes.
L'accumulation peut simuler un vrai grand lot, mais les résultats ne sont pas toujours identiques. Les statistiques de normalisation par lots sont calculées à partir de micro-lots individuels, tandis que les opérations stochastiques et l'ordre 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 de gradients est souvent confondue avec d'autres techniques de mémoire ou de stabilité :
- Le point de contrôle de gradient réduit la mémoire d'activation en re calculant certaines opérations de la passe avant sélectionnées pendant la rétropropagation. La documentation sur le point de contrôle d'activation PyTorch décrit ce compromis calcul-mémoire. L'accumulation divise plutôt un grand lot en micro-lots plus petits.
- La précision mixte stocke ou calcule des opérations sélectionnées avec des types de données de plus basse précision. Elle peut réduire la mémoire et améliorer le débit, tandis que l'accumulation modifie la fréquence des mises à jour de l'optimiseur. Les techniques peuvent être combinées en suivant le bon flux de travail d'accumulation en précision mixte automatique.
- Le découpage des gradients limite l'amplitude des gradients pour réduire l'instabilité causée par des mises à jour exceptionnellement grandes. Il ne crée pas un lot effectif plus grand. Lorsqu'il est combiné avec l'accumulation, le découpage doit normalement se produire après que le gradient complet a été accumulé, en utilisant une opération telle que clip_grad_norm.
Applications concrètes#
Dans la segmentation d'images médicales à haute résolution, un GPU de 12 Go peut ne contenir que deux grands scans à la fois. L'accumulation de gradients sur huit micro-lots produit un lot effectif de 16 tout en préservant la résolution nécessaire pour identifier 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 s'entraîner sur quatre GPU avec six images par appareil et quatre étapes d'accumulation. Le lot global effectif est de 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 ensembles de données et les cycles d'entraînement via Ultralytics Platform cloud training.
Accumulation de gradients avec Ultralytics YOLO#
Le flux de travail d'entraînement de modèle d'Ultralytics dérive le comportement d'accumulation des paramètres physiques batch et nominaux nbs. Avec batch=4 et nbs=64, l'entraîneur cible un lot nominal de 64 en reportant 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 plus grand micro-lot qui tient de manière fiable, calcule le lot effectif prévu et compare les résultats de validation lors de la modification des étapes d'accumulation, du taux d'apprentissage ou du nombre d'appareils.






