概述
It is the standard workaround for training big models when memory is the bottleneck.
深入探讨
通常,训练步骤处理一批、计算梯度并立即更新参数。通过梯度累积,您可以在较小的微批次上运行多次前向和后向传递,将它们的梯度添加到参数缓冲区中,并且仅在 N 个微批次之后调用优化器步骤(并将梯度归零)。有效批量大小变为微批量大小乘以 N,即使峰值内存仅保存一个微批量激活。这很重要,因为许多训练方法都假设大批量来实现稳定的统计数据,并且像大型变压器这样的模型无法在单个设备上容纳完整的目标批次。问题是:批量归一化统计数据是按微批次计算的,因此层范数或组范数与累积更好地配对,并且您必须正确缩放损失以保持正确的有效学习率。
现实世界的实施
通过累积超过 8 或 16 个微批次以达到数百个有效批次,在单个消费级 GPU 上微调大型语言模型。
训练高分辨率视觉或分割模型,即使 2 个批次也适合,但配方需要 32 个有效批次。
Hugging Face Trainer 和 PyTorch Lightning 公开了在有限 VRAM 设置中常规使用的gradient_accumulation_steps 设置。
通过累加匹配有效批量大小,在较小的硬件上重现论文的大批量结果。
梯度累积的未来
随着模型大小超过单设备内存,梯度累积将保持默认水平。它越来越多地与 DeepSpeed 和 FSDP 等框架中的混合精度、激活检查点、ZeRO 分片和管道并行性相结合。预计自动化会更严格,库会自动调整累积步骤以达到内存预算,并且在普通硬件上微调大型模型仍然很重要,包括消费级 GPU,它可以解锁原本不可能进行的训练。
付诸实践
为什么这很重要
- 成本与预算. 多年来,架构决策决定着性能和运营成本。
- 更清晰的判决. 技术教育帮助团队选择正确的堆栈,而不仅仅是最新的堆栈。
- 质量控制. 更好的工程选择可以减少生产中的可靠性事故。
留意
- 优化一项基准测试可以隐藏更广泛的系统弱点。
- 基础设施和维护成本常常被低估。
- 随着系统变得更加复杂,安全性和可观察性差距可能会扩大。
后续步骤
- 在实施之前定义延迟、质量和成本目标。
- 在实际负载和数据条件下进行基准测试。
- 仪器监控错误、漂移和用户影响。
- 在扩展之前准备回滚和事件响应路径。
不断探索
常见问题
What is Gradient Accumulation?
梯度累积可让您在更新权重之前对几个小批量的梯度求和,从而在有限的 GPU 内存上模拟大批量。当内存成为瓶颈时,这是训练大型模型的标准解决方法。
梯度积累主要让你做什么?
通过在更新之前对几个微批次的梯度求和,您可以模拟一个大批次,而无需将其全部保存在内存中。
对于累积因子 N,optimizer.step() 和 Zero_grad() 应该何时发生?
在 N 个微批次中累积梯度,对有效批次调用一次 optimizationr.step(),然后在下一个窗口之前清除梯度;使用清除的缓冲区开始训练。
哪个归一化层与梯度累积配对得更干净?
批次归一化计算每个微批次的统计数据,因此层或组归一化可以避免与小微批次的不匹配。
为什么使用 BatchNorm 的四个微批次的行为可能与总大小相同的一个物理批次的行为不同?
与批次相关的前向计算破坏了精确等价性。