
FP8 量化数据格式揭秘E4M3 与 E5M2 在深度学习推理中的表示精度权衡随着大语言模型LLM的参数量从数十亿迈向数千亿传统的 16 位浮点数FP16/BF16在显存占用与访存带宽上面临巨大挑战而整型量化如 INT8/INT4虽然在计算和显存上极其紧凑但在无损保留模型高层注意力分布和激活值离群点Outliers时往往需要复杂的校准算法与繁重的手工调优。在这一背景下由 NVIDIA、Arm 与 Intel 联合制定的FP88-bit Floating Point格式标准迅速成为了现代高性能 AI 芯片如 H100/H200/B200 以及新一代 CPU 架构的绝对主力。与整型不同FP8 完整保留了浮点数的“符号位Sign 指数位Exponent 尾数位Mantissa”三段式结构兼具了极宽的动态表示范围与自适应尺度特性。更具工程智慧的是FP8 规范并没有设计成单一格式而是同时推出了两种截然不同的变体FP8-E4M3 与 FP8-E5M2。本文我们将深度解构这两种格式的二进制比特排布、动态范围差异剖析为什么工业界会在权重、激活值与梯度上做出泾渭分明的选择并使用现代 C 实现精准的软件编解码算子。一、二进制排布与数值特性的数学对比一个字节8 个比特的容量极其有限。如何在有限的 8 位空间内在“动态范围Dynamic Range”与“数值精度Precision”之间做取舍是浮点格式设计的核心灵魂。E4M3: [ S (1 bit) ] [ E E E E (4 bits) ] [ M M M (3 bits) ] 偏置 Bias 7 E5M2: [ S (1 bit) ] [ E E E E E (5 bits) ] [ M M (2 bits) ] 偏置 Bias 15两种格式的物理参数对比表关键特性维度FP8 E4M3 格式FP8 E5M2 格式原生 BF16 格式 (参考)符号位 (Sign)1 位1 位1 位指数位 (Exponent)4 位 (Bias 7)5 位 (Bias 15)8 位 (Bias 127)尾数位 (Mantissa)3 位 (约 0.9 位小数)2 位 (约 0.6 位小数)7 位最大可表示值 (Max Norm)44857344$3.39 \times 10^{38}$最小正正规数 (Min Norm)$2^{-6} \approx 0.015625$$2^{-14} \approx 6.1 \times 10^{-5}$$1.17 \times 10^{-38}$无穷大 (Inf) 支持不支持 Inf(全部映射为 NaN)原生支持 $\pm\text{Inf}$原生支持 $\pm\text{Inf}$NaN 编码数量仅S.1111.111两个编码标准 IEEE 形式标准 IEEE 形式仔细观察这组数据可以发现极为深刻的工程妥协E4M3 极致压榨精度它将宝贵的 3 位全部分配给尾数把可表示的精度分辨率提升了一倍。但其代价是动态范围极其狭窄最大数值只能表示到 448只要数值超过 448就会立刻发生溢出。为了不浪费宝贵的编码空间E4M3 甚至废弃了标准的无穷大Inf把原本代表 Inf 的比特模式直接转用作有效数值表示。E5M2 继承 BF16 的动态血统它拥有与标准 FP16 完全相同的 5 位指数位因此其动态范围高达 $57344$并且拥有与 IEEE-754 完全一致的下溢阶梯与 Inf 语义。但其代价是尾数只有区区 2 位有效数值之间的步长跳跃极大精度极其粗糙。二、工业界黄金法则为什么推理首选 E4M3在生产环境的大模型推理Inference中工业界包括 TensorRT-LLM、vLLM 与 DeepSeek 推理内核形成了极其统一的共识在前向推理计算中权重Weights和激活值Activations全面采用 E4M3为什么不选择动态范围更大的 E5M2原因在于量化缩放因子Scaling Factor的引入在现代推理框架中张量并不是裸存在 FP8 空间中的而是伴随着 Block-wise 或 Tensor-wise 的高精度 FP32 缩放因子 $S$$$X_{\text{real}} X_{\text{fp8}} \times S$$既然外部已经有了缩放因子 $S$ 来宏观调节整个张量的动态量级张量内部各元素之间最迫切需要的是微观的相对精度分辨率E4M3 拥有 3 位尾数其相对量化误差Relative Quantization Error大约是 E5M2 的一半。在深达几十层的 Transformer 网络中每一层前向传播积累的舍入误差如果使用 E5M2 会导致最终生成的文本出现明显的乱码Degradation而使用 E4M3全网模型困惑度Perplexity几乎可以做到与原生 FP16 完全无损重合那么 E5M2 用在哪里E5M2 是为模型训练Training的反向传播Backward Pass量身定做的。在反向传播中梯度的方差极大极易出现接近于零的微弱梯度或瞬时爆发的大梯度此时宽广的动态范围比尾数精度更为致命E5M2 的 5 位指数能够确保梯度在长距离传播中既不下溢也不溢出。三、现代 C 实现 FP32 到 FP8-E4M3 的饱和量化算子在底层算子开发中将 FP32 快速压缩为 FP8-E4M3 时必须严格处理饱和截断Saturation防止超出 448 的离群值被错误解释为 NaN#include cstdint #include cmath #include algorithm #include span #include iostream // FP8 E4M3 软件位级表示 struct alignas(1) fp8_e4m3_t { uint8_t raw_bits; }; // 高性能标量转换实现将单精度 float 转换为 FP8-E4M3 (带饱和截断) inline fp8_e4m3_t float_to_e4m3(float val) { if (std::isnan(val)) { return fp8_e4m3_t{0x7F}; // 标准 NaN 模式 } // 提取符号位 uint32_t f_bits; std::memcpy(f_bits, val, 4); uint8_t sign (f_bits 31) 0x01; float abs_val std::abs(val); // 饱和截断E4M3 最大可表示绝对值为 448.0 if (abs_val 448.0f) { // 饱和到最大正规数 (Sign.1111.110 0x7E) return fp8_e4m3_t{static_castuint8_t((sign 7) | 0x7E)}; } // 下溢到 0 if (abs_val 0.0009765625f) { // 最小可表示次正规数阈值 return fp8_e4m3_t{static_castuint8_t(sign 7)}; } // 正常浮点位级重映射简化逻辑 // 实际工业级会通过查表或硬件向量位移重构 int exp; float frac std::frexp(abs_val, exp); // abs_val frac * 2^exp, frac in [0.5, 1) int e4_exp exp 6; // 对齐 Bias 7 e4_exp std::clamp(e4_exp, 1, 15); int e4_mantissa static_castint(std::round((frac * 2.0f - 1.0f) * 8.0f)); e4_mantissa std::clamp(e4_mantissa, 0, 7); uint8_t packed (sign 7) | ((e4_exp 0x0F) 3) | (e4_mantissa 0x07); return fp8_e4m3_t{packed}; } // 批量反量化内核将 FP8-E4M3 还原为 float void dequantize_e4m3_block(const fp8_e4m3_t* src, float* dst, float scale, size_t n) { for (size_t i 0; i n; i) { uint8_t b src[i].raw_bits; uint8_t sign (b 7) 0x01; uint8_t exp (b 3) 0x0F; uint8_t mant b 0x07; float val 0.0f; if (exp 0) { // 次正规数 val std::ldexp(static_castfloat(mant) / 8.0f, -6); } else if (exp 15 mant 7) { val NAN; // 特殊 NaN } else { // 正规数: (1 mant/8) * 2^(exp - 7) val std::ldexp(1.0f static_castfloat(mant) / 8.0f, exp - 7); } dst[i] (sign ? -val : val) * scale; } }四、工程落地最佳实践绝对禁止无保护强制类型转换不要试图使用简单的整数位移直接截断浮点数。FP8 的指数偏移量Bias与 IEEE-754 的 FP32Bias127完全不同且必须严格处理饱和截断与 NaN 掩蔽否则微小的位溢出会直接将正常权重大规模破坏为 NaN。硬件原生指令优先在拥有支持 FP8 硬件的现代平台上如具备 Hopper 架构 GPU 或最新 x86 扩展直接调用原生的向量转换内联函数如_mm512_cvtne2ps_pbh或 CUDA 的__nv_fp8_e4m3硬件单周期即可完成数十个元素的极速吞吐转换。动态延迟缩放Delayed Scaling在每一层推理输出激活值时使用当前 Batch 的历史最大绝对值Amax动态更新下一个时间步的缩放因子 $S$确保数据尽可能饱满地填满 E4M3 的可表示区间实现真正无损的极限加速。