基础格式:FP8 与 INT8
FP8(8 位浮点)
简介
FP8 是一种浮点表示格式,通过 “符号位 + 指数位 + 尾数位” 的组合表示数值,主流标准包括 NVIDIA 的 E4M3(4 位指数 + 3 位尾数)和 E5M2(5 位指数 + 2 位尾数)。
- 优势:保留浮点特性,动态范围远超整数格式(如 E5M2 的指数范围可达 ±128),适合表示激活值、梯度等动态范围大的数据,量化误差较小。
- 局限:硬件支持依赖特定芯片(如 Hopper 架构 GPU),不同厂商格式不统一;8 位存储仍比 INT8 占用更多带宽(与 INT8 同属 8 位,但浮点运算单元设计更复杂)。
ExMx
常见到E4M3或E5M2,这里的E代表指数位(Exponent),M代表尾数位(Mantissa)
E(Exponent):用于存储指数信息,决定数值的放大或缩小倍数。在E4M3中,指数位占用4位,可表示的指数范围更广,从而扩展动态范围。
M(Mantissa):存储有效数字部分(即小数点后的数值),占用3位,确保精度。这种设计在保证一定动态范围的同时提升了数值表达的准确性。
FP8 格式共 8 位,由三部分组成:
- 符号位(S):1 位,0 表示正数,1 表示负数(数值范围对称,以下仅计算正数范围)。
- 指数位(E):决定数值的动态范围,E4M3 中为 4 位,E5M2 中为 5 位。
- 尾数位(M):决定数值的精度(有效位数),E4M3 中为 3 位,E5M2 中为 2 位。
E4M3(4 位指数 + 3 位尾数)的数值范围
- 指数位参数:
指数位宽度 = 4 位 → 可表示的存储指数值范围:0~15(2^4 - 1)。
偏移量 = 2^(4-1) - 1 = 8 - 1 = 7。
- 实际指数范围:实际指数 = 存储指数值 - 偏移量 → 范围为:最小实际指数 = 0 - 7 = -7 最大实际指数 = 15 - 7 = 8
- 数值范围计算:FP8 的数值计算公式为:数值 = (-1)^S × (1 + M/2^M_bits) × 2^实际指数(注:M 是尾数位的二进制值,1 + M/2^M_bits 为 “归一化尾数”,最小值接近 1,看作1来继续往下,不影响数量级范围)。
因此,数值范围由指数决定:
最小正数(接近 0):2^(-7) ≈ 0.0078125
最大正数:2^8 = 256
- 即 E4M3 的数值范围约为 ±(0.0078125 ~ 256)(正负对称)。
E5M2(5 位指数 + 2 位尾数)的数值范围
- 指数位参数:
指数位宽度 = 5 位 → 可表示的存储指数值范围:0~31(2^5 - 1)。
偏移量 = 2^(5-1) - 1 = 16 - 1 = 15。
- 实际指数范围:实际指数 = 存储指数值 - 偏移量 → 范围为:最小实际指数 = 0 - 15 = -15 最大实际指数 = 31 - 15 = 16
- 数值范围计算:同理,数值范围由指数决定:
最小正数(接近 0):2^(-15) ≈ 3.0517578125×10^(-5)
最大正数:2^16 = 65536
- 即 E5M2 的数值范围约为 ±(3.05×10^(-5) ~ 65536)(正负对称)。
INT8(8 位整数)
INT8 是最常用的整数量化格式,通过线性映射(缩放因子 + 零点)将浮点值映射到 [-128, 127] 范围。
- 优势:硬件兼容性强(几乎所有 GPU/CPU/NPU 均支持 INT8 指令),计算效率高(整数运算单元能耗比是浮点的 2-4 倍),适合权重等分布相对集中的数据。
- 局限:动态范围固定(仅 ±127),对激活值中的异常值敏感,易导致精度损失;需额外存储缩放因子,增加内存开销。
进阶格式:MXFP8 与 MXINT8
在大模型量化与低精度推理领域,FP8(浮点 8 位)和 INT8(整数 8 位)是两种基础的低精度表示格式,而 MXFP8(混合精度浮点 8 位)与 MXINT8(混合精度整数 8 位)则是针对其局限性发展出的进阶方案。 “MX” 指的是 Open Compute Project(OCP)提出的 Microscaling 格微缩格式(MX-formats)规范。
MXFP8
高动态范围模式:E5M2(5 位指数 + 2 位尾数),适合激活值、梯度等存在极端值的数据;
高精度模式:E4M3(4 位指数 + 3 位尾数),适合权重、特征图等需保留细节的数据。
其核心实现依赖硬件支持的 “动态格式切换单元”,在推理时根据数据分布实时选择子格式,无需提前固定量化参数。例如,在 Transformer 模型中,MXFP8 可对注意力层的 Query/Key(需高动态范围)用 E5M2,对 Value(需高精度)用 E4M3,兼顾两者需求。
MXINT8
对关键通道(如注意力层的 QKV 投影)采用 “准 INT8” 模式(如保留部分 FP16 参数或细化缩放因子);
对冗余通道(如 FeedForward 层的中间激活)采用标准 INT8,甚至更低比特(如 INT4)。
与传统 INT8 的 “全局统一缩放” 不同,MXINT8 引入 “分层缩放机制”:对每个子模块单独计算缩放因子(如 Transformer 的每个注意力头独立量化),并允许部分高敏感参数保留 FP16 精度(通常仅占 1%-5%),以极小的额外开销换取精度提升。例如,在 Llama 模型中,MXINT8 对注意力层的缩放因子按头计算,对 FeedForward 层按通道计算,同时保留 0.5% 的关键权重为 FP16,精度损失可降低 30% 以上。
MXFP8 与 MXINT8 优缺点对比
MXINT8 的优劣
- 硬件兼容性好:基于现有 INT8 指令集扩展,无需全新硬件支持(通过软件逻辑实现动态缩放),可在 CPU、GPU、边缘芯片上通用。
- 效率精度平衡佳:仅对极少数关键参数保留高精度,整体内存占用与 INT8 接近(增加 5%-10%),但精度可提升至接近 FP16 的 95% 以上(传统 INT8 通常为 85%-90%)。MXINT8 在 “直接 cast” 情况(即不做大量微调)时精度损失非常小。比如在 “Microscaling Data Formats for Deep Learning” 论文中,MXINT8 在各类任务(图像分类、语言模型、推荐系统)中表现为 “closest to FP32 baseline” 的一种选项。
局限:
- 校准成本高:需通过大量数据统计通道重要性,确定哪些参数保留高精度,量化预处理时间比传统 INT8 长 3-5 倍。
- 缩放因子存储增加:分层缩放机制需为每个子模块存储单独的缩放因子,对超大规模模型(如 100B 参数)可能增加 10%-15% 的额外内存开销。
- 灵活性相对较差:“浮点”微缩格式(如 FP8)是近年来新兴趋势,硬件/软件在快速发展,INT8 并不能充分利用浮点所带来的动态范围优势,灵活性可能不如浮点格式(比如对梯度、激活、权重的表示可能受限)。
MXFP8 的优劣
优势:
- 精度保留更优:动态切换指数 - 尾数分配,对高动态范围数据(如激活值、梯度)的量化误差比固定 FP8 低 20%-40%,尤其适合多模态模型(如图像特征与文本特征的融合)。
- 灵活性强:无需预处理即可适配不同分布的数据,避免传统 FP8 因格式固定导致的 “一刀切” 误差(如 E5M2 对高精度需求场景的尾数截断损失)。
- 在最新硬件(例如 NVIDIA Blackwell、Qualcomm 等平台)中,FP8 及其微缩格式正成为新趋势。比如文章提到 Qualcomm 的 “Microscaling MX” 在大模型推理上加速了近 2×。
局限:
- 硬件依赖高:动态格式切换需专用硬件单元(如 NVIDIA Blackwell 架构的 MXFP8 引擎),老旧设备(如 A100)无法支持,兼容性弱于固定 FP8。
- 实现复杂度高:推理框架需实时分析数据分布并切换格式,增加了调度开销,在小模型上可能抵消效率收益
- 精度保持稍差:如果不做专门的调优/微调(e.g. rounding 模式、block size 配置),FP8 微缩格式可能比 INT8 更容易出现精度下降或稳定性问题。MXFP8 在 “direct-cast” 情况下(即不做 fine-tune)精度稍差于 MXINT8。比如那篇论文中:在直接 cast 情况下,MXINT8 表现最好,其次为 MXFP8。
适用场景与技术选择
MXFP8 和 MXINT8 均通过 “混合精度” 突破了固定格式的局限性,但适用场景差异显著:
- MXFP8:适合硬件条件优越(如最新 GPU)、对动态范围敏感的场景(如多模态模型推理、训练中的低精度梯度传递),优先保证精度无损。
- MXINT8:适合硬件兼容性要求高(如跨平台部署)、追求极致效率的场景(如边缘设备、高并发服务),以最小成本提升 INT8 精度。
参考链接:
https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf
https://www.qualcomm.com/developer/blog/2024/01/qualcomm-cloud-ai-100-accelerates-large-language-model-inference-2x-using-microscaling-mx
https://arxiv.org/pdf/2310.10537
