aclnnQuantGroupedMatmulInplaceAdd
产品支持情况
产品 | 是否支持 |
---|---|
[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object] | × |
[object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object] | × |
[object Object]Atlas 200I/500 A2 推理产品[object Object] | × |
[object Object]Atlas 推理系列产品[object Object] | × |
[object Object]Atlas 训练系列产品[object Object] | × |
功能说明
算子功能:在micro-batch训练场景,需要做micro-batch的梯度累计,会存在大量GroupedMatMul后接InplaceAdd的融合场景。QuantGroupedMatmulInplaceAdd算子将上述算子融合起来,提高网络性能。实现分组矩阵乘计算和加法计算,基本功能为矩阵乘和加法的组合,如T-C量化场景下,其中g为分组个数,为对应的维度。
相较于undefined接口,此接口变化:
- 输入输出参数类型均为aclTensor。
- 在GroupedMatMul计算结束后增加了InplaceAdd计算。
- 仅支持量化场景(1.mx量化;2.pertensor-perchannel)。
- 仅支持x1、x2是FLOAT8_E5M2、FLOAT8_E4M3FN、HIFLOAT8的输入。
计算公式:
- mx量化:
- T-C量化:
函数原型
每个算子分为undefined,必须先调用“aclnnQuantGroupedMatmulInplaceAddGetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小,再调用“aclnnQuantGroupedMatmulInplaceAdd”接口执行计算。
aclnnStatus aclnnQuantGroupedMatmulInplaceAddGetWorkspaceSize(const aclTensor *x1, const aclTensor *x2, const aclTensor *scale1Optional, const aclTensor *scale2, const aclTensor *groupList, aclTensor *yRef, int64_t groupListType, int64_t groupSize, uint64_t *workspaceSize, aclOpExecutor **executor)
aclnnStatus aclnnQuantGroupedMatmulInplaceAdd(void* workspace, uint64_t workspaceSize, aclOpExecutor* executor, aclrtStream stream)
aclnnQuantGroupedMatmulInplaceAddGetWorkspaceSize
参数说明:
- x1(aclTensor *,计算输入):Device侧的aclTensor,公式中的输入x1,2维tensor,shape为(K,M),undefined支持ND,数据类型支持FLOAT8_E4M3FN、FLOAT8_E5M2、HIFLOAT8。
- x2(aclTensor *,计算输入):Device侧的aclTensor,公式中的输入x2,2维tensor,shape为(K,N),undefined支持ND,数据类型支持FLOAT8_E4M3FN、FLOAT8_E5M2、HIFLOAT8。
- scale1Optional(aclTensor *,计算输入):可选参数,Device侧的aclTensor,代表量化参数中的由x1量化引入的缩放因子,undefined支持ND,数据类型支持FLOAT32、FLOAT8_E8M0。综合约束请参见undefined。
- scale2(aclTensor *,计算输入):Device侧的aclTensor,代表量化参数中的由x2量化引入的缩放因子,undefined支持ND,数据类型支持FLOAT32、FLOAT8_E8M0。综合约束请参见undefined。
- groupList(aclTensor *,计算输入):Device侧的aclTensor类型,代表输入和输出分组轴方向的matmul大小分布,数据类型支持INT64,1维tensor,shape为(g,),undefined支持ND。需注意:
- 当groupListType为0时,groupList必须为非负单调非递减数列,当groupListType为1时,groupList必须为非负数列。
- groupList中的最后一个值约束了输出数据的有效部分,groupList中未指定的部分将不会参与更新。
- yRef(aclTensor *,计算输入输出):Device侧的aclTensor,公式中的输入输出y,3维tensor,shape为(g,M,N),undefined支持ND,数据类型支持FLOAT32。
- groupListType(int64_t,计算输入):整数型参数,支持的取值如下:
- 0: groupList中数值为分组轴大小的cumsum结果(累积和);
- 1: groupList中数值为分组轴上每组大小;
- groupSize(int64_t,计算输入):整数型参数,用于输入m、n、k方向上的量化分组大小。groupSize输入由3个方向的groupSizeM,groupSizeN,groupSizeK三个值拼接组成,每个值占16位,共占用int64_t类型groupSize的低48位(groupSize中的高16位的数值无效),计算公式为:groupSize = groupSizeK | groupSizeN << 16 | groupSizeM << 32。
- 当前只支持传0。
- workspaceSize(uint64_t *,出参):返回需要在Device侧申请的workspace大小。
- executor(aclOpExecutor **,出参):返回op执行器,包含了算子计算流程。
返回值:
返回aclnnStatus状态码,具体参见undefined。
[object Object]
aclnnQuantGroupedMatmulInplaceAdd
参数说明:
- workspace(void*,入参):在Device侧申请的workspace内存地址。
- workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由第一段接口aclnnQuantGroupedMatmulInplaceAddGetWorkspaceSize获取。
- executor(aclOpExecutor*,入参):op执行器,包含了算子计算流程。
- stream(aclrtStream,入参):指定执行任务的Stream
返回值:
返回aclnnStatus状态码,具体参见undefined。
约束说明
- x1和x2的每一维大小在32字节对齐后都应小于int32的最大值2147483647,且内轴大小需小于2097152。
- 动态量化(T-C量化)场景支持的输入类型为:
- 不为空的参数支持的数据类型组合要满足下表:
x1 x2 scale2 scale1Optional yRef HIFLOAT8 HIFLOAT8 FLOAT32 FLOAT32 FLOAT32 - scale1Optional/scale2要满足以下约束(其中g为matmul组数即分组数):
参数 shape限制 scale1Optional 2维tensor,shape为(g, 1)或(g,) scale2 2维tensor,shape为(g, N)
- 不为空的参数支持的数据类型组合要满足下表:
- 动态量化(mx量化)场景支持的数据类型为:
- 数据类型组合要满足下表:
x1 x2 scale2 scale1Optional yRef FLOAT8_E5M2/FLOAT8_E4M3FN FLOAT8_E5M2/FLOAT8_E4M3FN FLOAT8_E8M0 FLOAT8_E8M0 FLOAT32 - scale1Optional/scale2要满足以下约束(其中g为matmul组数即分组数,g_i为第i个分组(下标从0开始)):
参数 shape限制 scale1Optional 3维tensor,shape为((K / 64) + g, M, 2),scale_i起始地址偏移为((K_0 + K_1 + ...+ K_{i-1})/ 64 + g_i) * M * 2,即scale_0的起始地址偏移为0,scale_1的起始地址偏移为(K_0 / 64 + 1) * M * 2, scale_2的起始地址偏移为((K_0 + K_1) / 64 + 2) * M * 2, 依此类推 scale2 3维tensor,shape为((K / 64) + g, N, 2), 起始地址偏移与scale1Optional同理
- 数据类型组合要满足下表:
- 动态量化(T-C量化)场景支持的输入类型为:
调用示例
示例代码如下,仅供参考,具体编译和执行过程请参考undefined。
[object Object]