开发者
下载
[object Object]

[object Object][object Object]undefined
[object Object]
  • 接口功能:融合GroupedMatmul、activation和quant,详细解释见计算公式。此接口为WeightNz特化版本,调用者必须传入FRACTAL_NZ格式的weight,接口按该格式解析该参数。当前版本仅支持MX量化场景,激活函数仅支持gelu_tanh。

  • 计算公式:

    [object Object]
    • 定义

      • 表示矩阵乘法。

      • 表示逐元素乘法。

      • gelu_tanh激活函数的数学语义为:

        GELUtanh(x)0.5x(1+tanh(2π(x+0.044715x3)))\text{GELU}_{\text{tanh}}(x) \approx 0.5x \left( 1 + \tanh\left( \sqrt{\frac{2}{\pi}} \left( x + 0.044715 x^3 \right) \right) \right)
      • 当前kernel底层实现使用gelu_sigmoid函数对gelu_tanh进行近似计算,定义为:

        GeluTanh(x)=x1+exp(1.595769121×(x+0.044715×x3))\operatorname{GeluTanh}(x) = \frac{x}{1 + \exp\left(-1.595769121 \times \left(x + 0.044715 \times x^3\right)\right)}

      *EE 表示专家数,MM 表示总token数,KK 表示输入特征维度,NN 表示输出特征维度。

      • blocksizeblocksize 表示MX量化时共享指数的分组大小,当前仅支持64。
    • 输入

      • XX:激活矩阵。
      • groupListgroupList:分组索引列表,按groupListType解释为cumsum或count。
      • weightweight:分组weight矩阵。
      • weightScaleweightScale:weight矩阵量化因子。
      • biasbias:MXFP8场景下必须为空,支持nullptr、空tensorlist或长度为1且元素shape为(0)的空tensorlist。
      • xScaleOptionalxScaleOptional:左矩阵量化因子,对应公式中的xScalexScale
    • 输出

      • YY:激活并量化后的输出矩阵,数据类型由输出Tensor y指定。
      • YScaleYScale:输出量化因子。
    • 计算过程

        1. 根据groupList[i]确定当前分组的token范围,i[0,Len(groupList))i \in [0, Len(groupList))
        1. 根据分组确定的入参进行GroupedMatmul和反量化计算,中间GroupedMatmul结果默认为FLOAT32类型:

        Ci=(Xiweighti)xScalei BroadcastweightScalei BroadcastC_i = (X_i \cdot weight_i) \odot xScale_{i\ Broadcast} \odot weightScale_{i\ Broadcast}

        1. 执行gelu_tanh激活:

        Si=GeluTanh(Ci)S_i = GeluTanh(C_i)

        注:当前kernel底层实现使用gelu_sigmoid函数近似计算gelu_tanh,近似公式见定义。

        1. 对激活结果进行MX量化,目标数据类型DType由输出Tensor y的数据类型指定:
        • 场景1,当scaleAlg为0时,表示OCP实现,将激活结果SiS_i在N轴按k=blocksizek=blocksize分组,一组kk个数{Vj}j=1k\{V_j\}_{j=1}^{k}动态量化为{YScale,{Pj}j=1k}\{YScale, \{P_j\}_{j=1}^{k}\}

          shared_exp=floor(log2(maxj(Vj)))emaxshared\_exp = floor(log_2(max_j(|V_j|))) - emax YScale=2shared_expYScale = 2 ^ {shared\_exp} Pj=cast_to_dst_type(Vj/YScale,roundMode), j from 1 to blocksizeP_j = cast\_to\_dst\_type(V_j / YScale, roundMode), \space j \space from \space 1 \space to \space blocksize

          量化后的PjP_j按对应VjV_j的位置组成输出YYYScaleYScale按对应N轴分组组成输出YScaleYScale

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

            [object Object]undefined
        • 场景2,当scaleAlg为1时,表示cuBLAS实现,只涉及FP8类型。将激活结果SiS_i在N轴按k=blocksizek=blocksize分组,每块单独计算一个块缩放因子Sfp32bS_{fp32}^b,再把块内所有元素用同一个Sfp32bS_{fp32}^b映射到目标FP8类型。如果最后一块不足kk个元素,缺失值视为0并按完整块处理。

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

          Amax(Dfp32b)=max({dj}j=1k)Amax(D_{fp32}^b)=max(\{|d_j|\}_{j=1}^{k})

          将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,再为避免量化溢出对指数向上取整:

          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)}

          对块内每个元素执行量化:

          dj=DType(dfp32jRfp32b), j from 1 to blocksized^j = DType(d_{fp32}^j \cdot R_{fp32}^b), \space j \space from \space 1 \space to \space blocksize

          最终输出的量化结果为(Sb,[dj]j=1k)\left(S^b, [d^j]_{j=1}^{k}\right),其中SbS^b表示块缩放因子Sue8m0bS_{ue8m0}^b[dj]j=1k[d^j]_{j=1}^{k}表示块内量化后的数据。

    [object Object]
[object Object]

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

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

    [object Object]
    • [object Object]Ascend 950PR/Ascend 950DT[object Object]:
      • x仅支持非转置输入,weight支持非转置和转置输入,接口会根据weight和weightScale的形状及转置关系推导weight是否转置。
      • weightScale转置属性需要与weight保持一致。
      • 空Tensor处理规则:
        • weight和weightScale作为必选输入,不支持空tensorlist,tensorlist中的元素不能为nullptr。
        • 支持M为0或N为0的空Tensor场景:x和xScaleOptional支持M为0,weight和weightScale支持N为0;该场景下允许K为0,第一段接口返回ACLNN_SUCCESS,workspaceSize为0;当M和N均不为0时,不支持K为0。
        • 支持groupList为空的空Tensor场景:当groupList为空,且输出y或yScale为空时,第一段接口返回ACLNN_SUCCESS,workspaceSize为0。
  • 返回值

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

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

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

    [object Object]
  • 返回值

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

[object Object]
  • 确定性计算:
    • aclnnGroupedMatmulActivationQuantWeightNz默认确定性实现。
  • 非空Tensor场景下,groupList第1维最小为1,最大为1024。
  • MXFP8量化场景下需满足以下约束条件:
    • 数据类型需要满足下表:

      [object Object]
    • shape约束需要满足下表:

      [object Object]
    • N必须为64整数倍。

[object Object]

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

[object Object]