Ascend C辅助矩阵分形格式详解
辅助矩阵分形格式详解【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkitMX系数矩阵针对Ascend 950PR/Ascend 950DT产品浮点数在科学计算、图像处理、神经网络等领域应用广泛。以AI训练为例现有的浮点数格式或数值范围不足或精度不高这影响了模型的收敛速度和性能。如果要同时满足数值范围和精度的要求将会导致内存占用过大从而增加数据存储和传输的成本。基于此种情况业内提出了一种新的浮点数格式——微缩放MicroscalingMX格式。MX格式的浮点数可以支持更低比特位宽的AI训练和推理并且占用的内存更少。符合MX标准的数据格式在使用8位或更低比特位的情况下能够实现稳健的AI训练和推理模型精度。MX格式是一种块数据格式若干个数据可以组成一个块或者一个组数据以块为单位。MX格式的数据由三部分构成共享缩放因子X位宽为w bits私有元素Pi位宽为d bits块大小k表示多少个低比特数据形成一个块所有k个元素Pi有相同的位宽和数据类型并且共享一个缩放因子X每个包含k个元素的块可以使用wk*d位进行编码。元素的数据类型和缩放因子可以独立选择。下图为MX格式的浮点数的数据结构S、E和M分别用于表示浮点数的符号、指数和尾数字段的值。其中共享缩放因子X是一个用于整个数据块的缩放比例因子它决定了数据块中所有元素的动态范围。通过引入共享缩放因子MX格式的数据能够在保持低位宽的同时灵活地表示不同范围的数据。块大小k指的是组成一个数据块或组的低比特数据的数量。私有元素Pi是指数据块中的每个低比特数据元素。这些元素经过缩放因子X的调整后共同表示了一个高精度的浮点数或整数。图1MX格式组成示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/mx_format.png MX格式组成示意图?utm_sourcegitcode_repo_files)MXMmad为带有量化系数X的矩阵乘法即左矩阵和右矩阵均有对应的量化系数矩阵左量化系数矩阵scaleA和右量化系数矩阵scaleB。计算公式为C (scaleA ⊗ A) * (scaleB ⊗ B) Bias“⊗”表示广播乘法左/右矩阵与左/右量化系数矩阵做乘积时K方向上每32个元素共享一个量化因子。如下图所示其中A为左矩阵形状为[M, K]scaleA为左量化系数矩阵形状为[M, K/32]B为右矩阵形状为[K, N]scaleB为右量化系数矩阵形状为[K/32, N]。图2MX矩阵乘示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/mx_matrix_computation_demo.png MX矩阵乘示意图?utm_sourcegitcode_repo_files)MX scaleA系数矩阵分形介绍物理位置Global Memory/L1 Buffer/Unified Buffer保存离线/在线生成左矩阵量化系数数据。设计原理MX矩阵乘法中A矩阵与scaleA矩阵物理地址上一一映射LoadDataMX矩阵搬运接口要求在L1 Buffer中scaleA矩阵满足行读取需求因此在L1 Buffer上scaleA矩阵为按行存储的小z大Z排布Zz。格式转换过程假设原始A矩阵大小为M, K则对应的scaleA矩阵大小为M, K/32scaleA矩阵被分为M1 * K1个分形按照row major行主序排布形状如Z字形每个分形内部有M0 * K0个元素按照row major行主序排布形状如Z字形所以这种数据格式称为Zz格式。其中(M0, K0)表示一个分形的shape其分形需要与L0A_MX Buffer物理内存排布保持一致且数据类型必须为fp8_e8m0_tshape为16x2。通过公式表达转换过程如下(…, B, M, K/32)-pad-(…, B, M1 * M0, K1 * K0)-reshape-(…, B, M1, M0, K1, K0)-transpose-(…, B, M1, K1, M0, K0)分形大小约束数据类型为fp8_e8m0_t分形大小为16x2M0K0如下图所示若GM上scaleA矩阵为ND排布可以通过ND2NZ.b16/DN2NZ.b16指令搬运到L1 Buffer确保L1 Buffer上分形为Zz排布满足LoadDataMX矩阵搬运接口要求。图3scaleA矩阵在不同位置上的排布格式![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/mx_scaleA_format.png scaleA矩阵在不同位置上的排布格式?utm_sourcegitcode_repo_files)MX scaleB系数矩阵分形介绍物理位置Global Memory/L1 Buffer/Unified Buffer保存离线/在线生成右矩阵量化系数数据。设计原理MX矩阵乘法中B矩阵与scaleB矩阵物理地址上一一映射LoadDataMX矩阵搬运接口要求在L1 Buffer上scaleB矩阵满足列读取需求因此在L1 Buffer上scaleB矩阵为按列存储的大N小n排布Nn。格式转换过程假设原始B矩阵大小为K, N则对应的scaleB矩阵大小为K/32, NscaleB矩阵被分为K1 * N1个分形按照column major列主序排布形状如N字形每个分形内部有K0 * N0个元素按照column major列主序排布形状如n字形所以这种数据格式称为Nn格式。其中K0, N0表示一个分形的shape其分形需要与L0B_MX Buffer物理内存排布保持一致且数据类型必须为fp8_e8m0_tshape为2x16。通过公式表达转换过程如下(…, B, K/32, N)-pad-(…, B, K1 * K0, N1 * N0)-reshape-(…, B, K1, K0, N1, N0)-transpose-(…, B, N1, K1, N0, K0)分形大小约束数据类型为fp8_e8m0_t分形大小为2x16K0N0如下图所示若Global MemoryGM上scaleB矩阵为ND排布可以通过ND2NZ.b16/DN2NZ.b16指令搬运到L1 Buffer确保L1 Buffer上分形为Nn排布满足LoadDataMX矩阵搬运接口要求。图4scaleB矩阵在不同位置上的排布格式![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/mx_scaleB_format.png scaleB矩阵在不同位置上的排布格式?utm_sourcegitcode_repo_files)具体实现可参考MXmmad样例。4选2稀疏索引矩阵针对Atlas A2训练系列产品/Atlas A2推理系列产品和Atlas A3训练系列产品/Atlas A3推理系列产品定义原始B矩阵稠密化过程中生成的索引矩阵。假设原始B矩阵每4个元素有至少2个零元素稠密化的B矩阵是过滤掉2个零的稠密矩阵。场景通常存在于Global MemoryGM中。在进行sparse矩阵运算前通常需要离线生成并将其转换为大Z小n格式Zn以适配Cube单元。生成过程如下图所示对于原始矩阵B中的每4个元素将在index矩阵中生成2个2位索引并按照以下规则进行编码。索引必须在{0, 1, 2}范围内。图5index生成示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/index生成示意图.png index生成示意图?utm_sourcegitcode_repo_files)第一个索引用于指示前3个元素中第1个非零元素的相对位置。第二个索引用于指示第2个非零元素在后3个元素中的相对位置。索引矩阵中的一个uint8的元素是由4个uint2_t组合而成的例如上图生成的索引数据为1 2 0 1 索引数据在Global MemoryGM地址中的排布从高位到低位为1 0 2 1 其中1 0 2 1对应索引矩阵前四位1 2 0 1为一个uint8_t。图6稠密化B矩阵示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/density_B_matrix_demo.png 稠密化B矩阵示意图?utm_sourcegitcode_repo_files)稠密化算法规则具体可参考下表。其中“-”表示不关心该位置上的值因为其后续Sparse Mmad计算过程中会被过滤。示例B矩阵元素0B矩阵元素1B矩阵元素2B矩阵元素3索引数据0索引数据1四个元素里面有两个非零元素00XY2b102b100X0Y2b012b10X00Y2b002b100XY-2b012b01X0Y-2b002b01XY--2b002b00四个元素里面有一个非零元素000X2b002b1000X02b102b000X002b012b00X0002b002b00四个元素里面没有非零元素00002b002b00物理位置GM/L1 Buffer保存离线生成好的索引矩阵数据。设计原理列读取需求sparse矩阵乘法中B矩阵与Index矩阵物理地址上一一映射LoadDataWithSparse指令要求在L1 Buffer上B矩阵与Index矩阵满足列读取需求因此在GM/L1 Buffer上Index矩阵为按列存储的大Z小n排布Zn。格式转换过程假设原始B矩阵大小为K, N则经过4选2稠密化后的B矩阵与Index矩阵大小为K/2, NIndex矩阵被分为K1 * N1个分形按照row major行主序排布形状如Z字形每个分形内部有N0 * K0个元素按照column major列主序排布形状如N字形所以这种数据格式称为Zn格式。其中(N0, K0)表示一个分形的shape其分形需要与B矩阵分形保持一致B矩阵数据类型为int8_t其小分形shape为16*32Index矩阵分形中每个uint8_t数据由4个uint2_t元素拼接而成其元素与B矩阵元素地址一一对应因此分形shape也为16*32但大小为128Byte。通过公式表达转换过程如下(…, B, K/2, N)-pad-(…, B, K1 * K0, N1 * N0)-reshape-(…, B, K1, K0, N1, N0)-transpose-(…, B, K1, N1, N0, K0)分形大小约束存储为uint8数据类型时分形大小为16x8N0K0。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