FP4 QAT — 显存的最后一刀
V4 在后训练阶段对 MoE expert weights 与 CSA Indexer QK 路径执行 FP4 QAT。FP4 权重可无损展开到 FP8 表示,以复用现有 FP8 训练框架;推理和 rollout 则直接加载原生 FP4 权重。
FP4 QAT = 量化感知训练(Quantization-Aware Training),把 MoE 专家权重存成 4-bit 浮点,forward 在 FP8 下算,反向梯度用直通估计回灌到 FP32 master 权重
一句话:用 4 bit 存权重(每个数 16 个码点),forward 把 4 bit dequant 到 FP8 算 GEMM,backward 梯度直接打回 FP32 master。 关键工程条件:只要 FP4 sub-block scale 与 FP8 block scale 的比例不超过阈值,FP4 值就能无额外舍入地展开到 FP8。团队验证当前权重满足这一条件;报告没有给出固定比例区间,也没有声称跨硬件输出 bit-identical。 相对 BF16,4-bit 权重的原始载荷约为四分之一;实际节省还要计入 scale、未量化参数和运行时缓冲。报告没有给出固定的端到端吞吐倍数。
- FP4 (E2M1)
- 4 bit 浮点:1 sign + 2 exponent + 1 mantissa。16 个可表示值:±0, ±0.5, ±1, ±1.5, ±2, ±3, ±4, ±6(含特殊编码)。动态范围窄(max 6.0,min 0.5),所以必须配 scale 才能表达广动态权重。
- FP8 (E4M3)
- 8 bit 浮点:1+4+3。动态范围 ~448,常用于 forward GEMM 输入/输出。V4 GEMM 的内部精度。
- QAT(Quantization-Aware Training)
- 训练时模拟量化:forward 前把权重量化再展开,让模型在量化误差存在时继续优化。相比训练后才量化的 PTQ,QAT 可以更早适应低精度;实际质量差异取决于模型和量化方案,报告没有给出统一的“几乎无损”结论。
- FP32 Master 权重
- 优化器为被量化的权重维护 FP32 master copy;FP4 是前向使用的低精度视图,梯度最终传播回 FP32 master weights。训练内存还包含梯度与优化器状态,不能只按“每参数多 4 字节”计算。
- STE(Straight-Through Estimator · 直通估计)
- 量化 $Q(\cdot)$ 的导数处处为 0(阶梯函数),梯度无法回传。STE 的 trick:反向时假装 $\partial Q / \partial w = 1$,把梯度直接穿过量化算子。粗暴但有效,是所有 QAT 的根基。
- Sub-block 嵌套 scale
- V4 在 128×128 的 FP8 quantization block 内使用 1×32 的 FP4 sub-block scale。只要这些细粒度 scale 的最大值与最小值之比不超过某个阈值,FP8 E4M3 多出的指数范围就能完整吸收 scale 差异。报告称当前权重经实证满足该条件,但没有公开阈值。
- STE 等价:梯度打到 FP8 权重
- forward 使用从 FP4 无额外舍入展开得到的 FP8 权重;backward 对同一 FP8 权重计算梯度,并直接传播回 FP32 master weights。这等价于在量化操作上使用 STE,也避免重新量化转置权重。
- Indexer FP4 + BF16 score
- CSA 的 Lightning Indexer 也走低精度路径:QK activations 的缓存、读取和乘法全部使用 FP4,index score $I_{t,s}$ 再从 FP32 量化到 BF16。报告称这一优化使 top-k selector 提速 2×,同时保持 99.7% 的 KV-entry recall。
- 真 FP4 推理 vs 模拟 FP4 训练
- 训练 step 将 FP4 权重无额外舍入地展开到 FP8,复用 FP8 mixed-precision pipeline;rollout 与 inference-only forward 直接使用原生 MXFP4 权重。报告只说采样行为与线上部署保持一致,不承诺跨硬件逐 bit 输出一致。
1. 万亿参数的显存账
V4-Pro 1.6T 参数的存储压力极端:
- BF16:约 3.2 TB;
- FP8:约 1.6 TB;
- FP4:约 0.8 TB。
原生支持 MXFP4 的硬件可以减少权重读取并提高低精度计算吞吐。V4 报告没有给出端到端推理提升 1.5–2× 的数字,也不应把 Hopper H100 描述为原生 MXFP4 目标硬件。
2. FP4 (E2M1) 长什么样
FP4 只有 16 个可表示值。E2M1 的标准编码:
4 bit 编码 = sign(1) + exponent(2) + mantissa(1):
当 $e = 0$ 时是 subnormal,$v = (-1)^s \cdot 2^{-1} \cdot (m/2)$ —— 含 ±0, ±0.5。
16 个值的具体清单:$\{0, \pm 0.5, \pm 1, \pm 1.5, \pm 2, \pm 3, \pm 4, \pm 6\}$。
注意:没有 5(exp 跳跃)、有两个零(±0)、最大值 6.0。动态范围 6 / 0.5 = 12,远窄于 FP8 (动态范围 ~890)。所以不配 scale 直接表达不了 LLM 权重 —— 必须 sub-block scaling。
读图法:上轴是 FP4 16 个固定码点 —— 你能直观看到它们非均匀分布(小值密、大值稀,浮点的本性)。下轴是一个 sub-block 内 32 个真实权重;蓝→红 = 量化前→量化后。
点"长尾分布"可看到:若 scale 由块内最大绝对值决定,单个大值会增大量化步距,使小权重更容易落到 0 附近码点。这个演示说明细粒度分块和 QAT 要处理的量化压力;报告没有给出训练前后权重长尾比例的对照。
3. 关键 trick:sub-block 嵌套 scale
FP4 动态范围太窄,不能用 per-tensor 单一 scale(异常值会压垮所有正常权重)。常见做法 per-channel 或 per-group。V4 走更细:
- FP4 sub-block:细粒度 scale 作用于 1×32 tiles;
- FP8 quantization block:范围为 128×128,其中包含 $128\times4=512$ 个 1×32 sub-block;
- 关键条件:同一 FP8 block 内,FP4 sub-block scale 的最大值与最小值之比不能超过 FP8 E4M3 动态范围可吸收的阈值。
关键条件是同一 128×128 FP8 block 内,FP4 sub-block scale 的最大值与最小值之比不能超过某个阈值。FP8 E4M3 比 FP4 E2M1 多两个指数位,因而可以吸收这部分细粒度 scale 差异。报告称当前权重经实证满足条件,但没有公布阈值或精确区间。
- FP8 动态范围更大:多出的指数位用于吸收 sub-block 间的 scale 差异;
- 条件经实证满足:作者验证当前权重的 scale 比例没有越过所需阈值;
- 无损的范围:这里指 FP4 低精度视图展开到 FP8 的步骤不再额外丢信息,不是 FP32 权重量化到 FP4 无损。
这是工程精算 —— 并不是 FP4 量化本身无损(它当然损失),而是 FP4 这个低精度视图"展开成 FP8"这一步无损。模型质量损失全部发生在"FP32 → FP4"那一次量化,QAT 让模型自己学着接受这个噪声。
4. QAT 训练循环
每步训练做的事:
- Forward:从 FP32 master 权重量化到 FP4(fake quant),dequant 到 FP8 输入 GEMM;
- Backward:梯度对FP8 表示的权重求导,等价 STE(绕过量化算子的 0 导数);
- Update:梯度累加到 FP32 master;
- 下一步:再次从 master 重新量化。
正常链式法则在量化算子 $Q$ 处会断:
$Q$ 是阶梯函数,处处导数为 0,梯度直接挂掉。STE 的 hack:反向时假装 $\partial Q / \partial w = 1$,让梯度原样穿过量化算子。等价于:
STE 是有偏的梯度近似:它绕过量化阶梯函数几乎处处为 0 的导数,使 FP32 master weights 仍能更新。量化误差上限取决于码点间隔与 scale,报告没有声称模型经过几个 batch 就会自动收敛到某种固定的“量化友好”分布。
5. CSA Indexer 的 FP4 路径
Ch04 的 CSA Lightning Indexer 是 V4 长上下文的命脉。每层一次 indexer 调用,每次要算整个 prefix 与当前 query 的 $QK^T$,然后选 top-k。FP4 化的关键:
- Indexer QK activations:缓存、读取和乘法全部使用 FP4;
- Indexer score $I_{t,s}$:从 FP32 量化到 BF16;
- 整体结果:报告称该优化使 top-k selector 提速 2×。
实测KV-entry recall 为 99.7%。报告没有进一步把剩余差异归因于“边界 token 翻号”,也没有量化其对下游 logits 的影响。
本章小结
- FP4 将被量化权重相对 BF16 的存储降至约四分之一,但完整模型还包含非 expert weights、scale、KV cache 与运行时缓冲,不能据此断言 Pro 可装入单节点 8×H100。
- FP4 (E2M1) 只有 16 个码点、动态范围 12,必须 sub-block 嵌套 scale。
- FP4 sub-block (1×32) + FP8 块 (128×128) 的 scale 比例落在 FP8 E4M3 范围内 → FP4→FP8 反量化无损。
- STE 让 QAT 训练通过量化算子,反向把梯度打回 FP32 master。
- Indexer 的 FP4 + BF16 score 让 top-k selector 2× 提速 + 99.7% recall。
- FP4→FP8 展开可以无额外舍入;报告的更谨慎结论是采样阶段直接使用原生 FP4,使其行为与线上部署保持一致。