怎样设置梯度累积步数

GPU
小华
2026-10-15

梯度累积(Gradient Accumulation)是一种在显存有限的情况下,用“多次小批量前向/反向”模拟“大批量训练”的技术。下面按常用框架给你讲怎么设置“梯度累积步数(accumulation steps)”。

一、核心原理(先理解)

假设:

  • 目标 batch size = 32
  • 单卡最大 batch size = 8
  • 累积步数 accumulation steps = 4

则:

每 4 次 forward+backward 才更新一次参数
等效 batch size = 8 × 4 = 32

⚠️ 注意:

  • loss 要除以累积步数
  • optimizer.step() 只在累积结束时调用
  • optimizer.zero_grad() 也在累积结束时调用

二、PyTorch 原生写法(最通用)

accum_steps = 4
optimizer.zero_grad()
for i, (x, y) in enumerate(dataloader):
pred = model(x)
loss = criterion(pred, y) / accum_steps  # 关键:除以步数
loss.backward()
if (i + 1) % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()

✅ 适用于:

  • 自定义训练循环
  • 研究 / 实验代码

三、Hugging Face Trainer(最省事)

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

✅ 自动处理:

  • loss 缩放
  • step 时机
  • zero_grad

四、DeepSpeed / Accelerate

DeepSpeed

{
"gradient_accumulation_steps": 4
}

Accelerate

accum_steps = 4
for i, batch in enumerate(dataloader):
outputs = model(**batch)
loss = outputs.loss / accum_steps
accelerator.backward(loss)
if (i + 1) % accum_steps == 0:
optimizer.step()
optimizer.zero_grad()

五、常见坑 ⚠️

  1. 忘了 loss / accum_steps

→ 学习率效果会“看起来不对”

  1. 每步都 step

→ 等于没累积

  1. BN 层问题

→ 小 batch 下 BN 统计不稳定,可用:

  • SyncBatchNorm
  • 或改用 LayerNorm
  1. 学习率调度

→ 按“更新次数”而不是“step 次数”算

六、怎么选累积步数?

公式:

accum_steps = target_batch / per_device_batch

例如:

  • target = 64
  • per GPU = 8
  • → accum_steps = 8

如果你告诉我:

  • 用的框架(PyTorch / Transformers / MMDetection 等)
  • 是否有多卡 / 分布式

我可以直接给你可复制的完整训练代码。

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

售前业务咨询

售后技术保障

400-100-2938

7*24小时售后电话

官方微信小程序