开发者
资源
[object Object]

[object Object][object Object]undefined
[object Object]
  • 接口功能:在micro-batch训练场景,需要做micro-batch的梯度累计,会存在大量GroupedMatMul后接InplaceAdd的融合场景。QuantGroupedMatmulInplaceAdd算子将上述算子融合起来,提高网络性能。实现分组矩阵乘计算和加法计算,基本功能为矩阵乘和加法的组合,如T-C量化场景下yi[m,n]=(x1i[m,ki]×x2i[ki,n])scale2i[n]scale1i+yi[m,n],i=1...gy_i[m,n]=(x1_i[m,k_i] \times x2_i[k_i,n]) * scale2_i[n] * scale1_i + y_i[m,n], i=1...g,其中g为分组个数,m/ki/nm/k_i/n为对应的维度。

    相较于接口,此接口变化:

    • 输入输出参数类型均为aclTensor。
    • 在GroupedMatMul计算结束后增加了InplaceAdd计算。
    • 仅支持量化场景(1.mx量化;2.T-C量化)。量化方式请参见
    • 仅支持x1、x2是FLOAT8_E5M2、FLOAT8_E4M3FN、HIFLOAT8的输入。
  • 计算公式:

    • mx量化:
    yi[m,n]=j=0kLoops1((k=0gsK1(x1Sliceix2Slicei))(scale1i[m,j]scale2i[j,n]))+yi[m,n]y_i[m,n] = \sum_{j=0}^{kLoops-1} ((\sum_{k=0}^{gsK-1} (x1Slice_i * x2Slice_i)) * (scale1_i[m, j] * scale2_i[j, n])) + y_i[m,n]

    其中,gsK代表K轴的量化的block size即32,x1Sliceix1Slice_i代表x1ix1_i第m行长度为gsK的向量,x2Sliceix2Slice_i代表x2ix2_i第n列长度为gsK的向量,K轴均从jgsKj*gsK起始切片,j的取值范围[0, kLoops), kLoops=ceil(KiK_i / gsK),支持最后的切片长度不足gsK。

    • T-C量化:
    yi=(x1i×x2i)scale2iscale1i+yiy_i=(x1_i\times x2_i) * scale2_i * scale1_i + y_i
[object Object]

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

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

    [object Object]
  • 返回值

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

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

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

    [object Object]
  • 返回值

    返回aclnnStatus状态码,具体参见

[object Object]
  • 确定性说明:aclnnQuantGroupedMatmulInplaceAdd默认确定性实现。
  • x1和x2的每一维大小在32字节对齐后都应小于int32的最大值2147483647,且内轴大小需小于2097152。
    • 动态量化(T-C量化)场景支持的输入类型为:
      • 不为空的参数支持的数据类型组合要满足下表:[object Object]undefined
      • scale1Optional/scale2要满足以下约束(其中g为matmul组数即分组数):[object Object]undefined
    • 动态量化(mx量化)场景支持的数据类型为:
      • 数据类型组合要满足下表:[object Object]undefined
      • scale1Optional/scale2要满足以下约束(其中g为matmul组数即分组数,g_i为第i个分组(下标从0开始)):[object Object]undefined
  • groupList第1维最大支持1024,即最多支持1024个group。
[object Object]

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

[object Object]