AI 低精度格式(bfloat16/FP8/TF32)

共 19 题
📑 题目列表 19 题
#
★★★

1. INT8 量化(对称/非对称)与 FP16/BF16 训练的精度差异是什么,量化误差如何用校准集评估?

INT8 量化(对称/非对称)与 FP16/BF16 训练的精度差异是什么?量化误差如何用校准集评估?

  • 对称与非对称 INT8 量化的原理与差异
  • 量化与低精度运算的精度差异
  • 校准集评估量化误差的方法

INT8 量化用于推理,把权重/激活从 FP32 映射到 8 位整数。对称量化用 scale = max/127 映射到 [-127,127],零点为 0;非对称量化用 scale=(max-min)/255 并引入零点 z,能更好表示分布偏斜的数据、减少量化误差。FP16/BF16 是训练用的低精度浮点,保留动态范围与相对精度,精度损失远小于 INT8。量化误差用校准集(代表性输入子集)评估:前向比较量化前后输出(如 KL 散度、cosine 相似度、误差分布),选择最小化误差的 scale/zp,或评估量化后模型的精度/损失坍缩。INT8 精度下降主要来自尾数信息丢失与分布范围截断,非对称量化对非对称分布更友好。

对称量化适合零中心对称分布,非对称量化通过零点覆盖偏斜分布,减量化误差;校准集用于在真实数据分布上衡量量化对输出/精度的破坏,是量化参数选择与效果评估的核心。

#
★★★

2. 为什么 BF16 训练配合 FP32 主权重(master weights)成为大模型训练标配,它规避了什么问题?

为什么 BF16 训练配合 FP32 主权重(master weights)成为大模型训练标配?它规避了什么问题?

  • BF16 的动态范围(8 位指数)与 FP32 一致
  • BF16 尾数仅 7 位,精度不足
  • master weights 用 FP32 保存权重避免精度损失

BF16 有 8 位指数,动态范围与 FP32 相同,训练中不会因梯度/权重下溢或溢出而崩溃,这是它比 FP16 稳定的关键。但 BF16 尾数仅 7 位,直接以 BF16 保存权重会因精度不足导致权重更新精度损失、训练不稳定。因此用 FP32 保存权重(master weights),每次更新在 FP32 精度的主副本上进行,前向/反向的 BF16 运算只用于计算,迭代后把 BF16 结果与 FP32 主权重同步。这样既保留 BF16 的显存/带宽优势与动态范围,又规避了 BF16 尾数精度不足导致的权重精度损失,成为大模型训练标配。

关键是把"存储权重"(需高精度,用 FP32)与"计算矩阵乘"(可用低精度,用 BF16)分离,master weights 用 FP32 保住权重更新精度,规避 BF16 尾数不足带来的误差累积。

#
★★★

3. 低精度 GEMM 的累加器为何必须保持高精度,逐项乘积舍入与累加误差如何随矩阵维度累积,FP32 累加如何控制误差界?

低精度 GEMM 的累加器为何必须保持高精度?逐项乘积舍入与累加误差如何随矩阵维度累积,FP32 累加如何控制误差界?

  • 低精度乘法的尾数损失
  • 累加误差随 K 维(内积长度)累积
  • FP32 累加器控制误差界

低精度 GEMM 中,乘积项(如 BF16×BF16)本身精度有限,若用同精度累加器累加,误差会随 K 维(内积长度)线性甚至平方累积,导致大规模矩阵乘结果误差爆炸。因此累加器必须用更高精度(FP32 累加),让每个乘积的舍入误差不随 K 维无界累积,把误差界控制在可接受范围。FP32 累加器把误差界从 O(K·ε_low) 控制到约 O(K·ε_32)(其中 ε_32 是 FP32 的舍入),远小于同精度累加。Tensor Core 的硬件设计正是"低精度输入乘法 + FP32 累加",在吞吐与精度间取得平衡,使大 K 维内积仍保持足够精度。

累加是数值误差的主要放大器,累加器精度决定误差上界;用 FP32 累加使误差随 K 维的增长受控,是低精度 GEMM 保持数值可用的关键设计。

