Gradient Accumulation
了解梯度累积如何在有限的 GPU 内存下实现更大的有效批量大小,并获取实用的 PyTorch 和 Ultralytics YOLO 训练指南。
梯度累积是一种训练技术,它会累加多个称为微批次的小批次中的梯度,然后再执行一次模型权重更新。当可用 GPU 内存无法一次容纳完整批次时,这种方法可以近似使用更大的批次大小进行训练。这样无需更改模型架构或降低输入分辨率,就能让内存占用较高的梯度下降变得切实可行。
梯度累积的工作原理#
在正常训练中,每个批次都会经过三个主要步骤:计算损失,使用反向传播计算梯度,然后让优化器更新模型权重。接着,梯度会在处理下一个批次前被清除。
梯度累积会延迟优化器更新。每个微批次都会执行一次前向传播和反向传播,但其梯度会保留在内存中,并与后续微批次的梯度相加。这种行为自然遵循 PyTorch backward 操作的机制,该操作会累加每个参数梯度字段中的值。
在达到配置的累积步数后:
- 优化器会更新模型权重。
- 使用类似 Optimizer.zero_grad 的操作重置梯度。
- 开始新的累积窗口。
有效批次大小为:
microbatch size x accumulation steps x number of training devices
例如,大小为 4 的图像微批次累积 8 步,其效果近似于在一块 GPU 上使用包含 32 张图像的批次。使用四块 GPU 时,全局有效批次大小将变为 128。
对内存、速度和学习的影响#
梯度累积可以降低激活值所需的峰值内存,因为网络一次只处理一个微批次。它不会显著减少模型参数、梯度或优化器状态所占用的内存。
它通常也不会加快训练速度。处理八个微批次仍然需要执行八次前向传播和反向传播,而且较小的批次可能无法高效利用 GPU。它的主要优势是能在有限内存中容纳所需的有效批次。另一个潜在优势出现在分布式训练中:借助 DistributedDataParallel no_sync 等功能,实现可以避免在累积窗口结束前同步梯度。
手动实现时,通常会将每个微批次的损失除以累积步数,使最终梯度表示平均值而不是总和。高级训练器可能会自动处理归一化,因此额外缩放可能导致更新结果错误。
梯度累积可以近似真正的大批次,但结果并不总是完全相同。批归一化统计量是根据单个微批次计算的,而随机操作和浮点运算顺序也可能引入差异。因此,学习率可能需要经过验证,而不能直接自动缩放。
相关技术与关键区别#
梯度累积经常与其他内存或稳定性技术混淆:
- 梯度检查点通过在反向传播期间重新计算选定的前向传播操作来减少激活值内存。PyTorch 激活检查点文档介绍了这种以计算换内存的权衡。梯度累积则是将一个大批次拆分成较小的微批次。
- **混合精度**使用较低精度的数据类型存储或计算选定的操作。它可以减少内存占用并提高吞吐量,而梯度累积改变的是优化器更新的频率。按照正确的自动混合精度累积工作流可以结合使用这两种技术。
- 梯度裁剪会限制梯度幅度,以减少异常大幅更新造成的不稳定。它不会产生更大的有效批次。与梯度累积结合使用时,通常应在梯度完成累积后再进行裁剪,使用类似 clip_grad_norm 的操作。
实际应用#
在高分辨率医学图像分割中,一块 12 GB 的 GPU 可能一次只能容纳两张大型扫描图像。跨八个微批次累积梯度可以产生大小为 16 的有效批次,同时保留识别小型解剖结构所需的分辨率。代价是优化器更新之间的间隔更长。
对于航空目标检测,工程团队可能会使用四块 GPU 进行训练,每个设备处理六张图像,并设置四个累积步数。有效全局批次为 96 张图像。这样可以在让每个设备保持在内存限制以内的同时,稳定包含许多小型车辆或建筑物的场景中的更新。团队可以通过 Ultralytics Platform 云训练管理云端实验、数据集和训练运行。
使用 Ultralytics YOLO 进行梯度累积#
Ultralytics 的模型训练工作流会根据物理 batch 和名义 nbs 设置推导累积行为。使用 batch=4 和 nbs=64 时,训练器会通过跨多个微批次延迟优化器更新,将目标设为名义批次大小 64。
from ultralytics import YOLO
# Load a pretrained YOLO26 detection model
model = YOLO("yolo26n.pt")
# Use a small physical batch and a larger nominal batch
results = model.train(
data="coco8.yaml",
epochs=10,
batch=4,
nbs=64,
)高级训练器会管理反向传播、梯度累积、优化器步骤和梯度清除。其行为记录在 Ultralytics BaseTrainer 参考文档中。实际使用时,应选择能够稳定运行的最大微批次,计算预期有效批次,并在更改累积步数、学习率或设备数量时比较验证结果。









