小显存怎样用梯度累积

GPU
小华
2026-10-15

在显存较小(小显存)的情况下,梯度累积(Gradient Accumulation)是非常实用的技巧。下面用通俗 + 可操作的方式讲清楚。

一、为什么要用梯度累积?

通常训练时:

batch_size = 32  → 一次前向+反向 → 更新参数

显存不够时:

batch_size = 4  → 显存能放下,但 batch 太小,训练不稳定

梯度累积的思想:

  • 把大 batch 拆成多个小 batch
  • 多次前向+反向 只算梯度,不更新参数
  • 累积若干次后,再统一更新一次参数

效果等价于:

等效 batch_size = mini_batch × accumulation_steps

二、核心原理(一句话)

前向和反向照常算,但 optimizer.step() 延迟执行

三、PyTorch 标准写法(重点)

1️⃣ 基本参数设置

mini_batch_size = 4
accumulation_steps = 8   # 等效 batch = 32
optimizer.zero_grad()

2️⃣ 训练循环示例

for i, (x, y) in enumerate(dataloader):
x, y = x.to(device), y.to(device)
# 前向
pred = model(x)
loss = criterion(pred, y)
# 反向(注意 loss 要除以累积步数)
loss = loss / accumulation_steps
loss.backward()
# 累积到指定次数再更新
if (i + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()

✅ 关键点

  • loss / accumulation_steps:保证梯度尺度一致
  • optimizer.zero_grad() 只在更新时清

四、常见错误(很重要)

❌ 错误 1:每次都 zero_grad

loss.backward()
optimizer.zero_grad()  # 错!梯度被清掉

✅ 正确:只在 step() 前清

❌ 错误 2:忘记缩放 loss

loss.backward()  # 等效 batch 变大但梯度没缩放

结果:学习率“变相变大”,训练炸

五、小显存额外配合技巧

技巧作用
梯度累积增大 batch
混合精度 (AMP)显存 ↓ 30~50%
gradient checkpointing用时间换显存
减小 model / seq_len最直接
torch.no_grad()推理时省显存

六、等效公式(记住这个)

effective_batch_size
= batch_per_step × accumulation_steps

例如:

  • 4 × 8 = 32
  • 2 × 16 = 32

七、一句话总结

小显存 = 小 batch + 多累积 + 少更新
如果你愿意,我可以:
  • 帮你算你显卡该设多少累积步数
  • 给你 Hugging Face / Transformers 的梯度累积示例
  • 或针对 LLM / 微调 / diffusion 单独讲

你现在是做什么任务?

亿速云提供售前/售后服务

售前业务咨询

售后技术保障

400-100-2938

7*24小时售后电话

官方微信小程序