Gradient Accumulation
Aprende como a acumulação de gradientes permite tamanhos de batch efetivos maiores com memória GPU limitada, com orientações práticas sobre PyTorch e o treino de Ultralytics YOLO.
A acumulação de gradientes é uma técnica de treino que adiciona os gradientes de vários lotes pequenos, chamados microlotes, antes de realizar uma única atualização dos pesos do modelo. Ela aproxima o treino com um tamanho do lote maior quando a memória disponível da GPU não consegue comportar o lote completo de uma só vez. Isso torna prática a descida do gradiente intensiva em memória sem alterar a arquitetura do modelo nem reduzir a resolução de entrada.
Como funciona a acumulação de gradientes#
Durante o treino normal, cada lote segue três etapas principais: calcular a perda, usar a retropropagação para calcular os gradientes e permitir que o otimizador atualize os pesos do modelo. Em seguida, os gradientes são limpos antes do lote seguinte.
A acumulação de gradientes adia a atualização do otimizador. Cada microlote realiza uma passagem para a frente e uma passagem para trás, mas os respetivos gradientes permanecem na memória e são adicionados aos dos microlotes seguintes. Este comportamento decorre naturalmente da operação backward do PyTorch, que acumula valores no campo de gradiente de cada parâmetro.
Após o número configurado de etapas de acumulação:
- O otimizador atualiza os pesos do modelo.
- Os gradientes são repostos usando uma operação como Optimizer.zero_grad.
- Começa uma nova janela de acumulação.
O tamanho efetivo do lote é:
microbatch size x accumulation steps x number of training devices
Por exemplo, um microlote de 4 imagens acumulado ao longo de 8 etapas comporta-se aproximadamente como um lote de 32 imagens numa GPU. Com quatro GPUs, o tamanho efetivo global do lote passa a ser 128.
Efeitos na memória, velocidade e aprendizagem#
A acumulação de gradientes reduz o pico de memória necessário para as ativações, porque apenas um microlote passa pela rede de cada vez. Ela não reduz substancialmente a memória utilizada pelos parâmetros do modelo, pelos gradientes ou pelo estado do otimizador.
Também não costuma acelerar o treino. Processar oito microlotes continua a exigir oito passagens para a frente e para trás, e lotes menores podem utilizar a GPU de forma menos eficiente. O principal benefício é permitir que um lote efetivo pretendido caiba numa memória limitada. Pode ocorrer um benefício secundário no treino distribuído, em que as implementações podem evitar sincronizar os gradientes até ao final de uma janela de acumulação usando funcionalidades como DistributedDataParallel no_sync.
Uma implementação manual geralmente divide a perda de cada microlote pelo número de etapas de acumulação, para que o gradiente resultante represente uma média em vez de uma soma. Os treinadores de alto nível podem tratar automaticamente da normalização, pelo que aplicar um escalonamento adicional pode produzir atualizações incorretas.
A acumulação pode aproximar-se de um lote grande verdadeiro, mas os resultados nem sempre são idênticos. As estatísticas da normalização por lote são calculadas a partir de microlotes individuais, enquanto as operações estocásticas e a ordem dos números de vírgula flutuante também podem introduzir diferenças. Por isso, a taxa de aprendizagem pode exigir validação em vez de um escalonamento automático.
Técnicas relacionadas e principais diferenças#
A acumulação de gradientes é frequentemente confundida com outras técnicas de memória ou estabilidade:
- Checkpointing de gradientes reduz a memória das ativações ao recalcular operações selecionadas da passagem para a frente durante a retropropagação. A documentação do checkpointing de ativações do PyTorch descreve esta troca entre computação e memória. A acumulação, por outro lado, divide um lote grande em microlotes menores.
- Precisão mista armazena ou calcula operações selecionadas com tipos de dados de menor precisão. Ela pode reduzir o consumo de memória e melhorar o débito, enquanto a acumulação altera a frequência com que o otimizador é atualizado. As técnicas podem ser combinadas seguindo o fluxo de trabalho de acumulação com precisão mista automática correto.
- Clipping de gradientes limita a magnitude dos gradientes para reduzir a instabilidade causada por atualizações invulgarmente grandes. Ele não cria um lote efetivo maior. Quando combinado com a acumulação, o clipping deve normalmente ocorrer depois de o gradiente completo ter sido acumulado, usando uma operação como clip_grad_norm.
Aplicações no mundo real#
Na segmentação de imagens médicas de alta resolução, uma GPU de 12 GB pode comportar apenas dois exames grandes de cada vez. Acumular gradientes ao longo de oito microlotes produz um lote efetivo de 16, preservando simultaneamente a resolução necessária para identificar pequenas estruturas anatómicas. A desvantagem é um intervalo mais longo entre as atualizações do otimizador.
Na deteção de objetos aéreos, uma equipa de engenharia pode treinar em quatro GPUs com seis imagens por dispositivo e quatro etapas de acumulação. O lote global efetivo é de 96 imagens. Isto pode estabilizar as atualizações em cenas que contêm muitos veículos ou edifícios pequenos, mantendo cada dispositivo dentro do seu limite de memória. As equipas podem gerir experiências na cloud, conjuntos de dados e execuções de treino através do treino na cloud da Ultralytics Platform.
Acumulação de gradientes com o Ultralytics YOLO#
O fluxo de trabalho de treino do modelo da Ultralytics determina o comportamento da acumulação a partir das configurações batch física e nbs nominal. Com batch=4 e nbs=64, o treinador visa um lote nominal de 64, adiando as atualizações do otimizador ao longo de vários 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,
)O treinador de alto nível gere a retropropagação, a acumulação, as etapas do otimizador e a limpeza dos gradientes. O seu comportamento está documentado na referência do BaseTrainer da Ultralytics. Na prática, escolhe o maior microlote que caiba de forma fiável, calcula o lote efetivo pretendido e compara os resultados de validação ao alterar as etapas de acumulação, a taxa de aprendizagem ou o número de dispositivos.









