1. 低精度正在成为默认选项

Scaling Law 仍在延续,模型参数量从百亿到千亿再到万亿,训练和推理的算力与显存开销急剧增长。GPU 的显存与算力增长远不及模型的膨胀速度,低精度存储和计算成为必然选择。从 BF16 的 2 bytes 到 FP8 的 1 byte 再到 FP4 的 0.5 byte,每降一级,显存和计算量近乎减半。

几个数字可以直观感受这个变化。DeepSeek-V3 的 671B 参数用 BF16 需要超过 1.3TB 显存,至少跨两个节点部署;换成 FP8 后压缩到约 685GB,一台 8×H200 单机即可承载 [1]。GPT-OSS 的 120B 参数通过 MXFP4 量化 MoE 权重,整个模型塞进了单张 80GB GPU [2]。而 DeepSeek-V4-Pro 达到 1.6T 参数,MoE Expert 以 FP4 存储、其余模块 FP8,单台 8×B200 节点即可完成推理 [3]

这些并不只是推理侧的压缩技巧。DeepSeek-V3 的 FP8 是贯穿训练全程的,loss 与 BF16 基线接近 [1];DeepSeek-V4 通过 Quantization-Aware Training 将 FP4 嵌入训练流程本身,而非事后量化 [3]。低精度已经从推理优化手段演变为训练范式的一部分。

质量损失如何控制?下面从数值格式、Scaling 和精度损失缓解三个层面展开。


2. 数值格式与表示能力

2.1 各格式能表示什么

浮点数由三部分组成:符号位(S)、指数位(E)、尾数位(M)。指数决定能表示多大/多小的数(动态范围),尾数决定相邻两个可表示值之间的间距(精度分辨率)。

格式位宽S+E+M可表示值数量最大值每参数占用
FP32321+8+23~43 亿3.4×10³⁸4 bytes
BF16161+8+765,5363.4×10³⁸2 bytes
FP16161+5+1065,53665,5042 bytes
FP8 E4M381+4+32564481 byte
FP8 E5M281+5+225657,3441 byte
FP4 E2M141+2+11660.5 byte

早期深度学习训练使用 FP32,每个参数 4 bytes,精度绰绰有余但计算和存储开销巨大。2018 年提出的混合精度训练(Mixed Precision Training)[4][5],核心思路是:前向和反向传播用 FP16 计算以获得 2 倍吞吐提升,同时维护一份 FP32 的 master weights 用于参数更新,兼顾速度与精度。这一方案迅速成为标准实践。

然而 FP16 在大模型训练中暴露出明显的局限性。FP16 只有 5 位指数,动态范围上限为 65,504。当模型规模增大后,梯度中容易出现超出该范围的极端值——上溢直接触发 loss spike,下溢则让梯度归零。

BF16 的设计针对的正是这个问题:保留与 FP32 相同的 8 位指数(动态范围达到 3.4×10³⁸),代价是尾数从 23 位缩减到 7 位。对训练而言,动态范围远比尾数精度更重要——梯度不溢出、不归零,训练才能稳定推进。BF16 因此迅速取代 FP16,成为大模型训练的默认精度。

FP8 将位宽进一步压缩到 8 bit,以 E4M3 为例,只有 256 个可表示值,分散在 [-448, 448] 的范围内。

而模型权重通常集中在 ±0.01 量级——不做 scaling 的话,这个狭窄区间内可用的 FP8 值寥寥无几,大量不同的权重会被舍入到相同的值。FP8 必须配合 scaling 使用,后面会详细展开。

FP4 更极端:全部只有 16 个值,正数部分能表示的是 {0, 0.5, 1, 1.5, 2, 3, 4, 6}。表示能力如此有限,必须依赖多层 scaling 和更精巧的量化策略才能工作。

值得一提的是 FP8 的两个子格式分工明确:E4M3(4 位指数 + 3 位尾数)精度更高,通常用于前向传播中的权重和激活值存储;E5M2(5 位指数 + 2 位尾数)动态范围更大(最大值 57,344),更适合梯度——梯度的值域波动比权重大得多 [6]

不过 DeepSeek-V3 全部使用 E4M3,靠细粒度 scaling 补偿动态范围不足,是个比较激进的选择 [1]

2.2 FP vs INT:两条量化路线

量化领域存在两条技术路线:浮点(FP)和整数(INT)。它们的核心区别在于数值的分布方式:

