梯度累积(Gradient Accumulation)是一种在不增加显存占用的前提下,近似实现更大 batch size 训练的方法,从而提升训练效率和稳定性。下面从原理、效率提升机制和适用场景来说明。
一、梯度累积的基本原理
在普通训练中,每个 batch 的流程是:
- 前向传播(forward)
- 计算 loss
- 反向传播(backward)→ 得到梯度
- 优化器更新参数(step)
梯度累积的做法:
- 不每次都更新参数
- 而是连续计算
K 个微小 batch(micro-batch)的梯度并累加 - 累积
K 次后,再执行一次参数更新
数学上等价于:
用 batch size = K × micro_batch_size 做一次更新
二、梯度累积如何提升训练效率
1️⃣ 突破显存限制,使用“大 batch”
- 大模型 / 大输入(如长文本、高分辨率图像)时
- 单卡显存无法直接容纳大 batch
- 梯度累积允许:
- 小显存跑大 batch
- 提升收敛稳定性(大 batch 梯度更准)
✅ 效果:
在相同显存下,获得接近大 batch 的训练效果
2️⃣ 提高 GPU 利用率(减少空闲)
- 小 batch 时:
- kernel 启动频繁
- 计算量不足,GPU 利用率低
- 累积多个 micro-batch:
- 更连续的计算
- 减少 Python / 框架调度开销
✅ 效果:
更平滑的 GPU 计算,减少“空转”
3️⃣ 稳定训练,减少更新噪声
- 小 batch 梯度方差大
- 累积后梯度更接近真实分布
✅ 效果:
4️⃣ 多卡 / 分布式训练中的效率提升
在 数据并行(DDP) 中:
- 每张卡用 micro-batch
- 累积后再做 all-reduce
优势:
三、代价与注意事项
❌ 不是“免费加速”
- 总计算量不变
- 总 step 时间 ≈ 普通大 batch
⚠ 学习率要调整
- 累积 K 倍 → 学习率通常 ×K(经验)
- 或配合 warmup
⚠ BatchNorm / 正则化
- BN 仍按 micro-batch 统计
- 大累积步数可能略微影响精度
四、典型使用场景
✅ 显存不足但想用大 batch
✅ 大模型微调(LLM / 多模态)
✅ 长序列训练(NLP / 视频)
✅ 分布式训练中降低通信成本
五、一句话总结
梯度累积通过“多次算梯度、一次更新参数”,在显存受限下模拟大 batch 训练,从而提升 GPU 利用率、训练稳定性和可扩展性。
如果你愿意,我也可以:
- 给你 PyTorch 梯度累积示例代码
- 对比梯度累积 vs 大 batch 的实测差异
- 讲在 LLM 微调中的最佳实践