昇腾社区首页
中文
注册

aclnnConvolutionBackward

产品支持情况

产品 是否支持
[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]

功能说明

  • 算子功能:卷积的反向传播。根据输出掩码设置计算输入、权重和偏差的梯度。此函数支持1D、2D和3D卷积。

  • 计算公式:

    输入input(N,Cin,Din,Hin,WinN,C_{in},D_{in},H_{in},W_{in})、输出out(N,Cout,Dout,Hout,WoutN,C_{out},D_{out},H_{out},W_{out})和卷积步长(stridestride)、卷积核大小(kernelSizekD,kH,kWkernelSize,kD,kH,kW)、膨胀参数(dilationdilation)的关系是:

    Dout=Din+2padding[0]dilation[0](kernelSize[0]1)1stride[0]+1D_{out}=\lfloor \frac{D_{in}+2*padding[0]-dilation[0] * (kernelSize[0] - 1) - 1}{stride[0]}+1 \rfloor Hout=Hin+2padding[1]dilation[1](kernelSize[1]1)1stride[1]+1H_{out}=\lfloor \frac{H_{in}+2*padding[1]-dilation[1] * (kernelSize[1] - 1) - 1}{stride[1]}+1 \rfloor Wout=Win+2padding[2]dilation[2](kernelSize[2]1)1stride[2]+1W_{out}=\lfloor \frac{W_{in}+2*padding[2]-dilation[2] * (kernelSize[2] -1) -1}{stride[2]}+1 \rfloor

    卷积反向传播需要计算对卷积正向的输入张量 xx、卷积核权重张量 ww 和偏置 bb 的梯度。

    • 对于 xx 的梯度 Lx\frac{\partial L}{\partial x}

      Lxn,cin,i,j=cout=1Coutp=1kHq=1kWLyn,cout,ip,jqwcout,cin,p,q\frac{\partial L}{\partial x_{n, c_{in}, i, j}} = \sum_{c_{out}=1}^{C_{out}} \sum_{p=1}^{k_H} \sum_{q=1}^{k_W} \frac{\partial L}{\partial y_{n, c_{out}, i-p, j-q}}\cdot w_{c_{out}, c_{in}, p, q}

      其中,LL 为损失函数,Ly\frac{\partial L}{\partial y} 为输出张量 yyLL 的梯度。

    • 对于 ww 的梯度 Lw\frac{\partial L}{\partial w}

      Lwcout,cin,p,q=n=1Ni=1Houtj=1Woutxn,cin,isH+p,jsW+qLyn,cout,i,j\frac{\partial L}{\partial w_{c_{out}, c_{in}, p, q}} = \sum_{n=1}^{N} \sum_{i=1}^{H_{out}} \sum_{j=1}^{W_{out}} x_{n, c_{in}, i \cdot s_H + p, j \cdot s_W + q} \cdot \frac{\partial L}{\partial y_{n, c_{out}, i, j}}
    • 对于 bb 的梯度 Lb\frac{\partial L}{\partial b}

      Lbcout=n=1Ni=1Houtj=1WoutLyn,cout,i,j\frac{\partial L}{\partial b_{c_{out}}} = \sum_{n=1}^{N} \sum_{i=1}^{H_{out}} \sum_{j=1}^{W_{out}} \frac{\partial L}{\partial y_{n, c_{out}, i, j}}

函数原型

每个算子分为undefined,必须先调用“aclnnConvolutionBackwardGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnConvolutionBackward”接口执行计算。

  • aclnnStatus aclnnConvolutionBackwardGetWorkspaceSize(const aclTensor *gradOutput, const aclTensor *input, const aclTensor *weight, const aclIntArray *biasSizes, const aclIntArray *stride, const aclIntArray *padding, const aclIntArray *dilation, bool transposed, const aclIntArray *outputPadding, int groups, const aclBoolArray *outputMask, int8_t cubeMathType, aclTensor *gradInput, aclTensor *gradWeight, aclTensor *gradBias, uint64_t *workspaceSize, aclOpExecutor **executor)

  • aclnnStatus aclnnConvolutionBackward(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, const aclrtStream stream)