FP8 对数间距 vs INT8 均匀间距
图 1. FP8 对数间距 vs INT8 均匀间距

神经网络的权重和激活值通常呈钟形分布——大量值聚集在零附近,少数 outlier 散布在两端。FP 格式的对数间距天然在零附近提供更高分辨率,与这种分布形状匹配。INT 格式则将表示能力均匀分配给整个值域,在远离零的稀疏区域浪费了大量表示能力,而零附近的分辨率又不及 FP 格式。

那 INT 还有什么存在价值?硬件成本。 一个 FP8 的 FMA(fused multiply-add)单元比 INT8 大 40-50% 的硅片面积,能耗也更高。在边缘设备、手机端、专用推理芯片上,INT 仍然是主流选择。此外,INT 的工具链更成熟(GPTQ [7]、AWQ [8]、bitsandbytes [9]),几乎所有 GPU 都支持 INT8 计算。

简单说:精度敏感选 FP,硬件受限选 INT。


3. Scaling:弥补动态范围的不足

3.1 为什么需要 Scaling

低精度格式的可表示值有限,为了让这些有限的值尽可能还原高精度下的数值分布,需要通过 scaling 将数据映射到格式的有效表示区间内。以 FP8 E4M3 为例:

BF16:范围 [-3.4×10³⁸, 3.4×10³⁸],8 位指数 + 7 位尾数,65536 个可表示值

FP8 E4M3:范围 [-448, 448],4 位指数 + 3 位尾数,256 个可表示值

直接截断:尾数 7→3 位导致精度下降,指数 8→4 位可能溢出或下溢。

Scaling 的作用是将原始数值分布映射到低精度格式的有效表示空间,充分利用有限的表示能力。具体做法很简单:计算一组数据的最大绝对值 amax,然后 scale = FP8_MAX / amax,所有值乘以 scale 后再转为 FP8 存储;反量化时除以 scale 即可还原。这样,FP8 有限的 256 个可表示值就能集中覆盖实际数据范围,最大化量化精度。

3.2 缩放粒度

但一个 scale factor 应该覆盖多大范围的数据?覆盖范围越大,outlier 对整体精度的影响越大;覆盖范围越小,精度越高但额外开销也随之增加。业界演化出了多种方案 [10]

缩放粒度对比
图 2. 缩放粒度对比
方法粒度Scale 格式精度效率硬件
Tensor-wise整个矩阵 1 个 scaleFP32高(1 次 FP32 操作)Hopper+
Block-wise (128×128)每子块 1 个 scaleFP32中(逐块 FP32 操作)Hopper+
Tile-wise (1×128)每 128 元素 1 个 scaleFP32较低(逐段 FP32 操作)Hopper+
MXFP8 (OCP)每 32 元素 1 个 scaleE8M0中高高(位移操作,Blackwell 原生)Hopper+

Tensor-wise 是最早的方案,逻辑简单:找到整个矩阵的最大绝对值作为 scale。问题在于它对 outlier 极其脆弱——矩阵中只要有一个异常大的值(比如其他值都在 0.01 量级,但有一个值是 10),整个矩阵的 scale 就会被这个 outlier 主导,其余 99.99% 的正常值的量化分辨率急剧下降。这种方案现在基本被淘汰了。

Block-wise 把矩阵切成 128×128 的子块,每个子块独立计算 scale。这样 outlier 的影响被限制在它所在的子块内,不会波及整个矩阵。scale 以 FP32 存储,对于一个 128×128 = 16384 个元素的块,额外开销仅 4 bytes / 16384 ≈ 0.02%。

Tile-wise 粒度更细,按 token 维度每 128 个通道计算一个 scale。激活值的 outlier 往往集中在特定通道(某些通道的平均幅值可能是其他通道的 10-100 倍),逐 token 的细粒度缩放能精确适配这种模式。

MXFP8 是 OCP(Open Compute Project)提出的 Microscaling 标准 [11]。与前三种”自定义 scaling”不同,MXFP8 把 scaling 直接内建到了格式规范中:每 32 个元素共享一个 E8M0 格式的 scale(8 位纯指数,无尾数,只能表示 2 的幂次)。

