aclnnWeightQuantBatchMatmulV3
产品支持情况
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]
- [object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]
功能说明
算子功能:完成一个输入为伪量化场景的矩阵乘计算,并可以实现对于输出的量化计算。相较于aclnnWeightQuantBatchMatmulV2接口,此接口变化点为:
新增innerPrecise参数,用于支持高精度或者高性能计算模式选择。A16W4 per_group场景在batchSize<=16的场景下可设置为1, 提升性能。
计算公式:
公式中的为伪量化场景的输入,其反量化公式为
当客户配置quantScaleOptional输入时, 会对输出进行量化处理, 其量化公式为
当客户配置quantScaleOptional输入为nullptr, 则直接输出:
函数原型
每个算子分为undefined,必须先调用“aclnnWeightQuantBatchMatmulV3GetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnWeightQuantBatchMatmulV3”接口执行计算。
aclnnStatus aclnnWeightQuantBatchMatmulV3GetWorkspaceSize(const aclTensor *x, const aclTensor *weight, const aclTensor *antiquantScale, const aclTensor *antiquantOffsetOptional, const aclTensor *quantScaleOptional, const aclTensor *quantOffsetOptional, const aclTensor *biasOptional, int antiquantGroupSize, int innerPrecise, const aclTensor *y, uint64_t *workspaceSize, aclOpExecutor **executor)
aclnnStatus aclnnWeightQuantBatchMatmulV3(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)
aclnnWeightQuantBatchMatmulV3GetWorkspaceSize
参数说明
x(aclTensor*, 计算输入):公式中的输入
x
,数据类型支持FLOAT16、BFLOAT16,undefined支持ND。undefined仅支持transpose场景。维度支持2维,shape支持(m, k),其中Reduce维度k需要与weight
的Reduce维度k大小相等。weight(aclTensor*,计算输入):公式中的输入
weight
,数据类型支持INT8、INT4、INT32(当weight数据格式为FRACTAL_NZ且数据类型为INT4/INT32时,或者当weight数据格式为ND且数据类型为INT32时,仅在INT4Pack场景支持,需要配合aclnnConvertWeightToINT4Pack接口完成从INT32到INT4Pack的转换,以及从ND到FRACTAL_NZ的转换,undefined),若数据类型为INT4,则weight的内轴应为偶数。undefined仅支持transpose场景。shape支持(k, n)。 对于不同伪量化算法模式,weight的数据格式为FRACTAL_NZ仅在如下场景下支持:- per_channel模式:
- weight的数据类型为INT8,y的数据类型为非INT8。
- weight的数据类型为INT4/INT32,weight转置,y的数据类型为非INT8。
- per_group模式:weight的数据类型为INT4/INT32,weight非转置,x非转置,antiquantGroupSize为64或128,k为antiquantGroupSize对齐,n为64对齐,y的数据类型为非INT8。
- per_channel模式:
antiquantScale(aclTensor*, 计算输入):实现输入反量化计算的反量化scale参数,反量化公式中的输入
antiquantScale
,数据类型支持FLOAT16、BFLOAT16、UINT64、INT64。当数据类型为FLOAT16、BFLOAT16时,要求和输入x
的数据类型保持一致。当数据类型为UINT64、INT64时,x仅支持FLOAT16,不转置,weight仅支持int8,ND转置,模式仅支持per_channel,quantScaleOptional和quantOffsetOptional必须为空,m仅支持[1, 96],k和n要求64对齐,需要首先配合aclnnCast接口完成FLOAT16到FLOAT32的转换,undefined,再配合aclnnTransQuantParamV2接口完成FLOAT32到UINT64的转换,undefined。undefined支持ND。undefined仅支持transpose场景。 对于不同伪量化算法模式,antiquantScale支持的shape如下:- per_tensor模式:输入shape为(1,)或(1, 1)。
- per_channel模式:输入shape为(1, n)或(n,)。
- per_group模式:输入shape为(ceil(k, group_size), n)。
antiquantOffsetOptional(aclTensor*, 计算输入):实现输入反量化计算的反量化offset参数,反量化公式中的输入
antiquantOffset
,数据类型支持FLOAT16、BFLOAT16、INT32。当数据类型为FLOAT16、BFLOAT16时,要求和输入x
的数据类型保持一致。当数据类型为INT32时,数据范围限制为[-128, 127],x仅支持FLOAT16,weight仅支持int8,antiquantScale仅支持UINT64/INT64。可选输入,当不需要时为空指针;存在时shape要求与antiquantScale
一致。undefined支持ND。undefined仅支持transpose场景。quantScaleOptional(aclTensor*, 计算输入):实现输出量化计算的量化参数,由量化公式中的quantScale和quantOffset的数据通过
aclnnTransQuantParam
接口转化得到。数据类型支持UINT64,undefined支持ND。不支持undefined。可选输入,当不需要时为空指针;对于不同的伪量化算法模式,支持的shape如下:- per_tensor模式:输入shape为(1,)或(1, 1)。
- per_channel模式:输入shape为(1, n)或(n,)。
quantOffsetOptional(aclTensor*, 计算输入):实现输出量化计算的量化offset参数,量化公式中的输入
quantOffset
,数据类型支持FLOAT,undefined支持ND。可选输入,当不需要时为空指针;存在时shape要求与quantScaleOptional
一致。不支持undefined。biasOptional(aclTensor*, 计算输入):偏置输入,公式中的输入
bias
。当输入x
的数据类型为BFLOAT16时,数据类型要求为FLOAT;当输入x
的数据类型为FLOAT16时,数据类型要求为FLOAT16。可选输入,当不需要时为空指针;存在输入时支持1维或2维,shape支持(n,)或(1, n)。支持ND。不支持undefined。antiquantGroupSize(int, 计算输入):表示伪量化per_group算法模式下,对输入
weight
进行反量化计算的groupSize输入,描述一组反量化参数对应的待反量化数据量在Reduce方向的大小。当伪量化算法模式不为per_group时传入0;当伪量化算法模式为per_group时传入值的范围为[32, k-1]且值要求是32的倍数。innerPrecise (int, 计算输入):表示伪量化是高精度还是高性能计算模式(仅支持传入0或1)。A16W4 per_group场景在batchSize<=16的场景下可设置为1,并且weight数据格式设为FRACTAL_NZ,来提升性能。其他场景不建议使用,建议传入0。
- 0:代表高精度模式。
- 1:代表高性能模式。
y(aclTensor*, 计算输出):计算输出,公式中的
y
。当quantScaleOptional
存在时,数据类型为INT8;当quantScaleOptional
不存在时,数据类型支持FLOAT16、BFLOAT16,且与输入x
的数据类型一致。维度支持2维,shape支持(m, n)。undefined支持ND。不支持undefined。workspaceSize(uint64_t*, 出参):返回需要在Device侧申请的workspace大小。
executor(aclOpExecutor**, 出参):返回op执行器,包含了算子计算流程。
返回值:
aclnnStatus:返回状态码,具体参见undefined。
[object Object]
aclnnWeightQuantBatchMatmulV3
参数说明
- workspace(void*, 入参):在Device侧申请的workspace内存地址。
- workspaceSize(uint64_t, 入参):在Device侧申请的workspace大小,由第一段接口aclnnWeightQuantBatchMatmulV3GetWorkspaceSize获取。
- executor(aclOpExecutor*, 入参):op执行器,包含了算子计算流程。
- stream(aclrtStream, 入参):指定执行任务的Stream。
返回值:
aclnnStatus:返回状态码,具体参见undefined。
约束说明
per_channel模式:为提高性能,推荐使用transpose后的weight输入。m范围为[65, 96]时,推荐使用数据类型为UINT64/INT64的antiquantScale。
per_group模式:在A16W4,batchSize<=16的场景下可设置innerPrecise参数为1,并且weight数据格式设为FRACTAL_NZ,来提升性能,但会存在一定的精度下降。
调用示例
示例代码如下,仅供参考,具体编译和执行过程请参考undefined。