返回 深度学习 思维导图
中文·English
🧠 深度学习ID: mixed-precision-fp8

混合精度 FP16/BF16/FP8

Mixed Precision FP16/BF16/FP8
🎯核心定义
混合精度 = 用低精度格式(FP16/BF16/FP8)做前向与反向计算,FP32 保存主权重(master weights)与优化器状态,兼顾速度与精度。位布局与值域: ① FP16 = 1 符号 + 5 指数 + 10 尾数,最大可表示数 65504=215×(2210)65504 = 2^{15} \times (2 - 2^{-10}),最小正规数 2146.1×1052^{-14} \approx 6.1\times10^{-5},最小次正规数 2246×1082^{-24} \approx 6\times10^{-8}。问题: 深层网络/大批量训练中梯度经常小于 10810^{-8},FP16 直接下溢为 0 → 参数不再更新(下溢问题)。解法 Loss Scaling: 反向前把 loss 乘缩放因子 SS(常用 2242^{24} 或 1024),梯度整体放大 SS 倍再反传,更新前在 FP32 主权重上除回 SS;动态 Loss Scaling: 检测到 Inf/NaN 时 SS/2S \leftarrow S/2 并跳过该步,一段时间无溢出则 SS 翻倍。② BF16 = 1 符号 + 8 指数 + 7 尾数: 指数位数与 FP32 相同 → 动态范围与 FP32 一致(约 ±3.4×1038\pm3.4\times10^{38}),彻底免于下溢、不需要 loss scaling;代价是尾数仅 7 位(约 3 位有效十进制数字),低精度。③ FP8: E4M3(4 指数 + 3 尾数,最大约 448,精度更高、范围小)→ 用于前向(权重/激活);E5M2(5 指数 + 2 尾数,最大约 57344,范围大、精度低)→ 用于反向梯度(防溢出/下溢)。标准训练流程: FP32 主权重副本 → 每步拷贝低精度副本做前向 → loss 乘 SS 后反向 → 低精度梯度 unscale 后更新 FP32 主权重(可与 EMA、权重衰减、梯度裁剪在 FP32 上叠加)。
💡使用场景
大模型训练/推理标配(A100/H100/TPU 原生支持,张量核算力随精度减半而翻倍);面试高频“FP16 为什么要 loss scaling”“BF16 与 FP16 的区别”“FP8 为什么分 E4M3/E5M2”。
解决的核心痛点
精度换速度与显存——显存减半、Tensor Core 吞吐翻倍(FP8 在 H100 上再翻倍),同时不丢训练精度: FP32 主权重保证数值精度;BF16 用“范围换精度”解决 FP16 的下溢缺陷(无需 loss scaling、训练更稳);FP8 把范围与精度按角色分配(前向激活要精度防信息丢失、梯度要范围防溢出),是推理与训练吞吐再翻倍的下一代方案。
🎯5 个高频面试考点 (Exam Points)
1
写出 FP16 位分布(1 符号 + 5 指数 + 10 尾数)与最大可表示数 65504=215×(2210)65504 = 2^{15} \times (2 - 2^{-10});解释训练中梯度为什么容易下溢(小于 2246×1082^{-24} \approx 6\times10^{-8})。
2
Loss Scaling 原理: 为什么反向前把 loss 乘 SS、更新前在 FP32 主权重上除回?动态策略(溢出时 SS 减半并跳过该步、连续无溢出则翻倍)为什么有效?
3
BF16(1+8+7)为什么不需要 loss scaling?指数位与 FP32 相同 → 范围约 ±3.4×1038\pm3.4\times10^{38};代价(尾数 7 位)是什么,什么场景精度不够?
4
FP8 E4M3 与 E5M2 为什么分别用于前向与梯度?比较两者的范围/精度取舍(最大约 448 vs 57344,尾数 3 vs 2 位)。
5
混合精度标准流程: FP32 master weights、低精度前向/反向、loss scaling 与 unscale、FP32 更新;与梯度裁剪、EMA、DDP 如何配合?
更新于 2026-08-12
🎯
检验攻克程度:针对「混合精度 FP16/BF16/FP8」专属刷题排雷
做单选排雷题、推导选项机制,答错自动收录进专属错题本。
🚀 开始本考点专项刷题
上一个知识点梯度裁剪下一个知识点DDP 与 Ring-AllReduce

🔗 更多 深度学习 知识点卡片

激活函数演进Adam/AdamWAutograd 动态图BatchNorm 批归一化