粒度上,MXFP8 比 block-wise(16384 元素/组)细得多,但 scale 只能是 power-of-2,精度不如 FP32 scale。每参数实际开销 8.25 bits(8 + 8/32)。Hopper GPU 可通过软件模拟支持,Blackwell 提供原生硬件加速。后面 3.3 节讨论的 MXFP4 属于同一个 MX 系列。

效率方面,前三种方案的 scale 以 FP32 存储,反量化时需要做 FP32 浮点乘法,这部分开销随 scale 粒度变细而增加——Tile-wise 每 128 个元素就需要一次 FP32 反量化操作,额外计算量最大。MXFP8 虽然粒度最细(32 元素/组),但 E8M0 scale 只能是 2 的幂次,反量化仅需位移操作,比 FP32 乘法高效得多。在 Blackwell 上,MXFP8 的 scale 应用由硬件原生完成,无需额外 CUDA Core 参与,吞吐优势更为明显。

DeepSeek-V3 的做法:权重 block-wise 128×128,激活值 tile-wise 1×128,scale 以 FP32 存储。DeepSeek-V3 在 H800(Hopper 架构)上训练,而 MXFP8 的原生硬件加速需要 Blackwell,Hopper 上只能软件模拟,吞吐优势有限;此外 FP32 scale 精度优于 E8M0 的 power-of-2 约束。最终 FP8 训练 loss 与 BF16 基线偏差控制在 0.25% 以内 [1]

3.3 FP4:格式与部署约束

FP4 只有 16 个值,需要更加细粒度的 scaling 策略。当前有两种主流方案:NVIDIA 专有的 NVFP4 [12] 和 OCP 开放标准的 MXFP4:

NVFP4 vs MXFP4 格式对比
图 3. NVFP4 vs MXFP4 格式对比
特性NVFP4MXFP4
块大小1632
Scale 结构双层(E4M3 + FP32)单层(E8M0)
每参数实际开销~4.5 bits~4.25 bits
精度更高稍低
B200 吞吐基准略高(E8M0 scale 硬件实现更简单)
生态NVIDIA 专有AMD/Intel/Meta/… 多厂商

NVFP4 用更小的块(16 vs 32)和两层缩放换取了更好的精度,在 GPT-OSS 微调实验中 validation loss 比 MXFP4 低约 2-3% [13]。但 MXFP4 的 E8M0 power-of-2 scale 反量化只需位移操作,硬件实现更简单,吞吐略优;同时作为 OCP 开放标准获得了更广泛的硬件支持。实际选择取决于项目对精度和生态的优先级。另外,“4.25 bits”这个数字也值得留意——FP4 表面上是 4-bit,但加上 scale 的存储开销后,每个参数实际占 4.25-4.5 bits。

部署层面还有两个实际约束。首先,4-bit 不是字节对齐的,存储时需要将两个 FP4 值 pack 到一个 byte 中,scale 也要紧凑排列;读取单个 FP4 值需要位移和掩码操作,scale 的对齐也需要专门处理,这给 kernel 实现带来了额外复杂度。其次,FP4 的 Tensor Core 原生支持目前仅限于 NVIDIA Blackwell 架构(B100/B200),在 Hopper 及更早的 GPU 上只能通过软件模拟实现,无法获得真正的吞吐收益——这也是 FP4 尚未像 FP8 那样广泛铺开的主要原因。


4. 怎样减少精度损失

低精度不是免费的午餐。将模型从 BF16 切换到 FP8 或 FP4,如果不加处理,训练 loss 发散、推理质量退化都是常见问题。精度损失的来源和对应的缓解手段可以归纳为以下几类:

  • 累积误差:单次乘法误差微小,但 matmul 中数千次累加后误差被逐步放大 → 高精度累积
  • 舍入偏差:低精度可表示值太少,确定性舍入引入系统性偏差 → Stochastic Rounding
  • 模块间差异:不同模块对精度的容忍度差异显著,统一降精度收益有限且有害 → 模块级混合精度
  • 量化本身的退化:上述手段缓解但不能消除精度损失 → QAT 让模型在训练阶段主动适应量化

4.1 高精度累积

矩阵乘法是深度学习中最核心的计算单元。一个 Linear 层的 matmul 涉及数千次乘加累积,单次 FP8 乘法的舍入误差虽然很小,但经过数千次累加后会积累到不可忽视的程度。

DeepSeek-V3 的做法是:Tensor Core 以 FP8 完成乘法获取吞吐优势,部分和则通过 CUDA Core 以 FP32 精度累积来保证结果正确性 [1]。乘法用低精度、累积用高精度,兼顾了速度和精度。

