大模型的参数规模巨大(如 7B、13B、70B),训练时显存不仅用于:
如果直接用很大的 batch size:
梯度累积的做法:
小 batch → 前向 + 反向 → 累积梯度(不更新参数)
重复 N 次
N 次后 → 用累积梯度更新一次参数这样:
大模型训练通常受益于较大的有效 batch size:
但硬件(尤其是单卡 / 单机)往往无法直接跑大 batch
在以下场景中,梯度累积常与并行策略配合使用:
例如:
梯度累积等价于:
“在更新前,先对多个 mini-batch 的梯度求平均”
这与标准 SGD / Adam 的数学形式一致,因此:
optimizer.zero_grad()
for i, (x, y) in enumerate(dataloader):
loss = model(x, y)
loss = loss / accum_steps
loss.backward()
if (i + 1) % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()大模型常用梯度累积,是因为它用“时间换空间”,在显存受限的情况下,稳定地实现大 batch 训练效果。
如果你愿意,我也可以从:
来进一步展开。