昇腾社区首页
中文
注册

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是 (N,Cin,D,H,W)(N, C_{\text{in}}, D, H, W) ,weight的shape是 (Cout,Cin,Kd,Kh,Kw)(C_{\text{out}}, C_{\text{in}}, K_d, K_h, K_w),scale的shape是 (Cout)(C_{\text{out}}) ,bias的shape是 CoutC_{\text{out}}, 输出(output)的shape是 (N,Cout,Dout,Hout,Wout)(N, C_{\text{out}}, D_{\text{out}}, H_{\text{out}}, W_{\text{out}}),其中NN表示批次大小,CC是通道数,DDHHWW分别是样本的深度、高度和宽度,KdK_dKhK_hKwK_w分别是卷积核的深度、高度和宽度,那输出将被表示为:

    output=conv(input,weight)scale+biasoutput=conv(input, weight)*scale+bias

函数原型

每个算子分为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。支持undefinedundefined支持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执行器,包含了算子计算流程。
  • 返回值:

    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]
  • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:
[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; } ```