4.2 Stochastic Rounding

高精度累积解决的是累加过程的误差放大问题。但 FP4 训练还面临另一个挑战:舍入偏差。

以一个值 0.2 为例,FP4 中最近的两个可表示值是 0 和 0.5。确定性舍入(Round-to-Nearest)每次都会把它舍为 0——信息永久丢失。如果模型中大量参数的梯度更新都遭遇这种系统性截断,训练就无法收敛。

值 0.2 在 FP4 可表示值 {0, 0.5} 之间:

  • Round-to-Nearest:永远舍入到 0 → 信息持续丢失
  • Stochastic Rounding:40% 概率 → 0.5,60% 概率 → 0。期望值 E[SR(0.2)] = 0.2 ✓ 无偏

Stochastic Rounding 以概率方式舍入,保证期望值等于原值(无偏估计)。单次舍入有噪声,但多次迭代后参数更新的方向保持正确。FP4 只有 16 个可表示值,这种无偏性对训练收敛至关重要。Quartet [14]、NVFP4 等 FP4 训练方案均采用了这一策略。

4.3 模块级混合精度

并非所有模块都需要同等精度。Transformer 中不同模块对量化的敏感度差异显著,将精度预算集中分配给敏感模块,是最直接有效的策略。

模块敏感度建议精度关键原因
EmbeddingBF16/FP16语义表示的入口,误差传播到全部后续层
Attention QKVFP8+微小误差改变注意力分布,影响语义聚焦
Attention ScoreBF16Softmax 对输入高度敏感,低精度导致注意力坍缩
FFN / MLPFP4/INT4占参数 60-80%,容错率高,压缩收益最大
KV Cache中高FP8/BF16已有 FP8 KV Cache 的实践,长文本场景仍建议 BF16
LayerNormFP32参数极少(几 KB),高精度无额外成本
MoE ExpertsFP4/INT4占总参数 90%+,每次仅激活少数

为什么 FFN 比 Attention 更耐压缩? FFN 的参数矩阵主要承担”知识存储”角色,单个参数的微小偏移会被后续的非线性函数和 LayerNorm 平滑。而 Attention 中 QKTQK^T 的点积结果直接送入 Softmax——指数函数会将输入的微小扰动放大。这也解释了为什么 DeepSeek-V4 将 MoE Expert(本质是 FFN)压到 FP4,而 Attention 计算保持 FP8 [3]

4.4 Quantization-Aware Training

前面的方法都是在计算层面减少误差。QAT 从训练角度出发:让模型在训练过程中就”见过”量化后的权重,主动学习适应低精度带来的信息损失。

DeepSeek-V4 对 MoE Expert 权重采用 FP4(MXFP4)QAT,其中有一个关键设计:FP4→FP8 的反量化是无损的 [3]。无损的原因在于两步操作都不引入舍入:

  • 类型转换无损:FP4 E2M1(2 位指数 + 1 位尾数)的每一个可表示值,在 FP8 E4M3(4 位指数 + 3 位尾数)中都能被精确表示。FP8 在指数和尾数维度上都严格包含 FP4,FP4→FP8 的转换不需要舍入。
  • Scale 应用无损:MXFP4 的 scale 采用 E8M0 格式,只能是 2 的幂次(如 2⁰, 2¹, 2⁻¹ …)。将浮点数乘以 2ⁿ 只移动指数位,不影响尾数,因此不产生舍入误差。

两步都无舍入,整个 FP4→FP8 反量化严格无损。图中以 1.5 为例,其 FP8 E4M3 编码为 0 0111 100 浮点编码:浮点数存储为三个字段 [S | E | M],还原公式为 (−1)^S × 2^(E−bias) × (1 + M/2^m),其中 bias = 2^(e−1) − 1,e 为指数位数,m 为尾数位数。FP8 E4M3 中 bias = 2³ − 1 = 7,m = 3。以 0 | 0111 | 100 为例:S=0,E=7,M=4,还原为 (−1)⁰ × 2^(7−7) × (1 + 4/8) = 1 × 1 × 1.5 = 1.5。乘以 2² 后指数 +2:E=9=1001,尾数不变 100,还原为 2^(9−7) × 1.5 = 4 × 1.5 = 6.0 ,乘以 scale 2² 后指数 +2、尾数不变,得到 6.0——两步都精确落在 FP8 网格上。

