OCP Microscaling Formats (MX) Specification
文章标题: OCP 微缩放格式 (MX) 规范
作者/机构: AMD, Arm, Intel, Meta, Microsoft, NVIDIA, Qualcomm
A1 主要贡献
本规范旨在标准化一个开放、公开且可互操作的数据格式家族——微缩放(Microscaling, MX)格式,以应对人工智能(AI)训练和推理中日益增长的计算和内存需求。
- 核心问题与目标:当前的AI工作负载对计算资源(特别是功耗和散热)和内存占用提出了巨大挑战。为了提高硬件性能和效率,降低运营成本及环境影响,迫切需要一种比现有格式更高效的数据表示方法。MX格式的目标是通过采用低位宽算术运算和更小的内存占用,来提升AI计算的效率和可持续性。
- 核心设计思想:MX格式的核心是“微缩放”机制,它将一组(一个块)数值共享一个缩放因子(scale)。一个MX兼容格式由三个关键部分定义:一个共享的缩放因子(S)、一组私有元素(eᵢ),以及定义块大小的缩放块尺寸(k)。这种设计允许从标量数据类型(如FP8, INT8)构建出高效的矢量数据类型。
- 主要贡献与影响:
- 提出并标准化MX格式家族:本规范正式定义了MX兼容格式,包括具体的MXFP8、MXFP6、MXFP4和MXINT8格式。详细规定了它们的块大小、元素数据类型和共享缩放数据类型。
- 提升AI计算效率:通过使用8位或更低位宽的算术,MX格式能够显著减少内存占用,从而提升硬件性能和能效,降低数据中心的运营成本(电力和冷却)和碳排放。
- 开放与互操作性:该规范由AMD、Arm、Intel、Meta、Microsoft、NVIDIA和Qualcomm等行业关键参与者合作制定,建立在OCP FP8等开放标准之上,旨在推动一个开放、可互操作的生态系统。这有助于减少软件和基础设施的开发成本,避免因采用定制化解决方案而产生的额外开销。
- 广泛的应用潜力:实验结果表明,MX格式在保持稳健模型准确率方面表现出色,有潜力成为AI训练和推理的主流数据格式,并在全球AI硬件和AI服务市场中得到广泛应用。
A3 设计原则
5.1 微缩放(MX)
MX格式的组成:一个MX兼容格式由三个部分定义:缩放(S)的数据类型/编码、私有元素($e_i$)的数据类型/编码,以及缩放块大小(k)。
块内共享缩放因子:在一个块中,所有k个元素($e_i$)都具有相同的数据类型和位宽,并共享同一个缩放因子S。从这个意义上说,MX可以被看作是一种从标量数据类型构建矢量数据类型的机制。
内存编码:若w为共享缩放因子S的编码位数,d为每个元素$e_i$的编码位数,则每个包含k个元素的块可以用(w + k×d)位进行编码。本规范未规定块在物理内存中的布局。如果多个块共享同一个缩放因子,实现可以压缩或删除重复的缩放因子。实现也可以将缩放因子S与k个元素连续存储或分开存储。
值的推断规则:MX块所表示的值$v_1, ..., v_k$根据其组成字段推断如下:
- 如果 S = NaN,则对于 1 ≤ i ≤ k,无论$e_i$为何值,$v_i$都等于NaN。
- 如果 S ≠ NaN:
- 若 $e_i \in \{Inf, NaN\}$,则 $v_i = e_i$。
- 若 $S \times e_i > \text{Float32}_{\text{max}}$ 或 $S \times e_i < -\text{Float32}_{\text{max}}$,则 $v_i$ 的行为由具体实现定义。
- 否则,$v_i = S \times e_i$。
此处 $\text{Float32}_{\text{max}}$ 是Float32数据格式可表示的最大数。MX兼容格式的编码值应在Float32范围内。当编码值的绝对值大于 $\text{Float32}_{\text{max}}$ 时,其行为由具体实现定义。块缩放因子的NaN编码见5.4节。当缩放因子为NaN时,MX块中的所有值均为NaN,并忽略元素编码。
A2 方法细节
5.2 具体的MX兼容格式
具体的MX兼容格式定义:一个具体的MX兼容格式由特定的块大小k以及S和$e_i$的数据类型组成。本规范包含的具体的MX兼容格式见下表。表中所列的元素和缩放数据类型在后续章节中描述。
Table 1. 具体的MX兼容格式的名称和参数。
命名约定:为避免与现有标量数据类型混淆,我们明确采用以下命名约定:在引用任何MX兼容数据类型时,我们在元素数据类型名称前加上“MX”。
5.2.1 实现合规性
支持要求:要符合本规范,实现无需支持所有具体的MX兼容格式。实现可以选择支持格式的任意子集。不同的编码(例如MXFP8的E5M2和E4M3)被视为不同的格式。对于每个受支持的格式,实现必须支持表1中列出的参数。
5.3 元素数据类型
元素数据类型定义:以下为MX兼容格式指定的元素数据类型。对于FP8、FP6和FP4格式,编码的值(不包括5.3.1节中列出的FP8的Inf和NaN编码)推断如下:
a) 如果 E > 0,则 $v = (-1)^S \times 2^{E-\text{bias}} \times (1 + 2^{-M} \times m)$。这是一个规格化数。
b) 如果 E = 0,则 $v = (-1)^S \times 2^{1-\text{bias}} \times (0 + 2^{-M} \times m)$。这是一个次规格化数。
其中:
- S、E和m分别是符号(Sign)、指数(Exponent)和尾数(Mantissa)字段的值。
- bias是指数偏置。
- M是尾数位数。
字段布局:下图显示了采用浮点元素数据类型(左)和整数元素数据类型(右)的MX兼容格式中的符号、指数和尾数字段。
5.3.1 FP8
FP8实现要求:FP8的实现必须遵守《OCP 8位浮点规范》。下方的表2和表3复现了该规范中的信息。实现必须支持表3中为处理从其他格式到FP8的值转换所列出的饱和(SAT)和溢出(OVF)方法。也可以支持其他方法,并通过一个可配置的溢出属性在可用方法之间进行选择。
Table 2. FP8编码细节。此信息复现自OCP FP8规范中的表2。
Table 3. 转换为FP8时的特殊情况,可配置的溢出属性设置为OVERFLOW或SATURATE模式。此信息复现自OCP FP8规范【索引5,OCP FP8 specification】中的表3。
5.3.2 FP6
FP6实现要求:FP6的实现必须遵守下表,并支持次规格化数。在FP6中没有为Inf或NaN保留的编码。实现必须支持roundTiesToEven
舍入模式用于将值转换为FP6。也可以支持其他舍入模式。
溢出和下溢处理:在转换为FP6期间,如果一个值在舍入后超出了FP6的可表示范围,实现必须支持将该值钳位(饱和)到FP6的最大量级,并保留符号。可以支持其他方法,并通过一个可配置的溢出属性在可用方法之间进行选择。超出范围的值可以是更宽数据格式中的规格化数或Infs。在转换为FP6期间,如果一个值在舍入后的量级小于FP6的最小次规格化数量级,实现必须将该值转换为零。从NaNs的转换由具体实现定义。
Table 4. FP6编码细节。
5.3.3 FP4
FP4实现要求:FP4的实现必须遵守下表,并支持次规格化数。在FP4中没有为Inf或NaN保留的编码。实现必须支持roundTiesToEven
舍入模式用于将值转换为FP4。也可以支持其他舍入模式。
溢出和下溢处理:在转换为FP4期间,如果一个值在舍入后超出了FP4的可表示范围,实现必须支持将该值钳位(饱和)到FP4的最大量级,并保留符号。可以支持其他方法,并通过一个可配置的溢出属性在可用方法之间进行选择。超出范围的值可以是更宽数据格式中的规格化数或Infs。在转换为FP4期间,如果一个值在舍入后的量级小于FP4的最小次规格化数量级,实现必须将该值转换为零。从NaNs的转换由具体实现定义。
Table 5. FP4编码细节。
5.3.4 INT8
INT8实现要求:INT8的实现必须遵守下表,唯一的例外是最大负数表示$-2^7$(见下方关于2的补码的说明)。INT8中没有为Inf或NaN保留的编码。实现必须支持roundTiesToEven
舍入模式用于将值转换为INT8。也可以支持其他舍入模式。
溢出和NaN转换:在转换为INT8期间,如果一个值在舍入后超出了INT8的可表示范围,实现必须支持将该值钳位(饱和)到INT8的最大量级,并保留符号。可以支持其他方法,并通过一个可配置的溢出属性在可用方法之间进行选择。超出范围的值可以是更宽数据格式中的规格化数或Infs。从NaNs的转换由具体实现定义。
2的补码和对称性:整数数据类型使用2的补码编码,但最大负数表示($-2^7$)可能不被使用,以保持最大正数和负数表示之间的对称性,并避免引入负偏差。
隐式缩放:INT8编码包含一个隐式缩放因子,使其具有一个符号位、一个整数位和六个小数位。
Table 6. INT8编码细节。
5.4 缩放数据类型
支持的缩放数据类型:以下为MX兼容格式指定的缩放数据类型。
5.4.1 E8M0
E8M0定义:E8M0是传统带偏置的Float32指数的无符号表示。与Float32指数不同,它没有为Inf的表示,并且只保留了一个NaN编码。
Table 7. 缩放数据类型E8M0的编码细节。
6. 基本操作
本节描述对MX兼容格式的基本操作。
6.1 两个MX兼容格式向量的点积
点积定义:两个长度为k的MX兼容格式向量 $x: \{S^{(x)}, [e_i^{(x)}]_{i=1}^k \}$ 和 $y: \{S^{(y)}, [e_i^{(y)}]_{i=1}^k \}$ 的点积是一个标量数z。必须最少支持以下语义:
其中:
- $S^{(x)}, S^{(y)}$ 分别是向量x和y的块缩放因子。
- $e_i^{(x)}, e_i^{(y)}$ 分别是向量x和y的第i个元素。
实现说明:x和y的缩放因子和/或元素可以使用不同的数据类型。点积的内部精度和操作顺序由具体实现定义。通过提出共享缩放因子,点积的规约计算只在元素上进行。
6.2 通用点积
通用点积定义:两个向量X和Y的通用点积应为一个标量Float32数Z。假设向量已被填充,使其长度是缩放块大小k的整数倍。设填充后的向量X和Y的长度为N×k,由N个长度为k的MX兼容向量组成,则X和Y的通用点积定义为:
其中DotProduct()在6.1节中定义,而$X_j$和$Y_j$分别是X和Y的第j个MX兼容子向量。
6.3 从标量元素向量到MX兼容格式的转换
转换机制要求:必须提供一种机制,用于将一个长度为k的标量元素向量 $v: [v_i]_{i=1}^k$ 转换为MX兼容格式 $\{S, [e_i]_{i=1}^k \}$, 即生成块缩放因子S和元素$e_i$。特别地,应最少支持以下语义:
- 将S设置为小于或等于 $\max_{i \in k}(|v_i|)$ 的最大2的幂次,再除以元素数据类型中可表示的最大2的幂次。
- 将$e_i$设置为经过缩放的输入 $v_i / S$,并量化到元素数据类型。对于此量化,超出元素数据类型最大规格化数表示范围的规格化数,应被钳位到最大规格化数,并保留符号。
其他选项:可以支持将标量元素向量转换为MX兼容格式的其他算法。对于到元素数据类型的量化,实现必须支持roundTiesToEven
作为舍入模式,也可以支持其他舍入模式。
A4 实验环境与结果
本规范文档未提供独立的实验环境或实验结果章节。在章节2.3“影响”中提到,“实验结果表明,本标准中引入的具体MX兼容格式在使用8位或更少位数的情况下,为AI训练和推理实现了稳健的模型准确率”,但未提供支持该结论的具体实验设置、数据集、模型架构或量化结果数据。
A5 结论
本规范文档没有独立的结论部分。它作为一项技术标准,主要侧重于定义MX数据格式及其相关操作,而非呈现研究工作的结论。
引用文献汇总
-
[1] Darvish Rouhani, Bita, et al., "Pushing the Limits of Narrow Precision Inferencing at Cloud Scale with Microsoft Floating Point", Advances in Neural Information Processing Systems (NeurIPS), 2020.
- 引用位置: 2.1 开放性
- 引用描述: 该文献被引用作为引出MX标准设计思想和研究成果的公开发表论文之一。原文描述为:“导致它的想法和结果已经在诸如[1,2,3]的论文中公开发布。”
-
[2], [3]
- 引用位置: 2.1 开放性
- 引用描述: 与[1]一同被引用,作为支持MX标准思想来源的公开研究。
- 备注: 规范中未提供这两篇文献的详细信息。
-
[4] IEEE Standard for Floating-Point Arithmetic
- 引用位置: 4.1 定义
- 引用描述: 该标准被多次引用,以定义规范中使用的基本浮点术语。
- 用于定义Float32:“在IEEE浮点算术标准[4]中定义的Binary32格式。”
- 用于定义Mantissa(尾数):“…(这等同于IEEE浮点算术标准[4]中定义的尾随有效数位字段)。”
- 用于定义roundTiesToEven(向偶数舍入):“…更多细节见IEEE浮点算术标准[4]第4.3.1节。”
- 备注: 规范中未提供该标准的完整引用信息,但明确指出了其来源。
-
[5] OCP FP8 specification
- 引用位置: 5.3.1 FP8
- 引用描述: 该规范被引用,以说明关于FP8格式的表格信息来源。原文描述为:“此信息复现自OCP FP8规范[5]中的表3。”
- 备注: 规范中未提供该规范的完整引用信息,但明确指出了其来源。
💬 评论讨论
欢迎在这里分享您的想法和见解!