昇腾社区首页
中文
注册
开发者
下载

aclnnGroupedMatmulV4

产品支持情况

[object Object]undefined

功能说明

  • 接口功能:实现分组矩阵乘计算,每组矩阵乘的维度大小可以不同。基本功能为矩阵乘,如yi[mi,ni]=xi[mi,ki]×weighti[ki,ni],i=1...gy_i[m_i,n_i]=x_i[m_i,k_i] \times weight_i[k_i,n_i], i=1...g,其中g为分组个数,mi/ki/nim_i/k_i/n_i为对应的维度。输入输出参数类型均为aclTensorList,对应的功能为:

    • k轴分组:kik_i各不相同,但mi/nim_i/n_i每组相同,此时xi/weightix_i/weight_i可以在kik_i上拼接。
    • m轴分组:kik_i各组相同,weighti/yiweight_i/y_i可以在nin_i上拼接。

    相较于接口,此接口新增:

    • 支持groupListOptional中数值为分组轴上每组大小。
    • [object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:
      • 支持静态量化(pertensor+perchannel)(量化方式请参见,下同)BFLOAT16和FLOAT16输出,带激活及不带激活场景
      • 支持动态量化(pertoken+perchannel)BFLOAT16和FLOAT16输出,带激活及不带激活场景。
      • 支持伪量化weight是INT4的输入,不带激活场景,支持perchannel和pergroup两种模式。

说明:

  • 单tensor指一个tensor list中所有分组的tensor在groupType指定的分组轴上合并为1个;否则为多tensor。

  • tensor转置:指若tensor shape为[M,K]时,则stride为[1,M],数据排布为[K,M]的场景,即非连续tensor。

  • 计算公式:

    • 非量化场景:

      yi=xi×weighti+biasiy_i=x_i\times weight_i + bias_i
    • 量化场景(静态量化,T-C && T-T量化,无perTokenScaleOptional):

      yi=(xi×weighti)scalei+offsetiy_i=(x_i\times weight_i) * scale_i + offset_i
      • x为INT8,bias为INT32

        yi=(xi×weighti+biasi)scalei+offsetiy_i=(x_i\times weight_i + bias_i) * scale_i + offset_i
      • x为INT8,bias为BFLOAT16/FLOAT16/FLOAT32,无offset

        yi=(xi×weighti)scalei+biasiy_i=(x_i\times weight_i) * scale_i + bias_i
    • 量化场景(动态量化,T-T && T-C && K-T && K-C量化):

      yi=(xi×weighti)scaleiper_token_scaleiy_i=(x_i\times weight_i) * scale_i * per\_token\_scale_i
      • x为INT8,bias为INT32

        yi=(xi×weighti+biasi)scaleiper_token_scaleiy_i=(x_i\times weight_i + bias_i) * scale_i * per\_token\_scale_i
      • x为INT8,bias为BFLOAT16/FLOAT16/FLOAT32

        yi=(xi×weighti)scaleiper_token_scalei+biasiy_i=(x_i\times weight_i) * scale_i * per\_token\_scale_i + bias_i
    • 量化场景(动态量化,MX && G-B量化):

      yi[m,n]=j=0kLoops1((k=0gsK1(xSliceiweightSlicei))(per_token_scalei[m/gsM,j]scalei[j,n/gsN]))+biasi[n]y_i[m,n] = \sum_{j=0}^{kLoops-1} ((\sum_{k=0}^{gsK-1} (xSlice_i * weightSlice_i)) * (per\_token\_scale_i[m/gsM, j] * scale_i[j, n/gsN])) + bias_i[n]

      其中,gsM,gsN和gsK分别代表M/N/K轴的量化的block size,xSliceixSlice_i代表xix_i第m行长度为gsK的向量,weightSliceiweightSlice_i代表weightiweight_i第n列长度为gsK的向量,K轴均从j * gsK起始切片,j的取值范围[0, kLoops), kLoops=ceil(KiK_i / gsK),支持最后的切片长度不足gsK。

    • 伪量化场景:

      yi=xi×(weighti+antiquant_offseti)antiquant_scalei+biasiy_i=x_i\times (weight_i + antiquant\_offset_i) * antiquant\_scale_i + bias_i

函数原型

每个算子分为,必须先调用“aclnnGroupedMatmulV4GetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小,再调用“aclnnGroupedMatmulV4”接口执行计算。

[object Object]
[object Object]

aclnnGroupedMatmulV4GetWorkspaceSize

  • 参数说明:

    [object Object]
    • [object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:
      • x支持FLOAT16、BFLOAT16、FLOAT32、INT8、INT4
      • weight支持FLOAT16、BFLOAT16、FLOAT32、INT8、INT4,格式支持ND、FRACTAL_NZ
      • biasOptional支持FLOAT16、FLOAT32、INT32
      • scaleOptional支持UINT64、BFLOAT16、FLOAT32
      • perTokenScaleOptional支持FLOAT32
      • out支持FLOAT16、BFLOAT16、INT8、FLOAT32、INT32
      • groupType不支持n轴分组
      • 输入参数x、weight,输出参数out支持最多128个tensor。
  • 返回值:

    返回aclnnStatus状态码,具体参见

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

    [object Object]

aclnnGroupedMatmulV4

  • 参数说明:

    [object Object]
  • 返回值:

    返回aclnnStatus状态码,具体参见

场景分类

[object Object][object Object]

  • GroupedMatmul算子根据计算过程中对输入数据(x, weight)和输出矩阵(out)的精度处理方式,其支持场景主要分为:非量化,伪量化,全量化。

    • [object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:

      [object Object]undefined

[object Object][object Object]

  • 计算公式 [object Object][object Object]

    • 非量化场景:yi=xi×weighti+biasiy_i=x_i\times weight_i + bias_i

    [object Object][object Object]

    • 全量化场景(无perTokenScaleOptional):

      • x为INT8,bias为INT32yi=(xi×weighti+biasi)scalei+offsetiy_i=(x_i\times weight_i + bias_i) * scale_i + offset_i
    • 全量化场景(有perTokenScaleOptional):

      • x为INT8,bias为INT32

        yi=(xi×weighti+biasi)scaleiper_token_scaleiy_i=(x_i\times weight_i + bias_i) * scale_i * per\_token\_scale_i
      • x为INT8,bias为BFLOAT16

        yi=(xi×weighti)scaleiper_token_scalei+biasiy_i=(x_i\times weight_i) * scale_i * per\_token\_scale_i + bias_i
      • x为INT4,无bias

        yi=xi×(weightiscalei)per_token_scaleiy_i=x_i\times (weight_i * scale_i) * per\_token\_scale_i

    [object Object][object Object]

    • 伪量化场景:

      • x为Float16、BFloat16,weight为INT4、INT8(仅支持x、weight、y均为单tensor的场景)。yi=xi×(weighti+antiquant_offseti)antiquant_scalei+biasiy_i=x_i\times (weight_i + antiquant\_offset_i) * antiquant\_scale_i + bias_i

      [object Object][object Object]

      • x为INT8,weight为INT4(仅支持x、weight、y均为单tensor的场景)。其中biasbias为必选参数,是离线计算的辅助结果,且 biasi=8×weightiscaleibias_i=8\times weight_i * scale_i ,并沿k轴规约。yi=((xi8)×weightiscalei+biasi)per_token_scaleiy_i=((x_i - 8) \times weight_i * scale_i+bias_i ) * per\_token\_scale_i

约束说明

  • 确定性计算:
    • aclnnGroupedMatmulV4默认确定性实现。
[object Object]
  • 公共约束

[object Object][object Object] - x和weight若需要转置,转置对应的tensor必须。 - x和weight中每一组tensor的最后一维大小都应小于65536。xix_i的最后一维指当x不转置时xix_i的K轴或当x转置时xix_i的M轴。weightiweight_i的最后一维指当weight不转置时weightiweight_i的N轴或当weight转置时weightiweight_i的K轴。 - 当weight为FRACTAL_NZ格式时,要求weight的Shape满足FRACTAL_NZ格式要求。 - perTokenScaleOptional:一般情况下,只支持1维且长度与x的M相同。仅支持x、weight、out均为单tensor(TensorList长度为1)场景。 - groupListOptional:当输出中TensorList的长度为1时,groupListOptional约束了输出数据的有效部分,groupListOptional中未指定的部分将不会参与更新。 - groupListType为0时要求groupListOptional中数值为非负单调非递减数列,表示分组轴大小的cumsum结果(累积和),groupListType为1时要求groupListOptional中数值为非负数列,表示分组轴上每组大小,groupListType为2时要求 groupListOptional中数值为非负数列,shape为[E, 2],E表示Group大小,数据排布为[[groupIdx0, groupSize0], [groupIdx1, groupSize1]...],其中groupSize为分组轴上每组大小,详见。 - groupType代表需要分组的轴,如矩阵乘为C[m,n]=A[m,k]xB[k,n],则groupType取值-1:不分组,0:m轴分组,1:n轴分组,2:k轴分组。当前不支持n轴分组,详细参考[object Object]groupType支持场景[object Object]约束。 - actType(int64_t,计算输入):整数型参数,代表激活函数类型,取值范围为0-5。

[object Object]
[object Object]

调用示例

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

[object Object]