Gradient Accumulation
Aprende cómo la acumulación de gradientes permite tamaños de lote efectivos más grandes con memoria de GPU limitada, con orientación práctica de entrenamiento en PyTorch y Ultralytics YOLO.
La acumulación de gradientes es una técnica de entrenamiento que suma los gradientes de varios lotes pequeños, llamados microlotes, antes de realizar una única actualización de los pesos del modelo. Se aproxima al entrenamiento con un batch size mayor cuando la memoria disponible de la GPU no puede albergar el lote completo de una vez. Esto hace que el gradient descent, que consume mucha memoria, sea práctico sin necesidad de cambiar la arquitectura del modelo ni reducir la resolución de entrada.
Cómo funciona la acumulación de gradientes#
Durante el entrenamiento normal, cada lote sigue tres pasos principales: calcular la pérdida, usar la backpropagation para calcular los gradientes y dejar que el optimizador actualice los pesos del modelo. A continuación, los gradientes se limpian antes del siguiente lote.
La acumulación de gradientes retrasa la actualización del optimizador. Cada microlote realiza una pasada hacia adelante y hacia atrás, pero sus gradientes permanecen en la memoria y se suman a los de los microlotes posteriores. Este comportamiento se deriva de forma natural de la PyTorch backward operation, que acumula valores en el campo de gradiente de cada parámetro.
Tras el número configurado de pasos de acumulación:
- El optimizador actualiza los pesos del modelo.
- Los gradientes se reinician mediante una operación como Optimizer.zero_grad.
- Comienza una nueva ventana de acumulación.
El tamaño de lote efectivo es:
microbatch size x accumulation steps x number of training devices
Por ejemplo, un microlote de 4 imágenes acumulado durante 8 pasos se comporta aproximadamente como un lote de 32 imágenes en una GPU. Con cuatro GPUs, el tamaño de lote efectivo global pasa a ser 128.
Efectos sobre la memoria, la velocidad y el aprendizaje#
La acumulación de gradientes reduce la memoria máxima requerida para las activaciones porque solo un microlote pasa por la red a la vez. No reduce sustancialmente la memoria utilizada por los parámetros del modelo, los gradientes o el estado del optimizador.
Tampoco suele acelerar el entrenamiento. Procesar ocho microlotes sigue requiriendo ocho pasadas hacia adelante y hacia atrás, y los lotes más pequeños pueden utilizar la GPU de forma menos eficiente. El beneficio principal es ajustar un lote efectivo deseado en una memoria limitada. Un beneficio secundario puede darse en el distributed training, donde las implementaciones pueden evitar sincronizar los gradientes hasta el final de una ventana de acumulación utilizando funciones como DistributedDataParallel no_sync.
Una implementación manual divide comúnmente la pérdida de cada microlote entre el número de pasos de acumulación para que el gradiente resultante represente una media en lugar de una suma. Los entrenadores de alto nivel pueden gestionar la normalización automáticamente, por lo que aplicar un escalado adicional puede producir actualizaciones incorrectas.
La acumulación puede aproximarse a un lote grande real, pero los resultados no siempre son idénticos. Las Batch normalization statistics se calculan a partir de microlotes individuales, mientras que las operaciones estocásticas y el orden de los números en coma flotante también pueden introducir diferencias. Por lo tanto, el learning rate puede requerir validación en lugar de un escalado automático.
Técnicas relacionadas y diferencias clave#
La acumulación de gradientes se confunde a menudo con otras técnicas de memoria o estabilidad:
- Gradient checkpointing reduce la memoria de activación recalculando operaciones seleccionadas de la pasada hacia adelante durante la retropropagación. La PyTorch activation checkpointing documentation describe este equilibrio entre computación y memoria. En su lugar, la acumulación divide un lote grande en microlotes más pequeños.
- Mixed precision almacena o calcula operaciones seleccionadas con tipos de datos de menor precisión. Puede reducir la memoria y mejorar el rendimiento, mientras que la acumulación cambia la frecuencia con la que el optimizador se actualiza. Las técnicas se pueden combinar siguiendo el correcto automatic mixed precision accumulation workflow.
- Gradient clipping limita la magnitud de los gradientes para reducir la inestabilidad debida a actualizaciones inusualmente grandes. No crea un lote efectivo mayor. Cuando se combina con la acumulación, el recorte debe realizarse normalmente después de que se haya acumulado el gradiente completo, utilizando una operación como clip_grad_norm.
Aplicaciones en el mundo real#
En la segmentación de imágenes médicas de alta resolución, una GPU de 12 GB puede albergar solo dos escaneos grandes a la vez. Acumular gradientes a lo largo de ocho microlotes produce un lote efectivo de 16 mientras se preserva la resolución necesaria para identificar estructuras anatómicas pequeñas. El inconveniente es un intervalo más largo entre las actualizaciones del optimizador.
Para la detección de objetos cenitales, un equipo de ingeniería podría entrenar en cuatro GPUs con seis imágenes por dispositivo y cuatro pasos de acumulación. El lote global efectivo es de 96 imágenes. Esto puede estabilizar las actualizaciones para escenas que contienen muchos vehículos pequeños o edificios, manteniendo cada dispositivo dentro de su límite de memoria. Los equipos pueden gestionar experimentos en la nube, conjuntos de datos y ejecuciones de entrenamiento a través de Ultralytics Platform cloud training.
Acumulación de gradientes con Ultralytics YOLO#
El model training workflow de Ultralytics deriva el comportamiento de acumulación de los ajustes físicos batch y nominales nbs. Con batch=4 y nbs=64, el entrenador apunta a un lote nominal de 64 aplazando las actualizaciones del optimizador en múltiples microlotes.
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,
)El entrenador de alto nivel gestiona la retropropagación, la acumulación, los pasos del optimizador y la limpieza de gradientes. Su comportamiento está documentado en la Ultralytics BaseTrainer reference. En la práctica, elige el microlote más grande que quepa de forma fiable, calcula el lote efectivo previsto y compara los resultados de validación al cambiar los pasos de acumulación, la tasa de aprendizaje o el recuento de dispositivos.






