aclnnQuantMatmulV5
支持的产品型号
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]
- [object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]
功能说明
算子功能:兼容aclnnQuantMatmulV3、aclnnQuantMatmulV4接口功能,在其基础上新增支持pergroup和perblock等特性,新增x1,x2输入支持dtype为FLOAT8_E4M3FN、FLOAT8_E5M2、HIFLOAT8、FLOAT4_E2M1、FLOAT4_E1M2。完成量化的矩阵乘计算,最小支持输入维度为2维,最大支持输入维度为6维。相似接口有aclnnMm(仅支持2维Tensor作为输入的矩阵乘)和aclnnBatchMatMul(仅支持三维的矩阵乘,其中第一维是Batch维度)。
计算公式:
x1为INT8,x2为INT32,x1Scale为FLOAT32,x2Scale为UINT64,yOffset为FLOAT32,out为FLOAT16/BFLOAT16:
x1,x2为INT8,无x1Scale,x2Scale为INT64/UINT64,可选参数x2Offset的dtype为FLOAT32,可选参数bias的dtype为INT32,out为INT8:
x1,x2为INT8,无x1Scale,x2Scale为INT64/UINT64,无x2Offset,可选参数bias的dtype为INT32,out为FLOAT16/BFLOAT16:
x1,x2为FLOAT8_E4M3FN/FLOAT8_E5M2/HIFLOAT8,无x1Scale,x2Scale为INT64/UINT64,无x2Offset,可选参数bias的dtype为FLOAT32,out为FLOAT8_E4M3FN/HIFLOAT8/FLOAT16/BFLOAT16/FLOAT32:
x1,x2为INT8,无x1Scale,x2Scale为BFLOAT16/FLOAT32,无x2Offset,可选参数bias的dtype为BFLOAT16/FLOAT32,out为BFLOAT16:
x1,x2为FLOAT4_E2M1/FLOAT4_E1M2/FLOAT8_E4M3FN/FLOAT8_E5M2,x1Scale为FLOAT8_E8M0,x2Scale为FLOAT8_E8M0,无x2Offset,可选参数bias的dtype为FLOAT32:
x1,x2为INT8,x1Scale为FLOAT32,x2Scale为BFLOAT16/FLOAT32,无x2Offset,可选参数bias的dtype为INT32:
x1,x2为INT8,x1Scale为FLOAT32,x2Scale为BFLOAT16/FLOAT32,无x2Offset,可选参数bias的dtype为BFLOAT16/FLOAT32,out为BFLOAT16:
x1,x2为INT8,x1Scale为FLOAT32,x2Scale为FLOAT32,无x2Offset,可选参数bias的dtype为FLOAT16/FLOAT32,out为FLOAT16:
x1,x2为FLOAT8_E4M3FN/FLOAT8_E5M2/HIFLOAT8,x1Scale为FLOAT32,x2Scale为FLOAT32,无x2Offset,可选参数bias的dtype为FLOAT32:
x1,x2为FLOAT8_E4M3FN/FLOAT8_E5M2/HIFLOAT8,x1Scale为FLOAT32,x2Scale为FLOAT32,无x2Offset,无bias,当x1为(a0, a1),x2为(b0, b1)时,x1Scale为(ceil(a0, 128), ceil(a1, 128))或(a0, ceil(a1, 128)),x2Scale为(ceil(b0, 128), ceil(b1, 128)):
x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1,x1Scale为FLOAT8_E8M0,x2Scale为FLOAT8_E8M0,无x1Offset,无x2Offset,可选参数bias的dtype为BFLOAT16,out为BFLOAT16:
x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1,无x1Scale,x2Scale为BFLOAT16,无x1Offset,无x2Offset,无bias, yScale为UINT64,out为BFLOAT16:
函数原型
每个算子分为,必须先调用“aclnnQuantMatmulV5GetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnQuantMatmulV5”接口执行计算。
aclnnStatus aclnnQuantMatmulV5GetWorkspaceSize(const aclTensor *x1, const aclTensor *x2, const aclTensor *x1Scale, const aclTensor *x2Scale, const aclTensor *yScale, const aclTensor *x1Offset, const aclTensor *x2Offset, const aclTensor *yOffset, const aclTensor *bias, bool transposeX1, bool transposeX2, int64_t groupSize, aclTensor *out, uint64_t *workspaceSize, aclOpExecutor **executor)
aclnnStatus aclnnQuantMatmulV5(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)
aclnnQuantMatmulV5GetWorkspaceSize
参数说明:
- x1(aclTensor*,计算输入):公式中的输入x1,device侧的aclTensor,数据格式支持ND,shape支持2
6维,在transposeX1为false情况下,形状为(batch, m, k);在transposeX1为true情况下,形状为(batch, k, m),其中batch代表前04维,0维表示bacth不存在。仅最后m和k轴转置情况下支持,其他轴方向不支持非连续的Tensor。数据类型支持INT8、FLOAT8_E4M3FN、FLOAT8_E5M2、HIFLOAT8、FLOAT4_E2M1、FLOAT4_E1M2。当x2Scale数据类型为FLOAT8_E8M0时,仅支持transposeX1为false的情况,维度表示:(batch, m, k),batch可不存在,当x1数据类型为FLOAT4_E2M1、FLOAT4_E1M2时要求k为偶数。- 当x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1时,仅支持k是64的倍数,transposeX1为false,不支持batch轴。
- 当x1为INT8,x2为INT32时,仅支持k是256的倍数,transposeX1为false,不支持batch轴。
- x2(aclTensor*,计算输入):公式中的输入x2,device侧的aclTensor。仅n和k轴转置情况下支持,其他轴方向不支持非连续的Tensor。数据格式支持ND,shape支持2
6维,在transposeX2为false情况下各个维度表示:(batch, k, n),在transposeX2为true情况下各个维度表示:(batch, n, k),其中batch代表前04维,0维表示bacth不存在,其中k与x1的shape中的k一致。数据类型支持INT4、INT8、FLOAT8_E4M3FN、FLOAT8_E5M2、HIFLOAT8、FLOAT4_E2M1、FLOAT4_E1M2,仅支持ND格式。当x2Scale数据类型为FLOAT8_E8M0时,仅支持transposeX2为true的情况,维度表示:(batch, n, k),其中batch代表前0~4维,0维表示bacth不存在,当x2数据类型为FLOAT4_E2M1、FLOAT4_E1M2时要求k为偶数。当x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1时,仅支持k是64的倍数。- 当x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1时,仅支持k是64的倍数,transposeX2为true,不支持batch轴。
- 当x1为INT8,x2为INT32时,仅支持k是256的倍数,transposeX2为false,不支持batch轴。
- x1Scale(aclTensor*,计算输入):公式中的输入x1Scale,device侧的aclTensor。可选的量化参数,支持传入nullptr。数据类型支持FLOAT32、FLOAT8_E8M0,支持ND。
- 当x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1时,区分mx和per-group的量化模式。
- mx量化模式:数据类型支持FLOAT8_E8M0。shape支持2维,shape为(m, ceil(k, groupSize))。
- per-group量化模式:预留参数,当前版本不支持,需要传入nullptr。
- 当x1Scale数据类型为FLOAT32时,shape可为1维或多维。
- shape可以为1维, 当输入为FLOAT8_E4M3FN、FLOAT8_E5M2、HIFLOAT8时,shape可为(1, )或(m, ),当输入为INT8时,shape为(m, 1),其中m与x1的m一致;
- 当x2scale维度大于1时, x1Scale为2到6维, 即(batch, t, d), batch可不存在且与x1的batch保持一致。 transposeX1为false时t = ceil(m, 128)或 t = m, d = ceil(k, 128), transposeX1为true时t = ceil(k, 128), d = ceil(m, 128)或 d = m, 其中m与x1的m一致, k与x1的k一致。
- 当x1Scale数据类型为FLOAT8_E8M0时, shape是2维, 即(t, d), t = m, d = ceil(k, 32), 其中m与x1的m一致, k与x1的k一致, d必须为偶数。
- 当x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1时,区分mx和per-group的量化模式。
- x2Scale(aclTensor*,计算输入):表示量化参数,公式中的输入x2Scale,device侧的aclTensor。数据类型支持UINT64、FLOAT32、BFLOAT16、FLOAT8_E8M0,支持ND。当原始输入类型不满足中组合时,需提前调用aclnnTransQuantParamV2接口来将scale转成INT64、UINT64数据类型。
- 当x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1时,区分mx和per-group的量化模式。
- mx量化模式:数据类型支持FLOAT8_E8M0。
- per-group量化模式:数据类型支持BFLOAT16。
- 当x2Scale数据类型为UINT64时,区分两种情况。
- 当x1为INT8,x2为INT32时,shape是2维, 即(k / groupSize, n),其中n与x2的n一致;
- 其他情况:shape是1维, 即(1, )或(n, ),其中n与x2的n一致;
- 当x2Scale数据类型为BFLOAT16时,shape是1维或2维, 即(1, )或(n, )或(n, ceil(k, groupSize)),其中n与x2的n一致;
- 当x2Scale数据类型为FLOAT8_E8M0时, shape是2维, 即(t, d), t = n, d = ceil(k, 32), 其中n与x2的n一致, k与x2的k一致, d必须为偶数。
- 当x2Scale数据类型为FLOAT32时, shape可维1维或多维。
- 当x1的m大于1且x1Scale的shape为(1, ),x2Scale的shape为(1, );
- 当x1Scale输入nullptr或x1Scale的shape是1维(m, )其中m与x1的m一致,x2Scale的shape是1维(1, )或(n, )其中n与x2的n一致;
- 当x1Scale的维度大于1时,x2Scale的维度也大于1为2到6维(batch, t, d),其中batch可不存在,与x2的batch保持一致,transposeX2为false时t = ceil(k, 128),d = ceil(n, 128),transposeX2为true时t = ceil(n, 128),d = ceil(k, 128),其中n与x2的n一致, k与x2的k一致。
- 当x1的类型为FLOAT8_E4M3FN、FLOAT8_E5M2, x1Scale的类型为FLOAT8_E8M0,并且x2的类型为FLOAT4_E2M1、FLOAT4_E1M2,x2Scale的类型为FLOAT8_E8M0时,x2Scale的数值会由量化工具放大64倍进行偏差补偿,再传入算子进行计算。
- 当x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1时,区分mx和per-group的量化模式。
- yScale(aclTensor*,计算输入):输出y的反量化scale参数。不支持非连续的Tensor。仅当x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1时支持。其他场景暂不支持。
- x1Offset(aclTensor*,计算输入):预留参数,当前版本不支持,需要传入nullptr或空tensor。
- x2Offset(aclTensor*,计算输入):公式中的输入offset,device侧的aclTensor。可选量化参数,支持传入nullptr。数据类型支持FLOAT32,支持ND,shape是1维(t, ),t = 1或n,其中n与x2的n一致。当x1,x2数据类型为INT8,且out数据类型为INT8时,x2Offset可以存在,其他输入类型需要传入nullptr。
- yOffset(aclTensor*,计算输入):
- bias(aclTensor*,计算输入):公式中的输入bias,device侧的aclTensor。可选参数,支持传入nullptr。支持ND。shape支持1维(n, )、2维(1, n)或3维(batch, 1, n),n与x2的n一致。当out的shape为2、4、5、6维时,bias的shape支持1维(n, )。数据类型支持INT32,FLOAT32、BFLOAT16、FLOAT16。
- transposeX1(bool,计算输入):
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:表示x1的输入shape是否包含transpose。在transposeX1为false情况下各个维度表示:(m, k),在transposeX1为true情况下各个维度表示:(k, m)。
- transposeX2(bool,计算输入):表示x2的输入shape是否包含transpose。
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:ND格式下,在transposeX2为false情况下各个维度表示:(k, n),在transposeX2为true情况下各个维度表示:(n, k),其中k与x1的shape中的k一致。
- groupSize(int64_t,计算输入):用于表示反量化中x1Scale/x2Scale输入的一个数在其所在的对应维度方向上可以用于该方向x1/x2输入的多少个数的反量化。groupSize输入由3个方向的groupSizeM,groupSizeN,groupSizeK三个值拼接组成,每个值占16位,共占用int64_t类型groupSize的低48位(groupSize中的高16位的数值无效),计算公式为:groupSize = groupSizeK | groupSizeN << 16 | groupSizeM << 32。
- 只有当x1Scale和x2Scale输入都是2维及以上数据时,groupSize取值有效,其他场景需传入0。
- 传入的groupSize内部会按公式分解得到groupSizeM、groupSizeN、groupSizeK,当其中有1个或多个为0,会根据x1/x2/x1Scale/x2Scale输入shape重新设置groupSizeM、groupSizeN、groupSizeK用于计算。原理:假设groupSizeM=0,表示m方向量化分组值由接口推断,推断公式为groupSizeM = m / scaleM(需保证m能被scaleM整除), 其中m与x1 shape中的m一致,scaleM与x1Scale shape中的m一致。
- 最终得到的groupSizeM、groupSizeN、groupSizeK取值接口会进行校验,如不满足,进程会报错退出:
- 当x1Scale/x2Scale输入都是2维及以上数据,且数据类型都为FLOAT32时,[groupSizeM,groupSizeN,groupSizeK]取值组合仅支持[1, 128, 128]和[128, 128, 128]。
- 当x1Scale/x2Scale输入都是2维及以上数据,且数据类型都为FLOAT8_E8M0时,[groupSizeM,groupSizeN,groupSizeK]取值组合仅支持[1, 1, 32]
- 当x1是FLOAT8_E4M3FN,x2是FLOAT4_E2M1时,[groupSizeM,groupSizeN,groupSizeK]取值组合仅支持[0, 0, 32]
- 当x1为INT8且x2为INT32时,groupSize只支持[0,0,256]
- out(aclTensor*,计算输出):公式中的输出out,device侧的aclTensor。支持ND。支持,shape支持2~6维,(batch, m, n),batch可不存在,支持x1与x2的batch维度broadcast,输出batch与broadcast之后的batch一致,m与x1的m一致,n与x2的n一致。数据类型支持INT8、HIFLOAT8、FLOAT8_E4M3FN、FLOAT16、BFLOAT16、FLOAT32。
- 当x1为FLOAT8_E4M3FN,x2为FLOAT4_E2M1时,数据类型支持BFLOAT16。
- workspaceSize(uint64_t*,出参):返回需要在Device侧申请的workspace大小。
- executor(aclOpExecutor**,出参):返回op执行器,包含了算子计算流程。
- x1(aclTensor*,计算输入):公式中的输入x1,device侧的aclTensor,数据格式支持ND,shape支持2
返回值:
[object Object]
aclnnQuantMatmulV5
参数说明:
- workspace(void*, 入参):在Device侧申请的workspace内存地址。
- workspaceSize(uint64_t, 入参):在Device侧申请的workspace大小,由第一段接口aclnnQuantMatmulV5GetWorkspaceSize获取。
- executor(aclOpExecutor*, 入参):op执行器,包含了算子计算流程。
- stream(aclrtStream, 入参):指定执行任务的AscendCL Stream流。
返回值:
约束说明
输入和输出支持以下数据类型组合:
x1 | x2 | x1Scale | x2Scale | x2Offset | yScale | bias | out |
---|---|---|---|---|---|---|---|
INT8 | INT8 | null | UINT64/INT64 | null | null | null/INT32 | FLOAT16/BFLOAT16 |
INT8 | INT8 | null | UINT64/INT64 | null/FLOAT32 | null | null/INT32 | INT8 |
INT8 | INT8 | null/FLOAT32 | FLOAT32/BFLOAT16 | null | null | null/INT32/FLOAT32/BFLOAT16 | BFLOAT16 |
INT8 | INT8 | FLOAT32 | FLOAT32 | null | null | null/INT32/FLOAT32/FLOAT16 | FLOAT16 |
FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT8_E4M3FN/FLOAT8_E5M2 | null | UINT64/INT64 | null | null | null/FLOAT32 | FLOAT8_E4M3FN/FLOAT16/BFLOAT16/FLOAT32 |
HIFLOAT8 | HIFLOAT8 | null | UINT64/INT64 | null | null | null/FLOAT32 | HIFLOAT8/FLOAT16/BFLOAT16/FLOAT32 |
FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT32 | FLOAT32 | null | null | null/FLOAT32 | FLOAT16/BFLOAT16/FLOAT32 |
HIFLOAT8 | HIFLOAT8 | FLOAT32 | FLOAT32 | null | null | null/FLOAT32 | FLOAT16/BFLOAT16/FLOAT32 |
FLOAT4_E2M1/FLOAT4_E1M2 | FLOAT4_E2M1/FLOAT4_E1M2 | FLOAT8_E8M0 | FLOAT8_E8M0 | null | null | null/FLOAT32 | FLOAT16/BFLOAT16/FLOAT32 |
FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT8_E8M0 | FLOAT8_E8M0 | null | null | null/FLOAT32 | FLOAT16/BFLOAT16/FLOAT32 |
FLOAT8_E4M3FN | FLOAT4_E2M1 | FLOAT8_E8M0 | FLOAT8_E8M0 | null | null | null/BFLOAT16 | BFLOAT16 |
FLOAT8_E4M3FN | FLOAT4_E2M1 | null | BFLOAT16 | null | UINT64 | null | BFLOAT16 |
INT8 | INT32 | FLOAT32 | UINT64 | null | null | null | FLOAT16/BFLOAT16 |
x1,x2,x1Scale,x2Scale和groupSize在不同量化场景下dtype,shape,取值等方面相互影响,关系如下:
x1数据类型 | x2数据类型 | x1Scale数据类型 | x2Scale数据类型 | x1 shape | x2 shape | x1Scale shape | x2Scale shape | yScale shape | [groupSizeM,groupSizeN,groupSizeK]取值 |
---|---|---|---|---|---|---|---|---|---|
FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT32 | FLOAT32 | (batch, m, k)/(batch, k, m) | (batch, n, k)/(batch, k, n) | (batch, ceil(m, 128), ceil(k, 128))/(batch, ceil(k, 128), ceil(m, 128)) | (batch, ceil(n, 128), ceil(k, 128))/(batch, ceil(k, 128), ceil(n, 128)) | null | [128, 128, 128] |
HIFLOAT8 | HIFLOAT8 | FLOAT32 | FLOAT32 | (batch, m, k)/(batch, k, m) | (batch, n, k)/(batch, k, n) | (batch, ceil(m, 128), ceil(k, 128))/(batch, ceil(k, 128), ceil(m, 128)) | (batch, ceil(n, 128), ceil(k, 128))/(batch, ceil(k, 128), ceil(n, 128)) | null | [128, 128, 128] |
FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT32 | FLOAT32 | (batch, m, k)/(batch, k, m) | (batch, n, k)/(batch, k, n) | (batch, m, ceil(k, 128))/(batch, ceil(k, 128), m) | (batch, ceil(n, 128), ceil(k, 128))/(batch, ceil(k, 128), ceil(n, 128)) | null | [1, 128, 128] |
HIFLOAT8 | HIFLOAT8 | FLOAT32 | FLOAT32 | (batch, m, k)/(batch, k, m) | (batch, n, k)/(batch, k, n) | (batch, m, ceil(k, 128))/(batch, ceil(k, 128), m) | (batch, ceil(n, 128), ceil(k, 128))/(batch, ceil(k, 128), ceil(n, 128)) | null | [1, 128, 128] |
FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT8_E4M3FN/FLOAT8_E5M2 | FLOAT8_E8M0 | FLOAT8_E8M0 | (batch, m, k) | (batch, n, k) | (batch, m, ceil(k, 32)) | (batch, n, ceil(k, 32)) | null | [1, 1, 32] |
FLOAT4_E2M1/FLOAT4_E1M2 | FLOAT4_E2M1/FLOAT4_E1M2 | FLOAT8_E8M0 | FLOAT8_E8M0 | (batch, m, k) | (batch, n, k) | (batch, m, ceil(k, 32)) | (batch, n, ceil(k, 32)) | null | [1, 1, 32] |
FLOAT8_E4M3FN | FLOAT4_E2M1 | FLOAT8_E8M0 | FLOAT8_E8M0 | (m, k) | (n, k) | (m, ceil(k, 32)) | (n, ceil(k, 32)) | null | [0, 0, 32] |
FLOAT8_E4M3FN | FLOAT4_E2M1 | null | BFLOAT16 | (m, k) | (n, k) | (m, ceil(k, 32)) | (n, ceil(k, 32)) | (1, n) | [0, 0, 32] |
INT8 | INT32 | FLOAT32 | UINT64 | (m, k) | (k, n // 8) | (m, 1) | ((k // 256),n) | null | [0, 0, 256] |
调用示例
x1,x2为FLOAT8_E4M3FN,x1Scale为FLOAT32,x2Scale为FLOAT32,无x2Offset,bias为FLOAT32的示例代码如下,仅供参考,具体编译和执行过程请参考。
[object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]: x1为INT8,x2为INT32,x1Scale为FLOAT32,x2Scale为UINT64,的示例代码如下,仅供参考,具体编译和执行过程请参考编译与运行样例。
[object Object]