开发者
资源
[object Object]

[object Object][object Object]undefined
[object Object]
  • 接口功能:RmsNorm算子是大模型常用的归一化操作,相比LayerNorm算子,其去掉了减去均值的部分。DynamicMxQuant算子则是在尾轴上按blocksize分组进行动态MX量化的算子。RmsNormDynamicMxQuant算子将RmsNorm归一化输出给到的DynamicMxQuant算子融合起来,减少搬入搬出操作。在输入尾轴axis上,根据每blocksize=32个数,计算出这组数对应的量化尺度mxscale,然后对这组数每一个除以mxscale,根据round_mode转换到对应的dst_type,得到量化结果y。在dst_type为FLOAT8_E4M3FN、FLOAT8_E5M2时,根据scale_alg的取值来指定计算mxscale的不同算法。

  • 计算公式:

    y=RmsNorm(x)=xRms(x)gamma+beta, where Rms(x)=1ni=1nxi2+epsilony = \operatorname{RmsNorm}(x)=\frac{x}{\operatorname{Rms}(\mathbf{x})}\cdot gamma+beta, \quad \text { where } \operatorname{Rms}(\mathbf{x})=\sqrt{\frac{1}{n} \sum_{i=1}^n x_i^2+epsilon}

    场景1,当scaleAlg为0时:

    • 将RmsNorm输出y在尾轴维度上按k = 32个数分组,一组k个数 {{Vi}i=1k}\{\{V_i\}_{i=1}^{k}\} 动态量化为 {mxscale,{Pi}i=1k}\{mxscale,\{P_i\}_{i=1}^{k}\}
    shared_exp=floor(log2(maxi(Vi)))emaxshared\_exp = floor(log_2(max_i(|V_i|))) - emax mxscale=2shared_expmxscale = 2^{shared\_exp} 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\\
    • emax: 对应数据类型的最大正则数的指数位。

      [object Object]undefined

    场景2,当scaleAlg为1时,只涉及FP8类型:

    • 将长向量按块分,每块长度为k,对每块单独计算一个块缩放因子Sfp32bS_{fp32}^b,再把块内所有元素用同一个Sfp32bS_{fp32}^b映射到目标低精度类型FP8。

    • 找到该块中数值的最大绝对值:

      Amax(Dfp32b)=max({di}i=1k)Amax(D_{fp32}^b)=max(\{|d_{i}|\}_{i=1}^{k})
    • 将FP32映射到目标数据类型FP8可表示的范围内:

      Sfp32b=Amax(Dfp32b)Amax(DType)S_{fp32}^b = \frac{Amax(D_{fp32}^b)}{Amax(DType)}
    • 转换为FP8格式下可表示的缩放值Sue8m0bS_{ue8m0}^b

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

    • 为保证量化时不溢出,对指数进行向上取整:

      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(dfp32iRfp32n)d^i = DType(d_{fp32}^i \cdot R_{fp32}^n)

[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]
  • 边界值场景说明

    • 当输入是Inf时:1、输出yOut为0;2、输出mxscaleOut为255,偶数pad填充值为0;3、输出rstdOut为0。
    • 当输入是NaN时:1、输出yOut为0;2、输出mxscaleOut为255,偶数pad填充值为0;3、输出rstdOut为NaN。
  • 数据格式说明

    所有输入输出Tensor的数据格式推荐使用ND格式,其他数据格式会由框架默认转换成ND格式进行处理。

  • 各产品型号支持数据类型说明

    • Atlas 350 加速卡:

      [object Object]undefined
  • mxscaleOut的shape约束说明如下:

    • rank(mxscaleOut) = rank(x) + 1。
    • mxscaleOut.shape[-2] = (ceil(x.shape[-1] / 32) + 2 - 1) / 2。
    • mxscaleOut.shape[-1] = 2。
    • 其他维度与输入x一致。
  • x的shape约束说明如下:

    • 当输出yOut的数据类型为FLOAT4_E2M1或FLOAT4_E1M2,x尾轴的值必须为偶数。
  • 确定性计算:

    • aclnnRmsNormDynamicMxQuant默认确定性实现。
[object Object]

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

[object Object]