梯度累积(Gradient Accumulation)本身不会直接减少单次前向/反向传播占用的显存,因此严格来说它不能“省”显存,而是用时间换批量大小。下面分点说明它和显存成本的关系,以及“能省多少”的问题。
1. 梯度累积在显存上做了什么
假设:
- 目标总 batch size =
B - 单卡实际 batch size =
b - 累积步数
k = B / b
显存组成:
- 模型参数:固定
- 优化器状态(Adam 的 m/v 等):固定
- 激活值(activation):与
b 成正比 - 梯度:通常只保留一份(累积时是 in-place 加和)
✅ 梯度累积时:
- 每一步只存
b 的激活 - 反向后把梯度加到总梯度上
- 每
k 步才更新参数 + 清梯度
❌ 它不会减少:
2. 能“省”的显存来自哪里?
省的是激活显存(activation memory),大概比例:
激活显存 ≈ 与 batch size 成正比
使用梯度累积后激活显存降到 1/k
例如:
- 原本 batch=32 → 显存爆
- 改成 batch=8 + 累积 4 步
- 激活显存约为原来的 1/4
⚠️ 但:
- 参数 + 优化器显存 完全没少
- 总计算量 = 原 batch 的
k 倍时间
3. 和真正省显存的方法对比
| 方法 | 显存效果 | 速度 | 说明 |
|---|
| 梯度累积 | 只省激活 | 变慢 k 倍 | 不省参数/优化器 |
| 混合精度 (FP16/BF16) | 省约 30–50% | 更快 | 推荐配合 |
| 梯度检查点 | 激活大幅减少 | 慢 20–30% | 重算激活 |
| ZeRO / 模型并行 | 参数+优化器可分 | 通信成本 | 多卡专用 |
4. 实际“能省多少”的经验值
- 小模型:累积收益不明显
- 大模型(LLM / 视觉大模型):
- 激活常占 40–70% 显存
- 累积 4–8 步 ≈ 省 50–80% 激活显存
- 若本来卡在激活上:非常有效
- 若本来卡在模型/优化器上:几乎没用
5. 一句话总结
梯度累积不直接“省显存成本”,而是把大 batch 的显存压力拆成小 batch 多次算,主要省的是激活显存,代价是训练更慢。
如果你愿意,可以告诉我:
我可以帮你算一个具体能降多少 GB的估算。