optimizer.step()accumulation_steps = 4
optimizer.zero_grad()
for i, (x, y) in enumerate(dataloader):
pred = model(x)
loss = criterion(pred, y)
loss = loss / accumulation_steps # ✅ 防止梯度放大
loss.backward()
if (i + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()✅ loss 要除以 accumulation_steps
✅ 只在累积结束时 step 和 zero_grad
batch_size 实际变小,但等效 batch 变大training_args = TrainingArguments(
per_device_train_batch_size=8,
gradient_accumulation_steps=4,
...
)8 × 4 = 32from accelerate import Accelerator
accelerator = Accelerator()
model, optimizer, dataloader = accelerator.prepare(
model, optimizer, dataloader
)
for batch in dataloader:
outputs = model(**batch)
loss = outputs.loss
loss = loss / gradient_accumulation_steps
accelerator.backward(loss)
if (step + 1) % gradient_accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad(){
"train_batch_size": 32,
"gradient_accumulation_steps": 4
}或:
ds_config = {
"train_batch_size": 32,
"gradient_accumulation_steps": 4
}| 错误 | 后果 |
|---|---|
忘记 loss / steps | 梯度放大 |
每步都 optimizer.step() | 等于没累积 |
| 学习率不调整 | 大 batch 效果差 |
等效 batch size 变大 → 学习率适当增大(线性缩放规则)
小 batch 可能不稳定,可用 SyncBatchNorm
clip_grad_norm_✅ 显存不够
✅ 想用大 batch 但硬件受限
✅ 微调大模型(LLM / ViT)
❌ 不推荐:
如果你愿意,我可以:
只要告诉我你用的是 PyTorch / HuggingFace / DeepSpeed / Megatron 即可。