与V1版本的差异:
- V2版本新增了
[object Object]参数,用于在pergroup量化方式(对应float4_e2m1输出类型)中控制目标数据类型的最大值。 - V1版本不支持自定义目标数据类型最大值,默认使用目标精度能表示的最大值。
- V2版本新增了
用户选择建议:
- 若需自定义float4_e2m1量化时的目标数据类型最大值(取值范围6.0-12.0),请选择V2版本。
- 若只需使用默认的目标精度最大值或使用int4/int32量化输出类型,V1和V2版本均可使用。
- 对于需要更精细控制量化范围以优化模型性能或精度的场景,推荐使用V2版本。
接口功能:该融合算子为输入矩阵x依次进行两次小矩阵乘法,即右乘输入矩阵kroneckerP2,左乘输入矩阵kroneckerP1,然后针对矩阵乘的结果进行量化处理。目前支持pertoken和pergroup量化方式,分别对应int4和float4_e2m1量化输出类型。
矩阵乘计算公式:
1.输入x右乘kroneckerP2:
2.kroneckerP1左乘x':
量化计算方式:
pertoken量化方式:
1.沿着x''的0维计算最大绝对值并除以(7 / clipRatio)以计算需量化为INT4格式的量化因子:
2.计算输出的out:
pergroup量化方式:
当dstTypeMax = 0.0时:
1.矩阵乘后x''的shape为[K,M,N],在计算pergroup量化方式其中的mx_quantize时,需reshape为[K,M*N],记为x2
2.在x2第二维上按照groupsize进行分组,包含元素e0,e1...e31。计算出emax
3.计算出reduceMaxValue和sharedExp
4.计算quantScale
5.每groupsize共享一个quantScale,计算out
当dstTypeMax = 6.0/7.0时:
- 将输入x在axis维度上按k = blocksize个数分组,一组k个数 动态量化为 , k = blocksize:
- 量化后的 按对应的 的位置组成输出yOut,mxscale按对应的axis维度上的分组组成输出mxscaleOut。
当dstTypeMax != 0.0/6.0/7.0时:
- 将长向量按块分,每块长度为k,对每块单独计算一个块缩放因子,再把块内所有元素用同一个映射到目标低精度类型FP8。如果最后一块不足k个元素,把缺失值视为0,按照完整块处理。
- 找到该块中数值的最大绝对值:
- 将FP32映射到目标数据类型FP8可表示的范围内,其中当dst_max_value=0时,是目标精度能表示的最大值;当dst_max_value!=0时,是dst_max_value传入值。
将块缩放因子转换为FP8格式下可表示的缩放值。
从块的浮点缩放因子中提取无偏指数和尾数。
为保证量化时不溢出,对指数进行向上取整,且在FP8可表示的范围内:
计算块缩放因子:
计算块转换因子:
应用到量化的最终步骤,对于每个块内元素,,最终输出的量化结果是,其中代表块的缩放因子,这里指,代表块内量化后的数据。
量化后的 按对应的 的位置组成输出yOut,mxscale按对应的axis维度上的分组组成输出mxscaleOut。
每个算子分为,必须先调用[object Object]接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用[object Object]接口执行计算。
- 确定性计算:
- aclnnFlatQuantV2默认确定性实现。