GroupedMatmul

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品
Atlas 训练系列产品 ×
Kirin X90 处理器系列产品
Kirin 9030 处理器系列产品

功能说明

  • 算子功能:实现分组矩阵乘计算。如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为分组个数。当前支持m轴和k轴分组,对应的功能为:

    • m轴分组:kik_inin_i各组相同,mim_i可以不相同。
    • k轴分组:mim_inin_i各组相同,kik_i可以不相同。
  • 计算公式:

    • 非量化场景:

    yi=xi×weighti+biasi y_i=x_i\times weight_i + bias_i

    • 量化场景(静态量化,T-C && T-T量化,无perTokenScaleOptional):

    yi=(xi×weighti)∗scalei+offseti y_i=(x_i\times weight_i) * scale_i + offset_i

    - x为INT8,bias为INT32
    $$
      y_i=(x_i\times weight_i + bias_i) * scale_i + offset_i
    $$
    - x为INT8,bias为BFLOAT16/FLOAT16/FLOAT32,无offset
    $$
      y_i=(x_i\times weight_i) * scale_i + bias_i
    $$
    
    • 量化场景(动态量化,T-T && T-C && K-T && K-C量化):

    yi=(xi×weighti)∗scalei∗per_token_scalei y_i=(x_i\times weight_i) * scale_i * per\_token\_scale_i

    - x为INT8,bias为INT32
    $$
      y_i=(x_i\times weight_i + bias_i) * scale_i * per\_token\_scale_i
    $$
    - x为INT8,bias为BFLOAT16/FLOAT16/FLOAT32
    $$
      y_i=(x_i\times weight_i) * scale_i * per\_token\_scale_i  + bias_i
    $$
    
    • 量化场景(动态量化,MX && G-B量化):

    yi[m,n]=∑j=0kLoops−1((∑k=0gsK−1(xSlicei∗weightSlicei))∗(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。

    • 伪量化场景:
      • x为Float16、BFloat16,weight为INT4、INT8(仅支持x、weight、y均为单tensor的场景)。

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

    - x为INT8,weight为INT4(仅支持x、weight、y均为单tensor的场景)。其中$bias$为必选参数,是离线计算的辅助结果,且 $bias_i=8\times weight_i  * scale_i$ ,并沿k轴规约。
    

    yi=((xi−8)×weighti∗scalei+biasi)∗per_token_scalei y_i=((x_i - 8) \times weight_i * scale_i+bias_i ) * per\_token\_scale_i

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x 输入 公式中的输入`x`。 FLOAT1、FLOAT16、INT161、INT8、INT41、BFLOAT16、FLOAT8_E5M22、FLOAT8_E4M3FN2、HIFLOAT82 ND
weight 输入 公式中的`weight`。 FLOAT1、FLOAT16、INT161、INT8、INT4、BFLOAT16、FLOAT8_E5M22、FLOAT8_E4M3FN2、HIFLOAT82 ND/NZ
biasOptional 可选输入 公式中的`bias`。 FLOAT、FLOAT16、INT32、BFLOAT162 ND
scaleOptional 可选输入 公式中的`scale`,代表量化参数中的缩放因子。 FLOAT、UINT64、BFLOAT16、FLOAT8_E8M02、INT642 ND
offsetOptional 可选输入 公式中的`offset`,代表量化参数中的偏移量。 FLOAT ND
antiquantScaleOptional 可选输入 公式中的`antiquant_scale`,代表伪量化参数中的缩放因子。 FLOAT16、BFLOAT16 ND
antiquantOffsetOptional 可选输入 公式中的`antiquant_offset`,代表伪量化参数中的缩放因子。 FLOAT16、BFLOAT16 ND
perTokenScaleOptional 可选输入 公式中的`per_token_scale`,代表量化参数中的由x量化引入的缩放因子。 FLOAT、FLOAT8_E8M02 ND
groupListOptional 可选输入 代表输入和输出分组轴方向的matmul大小分布。 INT64 ND
activationInputOptional 可选输入 代表激活函数的反向输入,当前只支持传入nullptr。 - -
activationQuantScaleOptional 可选输入 当前只支持传入nullptr。 - -
activationQuantOffsetOptional 可选输入 当前只支持传入nullptr。 - -
splitItem 属性 代表输出是否要做tensor切分。 INT64 -
groupType 属性 代表需要分组的轴。 INT64 -
groupListType 属性 代表groupList输入的分组方式。 INT64 -
actType 属性 代表激活函数类型。 INT64 -
tuningConfigOptional 可选输入 代表各个专家处理的token数的预期值,用于优化tiling。 INT64 -
out 输出 公式中的输出`y`。 FLOAT、FLOAT16、INT321、INT81、BFLOAT16 -
activationFeatureOutOptional 输出 激活函数的输入数据,当前只支持传入nullptr。 - -
dynQuantScaleOutOptional 输出 当前只支持传入nullptr。 - -
  • Ascend 950PR/Ascend 950DT AI处理器:

    • 上表数据类型列中的角标“1”代表该系列不支持的数据类型。
    • 输入参数x、weight均不支持INT16类型,且x不支持int4类型。
    • 输出参数out不支持INT32、INT8类型。
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品、Atlas A3 训练系列产品/Atlas A3 推理系列产品:

    • 上表数据类型列中的角标“2”代表该系列不支持的数据类型。
    • 不支持FLOAT8_E5M2、FLOAT8_E4M3FN、HIFLOAT8、FLOAT8_E8M0类型。
    • 输入参数biasOptional不支持BFLOAT16。
    • 输入参数scaleOptional不支持INT64类型。
  • Kirin X90/Kirin 9030 处理器系列产品: 不支持BFLOAT16、FLOAT8_E5M2、FLOAT8_E4M3FN、FLOAT8_E8M0、HIFLOAT8。

约束说明

  • Atlas A2 训练系列产品/Atlas A2 推理系列产品、Atlas A3 训练系列产品/Atlas A3 推理系列产品:

    • 输入数据类型和格式如下说明(1.除weight外,其余格式都为ND;2.groupList是否传值与使用场景有关,具体请参考groupType支持场景约束):

      类型 x weight bias scale offset antiquantScale antiquantOffset perTokenScale groupList activationInput activationQuantScale activationQuantOffset out
      非量化 FLOAT FLOAT (ND) FLOAT/null null null null null null INT64 null null null FLOAT
      非量化 FLOAT16 FLOAT16 (ND/NZ) FLOAT16/null null null null null null INT64 null null null FLOAT16
      非量化 BFLOAT16 BFLOAT16(ND/NZ) FLOAT/null null null null null null INT64 null null null BFLOAT16
      伪量化 FLOAT16 INT8 (ND) FLOAT16/null null null FLOAT16 FLOAT16 null INT64 null null null FLOAT16
      伪量化 BFLOAT16 INT8 (ND) FLOAT/null null null BFLOAT16 BFLOAT16 null INT64 null null null BFLOAT16
      伪量化 FLOAT16 INT4 (ND) FLOAT16/null null null FLOAT16 FLOAT16 null INT64 null null null FLOAT16
      伪量化 BFLOAT16 INT4 (ND) FLOAT/null null null BFLOAT16 BFLOAT16 null INT64 null null null BFLOAT16
      伪量化 INT8 INT4 (ND/NZ) FLOAT UINT64 null null null FLOAT INT64 null null null BFLOAT16
      伪量化 INT8 INT4 (ND/NZ) FLOAT UINT64 FLOAT/null null null FLOAT INT64 null null null FLOAT16
      量化 INT8 INT8 (ND) INT32/null UINT64 null null null null INT64 null null null INT8
      量化 INT8 INT8 (ND) INT32/null BFLOAT16 null null null FLOAT/null INT64 null null null BFLOAT16
      量化 INT8 INT8 (ND) INT32/null FLOAT null null null FLOAT/null INT64 null null null FLOAT16
      量化 INT8 INT8 (ND/NZ) INT32/null null null null null null INT64 null null null INT32
      量化 INT8 INT8 (NZ) INT32/null BFLOAT16 null null null FLOAT/null INT64 null null null BFLOAT16
      量化 INT8 INT8 (NZ) INT32/null FLOAT null null null FLOAT/null INT64 null null null FLOAT16
      量化 INT4 INT4 (ND/NZ) null UINT64 null null null FLOAT/null INT64 null null null FLOAT16/BFLOAT16
    • x和weight中每一组tensor的最后一维大小都应小于65536。xix_i的最后一维指当x不转置时xix_i的K轴或当x转置时xix_i的M轴。weightiweight_i的最后一维指当weight不转置时weightiweight_i的N轴或当weight转置时weightiweight_i的K轴。

    • x和weight若需要转置,转置对应的tensor必须非连续。

    • 伪量化场景shape约束:

      • 伪量化场景下,若weight的类型为INT8,仅支持perchannel模式;若weight的类型为INT4,对称量化支持perchannel和pergroup两种模式。若为pergroup,pergroup数G或GiG_i必须要能整除对应的kik_i。若weight为多tensor,定义pergroup长度si=ki/Gis_i = k_i / G_i,要求所有si(i=1,2,...g)s_i(i=1,2,...g)都相等。非对称量化支持perchannel模式。

      • 伪量化场景下若weight的类型为INT4,则weight中每一组tensor的最后一维大小都应是偶数。weightiweight_i的最后一维指weight不转置时weightiweight_i的N轴或当weight转置时weightiweight_i的K轴。并且在pergroup场景下,当weight转置时,要求pergroup长度sis_i是偶数。

      • 伪量化参数antiquantScaleOptional和antiquantOffsetOptional的shape要满足下表(其中g为matmul组数,G为pergroup数,GiG_i为第i个tensor的pergroup数):

        使用场景 子场景 shape限制
        伪量化perchannel weight单 [g,n][g, n]
        伪量化perchannel weight多 [ni][n_i]
        伪量化pergroup weight单 [g,G,n][g, G, n]
        伪量化pergroup weight多 [Gi,ni][G_i, n_i]
      • x为INT8、weight为INT4场景支持对称量化和非对称量化:

        • 对称量化场景:
          • 该场景下输出out的dtype为BFLOAT16或FLOAT16。
          • 该场景下offsetOptional为空。
          • 该场景下仅支持count模式(算子不会检查groupListType的值),k要求为quantGroupSize的整数倍,且要求k <= 18432。其中quantGroupSize为k方向上pergroup量化长度,当前支持quantGroupSize=256。
          • 该场景下scale为pergroup与perchannel离线融合后的结果,shape要求为[e,quantGroupNum,n][e, quantGroupNum, n],其中quantGroupNum=k÷quantGroupSizequantGroupNum=k \div quantGroupSize
          • Bias为计算过程中离线计算的辅助结果,值要求为8×weight×scale8\times weight \times scale,并在第1维累加,shape要求为[e,n][e, n]
          • 该场景下要求n为8的整数倍。
        • 非对称量化场景:
          • 该场景下输出out的dtype为FLOAT16。
          • 该场景下仅支持count模式(算子不会检查groupListType的值)。
          • 该场景下{k, n}要求为{7168, 4096}或者{2048, 7168}。
          • scale为pergroup与perchannel离线融合后的结果,shape要求为[e,1,n][e, 1, n]
          • 该场景下offsetOptional不为空。非对称量化offsetOptional为计算过程中离线计算辅助结果,即antiquantOffset×scaleantiquantOffset \times scale,shape要求为[e,1,n][e, 1, n],dtype为FLOAT32。
          • Bias为计算过程中离线计算的辅助结果,值要求为8×weight×scale8\times weight \times scale,并在第1维累加,shape要求为[e,n][e, n]
          • 该场景下要求n为8的整数倍。
    • 量化场景下,若weight的类型为INT4,需满足以下约束(其中g为matmul组数,G为k轴被pergroup划分后的组数):

      • weight的数据格式为ND时,要求n为8的整数倍。
      • 支持perchannel和pergroup量化。perchannel场景的scale的shape需为[g,n][g, n],pergroup场景需为[g,G,n][g, G, n]
      • pergroup场景下,GG必须要能整除kk,且k/Gk/G需为偶数。
      • 该场景仅支持groupType=0(x,weight,y均为单tensor),actType=0,groupListType=0/1。
      • 该场景不支持weight转置。
    • 仅量化场景 (per-token)、反量化场景支持激活函数计算。

    • 不同groupType支持场景:

      • 伪量化仅支持groupType为-1和0场景。
      • 量化仅支持groupType为0场景。
      • x、weight、y的输入类型为aclTensorList,表示一个aclTensor类型的数组对象。下面表格支持场景用“单”表示由一个aclTensor组成的aclTensorList,“多”表示由多个aclTensor组成的aclTensorList。例如“单多单”,分别表示x为单tensor、weight为多tensor、y为单tensor。
      groupType 支持场景 splitItem groupListOptional 转置 其余场景限制
      -1 多多多 0/1 groupListOptional必须传空 1)x不支持转置
      2)支持weight转置,但weight的tensorList中每个tensor是否转置需保持统一
      1)x中tensor要求维度一致,支持2-6维,weight中tensor需为2维,y中tensor维度和x保持一致
      0 单单单 2/3 1)必须传groupListOptional
      2)当groupListType为0时,最后一个值应小于等于x中tensor的第一维;当groupListType为1时,数值的总和应小于等于x中tensor的第一维;当groupListType为2时,第二列数值的总和应小于等于x中tensor的第一维
      3)groupListOptional第1维最大支持1024,即最多支持1024个group
      1)x不支持转置
      2)支持weight转置,A8W4与A4W4场景不支持weight转置
      1)weight中tensor需为3维,x,y中tensor需为2维
      0 单多单 2/3 1)必须传groupListOptional
      2)当groupListType为0时,最后一个值应小于等于x中tensor的第一维;当groupListType为1时,数值的总和应小于等于x中tensor的第一维;当groupListType为2时,第二列数值的总和应小于等于x中tensor的第一维
      3)groupListOptional第1维最大支持128,即最多支持128个group
      1)x不支持转置
      2)支持weight转置,但weight的tensorList中每个tensor是否转置需保持统一
      1)x,weight,y中tensor需为2维
      2)weight中每个tensor的N轴必须相等
      0 多多单 2/3 1)groupListOptional可选
      2)若传入groupListOptional,当groupListType为0时,groupListOptional的差值需与x中tensor的第一维一一对应;当groupListType为1时,groupListOptional的数值需与x中tensor的第一维一一对应;当groupListType为2时,groupListOptional第二列的数值需与x中tensor的第一维一一对应
      3)groupListOptional第1维最大支持128,即最多支持128个group
      1)x不支持转置
      2)支持weight转置,但weight的tensorList中每个tensor是否转置需保持统一
      1)x,weight,y中tensor需为2维
      2)weight中每个tensor的N轴必须相等
      2 单单单 2/3 1)必须传groupListOptional
      2)当groupListType为0时,最后一个值应小于等于x中tensor的第二维;当groupListType为1时,数值的总和与x应小于等于tensor的第二维;当groupListType为2时,第二列数值的总和应小于等于x中tensor的第二维
      3)groupListOptional第1维最大支持1024, 即最多支持1024个group
      1)x必须转置
      2)weight不能转置
      1)x,weight中tensor需为2维,y中tensor需为3维
      2)bias必须传空
      2 单多多 0/1 groupListOptional必须传空 1)x必须转置
      2)weight不能转置
      1)x,weight,y中tensor需为2维
      2)weight长度最大支持128,即最多支持128个group
      3)原始shape中weight每个tensor的第一维之和不应超过x第一维
      4)bias必须传空
  • Ascend 950PR/Ascend 950DT AI处理器:

    • 公共约束:

      • groupType:支持m轴分组和不分组,仅非量化和全量化支持k轴分组。
      • groupListType:支持取值0、1。当groupListType为0时,groupListOptional必须为非负单调非递减数列;当groupListType为1时,groupListOptional必须为非负数列。
      • tuningConfigOptional:不支持此参数。
      • actType取值范围为0-5。
        • 在伪量化和非量化场景下,actType仅支持0。
        • 在全量化场景下,当x和weight为INT8,量化模式为静态T-C量化或动态K-C量化,scale数据类型为FLOAT32或BFLOAT16时,actType支持传入0、1、2、4、5。其余全量化场景actType仅支持0。
    • 非量化场景支持的数据类型为:

      • 以下入参为空:scaleOptional、offsetOptional、antiquantScaleOptional、antiquantOffsetOptional、perTokenScaleOptional、activationInputOptional、activationQuantScaleOptional、activationQuantOffsetOptional、actType、activationFeatureOutOptional

      • 不为空的参数支持的数据类型组合要满足下表

        groupType x weight biasOptional out
        -1/0/2 BFLOAT16 BFLOAT16 BFLOAT16/FLOAT32/null BFLOAT16
        -1/0/2 FLOAT16 FLOAT16 FLOAT16/FLOAT32/null FLOAT16
        -1/0/2 FLOAT32 FLOAT32 FLOAT32/null FLOAT32
    • 量化场景支持的数据类型为:

      • 静态量化场景:

        • 以下入参为空:offsetOptional、antiquantScaleOptional、antiquantOffsetOptional、perTokenScaleOptional、activationInputOptional

        • 不为空的参数支持的数据类型组合要满足下表:

          groupType x weight biasOptional scaleOptional out
          0 INT8 INT8 INT32/null UINT64/INT64 BFLOAT16/FLOAT16/INT8
          0 INT8 INT8 INT32/null null/UINT64/INT64 INT32
          0 INT8 INT8 INT32/BFLOAT16/FLOAT32/null BFLOAT16/FLOAT32 BFLOAT16
          0 INT8 INT8 INT32/FLOAT16/FLOAT32/null FLOAT32 FLOAT16
          0 HIFLOAT8 HIFLOAT8 null UINT64/INT64 BFLOAT16/FLOAT16/FLOAT32
          0/2 HIFLOAT8 HIFLOAT8 null FLOAT32 BFLOAT16/FLOAT16/FLOAT32
          0 FLOAT8_E5M2/FLOAT8_E4M3FN FLOAT8_E5M2/FLOAT8_E4M3FN null UINT64/INT64 BFLOAT16/FLOAT16/FLOAT32
          0/2 FLOAT8_E5M2/FLOAT8_E4M3FN FLOAT8_E5M2/FLOAT8_E4M3FN null FLOAT32 BFLOAT16/FLOAT16/FLOAT32
        • scaleOptional要满足下表(其中g为matmul组数即分组数):

          groupType 使用场景 shape限制
          0/2 weight单tensor perchannel场景:每个tensor 2维,shape为(g, N);pertensor场景:每个tensor 2维或1维,shape为(g, 1)或(g,)
      • 动态量化(T-T && T-C && K-T && K-C量化)场景:

        • 以下入参为空:offsetOptional、antiquantScaleOptional、antiquantOffsetOptional、activationInputOptional

        • 不为空的参数支持的数据类型组合要满足下表:

          groupType x weight biasOptional scaleOptional perTokenScaleOptional out
          0 INT8 INT8 INT32/BFLOAT16/FLOAT32/null BFLOAT16/FLOAT32 FLOAT32 BFLOAT16
          0 INT8 INT8 INT32/FLOAT16/FLOAT32/null FLOAT32 FLOAT32 FLOAT16
          0/2 HIFLOAT8 HIFLOAT8 null FLOAT32 FLOAT32 BFLOAT16/FLOAT16/FLOAT32
          0/2 FLOAT8_E5M2/FLOAT8_E4M3FN FLOAT8_E5M2/FLOAT8_E4M3FN null FLOAT32 FLOAT32 BFLOAT16/FLOAT16/FLOAT32
        • scaleOptional要满足下表(其中g为matmul组数即分组数):

          groupType 使用场景 shape限制
          0/2 weight单tensor perchannel场景:每个tensor 2维,shape为(g, N);pertensor场景:每个tensor 2维或1维,shape为(g, 1)或(g,)
        • perTokenScaleOptional要满足下表:

          groupType 使用场景 shape限制
          0 x单tensor pertoken场景:每个tensor 1维,shape为(M,);pertensor场景:每个tensor 2维或1维,shape为(g, 1)或(g,),输入为INT8时不支持pertensor场景
          2 x单tensor pertoken场景:每个tensor 2维,shape为(g, M);pertensor场景:每个tensor 2维或1维,shape为(g, 1)或(g,)
      • 动态量化(mx量化)场景:

        • 以下入参为空:offsetOptional、antiquantScaleOptional、antiquantOffsetOptional、activationInputOptional

        • 计算公式中量化block size为:gsM = gsN = 1,gsK = 32。mx量化是特殊的pergroup量化。

        • 不为空的参数支持的数据类型组合要满足下表:

          groupType x weight biasOptional scaleOptional perTokenScaleOptional out
          0/2 FLOAT8_E5M2/FLOAT8_E4M3FN FLOAT8_E5M2/FLOAT8_E4M3FN null FLOAT8_E8M0 FLOAT8_E8M0 BFLOAT16/FLOAT16/FLOAT32
          0 FLOAT4_E2M1 FLOAT4_E2M1 FLOAT32/null FLOAT8_E8M0 FLOAT8_E8M0 BFLOAT16/FLOAT16/FLOAT32
        • scaleOptional要满足下表(其中g为matmul组数即分组数,g_i为第i个分组):

          groupType 使用场景 shape限制
          0 weight单tensor 每个tensor 4维,当weight转置时,shape为(g, N, ceil(K / 64), 2);当weight不转置时,shape为(g, ceil(K / 64), N, 2)
          2 weight单tensor 每个tensor 3维,shape为((K / 64) + g, N, 2)
        • perTokenScaleOptional要满足下表:

          groupType 使用场景 shape限制
          0 x单tensor 每个tensor 3维,shape为(M, ceil(K / 64), 2)
          2 x单tensor 每个tensor 3维,shape为((K / 64) + g, M, 2)
        • 对于mx量化中输入x为FLOAT4_E2M1时,需要满足K为偶数且K不为2。当weight非转置时还需满足N为偶数。

      • 动态量化(G-B量化)场景:

        • 以下入参为空:biasOptional、offsetOptional、antiquantScaleOptional、antiquantOffsetOptional、activationInputOptional

        • 计算公式量化block size为:当前仅支持gsM = 1,gsN = gsK = 128。

        • 不为空的参数支持的数据类型组合要满足下表:

          groupType x weight scaleOptional perTokenScaleOptional out
          0/2 HIFLOAT8 HIFLOAT8 FLOAT32 FLOAT32 BFLOAT16/FLOAT16/FLOAT32
          0/2 FLOAT8_E5M2/FLOAT8_E4M3FN FLOAT8_E5M2/FLOAT8_E4M3FN FLOAT32 FLOAT32 BFLOAT16/FLOAT16/FLOAT32
        • scaleOptional要满足下表(其中g为matmul组数即分组数,g_i为第i个分组):

          groupType 使用场景 shape限制
          0 weight单tensor 每个tensor 3维,weight转置时shape为(g, ceil(N / gsN), ceil(K / gsK)),weight非转置时shape为(g, ceil(K / gsK), ceil(N / gsN))
          2 weight单tensor 每个tensor 2维,shape为(K / gsK + g, ceil(N / gsN))
        • perTokenScaleOptional要满足下表:

          groupType 使用场景 shape限制
          0 x单tensor 每个tensor 2维,shape为(M, ceil(K / gsK))
          2 x单tensor 每个tensor 2维,shape为(K / gsK + g, M)
        • 动态量化特殊场景处理:

          • 在动态量化场景M分组或K分组情况下,当N等于1且scaleOptional的shape为(g, 1)时,weight既可以pertensor量化也可以perchannel量化时,优先选择pertensor量化模式。
          • 在动态量化场景M分组情况下,当g = M且perTokenScaleOptional的shape为(g,)时,x选择pertoken量化模式;当g = M,K <= 128且perTokenScaleOptional的shape为(g, 1)时,根据weight的量化模式选择x的量化模式。
          • 在动态量化场景K分组情况下,K小于128,N小于等于128且scaleOptional的shape为(g, 1)时,此种场景一律按照G-B量化处理。
          • 在动态量化场景K分组情况下,当M等于1且perTokenScaleOptional的shape为(g, 1)时,x既可以pertoken量化也可以pertensor量化时,优先选择pertensor量化模式。
          • 在动态量化场景K分组情况下,K小于128时,x的量化模式会根据M、N以及weight的量化模式进行区分。
    • 伪量化场景支持的数据类型为:

      • 以下入参为空:scaleOptional、offsetOptional、perTokenScaleOptional、activationInputOptional、activationQuantScaleOptional、activationQuantOffsetOptional

      • 不为空的参数支持的数据类型组合要满足下表

        groupType x weight biasOptional antiquantScaleOptional antiquantOffsetOptional out
        -1/0 BFLOAT16 INT8/INT4 BFLOAT16/FLOAT32/null BFLOAT16 BFLOAT16/null BFLOAT16
        -1/0 FLOAT16 INT8/INT4 FLOAT16/null FLOAT16 FLOAT16/null FLOAT16
        0 BFLOAT16 FLOAT8_E5M2/FLOAT8_E4M3FN/HIFLOAT8 BFLOAT16/FLOAT32/null BFLOAT16 null BFLOAT16
        0 FLOAT16 FLOAT8_E5M2/FLOAT8_E4M3FN/HIFLOAT8 FLOAT16/null FLOAT16 null FLOAT16
      • 当weight的数据类型为FLOAT8_E5M2、FLOAT8_E4M3FN、HIFLOAT8时,antiquantOffsetOptional仅支持传入空指针或空tensorList,weight仅支持转置。

      • 若weight的类型为INT4,则weight中每一组tensor的最后一维大小都应是偶数。weightiweight_i的最后一维指weight不转置时weightiweight_i的N轴或当weight转置时weightiweight_i的K轴。

      • antiquantScaleOptional和非空的biasOptional、antiquantOffsetOptional要满足下表(其中g为matmul组数即分组数):

        groupType 使用场景 shape限制
        -1 weight多tensor 每个tensor 1维,shape为(nin_i),不允许存在一个tensorList中部分tensor的shape为(nin_i)部分tensor为空的情况
        0 weight单tensor 每个tensor 2维,shape为(g, N)
    • 不同groupType支持场景:

      • 支持场景中单表示单tensor,多表示多tensor,表示顺序为x,weight,out,例如单多单表示支持x为单tensor,weight多tensor,out单tensor的场景。

        groupType 支持场景 场景限制
        -1 多多多 1)仅支持splitItem为0/1
        2)非量化x,out中tensor需为2维,shape分别为(mim_i, kik_i)和(mim_i, nin_i);伪量化场景x中tensor要求维度一致,支持2-6维,y中tensor维度和x保持一致;weight中tensor需为2维,shape为(nin_i, kik_i)或(kik_i, nin_i);bias中tensor需为1维,shape为(nin_i
        3)groupListOptional必须传空
        4)支持weight转置,但weight的tensorList中每个tensor是否转置需保持统一
        5)x不支持转置
        6)仅支持非量化和伪量化
        7)仅支持ND进ND出
        0 单单单 1)仅支持splitItem为2/3
        2)weight中tensor需为3维,shape为(g, N, K)或(g, K, N);x,out中tensor需为2维,shape分别为(M, K)和(M, N);bias中tensor需为2维,shape为(g, N)
        3)必须传groupListOptional,且当groupListType为0时,最后一个值不大于x中tensor的第一维,当groupListType为1时,数值的总和不大于x中tensor的第一维
        4)groupListOptional第1维最大支持1024,即最多支持1024个group
        5)支持x不转置,weight转置、不转置均支持
        6)x与weight为INT8时支持weight为FRACTAL_NZ数据格式,其余场景仅支持ND进;仅支持ND出
        0 单多单 1)仅支持splitItem为2/3
        2)必须传groupListOptional,且当groupListType为0时,最后一个值与x中tensor的第一维相等,当groupListType为1时,数值的总和与x中tensor的第一维相等,长度最大1024
        3)x,out中tensor需为2维,shape分别为(M, K)和(M, N);weight中tensor需为2维,shape为(N, K)或(K, N);bias中tensor需为1维,shape为(N)
        4)weight中每个tensor的N轴必须相等
        5)支持weight转置,但weight的tensorList中每个tensor是否转置需保持统一
        6)x不支持转置
        7)仅支持非量化
        8)仅支持ND进ND出
        0 多多单 1)仅支持splitItem为2
        2)x,out中tensor需为2维,shape分别为(M, K)和(M, N);weight中tensor需为2维,shape为(N, K)或(K, N);bias中tensor需为1维,shape为(N)
        3)weight中每个tensor的N轴必须相等
        4)若传入groupListOptional,当groupListType为0时,groupListOptional的差值需与x中tensor的第一维一一对应,当groupListType为1时,groupListOptional的数值需与x中tensor的第一维一一对应,且长度最大为1024
        5)支持weight转置,但weight的tensorList中每个tensor是否转置需保持统一
        6)x不支持转置
        7)仅支持非量化
        8)仅支持ND进ND出
        2 单单单 1)仅支持splitItem为2/3
        2)x,weight中tensor需为2维,shape分别为(K, M)和(K, N);out中tensor需为3维,shape为(g, M, N)
        3)必须传groupListOptional,且当groupListType为0时,最后一个值不大于x中tensor的第一维,当groupListType为1时,数值的总和不大于x中tensor的第一维
        4)groupListOptional第1维最大支持1024,即最多支持1024个group
        5)x必须转置,weight不能转置
        6)仅支持非量化和量化
        7)仅支持ND进ND出

调用说明

调用方式 调用样例 说明
aclnn调用 test_aclnn_grouped_matmul 通过接口方式调用GroupedMatmul算子。