FP4→FP8 无损反量化:类型转换精确 + scale 位移精确
图 4. FP4→FP8 无损反量化:类型转换精确 + scale 位移精确

这意味着整个 QAT 流程可以直接复用现有的 FP8 训练框架,无需修改反向传播逻辑。具体流程:

QAT 训练与推理流程
图 5. QAT 训练与推理流程

训练时用模拟量化保证梯度信号的完整性,推理时用真实 FP4 获得硬件加速,两个阶段的模型行为保持一致。


5. 总结

场景推荐格式硬件要求质量损失
训练(默认)BF16Ampere+
训练(高效)FP8 / MXFP8Hopper+(MXFP8 原生 Blackwell)极小,接近无损
训练(极速)FP4Blackwell需配合 QAT 控制
推理(近无损)FP8 / MXFP8Hopper+(MXFP8 原生 Blackwell)可忽略
推理(省显存)INT4 AWQ / GPTQ通用轻微退化
推理(最优吞吐)NVFP4 / MXFP4Blackwell需配合 QAT 控制

低精度不是简单地降低位宽,而是在格式选择、缩放策略和模块级精度分配上做系统性设计。从 DeepSeek-V3 的 FP8 到 DeepSeek-V4 的 FP4+FP8 混合,再到 GPT-OSS 的 MXFP4 原生发布,这条路线正在快速成熟。

FP8 本身的 256 个可表示值远不够精确,细粒度 Scaling、高精度累积等工程手段才是让训练 loss 收敛的关键。FP4 训练同理——QAT、Stochastic Rounding、模块级混合精度,单项措施各有局限,组合起来才能让 4-bit 训练收敛。随着 Blackwell 架构对 FP4 的原生硬件支持落地,FP4 很可能在未来一到两年内成为大模型训练和推理的新默认选项。


参考

[1] DeepSeek-AI. “DeepSeek-V3 Technical Report.” arXiv:2412.19437, 2024. https://arxiv.org/abs/2412.19437

[2] OpenAI. “Introducing GPT-OSS.” 2025. https://openai.com/index/introducing-gpt-oss/

[3] DeepSeek-AI. “DeepSeek-V4: Towards Highly Efficient Million-Token Context Intelligence.” 2026. https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro/blob/main/DeepSeek_V4.pdf

[4] Micikevicius et al. “Mixed Precision Training.” ICLR 2018. https://arxiv.org/abs/1710.03740

[5] NVIDIA. “Mixed-Precision Training of Deep Neural Networks.” NVIDIA Developer Blog, 2017. https://developer.nvidia.com/blog/mixed-precision-training-deep-neural-networks/

[6] Micikevicius et al. “FP8 Formats for Deep Learning.” arXiv:2209.05433, 2022. https://arxiv.org/abs/2209.05433

[7] Frantar et al. “GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers.” ICLR 2023. https://arxiv.org/abs/2210.17323

[8] Lin et al. “AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration.” MLSys 2024. https://arxiv.org/abs/2306.00978

[9] Dettmers et al. “LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale.” NeurIPS 2022. https://arxiv.org/abs/2208.07339

[10] NVIDIA. “Per-Tensor and Per-Block Scaling Strategies for Effective FP8 Training.” NVIDIA Developer Blog, 2025. https://developer.nvidia.com/blog/per-tensor-and-per-block-scaling-strategies-for-effective-fp8-training/

[11] OCP. “Microscaling Formats (MX) Specification v1.0.” 2023. https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf

[12] NVIDIA. “NVFP4 Trains with Precision of 16-Bit and Speed and Efficiency of 4-Bit.” NVIDIA Developer Blog, 2025. https://developer.nvidia.com/blog/nvfp4-trains-with-precision-of-16-bit-and-speed-and-efficiency-of-4-bit/

[13] NVIDIA. “Fine-Tuning GPT-OSS for Accuracy and Performance with Quantization Aware Training.” NVIDIA Developer Blog, 2025. https://developer.nvidia.com/blog/fine-tuning-gpt-oss-for-accuracy-and-performance-with-quantization-aware-training/

[14] Castro et al. “Quartet: Native FP4 Training Can Be Optimal for Large Language Models.” NeurIPS 2025. https://arxiv.org/abs/2505.14669