Training

gradient accumulation

Накопление градиентов нескольких микробатчей перед шагом оптимизатора для имитации большого батча.

Что такое gradient accumulation

Gradient accumulation (накопление градиентов) — техника, позволяющая имитировать большой batch size при ограниченной VRAM. Вместо одного большого батча модель обрабатывает N последовательных малых микробатчей, накапливает градиенты, и только после N-го шага выполняет обновление весов.

С точки зрения оптимизатора это эквивалентно одному шагу с батчем N × microbatch_size.

Как работает

optimizer.zero_grad()

for i, batch in enumerate(train_loader):
    outputs = model(**batch)
    loss = outputs.loss / gradient_accumulation_steps  # нормализация
    loss.backward()  # накапливаем градиенты

    if (i + 1) % gradient_accumulation_steps == 0:
        optimizer.step()          # шаг оптимизатора
        optimizer.zero_grad()     # обнуляем градиенты
        scheduler.step()

HF Trainer

from transformers import TrainingArguments
args = TrainingArguments(
    per_device_train_batch_size=2,
    gradient_accumulation_steps=16,
    # → effective batch_size = 2 × 16 = 32 (на 1 GPU)
)

Компромиссы

Параметр С gradient accumulation Без
VRAM Минимальная (per_device_bs) Пропорциональна BS
Скорость Немного медленнее Немного быстрее
Эффективность GPU Ниже (меньший BS) Выше
Batch size Любой Ограничен VRAM

При накоплении GPU не простаивает (backward выполняется без шага оптимизатора), но VRAM используется только для малого батча.

Связанные термины

  • batch size — что gradient accumulation имитирует
  • microbatch — единица накопления
  • VRAM — ограничение, обходимое этой техникой
  • gradient checkpointing — дополнительная техника экономии VRAM

Готовы запустить GPU-задачу?

Запустить GPU-сервер