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 | 可表示值数量 | 最大值 | 每参数占用 |
|---|---|---|---|---|---|
| FP32 | 32 | 1+8+23 | ~43 亿 | 3.4×10³⁸ | 4 bytes |
| BF16 | 16 | 1+8+7 | 65,536 | 3.4×10³⁸ | 2 bytes |
| FP16 | 16 | 1+5+10 | 65,536 | 65,504 | 2 bytes |
| FP8 E4M3 | 8 | 1+4+3 | 256 | 448 | 1 byte |
| FP8 E5M2 | 8 | 1+5+2 | 256 | 57,344 | 1 byte |
| FP4 E2M1 | 4 | 1+2+1 | 16 | 6 | 0.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)。它们的核心区别在于数值的分布方式:
神经网络的权重和激活值通常呈钟形分布——大量值聚集在零附近,少数 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]:
| 方法 | 粒度 | Scale 格式 | 精度 | 效率 | 硬件 |
|---|---|---|---|---|---|
| Tensor-wise | 整个矩阵 1 个 scale | FP32 | 低 | 高(1 次 FP32 操作) | Hopper+ |
| Block-wise (128×128) | 每子块 1 个 scale | FP32 | 中 | 中(逐块 FP32 操作) | Hopper+ |
| Tile-wise (1×128) | 每 128 元素 1 个 scale | FP32 | 高 | 较低(逐段 FP32 操作) | Hopper+ |
| MXFP8 (OCP) | 每 32 元素 1 个 scale | E8M0 | 中高 | 高(位移操作,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 | MXFP4 |
|---|---|---|
| 块大小 | 16 | 32 |
| 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 中不同模块对量化的敏感度差异显著,将精度预算集中分配给敏感模块,是最直接有效的策略。
| 模块 | 敏感度 | 建议精度 | 关键原因 |
|---|---|---|---|
| Embedding | 高 | BF16/FP16 | 语义表示的入口,误差传播到全部后续层 |
| Attention QKV | 高 | FP8+ | 微小误差改变注意力分布,影响语义聚焦 |
| Attention Score | 高 | BF16 | Softmax 对输入高度敏感,低精度导致注意力坍缩 |
| FFN / MLP | 低 | FP4/INT4 | 占参数 60-80%,容错率高,压缩收益最大 |
| KV Cache | 中高 | FP8/BF16 | 已有 FP8 KV Cache 的实践,长文本场景仍建议 BF16 |
| LayerNorm | 高 | FP32 | 参数极少(几 KB),高精度无额外成本 |
| MoE Experts | 低 | FP4/INT4 | 占总参数 90%+,每次仅激活少数 |
为什么 FFN 比 Attention 更耐压缩? FFN 的参数矩阵主要承担”知识存储”角色,单个参数的微小偏移会被后续的非线性函数和 LayerNorm 平滑。而 Attention 中 的点积结果直接送入 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 网格上。
这意味着整个 QAT 流程可以直接复用现有的 FP8 训练框架,无需修改反向传播逻辑。具体流程:
训练时用模拟量化保证梯度信号的完整性,推理时用真实 FP4 获得硬件加速,两个阶段的模型行为保持一致。
5. 总结
| 场景 | 推荐格式 | 硬件要求 | 质量损失 |
|---|---|---|---|
| 训练(默认) | BF16 | Ampere+ | 无 |
| 训练(高效) | FP8 / MXFP8 | Hopper+(MXFP8 原生 Blackwell) | 极小,接近无损 |
| 训练(极速) | FP4 | Blackwell | 需配合 QAT 控制 |
| 推理(近无损) | FP8 / MXFP8 | Hopper+(MXFP8 原生 Blackwell) | 可忽略 |
| 推理(省显存) | INT4 AWQ / GPTQ | 通用 | 轻微退化 |
| 推理(最优吞吐) | NVFP4 / MXFP4 | Blackwell | 需配合 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