DynamicBlockMxQuant【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品×Atlas A2 训练系列产品/Atlas A2 推理系列产品×Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品×功能说明算子功能对输入变量以数据块32*32为基本块进行MX量化转换为目的数据类型。在每个基本块中根据scale_alg的取值采取不同的scale算法计算出当前块对应的量化参数scale1*1将其广播为scale132*1和scale21*32输出。同时对基本块中的每一个数除以scale根据round_mode转换到对应的dst_type得到量化结果y。计算公式场景1当scaleAlg为0时将输入x以数据块32*32为基本块进行分组一个数据块的数 ${{V_i}{i1}^{32*32}}$ 量化为 ${scale, {P_i}{i1}^{32*32}}$$$ shared_exp floor(log_2(max_i(|V_i|))) - emax $$$$ scale 2^{shared_exp} $$$$ P_i cast_to_dst_type(V_i/scale, round_mode), \space i\space from\space 1\space to\space 32*32 $$同时将 scale1*1广播为scale132*1和scale21*32作为输出scale1和scale2​量化后的 $P_{i}$ 按对应的 $V_{i}$ 的位置组成输出y。emax: 对应数据类型的最大正则数的指数位。DataTypeemaxFLOAT4_E2M12FLOAT4_E1M20FLOAT8_E4M3FN8FLOAT8_E5M215场景2当scaleAlg为2时只涉及FLOAT4_E2M1类型将长向量按块分每块长度为k对每块单独计算一个块缩放因子$S_{fp32}^b$再把块内所有元素用同一个$S_{fp32}^b$映射到目标低精度类型FP8。如果最后一块不足k个元素把缺失值视为0按照完整块处理。找到该块中数值的最大绝对值: $$ Amax(D_{fp32}^b)max({|d_{i}|}_{i1}^{k}) $$引入新的属性 dst_type_max。dst_type_max类型为float默认值为0。默认输出时代表max_type为目标数据类型的最大值如果传入其他数值则需要按照传入的数值计算scale有效值当前支持0.0、6.0和7.0只支持在FLOAT4_E2M1场景设置该值。将FP32映射到目标数据类型FLOAT4_E2M1可表示的范围内。 $$ S_{fp32}^b \frac{Amax(D_{fp32}^b)}{dst_type_max} $$将块缩放因子$S_{fp32}^b$转换为FP8格式下可表示的缩放值$S_{ue8m0}^b$从块的浮点缩放因子$S_{fp32}^b$中提取无偏指数$E_{int}^b$和尾数$M_{fixp}^b$为保证量化时不溢出对指数进行向上取整且在FP8可表示的范围内 $$ E_{int}^b \begin{cases} E_{int}^b 1, \text{如果} S_{fp32}^b \text{为正规数且} E_{int}^b 254 \text{且} M_{fixp}^b 0 \ E_{int}^b, \text{其余情况} \end{cases} $$计算块缩放因子$S_{ue8m0}^b2^{E_{int}^b}$计算块转换因子$R_{fp32}^b\frac{1}{fp32(S_{ue8m0}^b)}$应用到量化的最终步骤对于每个块内元素$d^i DType(d_{fp32}^i \cdot R_{fp32}^n)$最终输出的量化结果是$\left(S^b, [d^i]{i1}^k\right)$其中$S^b$代表块的缩放因子这里指$S{ue8m0}^b$$[d^i]_{i1}^k$代表块内量化后的数据。参数说明参数名输入/输出/属性描述数据类型数据格式x输入表示输入x对应公式中$V_i$。当dst_type为FLOAT4_E2M1、FLOAT4_E1M2时x的最后一维必须是偶数。FLOAT16、BFLOAT16NDround_mode可选属性表示数据转换的模式对应公式中的round_mode。当dst_type为40/41对应输出y的数据类型为FLOAT4_E2M1/FLOAT4_E1M2时支持{rint, floor, round}当dst_type为35/36对应输出y的数据类型为FLOAT8_E5M2/FLOAT8_E4M3FN时仅支持{rint}传入空指针时采用rint模式。STRING-dst_type输入表示指定数据转换后y的类型。输入范围为{35, 36, 40, 41}分别对应输出y1和y2的数据类型为{35:FLOAT8_E5M2, 36:FLOAT8_E4M3FN, 40:FLOAT4_E2M1, 41:FLOAT4_E1M2}INT64-scale_alg输入表示scale的计算方法。当前仅支持取值0和2分别代表OCP Microscaling Formats (Mx) Specification和Dynamic Dtype Range实现。INT64-dst_type_max输入表示max_type为目标数据类型的最大值。在scale_alg2dst_type为FLOAT4_E2M1时生效需要按照传入的数值计算scale。有效值当前支持取值为0.0/6.0/7.0只支持在FLOAT4_E2M1场景设置该值。FLOAT-y输出表示输入x量化后的对应结果对应公式中的$P_i$。shape和输入x一致。FLOAT4_E2M1、FLOAT4_E1M2、FLOAT8_E4M3FN、FLOAT8_E5M2NDscale1输出表示-1轴每个分组对应的量化尺度对应公式中的scale广播的scale1。shape为x的-1轴的值除以32向上取整并对其进行偶数padpad填充值为0。FLOAT8_E8M0NDscale2输出表示-2轴每个分组对应的量化尺度对应公式中的scale广播的scale2。shape为x的-2轴的值除以32向上取整并对其进行偶数padpad填充值为0scale2输出需要对每两行数据进行交织处理。FLOAT8_E8M0ND约束说明关于x、scale1、scale2的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/64), 2]scale2的shape为[B, ceil(M/64), N, 2]。调用说明调用方式样例代码说明aclnn接口test_aclnn_dynamic_block_mx_quant通过aclnnDynamicBlockMxQuant接口方式调用DynamicBlockMxQuant算子。图模式-通过算子IR构图方式调用DynamicBlockMxQuant算子。【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考