接口功能:对输入变量,以数据块(32*32)为基本块进行MX量化转换为目的数据类型。在每个基本块中,根据scaleAlg的取值采取不同的scale算法计算出当前块对应的量化参数scale(1*1),将其广播为scale1(32*1)和scale2(1*32)输出。同时对基本块中的每一个数除以scale,根据round_mode转换到对应的dst_type,得到量化结果y。
计算公式:
场景1,当scaleAlg为0时:
将输入x以数据块(32*32)为基本块进行分组,一个数据块的数 量化为
同时将 scale(1*1)广播为scale1(32*1)和scale2(1*32)作为输出scale1和scale2,量化后的 按对应的 的位置组成输出y。
emax: 对应数据类型的最大正规数的指数位。
[object Object]undefined
场景2,当scaleAlg为2时,只涉及FLOAT4_E2M1类型:
- 将长向量按块分,每块长度为k,对每块单独计算一个块缩放因子,再把块内所有元素用同一个映射到目标低精度类型FLOAT4_E2M1,scale存储类型为FLOAT8_E8M0。如果最后一块不足k个元素,把缺失值视为0,按照完整块处理。
- 找到该块中数值的最大绝对值:
- 引入新的属性 dst_type_max。dst_type_max类型为float,默认值为0。默认输出时代表max_type为目标数据类型的最大值,如果传入其他数值,则需要按照传入的数值计算scale,有效值当前支持0.0、6.0和7.0,只支持在FLOAT4_E2M1场景设置该值。
- 将FP32映射到目标数据类型FLOAT4_E2M1可表示的范围内。
- 将块缩放因子转换为FP8格式下可表示的缩放值
- 从块的浮点缩放因子中提取无偏指数和尾数
- 为保证量化时不溢出,对指数进行向上取整,且在FP8可表示的范围内:
- 计算块缩放因子:
- 计算块转换因子:
- 应用到量化的最终步骤,对于每个块内元素,,最终输出的量化结果是,其中代表块的缩放因子,这里指,代表块内量化后的数据。
每个算子分为,必须先调用"aclnnDynamicBlockMxQuantGetWorkspaceSize"接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用"aclnnDynamicBlockMxQuant"接口执行计算。
[object Object]
[object Object]
- 关于x、scale1Out、scale2Out的shape约束说明如下:
- x的维度应该为2~3。
- rank(scale1) = rank(x) + 1。
- rank(scale2) = rank(x) + 1。
- scale1.shape[-2] = (ceil(x.shape[-1] / 32) + 2 - 1) / 2。
- scale2.shape[-3] = (ceil(x.shape[-2] / 32) + 2 - 1) / 2。
- scale1.shape[-1] = 2。
- scale2.shape[-1] = 2。
- 其他维度与输入x一致。
- 举例:输入x的shape为[B, M, N],目的数据类型为FP8类时,对应的y的shape为[B, M, N],scale1的shape为[B, M, (ceil(N/32) + 2 - 1) / 2, 2],scale2的shape为[B, (ceil(M / 32) + 2 - 1) / 2, N, 2]。
- 确定性说明:aclnnDynamicBlockMxQuant默认确定性实现。
[object Object]