#
★★

4. bfloat16 的表示,与 FP16 相比的指数/尾数分配与训练稳定性如何?

bfloat16 的表示是怎样的?与 FP16 相比指数/尾数分配如何影响训练稳定性?

  • BF16 的 1+8+7 位布局
  • FP16 的 1+5+10 位布局
  • 动态范围 vs 精度的权衡与训练稳定性

bfloat16 用 1 位符号、8 位指数、7 位尾数(共 16 位),动态范围与 FP32 相同(约 ±3e38),但相对精度仅约 2^-8;FP16 用 1 位符号、5 位指数、10 位尾数,动态范围小(约 ±65504)但精度高。训练稳定性上,BF16 因指数 8 位与 FP32 一致,梯度/权重不会因下溢/上溢而崩溃,即使某些值极小也能表示,因此训练更稳定,无需 loss scaling;FP16 动态范围有限,需 loss scaling 防止下溢,且易溢出。代价是 BF16 尾数精度低,因此需 FP32 master weights 保持权重精度。总体上 BF16 以精度换训练稳定性与动态范围,成为大模型训练标准。

5 位 vs 8 位指数决定了动态范围,10 位 vs 7 位尾数决定了相对精度;BF16 牺牲尾数换取与 FP32 一致的动态范围,从而规避 FP16 的溢出/下溢稳定性问题。

#
★★

5. FP8 训练相比 FP16/BF16 在显存与吞吐上的收益与收敛风险如何权衡?

FP8 训练相比 FP16/BF16 在显存与吞吐上的收益与收敛风险如何权衡?

  • FP8 的显存减半与吞吐提升
  • FP8 的极低精度(约 3-4 位有效)
  • 收敛风险与缓解手段

FP8(8 位)相比 FP16/BF16(16 位)把激活/权重存储减半,显存占用与带宽需求显著下降,Tensor Core 吞吐翻倍,可支持更大模型或更长序列。但 FP8 仅约 3-4 位有效数字,表示范围有限,直接用于训练梯度/权重易出精度不足、下溢或收敛不稳。权衡在于:虽能大幅提速省显存,但需 block-wise scaling、loss scaling、FP8 主权重与高精度累加等缓解手段,且对某些任务收敛可能退化。通常 FP8 用于主计算(矩阵乘)通道,关键路径(优化器状态、主权重、loss)仍保持 FP32/高精度,以在收益与收敛风险间取得平衡。

FP8 的收益是显存/带宽/吞吐的倍增,风险是精度不足导致收敛变差;通过"计算用 FP8、关键状态用高精度"的混合策略与缩放,把收益最大化、风险最小化。

#
★★

6. bfloat16 相比 FP16 保留了 8 位指数而缩减尾数,这一取舍如何影响动态范围与精度?

bfloat16 相比 FP16 保留 8 位指数而缩减尾数,这一取舍如何影响动态范围与精度?

  • 8 位指数带来的动态范围
  • 7 位尾数带来的精度损失
  • 动态范围与精度的权衡

BF16 保留 8 位指数,使动态范围与 FP32 一致(约 ±3.4e38),能覆盖从极小到极大的梯度/权重值,训练中不易因下溢/溢出崩溃;但尾数从 FP16 的 10 位降为 7 位,相对精度从约 1e-3(FP16)降到约 4e-3(BF16),每个数值的表示误差更大。取舍是:BF16 用精度换动态范围与训练稳定性,配合 FP32 master weights 弥补精度损失;FP16 用较小的动态范围换更高的相对精度,但需 loss scaling 防下溢。在梯度/激活尺度变化剧烈的训练中,BF16 的动态范围优势通常更关键。

动态范围决定"能否表示某量级的值",精度决定"表示得是否精确";BF16 优先保证范围(稳定性),牺牲精度交给 master weights 补偿,是这一取舍的工程落地。

#
★★

7. FP8 的 E4M3 与 E5M2 两种格式为何分别更适合推理与训练梯度表示?