aclnnConvolutionBackwardGetWorkspaceSize

  • 参数说明:

    • gradOutput(aclTensor *,计算输入):公式中的Ly\frac{\partial L}{\partial y},shape不支持broadcast,要求和input、weight满足卷积输入输出shape的推导关系。其数据类型与input、weight满足数据类型推导规则(参见undefinedundefined)。支持undefinedundefined支持NCL、NCHW、NCDHW,且需要与input、gradInput一致。
      • [object Object]Atlas 推理系列产品[object Object]、[object Object]Atlas 训练系列产品[object Object]:数据类型支持FLOAT、FLOAT16。不支持空tensor。
      • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持BFLOAT16、FLOAT、FLOAT16。1d、2d和3d transposed=false场景,各个维度的大小应该大于等于1。
    • input(aclTensor *,计算输入):公式中的xx,shape不支持broadcast,要求和gradOutput、weight满足卷积输入输出shape的推导关系。其数据类型与gradOutput、weight满足数据类型推导规则(参见undefinedundefined)。支持undefinedundefined支持NCL、NCHW、NCDHW,且需要与gradOutput、gradInput一致。
      • [object Object]Atlas 推理系列产品[object Object]、[object Object]Atlas 训练系列产品[object Object]:数据类型支持FLOAT、FLOAT16。
      • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持BFLOAT16、FLOAT、FLOAT16。1d、2d和3d transposed=false场景,各个维度的大小应该大于等于1。
    • weight(aclTensor *,计算输入):公式中的ww,shape不支持broadcast,要求和gradOutput、input满足卷积输入输出shape的推导关系。其数据类型与gradOutput、input满足数据类型推导规则(参见undefinedundefined)。支持undefinedundefined支持NCL、NCHW、NCDHW,且需要与gradWeight一致。
      • [object Object]Atlas 推理系列产品[object Object]、[object Object]Atlas 训练系列产品[object Object]:数据类型支持FLOAT、FLOAT16。不支持空tensor。
      • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持BFLOAT16、FLOAT、FLOAT16。2d和3d transposed=false场景,H、W的大小应该在[1,255]的范围内,其他维度的大小应该大于等于1。1d transposed=false场景,L的大小应该在[1,255]的范围内,其他维度的大小应该大于等于1。
    • biasSizes(aclIntArray *,计算输入):卷积正向过程中偏差(bias)的shape。数据类型为int64,数组长度是1。 其在普通卷积中等于[weight.shape[0]],在转置卷积中等于[weight.shape[1] * groups]。空Tensor场景下,当outputMask指定偏差的梯度需要计算时,biasSizes不能为nullptr。
    • stride(aclIntArray *,计算输入):反向传播过程中卷积核在输入上移动的步长。数据类型为int64,数组长度为weight维度减2,数值必须大于0。
      • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:3d transposed=false场景,strideD应该大于等于1,strideH、strideW应该在[1,63]的范围内。1d和2d transposed=false场景,各个值都应该大于等于1。
    • padding(aclIntArray *,计算输入):反向传播过程中对于输入填充。数据类型为int64,数组长度可以为weight维度减2,在2d场景下数组长度可以为4。数值必须大于等于0。
      • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:3d transposed=false场景,paddingD应该大于等于0,paddingH、paddingW应该在[0,255]的范围内。1d和2d transposed=false场景,各个值都应该在[0,255]的范围内。
    • dilation(aclIntArray *,计算输入):反向传播过程中的膨胀参数。数据类型为int64,数组长度可以为weight维度减2。数值必须大于0。
      • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:1d、2d和3d transposed=false场景,各个值都应该在[1,255]的范围内。
    • transposed(bool,计算输入):转置卷积使能标志位, 当其值为True时使能转置卷积。
    • outputPadding(aclIntArray *,计算输入):反向传播过程中对于输出填充,数据类型为int64,数组长度可以为weight维度减2,各维度的数值范围满足[0, stride对应维度数值)。transposed为False场景下,要求每个元素值为0。
    • groups(int,计算输入):反向传播过程中输入通道的分组数。 数据类型为int32,需满足groups*weight的C维度=input的C维度,groups取值范围为[1, 65535]。
    • outputMask(const aclBoolArray *,计算输入):输出掩码参数, 指定输出中是否包含输入、权重、偏差的梯度。反向传播过程输出掩码参数为True对应位置的梯度。
    • cubeMathType(int8_t,计算输入):用于判断Cube单元应该使用哪种计算逻辑进行运算,INT8类型的枚举值,枚举如下:
      • 0:KEEP_DTYPE,保持输入的数据类型进行计算。
        • [object Object]Atlas 推理系列产品[object Object]、[object Object]Atlas 训练系列产品[object Object]:当输入是FLOAT,Cube计算单元暂不支持,取0时会报错。
      • 1:ALLOW_FP32_DOWN_PRECISION,允许将输入数据降精度计算。
        • [object Object]Atlas 推理系列产品[object Object]、[object Object]Atlas 训练系列产品[object Object]:当输入是FLOAT,转换为FLOAT16计算。当输入为其他数据类型时不做处理。
        • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:当输入是FLOAT,转换为HFLOAT32计算。当输入为其他数据类型时不做处理。
      • 2:USE_FP16,允许转换为数据类型FLOAT16进行计算。当输入数据类型是FLOAT,转换为FLOAT16计算。
        • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:当输入是BFLOAT16时不支持该选项。当输入为其他数据类型时不做处理。
      • 3:USE_HF32,允许转换为数据类型HFLOAT32计算。当输入是FLOAT16,仍使用FLOAT16计算。
        • [object Object]Atlas 推理系列产品[object Object]、[object Object]Atlas 训练系列产品[object Object]:当输入是FLOAT,Cube计算单元暂不支持。
        • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:当输入是FLOAT,转换为HFLOAT32计算。当输入为其他数据类型时不做处理。
    • gradInput(aclTensor *, 计算输出):公式中的Lx\frac{\partial L}{\partial x}undefined为NCL、NCHW、NCDHW,且与input、gradOutput一致。数据类型与input保持一致。
      • [object Object]Atlas 推理系列产品[object Object]、[object Object]Atlas 训练系列产品[object Object]:数据类型支持FLOAT、FLOAT16。
      • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持BFLOAT16、FLOAT、FLOAT16。
    • gradWeight(aclTensor *, 计算输出):公式中的Lw\frac{\partial L}{\partial w}undefined为NCL、NCHW、NCDHW,且与weight一致。
      • [object Object]Atlas 推理系列产品[object Object]、[object Object]Atlas 训练系列产品[object Object]:数据类型支持FLOAT、FLOAT16。数据类型与weight保持一致。
      • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持BFLOAT16、FLOAT、FLOAT16。数据类型与weight保持一致。
    • gradBias(aclTensor *, 计算输出):公式中的Lb\frac{\partial L}{\partial b},且数据类型与gradOutput一致,undefined为ND。
      • [object Object]Atlas 推理系列产品[object Object]、[object Object]Atlas 训练系列产品[object Object]:数据类型支持FLOAT、FLOAT16。
      • [object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]、[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:数据类型支持BFLOAT16、FLOAT、FLOAT16。
    • workspaceSize(uint64_t *, 出参):返回需要在Device侧申请的workspace大小。
    • executor(aclOpExecutor **, 出参):返回op执行器,包含了算子计算流程。
  • 返回值:

    aclnnStatus:返回状态码,具体参见undefined

    [object Object]

aclnnConvolutionBackward

  • 参数说明:

    • workspace(void*, 入参):在Device侧申请的workspace内存地址。
    • workspaceSize(uint64_t, 入参):在Device侧申请的workspace大小,由第一段接口aclnnConvolutionBackwardGetWorkspaceSize获取。
    • executor(aclOpExecutor*, 入参):op执行器,包含了算子计算流程。
    • stream(aclrtStream, 入参):指定执行任务的Stream。
  • 返回值:

    aclnnStatus:返回状态码,具体参见undefined

约束说明

[object Object]Atlas 推理系列产品[object Object]:当前仅支持1D和2D卷积的反向传播,暂不支持3D卷积的反向传播。

[object Object]Atlas 训练系列产品[object Object]:当前仅支持1D和2D卷积的反向传播,暂不支持3D卷积的反向传播。

  • input的维度必须是2维以上
  • stride、padding、dilation、outputPadding的维度必须等于input维度-2
  • transposed=false时,D、H、W维度约束:(inputdim+paddim×2)((weightdim1)×dilationdim+1)(input_{dim} + pad_{dim} \times 2) \ge ((weight_{dim} - 1) \times dilation_{dim} + 1)
  • transposed=true时:
    • weight的N轴必须大于0
    • weight的N轴必须和input的C轴相等

由于硬件资源限制,算子在部分参数取值组合场景下会执行失败,请根据日志信息提示分析并排查问题。若无法解决,请单击undefined获取技术支持。

调用示例

示例代码如下,仅供参考,具体编译和执行过程请参考undefined

[object Object]