混合精准训练
混合精度训练通过以 16 位浮点而不是 32 位执行大部分数学运算来加速神经网络训练并减少内存使用。
概述
It lets the same GPU train bigger models faster with almost no loss in accuracy.
深入探讨
传统训练以 32 位浮点 (FP32) 存储权重并运行数学。混合精度使用较低精度的 16 位格式(FP16 或 bfloat16)进行大量矩阵乘法,同时保留权重的 32 位“主副本”以实现稳定更新。由于 16 位数字的大小只有一半,因此更适合 GPU 内存,并且 Tensor Core 处理它们的速度大约快 2-8 倍。问题是 FP16 的范围很窄:微小的梯度可能会下溢到零。标准的修复方法是损失缩放,它在反向传播之前将损失乘以一个大因子,以便小梯度保持可表示性,然后在权重更新之前将其除掉。 NVIDIA 的 Apex 以及 PyTorch 和 TensorFlow 中的内置 AMP(自动混合精度)可自动执行此操作。
技术洞察
FP16 只有 5 个指数位,动态范围较小,会导致梯度下溢。 Bfloat16 保留 8 个指数位(与 FP32 的范围匹配),但尾数位较少,因此它很少需要损失缩放 - 这是 Google TPU 和现代 GPU 青睐它的关键原因。 Tensor Core 通过将 16 位操作数相乘但在 FP32 中累加部分和来加速工作,从而在求和误差会复合的情况下保持精度。
战略影响
成本与预算
多年来,架构决策决定着性能和运营成本。
更清晰的判决
技术教育帮助团队选择正确的堆栈,而不仅仅是最新的堆栈。
质量控制
更好的工程选择可以减少生产中的可靠性事故。
混合精度训练的未来
精度不断下降。 NVIDIA Hopper 和 Blackwell GPU 支持的 FP8 训练正在成为前沿模型的标准,并且对 FP4 和微缩放格式 (MXFP) 的研究也在进一步推进。期望框架能够自动选择每层精度,硬件能够原生处理更窄的格式,量化感知训练能够模糊低精度训练和推理之间的界限,从而降低训练万亿参数模型的成本。
现实世界的实施
PyTorch 的 torch.cuda.amp.autocast 包装了一个训练循环,将单个 GPU 上的内存大致减半并将吞吐量加倍
在 TPU 上训练大型语言模型,例如 bfloat16 中的 GPT 式转换器,以避免损失缩放调整
通过将 ResNet 图像训练从 FP32 切换到 FP16,在消费级 RTX GPU 上安装更大的批量大小
NVIDIA H100 GPU 上的 FP8 混合精度可降低预训练前沿规模模型的成本
风险与防护栏
优化一项基准测试可以隐藏更广泛的系统弱点。
基础设施和维护成本常常被低估。
随着系统变得更加复杂,安全性和可观察性差距可能会扩大。
实施路线图
在实施之前定义延迟、质量和成本目标。
在实际负载和数据条件下进行基准测试。
仪器监控错误、漂移和用户影响。
在扩展之前准备回滚和事件响应路径。
不断探索
Free newsletter
Get the daily AI briefing
Three verified AI stories every weekday morning, written in plain English. Free forever, no ads.
One email each weekday. Unsubscribe in one click. We never sell or share your address.
Test yourself
Take the Mixed Precision Training quiz
Instant feedback on every answer, and a shareable certificate with a verifiable ID once you pass a course.
Support free AI education. AI Understanding is a 501(c)(3) nonprofit — no ads, no paywall, ever. Make a donation
常见问题
What is Mixed Precision Training?
混合精度训练通过以 16 位浮点而不是 32 位执行大部分数学运算来加速神经网络训练并减少内存使用。它可以让相同的 GPU 更快地训练更大的模型,而几乎不会损失准确性。
为什么混合精度训练要保留权重的 32 位“主副本”?
权重更新通常很小;以 16 位累积它们会损失精度,因此全精度主副本可以保持更新的准确性。
FP16 训练中损失缩放解决了什么问题?
FP16 的动态范围有限,因此小梯度可以舍入为零;在反向传播之前乘以损失可以使它们具有可表示性。
bfloat16相对于FP16有什么优势?
Bfloat16 与 FP32 一样保留了 8 个指数位,因此其动态范围较大,梯度下溢很少见。
Tensor Core 如何在使用 16 位输入时保持精度?
Tensor Core 将 16 位操作数相乘,但以 32 位进行累加,从而防止复合求和错误。
在训练期间使用 16 位值而不是 32 位值的主要好处是什么?
半角数字可以在 GPU 内存中容纳更多数据,让专用硬件处理矩阵数学的速度提高数倍。