FP8 的 E4M3 与 E5M2 两种格式为何分别更适合推理与训练梯度表示?

  • E4M3 的 1+4+3 布局(高精度、小范围)
  • E5M2 的 1+5+2 布局(大范围、低精度)
  • 推理(权重/激活)与梯度(范围大)的需求差异

FP8 的 E4M3(1 符号 + 4 指数 + 3 尾数)有更高的相对精度(3 位尾数)但动态范围小(约 ±448),适合推理中权重与激活的表示——这些值分布相对集中、需要精度;E5M2(1 符号 + 5 指数 + 2 尾数)动态范围大(约 ±57344)但精度低(2 位尾数),适合训练梯度——梯度可能跨越多个数量级,需要大范围防下溢,NaN 也被保留。因此推理通常用 E4M3(精度优先),训练梯度用 E5M2(范围优先),两者结合在 FP8 混合精度中分工。

E4M3 精度高范围小,E5M2 范围大精度低;推理的前向数据需要精度、训练的反向梯度需要范围,故按需求选择,是 FP8 格式分工的核心依据。

#
★★

8. TF32 在 Ampere Tensor Core 上以 19 位(8 指数+10 尾数)格式运算并以 FP32 累加,解决了什么问题?

TF32 在 Ampere Tensor Core 上以 19 位(8 指数+10 尾数)格式运算并以 FP32 累加,解决了什么问题?

  • TF32 的 19 位(8 指数 + 10 尾数)布局
  • 与 FP32/FP16 相比的精度-速度平衡
  • FP32 累加保证精度

TF32 是 Ampere Tensor Core 引入的截断格式:把 FP32 的 23 位尾数截断为 10 位,保留 8 位指数(动态范围与 FP32 相同),共 19 位有效运算,输出用 FP32 累加。它解决了"FP16 动态范围小、需 loss scaling"与"FP32 速度慢"的矛盾:TF32 在 FP32 相同的动态范围下,把 Tensor Core 吞吐提升接近 FP16 水平(无 loss scaling 负担),同时用 FP32 累加保证精度。主要用于训练中无需过多精度、但又要避免 FP16 稳定问题的场景,精度介于 FP16 与 FP32 之间,是精度与速度的折中。

TF32 的 8 位指数保留动态范围解决稳定性,10 位尾数提供中等级精度,FP32 累加控误差,从而在吞吐、动态范围、精度间取得平衡,替代 FP16 的 loss scaling 复杂度。

#
★★

9. 混合精度训练中 loss scaling 为何必要,它如何防止 FP16 梯度下溢?

混合精度训练中 loss scaling 为何必要?它如何防止 FP16 梯度下溢?

  • FP16 动态范围小导致的梯度下溢
  • loss scaling 放大 loss 使梯度进入可表示范围
  • 反向传播后缩放回原值

FP16 的最小正规数约 6e-5,而训练中许多梯度值远小于此,会下溢为 0,导致参数无法更新。loss scaling 把 loss 乘以一个大因子(如 1024,即 2^10)再反向传播,梯度随之放大同样倍数,从而进入 FP16 可表示范围,避免下溢。前向输出则需 /scale 保持数值正确,反向计算得到放大后的梯度,在更新前 /scale 还原真实梯度。通过动态调整 scale(检测溢出则减小、无溢出则增大)在稳定与精度间平衡,是 FP16 混合精度训练的必要技术。

下溢是 FP16 训练的主要失败模式,loss scaling 通过放大小梯度绕过下溢窗口,再缩放还原,使 FP16 也能承载小梯度,是混合精度训练的关键。

#
★★

10. FP16 的 5 位指数导致动态范围有限,训练中为何常因溢出而需改用 BF16?

FP16 的 5 位指数导致动态范围有限,训练中为何常因溢出而需改用 BF16?

  • FP16 最大约 65504 的溢出
  • 大权重/梯度跨越范围导致溢出
  • BF16 的 8 位指数大范围

