NVFP4 vs MXFP4 vs 普通 FP4:4bit 浮点进化史——区别、怎么想到的、解决什么问题
声明:本文作为笔者个人备忘的文章,不喜勿喷。· 综合 NVIDIA 技术博客、CSDN/知乎/腾讯云、OCP MicroScaling 规范、壁仞/AMD 公开资料等(2026-09)
〇、导读
英伟达 Blackwell 把 FP4(4-bit 浮点)算力推到了惊人的 9~15 PFLOPS,宣传语常说"4 位精度、16 位表现"。但当你真去部署时,会碰到三个长得像的格式:普通 FP4、MXFP4、NVFP4。它们都叫"4 位",却根本不是一回事——普通 FP4 几乎没人直接用,真正上战场的是 MXFP4 和 NVFP4 这对"师兄弟"。
这篇讲清楚:① 三种格式到底是什么 → ② 核心解决什么问题 → ③ 这个思路怎么想到的 → ④ 工程上带来的差异与代价。
一、三种格式到底是什么
1. 普通 FP4(原生 4-bit 浮点,E2M1)
- 2 位指数 + 1 位尾数,一共 4 位。
- 指数只能表达 4 种状态,尾数只能表达 1.0 / 1.5 两种精度。
- 数值范围只有 [-6, 6],极其有限。
- 问题:张量里一旦出现大数值(outlier 离群值),要么溢出爆炸,要么大量普通数值被压到相近值、欠拟合。所以裸 FP4 直接用来算,精度几乎不可用。
2. MXFP4(OCP Micro-Scaling 微缩放)
- 由 OCP(Open Compute Project)制定的MicroScaling(MX)通用框架下的 FP4 格式,跨 FP8/FP6/FP4/INT8 统一。
- 核心:把一个张量切成每 32 个连续元素的小块,每个块共享一个E8M0(8 位指数、0 位尾数)缩放因子——它是一个2 的幂乘数。
- 重建:每个元素 = 该元素的 4-bit 尾数 × 块共享的 2 的幂缩放。
- 特点:每个小块有自己的动态范围,不会被全局 outlier"绑架";且 2 的幂缩放对硬件极友好,适配 Blackwell 张量核的 1×32 粒度。AMD 的 MI355X 也原生支持。
3. NVFP4(NVIDIA 自家微缩放格式)
- 同样是"块内共享缩放"的思路,但做了三处针对精度的升级:
- 块更细:从 32 元素缩到16 元素微块;
- 缩放因子更准:把 E8M0(只能 2 的幂)换成E4M3(4 位指数 3 位尾数的 FP8),支持分数倍缩放(1.5×、2.5×…),舍入误差远小于"只能乘 2 的幂"的 MXFP4;
- 加了一层全张量 FP32 全局缩放:对数值跨度极大的张量做全局协调,形成"微块精细缩放 + 张量全局缩放"的双重缩放。
4. 三者一张表看懂
| 维度 | 普通 FP4 | MXFP4 | NVFP4 |
|---|---|---|---|
| 位结构 | E2M1 | 4bit 尾数 + 块共享指数 | 4bit 尾数 + 微块共享缩放 |
| 缩放方式 | 无缩放 | 32 值块 +E8M0(2的幂) | 16 值微块 +E4M3(FP8,分数倍)+ 全张量 FP32 |
| 数值范围 | [-6,6],很窄 | 大(块级动态范围) | 大(更精细块级+全局) |
| 缩放精度 | — | 粗,指数级舍入偏大 | 细,可分数倍,更准 |
| 主导方 | IEEE/原生 | OCP 开放标准 | NVIDIA 专有 |
| 硬件 | 通用 | Blackwell/AMD 张量核 | Blackwell 原生 |
| 定位 | 理论 4bit | 统一生态 + 硬件效率 | 高精度 + 训练稳定 |
二、核心解决什么问题
- 解决普通 FP4"范围太窄、精度崩溃"的死穴:一个张量里数值可能差好几个数量级,单靠裸 FP4 必然溢出/欠拟合。块缩放让"每个小块有独立动态范围",是最关键的破解。
- 在 4-bit 下逼近 16-bit 精度:NVFP4 官方宣称实现了"16 位训练的精度 + 4 位训练的速度和效率",通过哈达玛变换重排数值分布、随机舍入、2D 块量化等,让低精度不损失质量(MIT 的研究也用 NVFP4+SVDQuant 在 FLUX 上接近 16 位输出)。
- 极致省显存、带宽和算力:4-bit 数据只有 FP16 的1/4、FP8 的1/2,直接砍掉显存占用、通信量(AllGather 减半)和计算 FLOPs,是 Blackwell 冲上 FP4 9~15 PFLOPS、缓解"显存墙/带宽墙"的根本。
- 统一生态 vs 高精度两条路线:MX 系列要的是"跨厂商、跨精度统一框架 + 硬件高效",NVFP4 要的是"单家极致精度 + 训练可用"——这就是两者的分野。
三、这个思路是怎么"想到"的?(思想来源)
- 本质是"块浮点 / 共享指数"的再次升级:整张量共用一个缩放(per-tensor)不够,就细化到 per-channel、per-block、再到 per-microblock——量化粒度从"全局一刀切"走向"局部自适应",是低精度表示演进的主线。
- 直接前辈是 FP8 的缩放策略:FP8 训练从per-tensor → per-tensor-block(128×128,DeepSeek-V3 验证)→ MXFP8 的 1×32 细粒度(Blackwell 张量核原生)。FP4 只是在 FP8 这条路上再走深一步。
- 两个组织用不同价值观给了答案:
- OCP/MX想统一:MXFP4 用最笨但最便宜的E8M0(2 的幂)换硬件极致简单和跨厂商互操作,代价是缩放粗糙、有舍入误差;
- NVIDIA/NVFP4想做到极致:用 E4M3 的分数倍缩放换更准的量化,再叠加随机哈达玛等"工程魔法",把 4-bit 训练稳定地卷上"16 位精度"。
- 一句话总结思路:“与其让所有数共享一个量程,不如给每个局部小块一个自己的量程。”
四、工程上带来的差异与代价(实战认知)
- 缩放因子决定了精度天花板:E8M0 只能乘 2 的幂 → 块内数值被"成倍"压缩,遇到非 2 的幂的真实分布误差大;E4M3 支持 1.5×/2.5× 等分数倍 → 更贴合数据分布、误差小。
- 块大小影响适应性:MXFP4 用 32、NVFP4 用 16,块越小越能避免"大数掩盖小变化",但缩放开销和硬件成本越高。
- NVFP4 不是"改一行类型就能用":要稳定,需要重做量化感知训练(QAT)、校准敏感度、重写低精度内核,甚至做哈达玛变换+随机舍入的融合内核。硬把 FP8 权重截断成 4-bit 会快速崩精度(连 NVIDIA 自家 DLSS 都还没完成全量 NVFP4 量化)。
- MXFP4 生态更开放,NVFP4 精度更极致:
- 追求跨硬件、省事、统一 → MXFP4(OCP,Intel/AMD/ARM/NVIDIA 都参与);
- 追求极限精度、训练质量、单一家 Blackwell → NVFP4。
- 目前原生 A4W4 训练的开源大模型还很少(如 GPT-OSS 仅 MoE 层用 MXFP4),未来缩放粒度/格式可能仍有演化。
五、总结(个人备忘)
- 普通 FP4:E2M1,范围 [-6,6] 太窄,裸用会溢出/欠拟合——是"地基",不当主力。
- MXFP4:32 块 + E8M0(2的幂) 共享指数,块级动态范围,宽动态 + 硬件高效 + 开放统一,但缩放大、精度略粗。
- NVFP4:16 微块 + E4M3(FP8,分数倍) + 全张量 FP32,更细、更准、训练稳定,但 NVIDIA 专有、实现重。
- 路线:一句话——“给每个局部小块一个自己的量程”,从 per-tensor 一路细化到 per-microblock。
- 选型:跨平台省事用 MXFP4;单家 Blackwell 要极限精度/训练用 NVFP4。
声明:本文作为笔者个人备忘的文章,不喜勿喷。以及AI生成。
主要参考来源(公开资料)
NVIDIA 技术博客(Introducing NVFP4 / NVFP4 16-bit 精度 4-bit 速度 / FP8 按张量与按块缩放)、CSDN 文库(MXFP4 vs NVFP4 全对比选型)、腾讯云开发者社区(NVFP4 量化 2.3× 推理加速)、腾讯新闻/AMD(MXFP4 微缩放与训练不稳定性研究)、壁仞(MXFP4 缩放粒度与异常值平滑)、知乎(Megatron-Core 下 FP8/FP4 训练实战)。本文由 AI 辅助整理。