• 首页 > 
  • AI技术 > 
  • 为什么梯度累积能节省显存资源

为什么梯度累积能节省显存资源

GPU
小华
2026-07-18

梯度累积(Gradient Accumulation)之所以能节省显存,核心原因在于:

它用“时间换空间”,把一次大 batch 的训练拆成多次小 batch,从而避免了同时存储大 batch 的前向激活值和中间计算结果。
下面分层解释。

1. 显存占用的主要来源

在训练神经网络时,显存主要被以下几部分占用:

  1. 模型参数(Parameters)
  2. 参数对应的梯度(Gradients)
  3. 优化器状态(如 Adam 的 m、v)
  4. 前向传播的中间激活值(Activations) ✅(这是关键)

其中:

  • 模型参数、梯度、优化器状态通常与 batch size 无关
  • 激活值显存占用与 batch size 成正比

2. 一次大 batch 为什么显存大?

假设:

  • 理想 batch size = 64
  • 但显存只能跑 batch size = 16

如果直接跑 batch size = 64:

  • 前向传播需要同时存 64 个样本的所有中间激活
  • 反向传播时也需要这些激活来计算梯度
  • 显存很容易 OOM(Out Of Memory)

3. 梯度累积是怎么做的?

梯度累积把 batch size = 64 的训练拆成 4 步:

batch size = 16
accumulation steps = 4

步骤:

  1. 前向 + 反向(batch 1)→ 梯度存到 buffer
  2. 前向 + 反向(batch 2)→ 梯度累加
  3. 前向 + 反向(batch 3)→ 梯度累加
  4. 前向 + 反向(batch 4)→ 梯度累加
  5. 第 4 步结束后,才更新参数

代码逻辑类似:

optimizer.zero_grad()
for i in range(accumulation_steps):
loss = model(small_batch)
loss = loss / accumulation_steps
loss.backward()   # 梯度累加
optimizer.step()

4. 为什么显存变小了?

✅ 关键原因:激活值显存被“分块释放”

对比项大 batch(无累积)梯度累积
同时存在的激活值64 个样本16 个样本
峰值显存
梯度一次计算多次累加
参数更新每步更新多次累积后更新

因为:

每一小步 forward/backward 结束后,该 batch 的激活值就可以释放
而大 batch 必须等所有样本反向完成才能释放。

5. 哪些显存没节省?

⚠️ 梯度累积 不能减少 以下显存占用:

  • 模型参数本身
  • 梯度 buffer(梯度是累加的,不是放大)
  • 优化器状态(Adam 等)

✅ 所以它主要省的是:

前向激活值带来的显存峰值

6. 形象类比

把显存想象成一张桌子:

  • 大 batch:一次把 64 盘菜全摆上桌 → 桌子不够
  • 梯度累积:每次只摆 16 盘,吃完再上 → 桌子够用

7. 总结一句话

梯度累积通过把大 batch 拆成多个小 batch 分步计算,减少了同一时刻需要存储的激活值数量,从而降低显存峰值,实现“用更多计算换更少显存”。
如果你愿意,我也可以帮你:
  • 算你当前模型 + batch size 的实际显存占用
  • 给你一个 PyTorch 的梯度累积模板
  • 对比梯度累积 vs 分布式数据并行(DDP)的显存差异
亿速云提供售前/售后服务

售前业务咨询

售后技术保障

400-100-2938

7*24小时售后电话

官方微信小程序