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-сервер