| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 个月前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 14 天前 | ||
| 5 个月前 | ||
| 3 个月前 |
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\_scale,level1_scaleilevel1\_scale_i按尾轴对应的分组组成输出level1_scalelevel1\_scale。
-
max_i代表求第i个分组中的最大值
-
emax: 对应数据类型的最大正则数的指数位。
DataType emax FLOAT4_E2M1 2
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 |
|
FLOAT16、BFLOAT16 | ND |
| smooth_scale | 可选输入 |
|
FLOAT16、BFLOAT16(且与输入x一致) | ND |
| round_mode | 可选属性 |
|
STRING | - |
| level0_block_size | 可选属性 |
|
INT64 | - |
| level1_block_size | 可选属性 |
|
INT64 | - |
| y | 输出 |
|
FLOAT4_E2M1 | ND |
| level0_scale | 输出 |
|
FLOAT32 | ND |
| level1_scale | 输出 |
|
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算子。 |