梯度累积如何节省显存成本

GPU
小华
2026-10-15

梯度累积(Gradient Accumulation)本身并不会直接减少单次前向/反向传播所需的显存峰值,但它可以通过用“时间换空间”的方式,在固定显存下使用更大的等效 batch size,从而显著节省训练大模型或大数据批次时的显存成本。下面从原理、节省点在哪、以及常见误区三个方面说明。

一、梯度累积的基本原理

正常训练(无累积):

for each batch:
forward
backward  → 得到梯度
optimizer.step()  → 更新参数
optimizer.zero_grad()

梯度累积训练:

accum_step = k
for i, batch in enumerate(dataloader):
forward
backward
if (i+1) % k == 0:
optimizer.step()
optimizer.zero_grad()

等效 batch size =

batch_size_per_step × accum_step

二、梯度累积“节省显存”的核心逻辑

1️⃣ 用小 micro-batch 代替大 batch

假设:

  • 模型需要 显存 M
  • 想用总 batch = 128
  • 单卡显存只能跑 batch = 16

不使用累积:

  • 必须一次前向 + 反向 batch=128
  • 激活值显存 ∝ batch size
  • 直接 OOM

使用梯度累积(k=8):

  • 每次只跑 batch=16
  • 显存峰值只对应 16
  • 梯度在多次 step 中累加(梯度本身很小)

✅ 显存峰值下降 ≈ 8 倍

2️⃣ 节省的是「激活值显存」,不是参数显存

显存主要由三部分组成:

类型是否受累积影响
模型参数❌ 不变
优化器状态(Adam等)❌ 不变
激活值(activation)✅ 显著降低
梯度⚠️ 略增(但很小)

所以:

梯度累积主要节省的是 中间激活显存

3️⃣ 对比其他显存优化方法

方法显存节省点是否影响计算
梯度累积激活值变慢
混合精度参数+激活基本无
梯度检查点激活值重计算变慢
模型并行参数+激活通信开销

梯度累积常和以上方法叠加使用。

三、常见误解澄清

❌ 误解 1:梯度累积减少“总显存占用”

✅ 实际:

  • 总训练显存 ≈ 不变
  • 峰值显存显著下降

❌ 误解 2:梯度累积比大 batch 更省时间

✅ 实际:

  • 计算量完全相同
  • 甚至更慢(无并行)

❌ 误解 3:累积步数越大越好

✅ 实际:

  • 步数过大 → 收敛行为变化
  • 学习率通常需要线性缩放

四、一句话总结

梯度累积通过把大 batch 拆成多个小 step 的“显存分期的训练方式”,在固定显存下实现大 batch 训练,从而节省显存成本,但以增加训练时间为代价。
如果你愿意,我也可以:
  • 给你一个 PyTorch 梯度累积示例代码
  • 或结合 LLM 训练 / 微调(LoRA、SFT)讲具体配置
亿速云提供售前/售后服务

售前业务咨询

售后技术保障

400-100-2938

7*24小时售后电话

官方微信小程序