FP16 只有 5 位指数,最大约 65504,当训练中出现较大权重、激活或梯度(如某些层、大学习率、未缩放的中间值)时,可能溢出为无穷,导致 NaN 与训练崩溃。即便有 loss scaling,集中式/大尺度值仍可能越界。BF16 有 8 位指数,动态范围与 FP32 一致(约 ±3.4e38),几乎不会因数值过大而溢出,训练更稳健。因此在大模型训练中,当 FP16 的溢出/下溢问题难以用 scaling 完全规避时,改用 BF16 以去掉范围限制,从而稳定训练(配 FP32 master weights 补精度)。

FP16 的范围同时面临"小数下溢"与"大数溢出"两端压力,BF16 用 8 位指数消除范围瓶颈,以稳定换取精度(由 master weights 补偿),是 FP16 换 BF16 的根本原因。

#
★★

11. bfloat16 与 FP32 指数位宽相同为何能简化格式转换,转换时损失了什么?

bfloat16 与 FP32 指数位宽相同为何能简化格式转换,转换时损失了什么?

  • 两者指数同为 8 位
  • 转换时截断尾数保留指数
  • 损失的尾数精度

BF16 与 FP32 的指数都是 8 位,符号位也相同,因此相互转换时指数部分无需任何调整,只需截断/补齐尾数:FP32→BF16 直接截断低 16 位尾数(约 2^-16 记入尾数),BF16→FP32 在尾数后补 16 个 0。硬件转换极简(一次移位/截断),也无需处理指数范围差异。损失的是尾数精度:转换时 FP32 的 23 位尾数被截断为 7 位,丢弃约 16 位精度,相对误差约 2^-8,Subnormal 与舍入处理也相对简单。因此格式转换廉价,但精度显著下降,需靠 FP32 master weights 补偿。

指数位宽一致使转换无需指数重映射,只需尾数截断/扩展,硬件友好;代价是丢失高位尾数精度,这是"简单位转换"与"精度损失"的权衡。

#
★★

12. FP8(E4M3/E5M2)与 TF32 在推理与训练中的精度取舍

FP8(E4M3/E5M2)与 TF32 在推理与训练中的精度取舍是什么?

  • FP8 的 8 位(E4M3/E5M2)低精度
  • TF32 的 19 位中精度
  • 推理/训练的不同精度需求

FP8 是 8 位格式,E4M3(精度高、范围小)适推理、E5M2(范围大、精度低)适训练梯度,位宽小、吞吐高、显存省,但精度仅约 3-4 位有效,需 block scaling 与高精度累加配合,收敛风险较大。TF32 是 19 位(8 指数+10 尾数)截断 FP32,精度远高于 FP8(约 10 位尾数),动态范围与 FP32 相同,适合训练中需要更高精度、又不愿用 FP16 的场景,吞吐约 FP32 的 8 倍。取舍:追求极致吞吐与显存(推理、容错训练)用 FP8;需要稳定精度与动态范围(训练前向、一般场景)用 TF32。两者都以精度换速度,但档位不同,FP8 更大胆、TF32 更保守。

FP8 与 TF32 代表"低精度压缩"的两档:FP8 位宽更小、精度更低、需更多缓解手段;TF32 位宽较大、精度较高、更接近 FP32 语义。选择取决于精度敏感度与吞吐需求。

#
★★

13. FP16 与 BF16 的动态范围对比(5 位 vs 8 位指数),在梯度、激活与权重上分别如何选择?

FP16 与 BF16 的动态范围对比(5 位 vs 8 位指数),在梯度、激活与权重上分别如何选择?

  • FP16 5 位指数 vs BF16 8 位指数
  • 各量的动态范围需求
  • 权重/激活/梯度的格式选择

FP16 动态范围约 ±65504,BF16 约 ±3.4e38(与 FP32 一致)。梯度在训练中可能跨越多个数量级且包含极小值,最需要大动态范围防下溢/溢出,因此优先选 BF16(或 E5M2/FP8);权重通常集中在较小范围,但更新精度敏感,常用 FP32 master weights 或需高精度,BF16 配 master weights 更稳;激活值范围随层变化,若尺度稳定可用 FP16(更高精度),若尺度大或需稳定性用 BF16。工程上:梯度/权重用大范围(BF16)配高精度主副本,激活视规模与稳定性在 FP16/BF16 间权衡,必要时用 loss scaling 配合 FP16。

