aclnnQuantGroupedMatmulDequant
产品支持情况
产品 | 是否支持 |
---|---|
[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] | × |
功能说明
- 算子功能:对输入x进行量化,分组矩阵乘以及反量化。
- 计算公式:
1.若输入smoothScaleOptional,则 2.若不输入xScaleOptional,则为动态量化,需要计算x量化系数 3.量化 4.分组矩阵乘+反量化- 4.1 若输入的数据类型为FLOAT32, 则:
- 4.2 若输入的数据类型为INT64, 则: 特别说明:如果是上述4.2场景,说明输入前已经和做过了矩阵乘运算,因此算子内部计算时省略了该步骤,这要求必须是pertensor静态量化的场景。即输入前要对$scale_{weight}做如下处理得到INT64类型的数据:
函数原型
每个算子分为undefined,必须先调用“aclnnQuantGroupedMatmulDequantGetWorkspaceSize”接口获取入参并根据流程计算所需workspace大小,再调用“aclnnQuantGroupedMatmulDequant”接口执行计算。
aclnnStatus aclnnQuantGroupedMatmulDequantGetWorkspaceSize(const aclTensor *x, const aclTensor *weight, const aclTensor *weightScale, const aclTensor *groupList, const aclTensor *biasOptional, const aclTensor *xScaleOptional, const aclTensor *xOffsetOptional, const aclTensor *smoothScaleOptional, char *xQuantMode, bool transposeWeight, const aclTensor *out, uint64_t *workspaceSize, aclOpExecutor **executor)
aclnnStatus aclnnQuantGroupedMatmulDequant(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)
aclnnQuantGroupedMatmulDequantGetWorkspaceSize
参数说明:
- x(aclTensor*,计算输入):表示输入的左矩阵,必选参数,Device侧的aclTensor,公式中的输入,数据类型支持FLOAT16,undefined支持ND。支持undefined。shape支持2维,各个维度表示:(m,k)。不支持空Tensor。
- weight(aclTensor*,计算输入):表示输入的右矩阵,必选参数,Device侧的aclTensor,公式中的,数据类型支持INT8,undefined支持昇腾亲和数据排布格式和ND格式。不支持空Tensor。
- ND格式下,shape支持3维。
- 在transposeWeight为true情况下各个维度表示:(g,n,k)。
- 在transposeWeight为false情况下各个维度表示:(g,k,n)。
- 昇腾亲和数据排布格式下,shape支持5维。
- 在transposeWeight为true情况下各个维度表示:(g,k1,n1,n0,k0),其中k0 = 32,n0 = 16,k1和x的k需要满足以下关系:ceilDiv(k,32)= k1。
- 在transposeWeight为false情况下各个维度表示:(g,n1,k1,k0,n0),其中k0 = 16,n0 = 32,k1和x的k需要满足以下关系:ceilDiv(k,16)= k1。
- 可使用aclnnCalculateMatmulWeightSizeV2接口以及aclnnTransMatmulWeight接口完成输入Format从ND到昇腾亲和数据排布格式的转换。
- ND格式下,shape支持3维。
- weightScale(aclTensor*,计算输入):表示weight的量化系数,必选参数,Device侧的aclTensor,公式中的,数据类型支持FLOAT32和INT64,undefined支持ND,支持undefined和空Tensor。shape是2维(g,n),其中g,n与weight的g,n一致。当数据类型为INT64时,必须要求xScaleOptional数据类型为FLOAT16,且xQuantMode值为pertensor。
- groupList(aclTensor*,计算输入):代表x和out分组轴方向的matmul大小分布的cumsum结果(累积和),必选参数,Device侧的aclTensor,公式中的,数据类型支持INT64,undefined支持ND,支持undefined和空Tensor。shape是1维(g,),其中g与weight的g一致。groupList必须为非负递增数列,且最大值不超过m。
- biasOptional(aclTensor*,计算输入):表示计算的偏移量,可选参数,Device侧的aclTensor,公式中的,当前仅支持传入空指针。
- xScaleOptional(aclTensor*,计算输入):表示x的量化系数,可选参数,Device侧的aclTensor,公式中的,数据类型支持FLOAT32和FLOAT16,undefined支持ND,支持undefined。当xQuantMode为pertensor时,shape是1维(1,);当xQuantMode为pertoken时,shape是1维(m,),其中m与输入x的m一致。若为空则为动态量化。当数据类型为FLOAT16时,必须要求weightScale数据类型为INT64,且xQuantMode值为pertensor。支持空Tensor。
- xOffsetOptional(aclTensor*,计算输入):表示x的偏移量,可选参数,Device侧的aclTensor,当前仅支持传入空指针。
- smoothScaleOptional(aclTensor*,计算输入):表示x的平滑系数,可选参数,Device侧的aclTensor,公式中的,数据类型支持FLOAT16,undefined支持ND,支持undefined,shape是1维(k,),其中k与x的k一致。支持空Tensor。
- xQuantMode(string,计算输入):Host侧的string,指定输入x的量化模式,支持取值pertoken/pertensor,动态量化时只支持pertoken。pertoken表示每个token(某一行)都有自己的量化参数;pertensor表示整个张量使用统一的量化参数。
- transposeWeight(bool,计算输入):Host侧的bool,表示输入weight是否转置,类型支持bool。当前只支持true。
- out(aclTensor*,计算输出):必选参数,Device侧的aclTensor,计算结果,公式中的,数据类型支持FLOAT16,undefined支持ND,只支持连续Tensor, shape支持2维,各个维度表示:(m,n)。其中m与x的m一致,n与weight的n一致。
- workspaceSize(uint64_t *,出参):返回需要在Device侧申请的workspace大小。
- executor(aclOpExecutor *,出参):返回op执行器,包含了算子计算流程。
返回值:
aclnnStatus: 返回状态码,具体参见undefined。
[object Object]
aclnnQuantGroupedMatmulDequant
参数说明:
- workspace(void *,入参):在Device侧申请的workspace内存地址。
- workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由第一段接口aclnnQuantGroupedMatmulDequantGetWorkspaceSize获取。
- executor(aclOpExecutor *,入参):op执行器,包含了算子计算流程。
- stream(aclrtStream ,入参):指定执行任务的Stream。
返回值:
aclnnStatus: 返回状态码,具体参见undefined。
约束说明
- n,k都需要是16的整数倍。
- 当weightScale数据类型为INT64时,必须要求xScaleOptional数据类型为FLOAT16,且xQuantMode值为pertensor;当xScaleOptional数据类型为FLOAT16时,必须要求weightScale数据类型为INT64,且xQuantMode值为pertensor。
调用示例
示例代码如下,仅供参考,具体编译和执行过程请参考undefined。
[object Object]