大模型训练中 FP16、BF16 和 FP32 应该如何配合?
先用自己的话答,再看参考说法
60 秒是练习上限,不是必须凑满。原理题讲清因果,设计题讲清约束,项目题只讲真实证据。
别照着背。参考说法只用于对照;直接回答问题,简单题说清楚就收尾。项目题只用自己的经历和数字。
参考内容当前已显示;开始口述后会暂时隐藏。
面试时怎么答
FP16 与 BF16 先比较指数位和尾数位:BF16 动态范围接近 FP32,FP16 精度更细却更容易溢出。再说明混合精度不是所有张量统一降位,矩阵乘、累加、主权重、优化器状态和归一化可能使用不同精度;FP16 常需 Loss Scaling,BF16 也并非绝不溢出。
可以这样答:
BF16 和 FP16 都占 16 bit,但 BF16 的指数位更多、动态范围接近 FP32,因此大模型训练通常更稳;FP16 尾数位更多,却更容易上溢或下溢。混合精度并非所有张量都降位:矩阵乘可用低精度,累加、主权重、优化器状态和敏感算子常保留 FP32,FP16 还经常需要 Loss Scaling。
核心回答
FP16 和 BF16 都占 16 bit,但位宽分配不同:FP16 指数位较少、尾数位较多,精度更细但动态范围较窄;BF16 与 FP32 一样使用 8 位指数,动态范围更接近 FP32,但尾数更短。大模型训练常用 BF16 或 FP16 做矩阵计算和激活,同时让部分归一化、归约、优化器状态或主权重保留 FP32。FP16 更容易出现梯度下溢,通常需要 Loss Scaling;BF16 一般较少依赖缩放,但仍可能出现溢出或训练不稳定。
展开说明
混合精度不是把所有张量统一转成半精度。框架的自动混合精度会按算子选择 dtype,例如矩阵乘可使用 Tensor Core 友好的低精度,部分数值敏感操作则提升到 FP32。优化器若直接在低精度小更新上累加,更新可能被舍入掉,因此常保留 FP32 状态或主权重。
Loss Scaling 先放大损失,使反向梯度离开 FP16 的下溢区间,更新前再缩回;动态缩放器会在检测到 inf/NaN 时降低尺度。BF16 的动态范围更大,不代表有效精度等同 FP32,也不代表所有旧硬件都能高效支持。
工程实践
先根据 GPU/TPU 的原生支持选 dtype,再用完整训练曲线验证。监控 Loss Scale、inf/NaN、梯度范数、溢出跳步和吞吐;出现异常时检查学习率、归一化与自定义算子,而不是只切回 FP32。保存检查点时还要确认优化器状态的真实 dtype,不能仅按模型权重大小估算显存。
常见追问
- BF16 与 FP16 都是 16 bit,为什么动态范围差很多? BF16 使用 8 位指数而 FP16 只有 5 位指数,因此 BF16 范围接近 FP32,但尾数精度更低。
- Loss Scaling 解决梯度下溢时,为什么不会改变最终梯度? 反向前把 Loss 乘尺度,梯度计算后再除以同一尺度;理想算术下数值不变,只是中间值避开低精度下溢区。
- 哪些张量通常值得保留 FP32? 优化器状态、主权重、梯度归约、部分归一化与 Softmax 统计通常更敏感,但应以框架实现和数值 Profile 为准。
一句话复习
FP16 尾数更多但范围较窄,BF16 范围接近 FP32;混合精度用低精度提速、用高精度保护敏感状态。
参考资料
评论与补充
评论会直接显示在这道题下面。可以写自己的答法、继续追问或指出错误,不需要 GitHub 账号,也不会跳转到 Issue;内容会公开,请勿填写个人隐私、公司机密或受保密约束的材料。
正在连接站内评论服务…
正在加载评论…
还没有评论,你可以先写下自己的理解或追问。