文件最后提交记录最后更新时间
3 个月前
14 天前
14 天前
14 天前
14 天前
14 天前
5 个月前
3 个月前
README

DynamicDualLevelMxQuant

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品 ×
Atlas A2 训练系列产品/Atlas A2 推理系列产品 ×
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×

功能说明

  • 算子功能:目的数据类型为FLOAT4类的MX量化。只对尾轴进行量化,前面所有的轴都合轴处理,通过给定的level0_block_size将输入划分成多个数据块,对每个数据块进行一级量化,输出量化尺度level0_scale;然后将一级量化的结果作为新的输入,并通过给定的level1_block_size将其划分成多个数据块,对每个数据块进行二级量化,输出量化尺度level1_scale,根据round_mode进行数据类型的转换,得到量化结果y。

    • 可选功能:融合smooth scale运算,在对数据输入x进行量化前先进行x=x*smooth_scale(广播逐元素乘法)。
  • 计算公式:

    • 将输入x在尾轴上按k0k_0 = level0_block_size个数分组,一组k0k_0个数 {{xi}i=1k0}\{\{x_i\}_{i=1}^{k_0}\} 动态量化为 {level0scale,{tempi}i=1k0}\{level0_scale, \{temp_i\}_{i=1}^{k_0}\}, k0k_0 = level0_block_size,然后将temp在尾轴上按k1k_1 = level1_block_size个数分组,一组k1k_1个数 {{tempi}i=1k1}\{\{temp_i\}_{i=1}^{k_1}\} 动态量化为 {level1scale,{yi}i=1k1}\{level1_scale, \{y_i\}_{i=1}^{k_1}\}, k1k_1 = level1_block_size

    input_maxi=maxi(abs(xi))input\_max_i = max_i(abs(x_i))

    level0_scalei=input_maxi/(FP4_E2M1_MAX)level0\_scale_i = input\_max_i / (FP4\_E2M1\_MAX)

    tempi=cast_to_x_type(xi/level0_scalei), i from 1 to level0_block_sizetemp_i = cast\_to\_x\_type(x_i / level0\_scale_i), \space i\space from\space 1\space to\space level0\_block\_size

    shared_expi=floor(log2(maxi(∣tempi∣)))−emaxshared\_exp_i = floor(log_2(max_i(|temp_i|))) - emax

    level1_scalei=2shared_expilevel1\_scale_i = 2^{shared\_exp_i}

    yi=cast_to_FP4_E2M1(tempi/level1_scalei,round_mode), i from 1 to level1_block_sizey_i = cast\_to\_FP4\_E2M1(temp_i/level1\_scale_i, round\_mode), \space i\space from\space 1\space to\space level1\_block\_size

    • ​量化后的 yiy_{i} 按对应的 xix_{i} 的位置组成输出y,level0_scaleilevel0\_scale_i按尾轴对应的分组组成输出level0_scalelevel0\_scalelevel1_scaleilevel1\_scale_i按尾轴对应的分组组成输出level1_scalelevel1\_scale

    • max_i代表求第i个分组中的最大值

    • emax: 对应数据类型的最大正则数的指数位。

      DataType emax
      FLOAT4_E2M1 2

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x 输入
  • 表示算子输入的Tensor,对应公式中xi
  • shape支持1-7维,最后一维必须是偶数。
FLOAT16、BFLOAT16 ND
smooth_scale 可选输入
  • 表示用于smooth scale运算的输入;
  • 当不需要融合smooth scale运算时,smooth_scale应传入nullptr;
  • 当smooth_scale不为nullptr时,smooth_scale的dtype需与x一致,且shape为1维,长度等于x最后一维。
FLOAT16、BFLOAT16(且与输入x一致) ND
round_mode 可选属性
  • 表示数据转换的模式,对应公式中的round_mode;
  • 支持{"rint", "round", "floor"};
  • 默认值为"rint"。
STRING -
level0_block_size 可选属性
  • 表示第一级量化的block_size,对应公式中的level0_block_size;
  • 输入范围为{512}。
INT64 -
level1_block_size 可选属性
  • 表示第二级量化的block_size,对应公式中的level1_block_size;
  • 输入范围为{32}。
INT64 -
y 输出
  • 表示输入x量化后的对应结果,对应公式中的yi
  • shape和输入x一致。
FLOAT4_E2M1 ND
level0_scale 输出
  • 表示第一级量化的scale,对应公式中的level0_scale;
  • shape在尾轴上的值,为x尾轴的值除以level0_block_size向上取整
FLOAT32 ND
level1_scale 输出
  • 表示第二级量化的scale,对应公式中的level1_scale;
  • shape的大小为x的dim + 1;
  • shape在最后两轴的值为((ceil(x.shape[-1] / level1_block_size) + 2 - 1) / 2, 2),并对其进行偶数pad,pad填充值为0。
FLOAT8_E8M0 ND

约束说明

  • 关于x、level0_scale、level1_scale的shape约束说明如下:
    • rank(level1_scale) = rank(x) + 1。
    • level0_scale.shape[-1] = ceil(x.shape[-1] / level0_block_size)。
    • level1_scale.shape[-2] = (ceil(x.shape[-1] / level1_block_size) + 2 - 1) / 2。
    • level1_scale.shape[-1] = 2。
    • 其他维度与输入x一致。

调用说明

调用方式 样例代码 说明
aclnn接口 test_aclnn_dynamic_dual_level_mx_quant 通过aclnnDynamicDualLevelMxQuant接口方式调用DynamicDualLevelMxQuant算子。
图模式 - 通过算子IR构图方式调用DynamicDualLevelMxQuant算子。