Developers
Download
[object Object]

[object Object][object Object]undefined
[object Object]
  • 接口功能:在-1轴和-2轴上同时进行目的数据类型为FLOAT4类、FLOAT8类的MX量化。在给定的-1轴和-2轴上,每32个数,计算出这两组数对应的量化尺度mxscale1、mxscale2作为输出mxscale1Out、mxscale2Out的对应部分,然后分别对两组数所有元素除以对应的mxscale1或mxscale2,根据round_mode转换到对应的dstType,得到量化结果y1和y2分别作为输出y1Out和y2Out的对应部分。在dstType为FLOAT8_E4M3FN、FLOAT8_E5M2时,根据scaleAlg的取值来指定计算mxscale的不同算法。

  • 合轴说明:算子实现时,会对-2轴(不包含)之前的所有轴进行合轴处理。即对于输入shape为(d0,d1,...,dn3,dn2,dn1)(d_0, d_1, ..., d_{n-3}, d_{n-2}, d_{n-1})的张量,-2轴之前的维度(d0,d1,...,dn3)(d_0, d_1, ..., d_{n-3})会被合并为一个维度,等效于将输入reshape为(d0×d1×...×dn3,dn2,dn1)(d_0 \times d_1 \times ... \times d_{n-3}, d_{n-2}, d_{n-1})后再进行量化计算。

  • 计算公式:

    • 场景1,当scaleAlg为0时,即OCP Microscaling Formats (Mx) Specification实现:

      • 将输入x在-1轴上按照32个数进行分组,一组32个数 {{Vi}i=132}\{\{V_i\}_{i=1}^{32}\} 量化为 {mxscale1,{Pi}i=132}\{mxscale1, \{P_i\}_{i=1}^{32}\}

        shared_exp=floor(log2(maxi(Vi)))emaxshared\_exp = floor(log_2(max_i(|V_i|))) - emax mxscale1=2shared_expmxscale1 = 2^{shared\_exp} Pi=cast_to_dst_type(Vi/mxscale1,round_mode), i from 1 to 32P_i = cast\_to\_dst\_type(V_i/mxscale1, round\_mode), \space i\space from\space 1\space to\space 32
      • 同时,将输入x在-2轴上按照32个数进行分组,一组32个数 {{Vj}j=132}\{\{V_j\}_{j=1}^{32}\} 量化为 {mxscale2,{Pj}j=132}\{mxscale2, \{P_j\}_{j=1}^{32}\}

        shared_exp=floor(log2(maxj(Vj)))emaxshared\_exp = floor(log_2(max_j(|V_j|))) - emax mxscale2=2shared_expmxscale2 = 2^{shared\_exp} Pj=cast_to_dst_type(Vj/mxscale2,round_mode), j from 1 to 32P_j = cast\_to\_dst\_type(V_j/mxscale2, round\_mode), \space j\space from\space 1\space to\space 32
      • -1轴​量化后的 PiP_{i} 按对应的 ViV_{i} 的位置组成输出y1Out,mxscale1按对应的-1轴维度上的分组组成输出mxscale1Out。-2轴​量化后的 PjP_{j} 按对应的 VjV_{j} 的位置组成输出y2Out,mxscale2按对应的-2轴维度上的分组组成输出mxscale2Out。

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

        [object Object]undefined
    • 场景2,当scaleAlg为1时,只涉及FP8类型(CuBALS Scale计算算法):

      • -1轴量化:将输入x在-1轴上按照32个数进行分组,每组长度为32,对每组单独计算一个块缩放因子Sfp32bS_{fp32}^b,再把组内所有元素用同一个Sfp32bS_{fp32}^b映射到目标低精度类型FP8。如果最后一组不足32个元素,把缺失值视为0,按照完整组处理。
        • 找到该组中数值的最大绝对值:Amax(Dfp32b)=max({di}i=132)Amax(D_{fp32}^b)=max(\{|d_{i}|\}_{i=1}^{32})
        • 将FP32映射到目标数据类型FP8可表示的范围内,其中Amax(DType)Amax(DType)是目标精度能表示的最大值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+1,如果Sfp32b为非正规数,且Mfixpb>0.5Eintb,否则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 + 1, & \text{如果} S_{fp32}^b \text{为非正规数,且} M_{fixp}^b > 0.5 \\ 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(dfp32iRfp32b)d^i = DType(d_{fp32}^i \cdot R_{fp32}^b),最终-1轴输出的量化结果是(Sb,[di]i=132)\left(S^b, [d^i]_{i=1}^{32}\right),其中SbS^b代表块的缩放因子,即Sue8m0bS_{ue8m0}^b[di]i=132[d^i]_{i=1}^{32}代表组内量化后的数据。
      • -2轴量化:同时,将输入x在-2轴上按照32个数进行分组,采用与-1轴相同的CuBALS Scale计算算法,对每组独立计算块缩放因子并量化。-2轴输出的量化结果是(Sb,[dj]j=132)\left(S^b, [d^j]_{j=1}^{32}\right)
      • -1轴量化结果组成输出y1Out,对应的块缩放因子组成输出mxscale1Out。-2轴量化结果组成输出y2Out,对应的块缩放因子组成输出mxscale2Out。
    • 场景3,当scaleAlg为2时,只涉及FP4_E2M1类型:

      • 当dstTypeMax = 0.0/6.0/7.0时:
        • -1轴量化:将输入x在-1轴上按照32个数进行分组,一组32个数 {{Vi}i=132}\{\{V_i\}_{i=1}^{32}\} 量化为 {mxscale1,{Pi}i=132}\{mxscale1, \{P_i\}_{i=1}^{32}\}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} \\ mxscale1=2shared_expmxscale1 = 2^{shared\_exp} Pi=cast_to_dst_type(Vi/mxscale1,round_mode), i from 1 to 32P_i = cast\_to\_dst\_type(V_i/mxscale1, round\_mode), \space i\space from\space 1\space to\space 32\\
        • -2轴量化:同时,将输入x在-2轴上按照32个数进行分组,一组32个数 {{Vj}j=132}\{\{V_j\}_{j=1}^{32}\} 采用与-1轴相同的进位计算方法量化为 {mxscale2,{Pj}j=132}\{mxscale2, \{P_j\}_{j=1}^{32}\}
        • ​-1轴量化后的 PiP_{i} 按对应的 ViV_{i} 的位置组成输出y1Out,mxscale1按对应的-1轴维度上的分组组成输出mxscale1Out。-2轴量化后的 PjP_{j} 按对应的 VjV_{j} 的位置组成输出y2Out,mxscale2按对应的-2轴维度上的分组组成输出mxscale2Out。
      • 当dstTypeMax != 0.0/6.0/7.0时:
        • -1轴量化:将输入x在-1轴上按照32个数进行分组,每组长度为32,对每组单独计算一个块缩放因子Sfp32bS_{fp32}^b,再把组内所有元素用同一个Sfp32bS_{fp32}^b映射到目标低精度类型FP4_E2M1。如果最后一组不足32个元素,把缺失值视为0,按照完整组处理。
          • 找到该组中数值的最大绝对值:Amax(Dfp32b)=max({di}i=132)Amax(D_{fp32}^b)=max(\{|d_{i}|\}_{i=1}^{32})
          • 将FP32映射到目标数据类型可表示的范围内,其中当dstTypeMax=0时,Amax(DType)Amax(DType)是目标精度能表示的最大值;当dstTypeMax!=0时,Amax(DType)Amax(DType)是dstTypeMax传入值。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(dfp32iRfp32b)d^i = DType(d_{fp32}^i \cdot R_{fp32}^b),最终-1轴输出的量化结果是(Sb,[di]i=132)\left(S^b, [d^i]_{i=1}^{32}\right),其中SbS^b代表块的缩放因子,即Sue8m0bS_{ue8m0}^b[di]i=132[d^i]_{i=1}^{32}代表组内量化后的数据。
        • -2轴量化:同时,将输入x在-2轴上按照32个数进行分组,采用与-1轴相同的算法,对每组独立计算块缩放因子并量化。-2轴输出的量化结果是(Sb,[dj]j=132)\left(S^b, [d^j]_{j=1}^{32}\right)
        • -1轴量化结果组成输出y1Out,对应的块缩放因子组成输出mxscale1Out。-2轴量化结果组成输出y2Out,对应的块缩放因子组成输出mxscale2Out。
[object Object]

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

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

    [object Object]
  • 返回值:

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

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

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

    [object Object]
  • 返回值:

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

[object Object]
  • 关于x、mxscale1Out、mxscale2Out的shape约束说明如下:
    • rank(mxscale1Out) = rank(x) + 1。
    • rank(mxscale2Out) = rank(x) + 1。
    • mxscale1Out.shape[-2] = (ceil(x.shape[-1] / 32) + 2 - 1) / 2。
    • mxscale2Out.shape[-3] = (ceil(x.shape[-2] / 32) + 2 - 1) / 2。
    • mxscale1Out.shape[-1] = 2。
    • mxscale2Out.shape[-1] = 2。
    • 其他维度与输入x一致。
    • 举例:输入x的shape为[B, M, N],目的数据类型为FP8类时,对应的y1和y2的shape为[B, M, N],mxscale1的shape为[B, M, (ceil(N/32)+2-1)/2, 2],mxscale2的shape为[B, (ceil(M/32)+2-1)/2, N, 2]。
  • 确定性说明:aclnnDynamicMxQuantWithDualAxisV2默认确定性实现。
[object Object]

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

[object Object]