选择依据是"该量的取值范围与精度敏感度":范围大、易极端(梯度)需大指数(BF16);精度敏感(权重)需高精度主副本;激活居中,按稳定性决定。

#
★★

14. 低比特量化(INT4/NF4)与 QLoRA 在推理显存与精度上的取舍,逐层/逐通道量化粒度的影响?

低比特量化(INT4/NF4)与 QLoRA 在推理显存与精度上的取舍,及逐层/逐通道量化粒度的影响是什么?

  • INT4/NF4 的 4 位量化
  • QLoRA 的 NF4 权重 + 低秩适配器
  • 逐层 vs 逐通道量化粒度

INT4/NF4 把权重压缩到 4 位,显存/带宽大幅下降,可加载更大模型;NF4(Normal Float 4)用正态分布优化的 4 位码本,对权重分布更友好,精度损失小于均匀 INT4。QLoRA 用 NF4 冻结基座权重 + 低秩(LoRA)适配器在可训练浮点精度更新,兼顾推理省显存与微调精度。量化粒度影响:逐通道(per-channel)为每个输出通道用独立 scale,更贴合分布、精度损失小但不便于硬件整块量化;逐层(per-tensor)用全局 scale,实现简单、吞吐高但精度损失大。工程上在精度与吞吐之间权衡粒度,逐组/逐通道常用以保精度。

4 位量化核心是"用更少位保精度"——NF4 的分布匹配码本降低损失,更细粒度(逐通道)的 scale 更贴合数据分布,但增加硬件复杂度;QLoRA 用低秩适配把"训练精度"与"存储压缩"解耦。

#
★★

15. FP8 训练的分块缩放(block-wise scaling)如何缓解小数值溢出,E4M3 与 E5M2 如何分工?

FP8 训练的分块缩放(block-wise scaling)如何缓解小数值溢出?E4M3 与 E5M2 如何分工?

  • block-wise scaling 的逐块缩放思想
  • 缓解 FP8 范围不足
  • E4M3 与 E5M2 的分工

FP8 范围有限,矩阵中不同块的数值尺度差异大,用一个全局 scale 会顾此失彼。block-wise scaling 把矩阵按块(如 32×32 或 128×128)切分,为每块计算独立 scale(每块最大绝对值),把每块数值归一化到 FP8 可表示范围,从而缓解小数值被吞没或大数值溢出。E4M3(精度高、范围小)用于权重/激活(前向)与部分梯度,E5M2(范围大、精度低)用于梯度(值可能很大且需大范围),两者结合:前向用 E4M3 保精度,反向梯度用 E5M2 保范围,配合 block scaling 让各块在各自范围上表示,共同提升 FP8 训练稳定性。

block scaling 解决了"单一 scale 无法覆盖不同尺度矩阵"的问题,格式化分工(E4M3 前向、E5M2 梯度)结合了精度与范围需求,是 FP8 训练可行性的关键。

#
★★

16. 混合精度训练中优化器状态(Adam 一阶/二阶矩)为什么需要最高精度,它占显存的主要部分吗?

混合精度训练中优化器状态(Adam 一阶/二阶矩)为什么需要最高精度?它占显存的主要部分吗?

  • Adam 的 m/v 矩估计的精度需求
  • 优化器状态在显存中的占比
  • 降精度优化器状态的影响

Adam 一阶矩 m 与二阶矩 v 通过指数移动平均累积,长期累积的数值需要高精度保存,否则 v(二阶矩)的舍入误差会破坏自适应步长,m 的误差会累积到权重更新,导致训练不稳定。且这些状态在训练中反复读写更新,精度损失会逐轮放大。因此优化器状态通常用 FP32(或 BF16/FP8 混合但降级风险大)。显存上,优化器状态常占主导:每个参数通常需 2 份状态(m、v),加上参数与梯度,优化器状态可占训练显存的主要部分(约 2/3 甚至更多)。因此优化器状态压缩(如 8-bit Adam、FP8 状态)是省显存的关键,但需精度管理。

