梯度累积步骤具体如何设置

GPU
小华
2026-07-18

梯度累积(Gradient Accumulation)是在显存不足时,用多次小 batch 计算梯度、再统一更新一次参数的常用技巧。下面从原理 → 设置方法 → 具体示例 → 常见注意点一步步说明。

一、梯度累积的基本思想

假设:

  • 理想 batch size = B
  • 显存只能跑 bb < B
  • 梯度累积步数 accumulation_steps = B / b

做法是:

  1. 连续跑 accumulation_steps 次前向 + 反向
  2. 不更新参数
  3. 累积 accumulation_steps 次梯度
  4. accumulation_steps 次时 统一更新参数并清零梯度

二、核心公式

  • 普通训练:
loss.backward()
optimizer.step()
optimizer.zero_grad()
  • 梯度累积:
loss = loss / accumulation_steps
loss.backward()   # 梯度累加
if (step + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()

⚠️ loss 除以 accumulation_steps 是为了保证梯度等价(非常重要)

三、PyTorch 中的标准写法

✅ 推荐写法(最清晰)

accumulation_steps = 4
optimizer.zero_grad()
for i, (x, y) in enumerate(dataloader):
pred = model(x)
loss = criterion(pred, y)
# 1. 缩放 loss
loss = loss / accumulation_steps
# 2. 反向传播(梯度累加)
loss.backward()
# 3. 每 accumulation_steps 更新一次
if (i + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()

四、完整训练循环示例

model.train()
optimizer.zero_grad()
accumulation_steps = 4
total_steps = 0
for epoch in range(epochs):
for batch_idx, (x, y) in enumerate(dataloader):
out = model(x)
loss = criterion(out, y) / accumulation_steps
loss.backward()
total_steps += 1
if total_steps % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()

五、如何确定梯度累积步数?

1️⃣ 从显存出发(最常见)

目标 batch size单卡能跑 batch sizeaccumulation_steps
64164
128816
32321(不需要)

等价 batch size = batch_size × accumulation_steps

2️⃣ 多卡 / 分布式训练时

有效 batch size =
per_gpu_batch_size × accumulation_steps × GPU数量

例如:

  • 每卡 batch = 8
  • 4 张 GPU
  • accumulation_steps = 2

→ 有效 batch = 8 × 2 × 4 = 64

六、常见坑 & 注意事项

⚠️ 1. loss 没除以 accumulation_steps

会导致梯度放大,训练不稳定。
✅ 正确:

loss = loss / accumulation_steps

⚠️ 2. optimizer.zero_grad() 放错位置

❌ 每次 backward 都清梯度

✅ 只在更新参数时清

⚠️ 3. Batch Normalization 不是完全等价

梯度累积 不能完美模拟大 batch 的 BN 统计
解决方案:

  • 使用 SyncBatchNorm
  • 或使用 torch.nn.BatchNorm2d(..., momentum=...) 调小 momentum
  • 或改用 LayerNorm / GroupNorm

⚠️ 4. 学习率是否需要调整?

通常需要

  • 大 batch → 可增大 lr
  • 小 batch + 梯度累积 → lr 可略大

经验规则:

lr_new = lr_base × sqrt(accumulation_steps)

七、Hugging Face Trainer 中的设置(如果你用 NLP)

args = TrainingArguments(
per_device_train_batch_size=8,
gradient_accumulation_steps=4,
...
)

Trainer 会自动处理梯度累积 ✅

八、一句话总结

梯度累积步数 = 目标 batch size ÷ 单步能跑的 batch size
核心就是:loss 缩放 + 梯度累加 + 定期更新
如果你愿意,可以告诉我:
  • 你用的是 CV / NLP / 大模型
  • 单卡还是多卡
  • 是否用 Trainer / DeepSpeed / Megatron

我可以给你完全贴合你场景的设置方案

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

售前业务咨询

售后技术保障

400-100-2938

7*24小时售后电话

官方微信小程序