开发者
下载
[object Object]

[object Object][object Object]undefined
[object Object]
  • 与V1版本的差异

    • V2版本新增了[object Object]参数,用于在pergroup量化方式(对应float4_e2m1输出类型)中控制目标数据类型的最大值。
    • V1版本不支持自定义目标数据类型最大值,默认使用目标精度能表示的最大值。
  • 用户选择建议

    • 若需自定义float4_e2m1量化时的目标数据类型最大值(取值范围6.0-12.0),请选择V2版本。
    • 若只需使用默认的目标精度最大值或使用int4/int32量化输出类型,V1和V2版本均可使用。
    • 对于需要更精细控制量化范围以优化模型性能或精度的场景,推荐使用V2版本。
  • 接口功能:该融合算子为输入矩阵x依次进行两次小矩阵乘法,即右乘输入矩阵kroneckerP2,左乘输入矩阵kroneckerP1,然后针对矩阵乘的结果进行量化处理。目前支持pertoken和pergroup量化方式,分别对应int4和float4_e2m1量化输出类型。

  • 矩阵乘计算公式:

    1.输入x右乘kroneckerP2:

    x=x@kroneckerP2x' = x @ kroneckerP2

    2.kroneckerP1左乘x':

    x=kroneckerP1@xx'' = kroneckerP1@x'
  • 量化计算方式:

    pertoken量化方式:

    1.沿着x''的0维计算最大绝对值并除以(7 / clipRatio)以计算需量化为INT4格式的量化因子:

    quantScale=[max(abs(x[0,:,:])),max(abs(x[1,:,:])),...,max(abs(x[K,:,:]))]/(7/clipRatio)quantScale = [max(abs(x''[0,:,:])),max(abs(x''[1,:,:])),...,max(abs(x''[K,:,:]))]/(7 / clipRatio)

    2.计算输出的out:

    out=x/quantScaleout = x'' / quantScale

    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

      emax=max(e0,e1....e31)emax = max(e0,e1....e31)

      3.计算出reduceMaxValue和sharedExp

      reduceMaxValue=log2(reduceMax(x2),groupSize=32)reduceMaxValue = log2(reduceMax(x2),groupSize=32) sharedExp[K,MN/32]=reduceMaxValueemaxsharedExp[K,M*N/32] = reduceMaxValue -emax

      4.计算quantScale

      quantScale[K,MN/32]=2sharedExp[K,MN/32]quantScale[K,M*N/32] = 2 ^ {sharedExp[K,M*N/32]}

      5.每groupsize共享一个quantScale,计算out

      out=x2/quantScaleout = x2 / quantScale
    • 当dstTypeMax = 6.0/7.0时:

      • 将输入x在axis维度上按k = blocksize个数分组,一组k个数 {{Vi}i=1k}\{\{V_i\}_{i=1}^{k}\} 动态量化为 {mxscale1,{Pi}i=1k}\{mxscale1, \{P_i\}_{i=1}^{k}\}, k = blocksize:
      shared_exp={ceil(log2(maxi(Vi)))emax,如果尾数位的高比特前一/两位为1,且尾数不全为0floor(log2(maxi(Vi)))emax,其它shared\_exp = \begin{cases} ceil(log_2(max_i(|V_i|))) - emax, & \text{如果} 尾数位的高比特前一/两位 \text{为1,且尾数不全为0} \\ floor(log_2(max_i(|V_i|))) - emax, & \text{其它} \end{cases} \\ Pi=cast_to_dst_type(Vi/mxscale,round_mode), i from 1 to blocksizeP_i = cast\_to\_dst\_type(V_i/mxscale, round\_mode), \space i\space from\space 1\space to\space blocksize\\
      • ​量化后的 PiP_{i} 按对应的 ViV_{i} 的位置组成输出yOut,mxscale按对应的axis维度上的分组组成输出mxscaleOut。
    • 当dstTypeMax != 0.0/6.0/7.0时:

      • 将长向量按块分,每块长度为k,对每块单独计算一个块缩放因子Sfp32bS_{fp32}^b,再把块内所有元素用同一个Sfp32bS_{fp32}^b映射到目标低精度类型FP8。如果最后一块不足k个元素,把缺失值视为0,按照完整块处理。
      • 找到该块中数值的最大绝对值:
      Amax(Dfp32b)=max({di}i=1k)Amax(D_{fp32}^b)=max(\{|d_{i}|\}_{i=1}^{k})
      • 将FP32映射到目标数据类型FP8可表示的范围内,其中当dst_max_value=0时,Amax(DType)Amax(DType)是目标精度能表示的最大值;当dst_max_value!=0时,Amax(DType)Amax(DType)是dst_max_value传入值。
      Sfp32b=Amax(Dfp32b)Amax(DType)S_{fp32}^b = \frac{Amax(D_{fp32}^b)}{Amax(DType)}
      • 将块缩放因子Sfp32bS_{fp32}^b转换为FP8格式下可表示的缩放值Sue8m0bS_{ue8m0}^b

      • 从块的浮点缩放因子Sfp32bS_{fp32}^b中提取无偏指数EintbE_{int}^b和尾数MfixpbM_{fixp}^b

      • 为保证量化时不溢出,对指数进行向上取整,且在FP8可表示的范围内:

        Eintb={Eintb+1,如果Sfp32b为正规数,且Eintb<254Mfixpb>0Eintb,否则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}
      • 计算块缩放因子:Sue8m0b=2EintbS_{ue8m0}^b=2^{E_{int}^b}

      • 计算块转换因子:Rfp32b=1fp32(Sue8m0b)R_{fp32}^b=\frac{1}{fp32(S_{ue8m0}^b)}

      • 应用到量化的最终步骤,对于每个块内元素,di=DType(dfp32iRfp32n)d^i = DType(d_{fp32}^i \cdot R_{fp32}^n),最终输出的量化结果是(Sb,[di]i=1k)\left(S^b, [d^i]_{i=1}^k\right),其中SbS^b代表块的缩放因子,这里指Sue8m0bS_{ue8m0}^b[di]i=1k[d^i]_{i=1}^k代表块内量化后的数据。

      • ​量化后的 PiP_{i} 按对应的 ViV_{i} 的位置组成输出yOut,mxscale按对应的axis维度上的分组组成输出mxscaleOut。

[object Object]

每个算子分为,必须先调用[object Object]接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用[object Object]接口执行计算。

[object Object]
[object Object]
[object Object]
  • 参数说明

    [object Object]
  • 返回值

    aclnnStatus:返回状态码,具体参见

    第一段接口完成入参校验,出现以下场景时报错:

    [object Object]
[object Object]
  • 参数说明

    [object Object]
  • 返回值

    aclnnStatus:返回状态码,具体参见

[object Object]
  • 确定性计算:
    • aclnnFlatQuantV2默认确定性实现。
[object Object]

示例代码如下,仅供参考,具体编译和执行过程请参考

[object Object]