aclnnQuantConvolution
产品支持情况
产品 | 是否支持 |
---|---|
[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] | × |
功能说明
算子功能:完成per-tensor量化的2D、3D卷积计算,其中卷积计算过程与aclnnConvolution接口一致。
计算公式: 我们假定输入(input)的shape是 ,weight的shape是 ,scale的shape是 ,bias的shape是 , 输出(output)的shape是 ,其中表示批次大小,是通道数,、和分别是样本的深度、高度和宽度,、和分别是卷积核的深度、高度和宽度,那输出将被表示为:
函数原型
每个算子分为undefined,必须先调用“aclnnQuantConvolutionGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnQuantConvolution”接口执行计算。
aclnnStatus aclnnQuantConvolutionGetWorkspaceSize(const aclTensor* input, const aclTensor* weight, const aclTensor* bias, const aclTensor *scale, const aclTensor *offset, const aclIntArray* stride, const aclIntArray* padding, const aclIntArray* dilation, bool transposed, const aclIntArray* outputPadding, int64_t groups, int32_t offsetx, const char* roundMode, aclTensor* output, uint64_t* workspaceSize, aclOpExecutor** executor)
aclnnStatus aclnnQuantConvolution(void *workspace, const uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)
aclnnQuantConvolutionGetWorkspaceSize
参数说明:
- input(aclTensor *,计算输入):表示卷积输入。公式中的
input
,device侧的aclTensor,支持undefined。input、weight、output的维度需要相同。不支持空tensor输入。- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持INT8。undefined仅支持NCDHW。
- weight(aclTensor *,计算输入):表示卷积权重。公式中的
weight
,device侧的aclTensor,支持undefined,其shape的C维度需要与input的C维度保持一致。不支持空tensor输入。- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持INT8。undefined仅支持NCDHW。
- bias(aclTensor *,计算输入):表示卷积偏置。公式中的
bias
,device侧的aclTensor。支持undefined,undefined支持ND,shape支持一维且与weight的第一维cout相等。- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持BFLOAT16、FLOAT16、FLOAT。
- scale(aclTensor*,计算输入):表示量化参数,公式中的
scale
,device侧的aclTensor。undefined支持ND,shape是1维且与weight的第一维cout一致。- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型仅支持FLOAT。
- offset(aclTensor*,计算输入):预留量化参数,device侧的aclTensor。目前暂不支持,传入空指针nullptr即可。
- stride(aclIntArray *,计算输入):卷积扫描步长,2d场景下数组长度需等于2,3d场景下数组长度需等于3。strideH和strideW应该在[1,63]的范围内。conv3d场景下,strideD的大小应该在[1,1000000]的范围内。
- padding(aclIntArray *,计算输入):对input的填充。其值应该大于等于0,paddingH和paddingW应该在[0,255]的范围内。conv3d场景下,paddingD的大小应该在[0,1000000]的范围内。
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:padding的数组长度需要等于3。
- dilation(aclIntArray *,计算输入):卷积核中元素的间隔,2d场景下数组长度需等于2,3d场景下数组长度需等于3。其值应该大于0,dilationH和dilationW应该在[1,255]的范围内。conv3d场景下,dilationD的大小应该在[1,1000000]的范围内。
- transposed(bool,计算输入):预留参数。表示是否为转置量化卷积。目前暂不支持,传入false即可。
- outputPadding(aclIntArray *,计算输入):预留参数。表示转置卷积情况下,对输出所有边的填充,非转置卷积情况下,忽略该属性配置。目前暂不支持,传入空指针nullptr即可。
- groups(int64_t,计算输入):表示从输入通道到输出通道的块链接个数。
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数值必须为1。
- offsetx(int32_t,计算输入):表示量化因子。
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:暂不支持,传入0值即可。
- roundMode(char *,计算输入):表示取整模式。
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:暂不支持,传入空指针nullptr。
- output(aclTensor *,计算输出):表示卷积输出。公式中的
out
,其shape满足卷积的推导规则。不支持空tensor输出。- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持BFLOAT16、FLOAT16。undefined仅支持NCDHW。
- workspaceSize(uint64_t *,出参):返回需要在Device侧申请的workspace大小。
- executor(aclOpExecutor **,出参):返回op执行器,包含了算子计算流程。
- input(aclTensor *,计算输入):表示卷积输入。公式中的
返回值:
aclnnStatus:返回状态码,具体参见undefined。
[object Object]
aclnnQuantConvolution
参数说明:
- workspace(void*,入参):在Device侧申请的workspace内存地址。
- workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由第一段接口aclnnQuantConvolutionGetWorkspaceSize获取。
- executor(aclOpExecutor*,入参):op执行器,包含了算子计算流程。
- stream(aclrtStream,入参):指定执行任务的Stream。
返回值:
aclnnStatus:返回状态码,具体参见undefined。
约束说明
- 算子仅支持在推理场景下调用。
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:input, weight, bias, scale, offset中每一组tensor的每一维大小都应小于int32的最大值2147483647(INT32_MAX)。
调用示例
示例代码如下,仅供参考,具体编译和执行过程请参考undefined。 不同产品型号请参考使用不同的main函数。
- [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:
int main() { // 1. (固定写法)device/stream初始化,参考acl API手册 // 根据自己的实际device填写deviceId int32_t deviceId = 0; aclrtStream stream; std::vector[object Object] dtypesInfo = {aclDataType::ACL_INT8, aclDataType::ACL_INT8, aclDataType::ACL_INT32, aclDataType::ACL_INT64, aclDataType::ACL_FLOAT16}; // 分别是input/weight/bias/scale/output的datatype auto ret = aclnnQuantConvolutionTest(deviceId, stream, dtypesInfo); CHECK_FREE_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnQuantConvolutionTest failed. ERROR: %d\n", ret); return ret);
Finalize(deviceId, stream); return 0; } ```