/ accum_steps,梯度会放大。optimizer.step() 和 optimizer.zero_grad()。accum_steps = 4
optimizer.zero_grad()
for i, (x, y) in enumerate(dataloader):
pred = model(x)
loss = criterion(pred, y) / accum_steps
loss.backward()
if (i + 1) % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()✅ 关键点:
loss / accum_stepsstep() 只在累积满时调用zero_grad() 在 step 后目的:确认“累积 4 步” ≈ “batch ×4 一次训练”
做法:
for name, p in model.named_parameters():
if p.grad is not None:
print(name, p.grad.abs().mean().item())检查:
只训练 1 个 optimizer.step(),打印:
再对比:
经验公式:
effective_batch = batch_size * accum_steps * gpu_num然后按 linear scaling rule:
lr_new = lr_base * (eff_batch / base_batch)✅ 正确顺序:
with autocast():
loss = model(x, y) / accum_steps
scaler.scale(loss).backward()
if step % accum == 0:
scaler.step(optimizer)
scaler.update()
optimizer.zero_grad()❌ 错误:
scaler.step你可以贴出:
我可以直接帮你逐行检查梯度累积是否正确。