优化器状态是"长期累积量",对精度最敏感;同时它数量大(每参数 2 份),是显存大户,故"最高精度"与"显存压缩"在此冲突,需用高效的降精度压缩(如 8-bit Adam)在精度与显存间权衡。

#
★★

17. BF16 尾数仅 7 位,数值较大时相邻可表示数间隔(ULP)变大,对梯度与激活的绝对精度有何影响?

BF16 尾数仅 7 位,数值较大时相邻可表示数间隔(ULP)变大,对梯度与激活的绝对精度有何影响?

  • BF16 的相对精度 2^-8
  • ULP 随数值增大而增大
  • 对梯度/激活绝对精度的影响

BF16 尾数 7 位,相对精度约 2^-8(约 0.4%)。浮点表示中相邻数的间距(ULP)随数值大小成正比:数值越大,ULP 越大,绝对误差越大。对梯度/激活而言,当数值本身较大时(如激活达到 100),BF16 的绝对误差可达 100×0.4%≈0.4,相对误差保持 0.4% 但绝对误差可观;而小数值时绝对误差很小。影响:梯度/激活的较大值在 BF16 下绝对精度损失更明显,可能累积成权重更新误差,影响训练精度。因此 BF16 适合"相对精度够用、绝对误差可接受"的场景,对大数值敏感路径需 FP32 master weights 或更高精度补偿。

浮点相对精度恒定但绝对误差与数值大小成正比,BF16 尾数少使大值的绝对误差更大,理解这一点对评估 BF16 是否适用(尤其大激活/大梯度)至关重要。

#

18. 低精度计算的缩放,loss scaling 与混合精度训练的工程实践如何?

低精度计算的缩放:loss scaling 与混合精度训练的工程实践是怎样的?

  • loss scaling 的静态/动态策略
  • 混合精度训练的完整流程
  • 溢出检测与缩放更新

混合精度训练工程实践:前向用 FP16/BF16 计算,loss 乘以 scale(如初始 2^24)再反向传播,避免梯度下溢;溢出检测(isinf/isnan)触发则减小 scale 并重试该步,无溢出则周期性增大 scale;更新时把梯度 /scale 还原,用 FP32 master weights 更新。动态 scaling 自动在"防下溢"与"防溢出"间平衡。实践要点:权重与优化器状态用 FP32,计算用低精度,loss 用 scaling,梯度裁剪在缩放后执行,且用 master weights 保精度。这是 PyTorch AMP 等框架的标准做法,兼顾速度与收敛。

loss scaling 是混合精度的核心工程手段,动态调整 scale 配合溢出检测,让 FP16 在避免下溢的同时不因溢出崩溃,配合 FP32 master weights 与高精度累加构成完整实践。

#

19. 低精度梯度通信的误差反馈(error feedback),BF16/FP8 allreduce 时如何用残差补偿舍入误差以维持收敛?

低精度梯度通信的误差反馈(error feedback):BF16/FP8 allreduce 时如何用残差补偿舍入误差以维持收敛?

  • 梯度通信压缩的舍入误差
  • error feedback 的残差累积与回补
  • 维持收敛的机制

分布式训练中梯度 allreduce 先用低精度(BF16/FP8)压缩传输以省带宽,但压缩会引入舍入误差,若直接丢弃会导致梯度有偏、收敛变差。error feedback(误差反馈)记录每次压缩被舍弃的残差,下一次通信前把残差加回当前梯度再做压缩,使被舍掉的误差在后续轮次被补偿,从而把舍入误差从"有偏丢失"变为"被回补的近似",维持收敛。工程上为每个梯度维护残差 buffer,每轮 grad += residual 后压缩传输,并更新 residual = grad - decompress(compress(grad)),配合随机舍入/无损传输进一步降低误差。这是降精度梯度通信的核心。

error feedback 的核心是"把丢弃的误差留到下一轮再补",通过残差累积使压缩误差不产生系统性偏差,从而在不显著增加带宽下维持收敛,是低精度梯度通信的关键技术。