发表时间: 2023-09
文章标题: OCP 微缩放格式 (MX) 规范
作者/机构: AMD, Arm, Intel, Meta, Microsoft, NVIDIA, Qualcomm
一句话结论 本规范由多家科技巨头联合制定,提出并标准化了一种名为微缩放(MX)的开放数据格式家族,通过让一组低位宽数值共享一个缩放因子,在显著降低人工智能训练和推理内存占用的同时,保持了稳健的模型准确率,从而建立了一个可互操作的底层硬件生态系统。
要解决什么问题 当前人工智能训练和推理工作负载对计算资源和内存占用提出极高要求,导致数据中心功耗、散热成本及环境影响急剧上升。原有的标准数据格式在应对日益庞大的模型时,面临着内存带宽受限和计算能效低下的严重卡点。具体到机制层面,若继续使用传统标量数据类型(如高位宽浮点数),不仅占用大量内存空间,矩阵运算时也会消耗过多电力并产生巨大热量。为了在不牺牲模型表现的前提下进一步提升硬件性能、降低运营成本,行业迫切需要一种比现有常规标量数据格式更高效、内存占用更小的数据表示机制。此外,各家硬件厂商过去倾向于采用定制化解决方案,导致软件和基础设施开发成本高昂,因此解决跨平台数据格式的互操作性,避免生态碎片化,也是本规范要攻克的关键阻碍。
怎么做的 核心思路是引入“微缩放”(Microscaling,简称 MX)机制,将传统的标量数据类型转化为高效的矢量数据类型。具体而言,该方法将连续 $k$ 个数值划分为一个缩放块,块内所有私有元素 $e_i$ 采用相同低位宽数据类型,并共享同一个缩放因子 $S$。这种设计使得一个包含 $k$ 个元素的块只需消耗 $w + k \times d$ 位内存(其中 $w$ 为缩放因子的位宽,$d$ 为元素的位宽),从而大幅压缩了存储体积。在数值的推断上,除了处理特殊的非数(NaN)或越界情况外,块内第 $i$ 个元素的实际物理值 $v_i$ 定义为: $$v_i = S \times e_i$$ 关键设计由几个核心部件构成:首先是元素数据类型,规范定义了 MXFP8、MXFP6、MXFP4 和 MXINT8 四种具体格式。其中 FP6 和 FP4 必须支持次规格化数,并取消无穷大(Inf)和非数保留编码以最大化表示范围;在发生溢出时,要求采用饱和截断机制(钳位到该格式的最大量级并保留符号)。INT8 则使用二进制补码编码,但特意废弃了最大负数($-2^7$)以保证正负数表示之间的对称性,避免引入负偏差,且其编码内含一个隐式缩放因子(一符号位、一整数位、六小数位)。其次是缩放数据类型,采用 E8M0(即传统带偏置的 Float32 指数的无符号表示),它没有无穷大表示,仅保留一个非数编码。当缩放因子为非数时,整个块内的所有值均被视为非数,直接忽略元素编码。 这种设计的最大优势体现在矩阵乘法的核心操作——点积运算上。两个长度为 $k$ 的 MX 格式向量 $x$ 和 $y$ 的点积计算公式被优化为: $$z = S^{(x)} S^{(y)} \sum_{i=1}^k e_i^{(x)} e_i^{(y)}$$ 通过提取共享缩放因子,乘加运算可以直接在极低位宽的元素上进行规约计算,最后再统一乘以缩放因子。这不仅绕开了高精度计算的功耗卡点,还大幅降低了硬件乘法器的面积和能耗。在将常规高精度标量向量转换为 MX 格式时,系统会先根据块内元素的最大绝对值确定共享缩放因子 $S$(基于块内最大绝对值和元素类型最大可表示值计算得出),随后将各个元素除以 $S$ 并使用向偶数舍入模式量化到对应的低位宽格式中。
效果如何 由于本文档是由 AMD、Arm、Intel、Meta、Microsoft、NVIDIA 和 Qualcomm 联合发布的底层技术规范标准,而非传统学术论文,因此文中未提供独立的实验环境设置、模型规模、训练数据量、对比基线或具体量化测试结果。文档仅在影响陈述中指出,初步的实验结果表明,采用本标准中引入的 MX 兼容格式(在使用 8 位或更低位宽的情况下),能够在人工智能的训练和推理任务中实现稳健的模型准确率,具备成为主流数据格式的潜力。该规范的主要代价和局限在于,它要求底层硬件实现必须支持特定的舍入模式(如向偶数舍入)、溢出饱和处理以及特殊的次规格化数转换逻辑。此外,规范并未强制规定缩放块在物理内存中的具体布局(缩放因子可以与元素连续存储或分开存储,甚至可以压缩去重),且当编码值绝对值超出 Float32 最大范围时,其行为交由具体实现定义,这在一定程度上增加了跨平台硬件设计的复杂性。
本规范旨在标准化一个开放、公开且可互操作的数据格式家族——微缩放(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