文章标题: OCP 微缩放格式 (MX) 规范
作者/机构: AMD, Arm, Intel, Meta, Microsoft, NVIDIA, Qualcomm
本规范旨在标准化一个开放、公开且可互操作的数据格式家族——微缩放(Microscaling, MX)格式,以应对人工智能(AI)训练和推理中日益增长的计算和内存需求。
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,并忽略元素编码。
具体的MX兼容格式定义:一个具体的MX兼容格式由特定的块大小k以及S和$e_i$的数据类型组成。本规范包含的具体的MX兼容格式见下表。表中所列的元素和缩放数据类型在后续章节中描述。
Table 1. 具体的MX兼容格式的名称和参数。
命名约定:为避免与现有标量数据类型混淆,我们明确采用以下命名约定:在引用任何MX兼容数据类型时,我们在元素数据类型名称前加上“MX”。
支持要求:要符合本规范,实现无需支持所有具体的MX兼容格式。实现可以选择支持格式的任意子集。不同的编码(例如MXFP8的E5M2和E4M3)被视为不同的格式。对于每个受支持的格式,实现必须支持表1中列出的参数。
元素数据类型定义:以下为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兼容格式中的符号、指数和尾数字段。
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。
FP6实现要求:FP6的实现必须遵守下表,并支持次规格化数。在FP6中没有为Inf或NaN保留的编码。实现必须支持roundTiesToEven舍入模式用于将值转换为FP6。也可以支持其他舍入模式。
溢出和下溢处理:在转换为FP6期间,如果一个值在舍入后超出了FP6的可表示范围,实现必须支持将该值钳位(饱和)到FP6的最大量级,并保留符号。可以支持其他方法,并通过一个可配置的溢出属性在可用方法之间进行选择。超出范围的值可以是更宽数据格式中的规格化数或Infs。在转换为FP6期间,如果一个值在舍入后的量级小于FP6的最小次规格化数量级,实现必须将该值转换为零。从NaNs的转换由具体实现定义。
Table 4. FP6编码细节。
FP4实现要求:FP4的实现必须遵守下表,并支持次规格化数。在FP4中没有为Inf或NaN保留的编码。实现必须支持roundTiesToEven舍入模式用于将值转换为FP4。也可以支持其他舍入模式。
溢出和下溢处理:在转换为FP4期间,如果一个值在舍入后超出了FP4的可表示范围,实现必须支持将该值钳位(饱和)到FP4的最大量级,并保留符号。可以支持其他方法,并通过一个可配置的溢出属性在可用方法之间进行选择。超出范围的值可以是更宽数据格式中的规格化数或Infs。在转换为FP4期间,如果一个值在舍入后的量级小于FP4的最小次规格化数量级,实现必须将该值转换为零。从NaNs的转换由具体实现定义。
Table 5. FP4编码细节。
INT8实现要求:INT8的实现必须遵守下表,唯一的例外是最大负数表示$-2^7$(见下方关于2的补码的说明)。INT8中没有为Inf或NaN保留的编码。实现必须支持roundTiesToEven舍入模式用于将值转换为INT8。也可以支持其他舍入模式。
溢出和NaN转换:在转换为INT8期间,如果一个值在舍入后超出了INT8的可表示范围,实现必须支持将该值钳位(饱和)到INT8的最大量级,并保留符号。可以支持其他方法,并通过一个可配置的溢出属性在可用方法之间进行选择。超出范围的值可以是更宽数据格式中的规格化数或Infs。从NaNs的转换由具体实现定义。
2的补码和对称性:整数数据类型使用2的补码编码,但最大负数表示($-2^7$)可能不被使用,以保持最大正数和负数表示之间的对称性,并避免引入负偏差。
隐式缩放:INT8编码包含一个隐式缩放因子,使其具有一个符号位、一个整数位和六个小数位。
Table 6. INT8编码细节。
支持的缩放数据类型:以下为MX兼容格式指定的缩放数据类型。
E8M0定义:E8M0是传统带偏置的Float32指数的无符号表示。与Float32指数不同,它没有为Inf的表示,并且只保留了一个NaN编码。
Table 7. 缩放数据类型E8M0的编码细节。
本节描述对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的缩放因子和/或元素可以使用不同的数据类型。点积的内部精度和操作顺序由具体实现定义。通过提出共享缩放因子,点积的规约计算只在元素上进行。
通用点积定义:两个向量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兼容子向量。
转换机制要求:必须提供一种机制,用于将一个长度为k的标量元素向量 $v: [v_i]_{i=1}^k$ 转换为MX兼容格式 $\{S, [e_i]_{i=1}^k \}$, 即生成块缩放因子S和元素$e_i$。特别地,应最少支持以下语义:
其他选项:可以支持将标量元素向量转换为MX兼容格式的其他算法。对于到元素数据类型的量化,实现必须支持roundTiesToEven作为舍入模式,也可以支持其他舍入模式。
本规范文档未提供独立的实验环境或实验结果章节。在章节2.3“影响”中提到,“实验结果表明,本标准中引入的具体MX兼容格式在使用8位或更少位数的情况下,为AI训练和推理实现了稳健的模型准确率”,但未提供支持该结论的具体实验设置、数据集、模型架构或量化结果数据。
本规范文档没有独立的结论部分。它作为一项技术标准,主要侧重于定义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], [3]
[4] IEEE Standard for Floating-Point Arithmetic
[5] OCP FP8 specification