梯度累积
Gradient Accumulation进阶连续算几个小批次的梯度先攒着,再统一更新一次参数,模拟大批量训练。
显存放不下想要的批大小时最常用的训练技巧。做法是:每个小批次照常前向、反向,但先不调用优化器,让梯度在参数上累加;攒够 N 个小批次后才执行一次参数更新,再把梯度清零。这样等效批大小等于单卡批大小 × 累积步数 × 卡数,代价是更新次数变少、每次更新耗时变长。要注意两点:损失要除以累积步数(按 token 算损失时要按总 token 数归一化),否则梯度会被放大;BatchNorm 这类依赖批统计量的层仍然只看到小批次。Hugging Face Accelerate 等训练库提供现成开关,在单卡或少量显卡上微调 VLA 时经常用到。
例子单卡只放得下 8 条样本,想要批大小 64,就把累积步数设为 8:连续跑 8 个小批次的 backward,再调用一次 optimizer.step()。
- 相关
- 批大小、梯度检查点(激活重计算)、混合精度训练、分布式训练(数据并行 / 模型并行)、优化器、GPU 显存
- 来源
- Performing gradient accumulation with Accelerate (Hugging Face 文档)