浮点数在科学计算、图像处理、神经网络等领域应用广泛。以AI训练为例,现有的浮点数格式或数值范围不足,或精度不高,这影响了模型的收敛速度和性能。如果要同时满足数值范围和精度的要求,将会导致内存占用过大,从而增加数据存储和传输的成本。基于此种情况,业内提出了一种新的浮点数格式——微缩放(Microscaling,MX)格式。MX格式的浮点数可以支持更低比特位宽的AI训练和推理,并且占用的内存更少。符合MX标准的数据格式在使用8位或更低比特位的情况下,能够实现稳健的AI训练和推理模型精度。
MX格式是一种块数据格式,若干个数据可以组成一个块(或者一个组),数据以块为单位。MX格式的数据由三部分构成:
- 共享缩放因子X,位宽为w bits;
- 私有元素P[object Object]i[object Object],位宽为d bits;
- 块大小k,表示多少个低比特数据形成一个块;
所有k个元素P[object Object]i[object Object]有相同的位宽和数据类型,并且共享一个缩放因子X,每个包含k个元素的块可以使用(w+k*d)位进行编码。元素的数据类型和缩放因子可以独立选择。
下图为MX格式的浮点数的数据结构,S、E和M分别用于表示浮点数的符号、指数和尾数字段的值。其中,共享缩放因子X是一个用于整个数据块的缩放比例因子,它决定了数据块中所有元素的动态范围。通过引入共享缩放因子,MX格式的数据能够在保持低位宽的同时,灵活地表示不同范围的数据。块大小k指的是组成一个数据块(或组)的低比特数据的数量。私有元素P[object Object]i[object Object]是指数据块中的每个低比特数据元素。这些元素经过缩放因子X的调整后,共同表示了一个高精度的浮点数或整数。
图 1 MX格式组成示意图[object Object][object Object]
MX格式的数据类型包含多种,例如MXFP8、MXFP4、MXFP16、MXINT4等。下表列举了(全称Microscaling Matmul)支持的数据类型。
表 1 MxMatmul支持MX格式的数据类型
[object Object][object Object]
[object Object]MxMatmul(全称Microscaling Matmul)为带有量化系数的矩阵乘法,即左矩阵和右矩阵均有对应的量化系数矩阵,左量化系数矩阵scaleA和右量化系数矩阵scaleB。MxMatmul场景中,左量化系数矩阵与左矩阵乘积,右量化系数矩阵与右矩阵乘积,对两个乘积的结果做矩阵乘法。
MxMatmul的计算公式为:C = (scaleA ⊗ A) * (scaleB ⊗ B) + Bias,“⊗”表示广播乘法,左/右矩阵与左/右量化系数矩阵做乘积时,K方向上每32个元素共享一个量化因子,如所示。
- A、scaleA、B、scaleB为源操作数。A为左矩阵,形状为[M, K];scaleA为左量化系数矩阵,形状为[M, K/32];B为右矩阵,形状为[K, N];scaleB为右量化系数矩阵,形状为[K/32, N]。
- C为目的操作数,存放矩阵乘结果的矩阵,形状为[M, N]。
- Bias为矩阵乘偏置,形状为[1, N]。对(scaleA ⊗ A) * (scaleB ⊗ B)结果矩阵的每一行都采用该Bias进行偏置。
图 2 MxMatmul矩阵乘示意图[object Object][object Object]
矩阵A、scaleA、B、scaleB在不同位置中的排布格式分别如下图所示。
图 3 A矩阵在不同位置的排布格式[object Object][object Object]
图 4 B矩阵在不同位置的排布格式[object Object][object Object]
图 5 scaleA矩阵在不同位置的排布格式[object Object][object Object]
图 6 scaleB矩阵在不同位置的排布格式[object Object][object Object]
矩阵计算之前,需要对A、B矩阵进行量化操作的场景。当前该场景下,Matmul输入输出矩阵支持的数据类型如下表所示。
表 2 MxMatmul支持的量化场景
[object Object][object Object]
[object Object]Host侧自动获取Tiling参数的关键步骤介绍如下:
创建Tiling对象。
[object Object]传入硬件平台信息创建PlatformAscendC对象,然后创建Tiling对象,硬件平台信息可以通过GetPlatformInfo获取。
设置A、B、C、Bias的内存逻辑位置、格式、数据类型以及是否转置的信息,设置scaleA、scaleB的内存逻辑位置、格式以及是否转置的信息。
调用、接口,设置scaleA、scaleB的内存逻辑位置、格式以及是否转置。
[object Object]使能MxMatmul场景。
[object Object]设置矩阵shape信息。
[object Object]设置可用空间大小信息。
设置Matmul计算时可用的L1 Buffer/L0C Buffer/Unified Buffer空间大小,-1表示AI处理器对应Buffer的大小。
[object Object]按需设置其他参数,比如设置bias参与计算。
[object Object]获取Tiling参数。
[object Object]Tiling参数的序列化保存等其他操作。
Kernel侧的关键步骤介绍如下:
创建Matmul对象。
[object Object]创建对象时需要传入A、scaleA、B、scaleB、C、Bias的参数类型信息, A、scaleA、B、scaleB类型信息通过来定义,C、Bias类型信息通过来定义,包括:内存逻辑位置、数据格式、数据类型、转置信息。同时,通过模板参数传入表明使能MxMatmul场景。
[object Object]初始化操作。
[object Object]设置左矩阵A、右矩阵B、左量化系数矩阵scaleA、右量化系数矩阵scaleB、Bias。
通过、设置左量化系数矩阵scaleA、右量化系数矩阵scaleB。
[object Object]完成矩阵乘操作。
结束矩阵乘操作。
[object Object]
表 3 MatmulTypeWithScale参数说明
[object Object][object Object]
[object Object]在MxMatmul场景中,如果A与B矩阵的位置同时为GM,对singleKIn没有特殊限制,在这种情况下,若scaleA和scaleB的K方向大小(即Ceil(singleKIn, 32))为奇数,用户需自行在scaleA和scaleB的K方向补0至偶数。例如,当singleKIn为30时,Ceil(singleKIn, 32)为1,用户需要自行在scaleA和scaleB的K方向补0,使K方向为偶数。对于其它A、B矩阵逻辑位置的组合情况,即A与B矩阵的位置不同时为GM,singleKIn以32个元素向上对齐后的数值必须是32的偶数倍。
在MxMatmul场景中,当输入数据类型为fp4x2_e2m1_t/fp4x2_e1m2_t时,内轴必须为偶数。
在MxMatmul场景中,通过将A矩阵和scaleA矩阵的数据格式设置为VECTOR,来开启。在此模式下,A和scaleA矩阵仅支持内存逻辑位置为GM,并且均不支持转置。
A矩阵、B矩阵为UB输入时,矩阵的内轴需要向上32字节对齐,例如,A矩阵的形状为(M, K)时,将K对齐到32字节;A矩阵的形状为(K, M)时,将M对齐到32字节。
scaleA矩阵、scaleB矩阵为UB输入时,矩阵的内轴需要向上32字节对齐,例如,scaleA矩阵的形状为(M, K/32)时,将K/32对齐到32字节;scaleA矩阵的形状为(K/32, M)时,将M对齐到32字节。
当scaleA和scaleB矩阵以ND格式输入时,高阶API在内部实现格式转换时,需要占用UB临时空间。开发者需使用接口配置临时空间,临时空间大小(单位字节)的计算公式如下。
[object Object]