
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载导读本文聚焦 asc-devkit 开源仓库中 3D 卷积反向传播Conv3DBackpropInput又称 Conv3DTranspose / deconvolutionTiling 阶段的核心参数设置接口SetStride。文章以 SetStride.md 文档为骨架结合仓库中 Tiling 基类实现、Tiling 派生实现 与 单元测试完整讲解该接口的函数原型、参数语义、取值范围校验、底层存储结构以及它在完整 Tiling 流程中的调用位置与作用。读完本文读者可以准确使用SetStride配置 Conv3DBackpropInput 算子的步长并理解 Stride 参数如何参与输出 Shape 推导、backprop padding 计算与 Tiling 数据生成。一、接口概览函数原型与参数语义SetStride是 asc-devkit 中ConvBackpropApi命名空间下Conv3DBpInputTiling类提供的 Tiling 参数设置接口用于设置 3D 卷积正向过程中的步长Stride信息。其函数原型为void SetStride(int64_t strideD, int64_t strideH, int64_t strideW)参数说明如下表所示参数名输入/输出描述strideD输入卷积正向过程中 Depth深度方向 Stride 的大小strideH输入卷积正向过程中 Height高度方向 Stride 的大小strideW输入卷积正向过程中 Width宽度方向 Stride 的大小返回值无void。该接口本身无额外约束原文档约束说明为无但 Stride 取值会经过 CheckAttrs 等 Tiling 参数校验逻辑的检查具体取值范围与限制见下文第三节。1.1 接口在类体系中的位置SetStride声明于 conv3d_bp_input_tiling_base.h属于Conv3DBpInputTilingBase公共接口的一部分。该类还提供了与之配套的参数设置接口SetWeightShape(cout, cin, d, h, w)设置卷积核 ShapeSetInputShape(n, c, d, h, w)设置输入特征图 Shape同时会把算子类型标记为kConv3DBackpropInputSetGradOutputShape(n, c, d, h, w)设置反向传播梯度输出 ShapeSetPadding(padFront, padBack, padUp, padDown, padLeft, padRight)设置正向卷积 PaddingSetDilation(dilationD, dilationH, dilationW)设置膨胀系数SetOutputPadding(outputPadD, outputPadH, outputPadW)设置输出 Padding仅 Conv3DTranspose 场景可用。派生类Conv3DBpInputTiling在 conv3d_bp_input_tiling.h 中继承该接口并在GetTiling/Compute流程中消费这些参数。1.2 底层存储stride 落入 attrInfo 结构从源码实现看SetStride的实质是将三个步长参数写入 Tiling 基类的attrInfoConv3DBpAttr结构体定义于 conv3d_bp_tiling_base.hvoid Conv3DBpInputTilingBase::SetStride(int64_t strideD, int64_t strideH, int64_t strideW) { this-attrInfo.strideH strideH; this-attrInfo.strideW strideW; this-attrInfo.strideD strideD; }Conv3DBpAttr中 stride 相关字段默认值为1int64_t strideD 1; int64_t strideH 1; int64_t strideW 1;也就是说即使不调用SetStrideTiling 流程也会按 stride 均为 1 的默认值进行 Shape 推导与 Tiling 计算显式调用SetStride则用于覆盖默认值。二、调用示例与完整使用流程原文档给出的调用示例如下auto ascendcPlatform platform_ascendc::PlatformAscendCManager::GetInstance(); ConvBackpropApi::Conv3DBpInputTiling conv3DBpDxTiling(*ascendcPlatform); conv3DBpDxTiling.SetStride(strideD, strideH, strideW);其中platform_ascendc::PlatformAscendCManager::GetInstance()获取昇腾平台信息单例Conv3DBpInputTiling的构造函数会读取实际 SoC 的 L1/L0A/L0B/L0C/UB 等内存容量供后续 Tiling 分块计算使用见 conv3d_bp_input_tiling_base.cpp。2.1 完整的 Tiling 配置序列SetStride通常与 Shape、Padding、Dilation 等设置接口配合使用最终调用GetTiling生成 Tiling 数据。仓库单元测试 test_conv3d_backprop_input_api_tiling_func.cpp 给出了典型的配置序列Conv3DBpInputTiling conv3dDx(*ascendcPlatform); conv3dDx.SetWeightShape(512, 512, 1, 1, 1); conv3dDx.SetInputShape(1, 512, 5, 32, 32); conv3dDx.SetGradOutputShape(1, 512, 5, 32, 32); conv3dDx.SetDilation(1, 1, 1); conv3dDx.SetStride(256, 256, 256); // 非法取值CheckAttrs 应返回 false EXPECT_EQ(false, conv3dDx.CheckAttrs()); conv3dDx.SetStride(1, 1, 1); // 恢复合法取值 conv3dDx.SetPadding(256, 256, 0, 0, 0, 0); EXPECT_EQ(false, conv3dDx.CheckPadRange());而在网络级测试 test_conv3d_backprop_input_api_tiling_network.cpp 中一个合法的完整流程如下conv3dDx.SetWeightShape(3, 64, 3, 3, 3); conv3dDx.SetInputShape(16, 64, 22, 130, 130); conv3dDx.SetGradOutputShape(16, 3, 20, 128, 128); conv3dDx.SetStride(1, 1, 1); // ... SetPadding / SetDilation 等 int64_t ret1 conv3dDx.GetTiling(tilingData);2.2 GetTiling 的返回值语义GetTiling返回int64_t成功返回0参数校验或 Tiling 计算失败返回-1见 conv3d_bp_input_tiling.cpp。调用方应检查该返回值以判断 Tiling 是否生成成功。三、Stride 的取值范围与校验规则虽然SetStride接口本身不设约束但生成的 Stride 值会在Compute()→CheckInputParam()中被严格校验。校验分两个层级3.1 基类层级的通用校验CheckInputAttrconv3d_bp_input_tiling_base.cpp 中要求 stride 必须为正数if (this-attrInfo.strideH 0 || this-attrInfo.strideW 0 || this-attrInfo.strideD 0) { TILING_LOG_ERROR(Illegal attrs have set: strideH%ld, strideW%ld, strideD%ld, which must 0., ...); return false; }单元测试 Input_Attr_Check 验证了strideH 0时CheckInputAttr返回false。3.2 派生类层级的范围校验CheckAttrs派生类 conv3d_bp_input_tiling.cpp 中CheckAttrs对 stride 施加更严格的取值范围约束参数支持范围依据strideH[1, 63]DIM_LOW1、STRIDES_DIM_HW_UP63strideW[1, 63]DIM_LOW1、STRIDES_DIM_HW_UP63strideD[1, 255]DIM_LOW1、STRIDES_DIM_DEPTH_UP255取值范围常量定义于 conv3d_bp_tiling_util.hconst int32_t DIM_LOW 1; const int32_t STRIDES_DIM_HW_UP 63; const int32_t STRIDES_DIM_DEPTH_UP 255;此外CheckAttrs还要求strideD不大于卷积核深度orgkDstride_d kernel_d时直接报错这是从 3D 反卷积的滑动语义出发的硬性限制。测试用例 Invalid_attrs 中SetStride(256, 256, 256)正是由于超出上述范围而使CheckAttrs返回false。3.3 Stride 与其他参数的联动约束CheckOutputHeightconv3d_bp_input_tiling.cpp要求mod((fmapHPadding - filterHDilation), strideH) padDown即高度方向加 padding 后的特征图尺寸与膨胀后卷积核尺寸之差对strideH取模的结果不能超过padDown否则输出高度无法整除步长。这体现了 stride 必须与 padding、dilation、kernel size 协同满足整除约束。四、Stride 在 Tiling 计算中的核心作用Stride 一旦写入attrInfo将在 Tiling 计算的多处被消费是反卷积 Shape 推导与 backprop padding 计算的基石。4.1 参与输出 Shape 反推InferShape对于 Conv3DTranspose 场景未调用SetInputShape时opType_为kConv3DTransposeInferShapeconv3d_bp_input_tiling.cpp利用 stride 反推出输入特征图尺寸int64_t di (shapeInfo.orgDo - 1) * attrInfo.strideD - attrInfo.padFront - attrInfo.padBack attrInfo.dilationD * (shapeInfo.orgkD - 1) attrInfo.outputPadD 1; int64_t hi (shapeInfo.orgHo - 1) * attrInfo.strideH - attrInfo.padUp - attrInfo.padDown attrInfo.dilationH * (shapeInfo.orgkH - 1) attrInfo.outputPadH 1; int64_t wi (shapeInfo.orgWo - 1) * attrInfo.strideW - attrInfo.padLeft - attrInfo.padRight attrInfo.dilationW * (shapeInfo.orgkW - 1) attrInfo.outputPadW 1;4.2 参与 Shape 一致性校验CheckCalPads在常规 Conv3DBackpropInput 场景下CheckCalPadsconv3d_bp_input_tiling.cpp用 stride 按正向卷积公式推导期望的输出尺寸并与SetGradOutputShape设置的梯度输出 Shape 比对int64_t doExpect (shapeInfo.orgDi attrInfo.padFront attrInfo.padBack - filterDDilation) / attrInfo.strideD 1; int64_t hoExpect (shapeInfo.orgHi attrInfo.padUp attrInfo.padDown - filterHDilation) / attrInfo.strideH 1; int64_t woExpect (shapeInfo.orgWi attrInfo.padLeft attrInfo.padRight - filterWDilation) / attrInfo.strideW 1;若推导出的(doExpect, hoExpect, woExpect)与用户设置的梯度输出 Shape 不一致Tiling 直接返回失败。因此调用SetStride时stride 取值必须与输入/输出 Shape、kernel、padding、dilation 整体自洽。4.3 参与 backprop padding 计算反卷积的反向 padding由 CalModifyBackpropPadD 与 CalModifyBackpropPadHW 计算其中大量使用 stride// 尾端反向 padding 公式H/W 同理 int64_t padTailAfter CalBackpropPadAfter(shapeInfo.orgDi, shapeInfo.orgDo, attrInfo.strideD, attrInfo.padFront); // 等价于 inputDim - outputDim * stride pad计算得到的backpropPadHead/Tail/Up/Down/Left/Right会随最终 Tiling 数据下发到算子侧用于控制梯度累加时各维度的裁剪范围。4.4 参与 Kernel 侧 Tiling 分块决策Stride 还会影响算子侧的分块与访存策略SetSingleCoreInfoconv3d_bp_input_tiling.cpp使用attrInfo.strideH/attrInfo.strideD计算houtCopyLine、doutCopyLine等拷贝行数进而评估 L2 Cache 占用是否超过经验阈值CalFmapHconv3d_bp_input_tiling.cpp中hoExpand (orgHo - 1) * strideH 1用于约束 M 方向可展开的高度SetInitOutputconv3d_bp_input_tiling.cpp中doModulo、hoModulo用 stride 取模决定是否需要初始化输出initOutputFlag。4.5 写入最终 Tiling 数据Tiling 数据生成阶段SetFinalTiling会把 stride 原样写入 Tiling 结构体供算子侧 kernel 读取tiling.conv3DDxTiling.set_strideH(this-attrInfo.strideH); tiling.conv3DDxTiling.set_strideW(this-attrInfo.strideW); tiling.conv3DDxTiling.set_strideD(this-attrInfo.strideD);对应代码见 conv3d_bp_input_tiling_base.cpp。同时PrintTilingData会通过日志输出strideH/strideW/strideD供调试定位conv3d_bp_input_tiling_base.cpp。五、实践要点与常见错误综合文档、源码与测试使用SetStride时有以下几个实践要点调用顺序建议在SetWeightShape/SetInputShape/SetGradOutputShape之后、GetTiling之前调用SetStride确保校验阶段能拿到完整的 Shape 上下文。基类SetGroup的注释也提示应在设置 Shape 之后调用conv3d_bp_input_tiling_base.cppStride 同理。取值范围H/W 方向限制在[1, 63]D 方向限制在[1, 255]且strideD kernelD。超过范围时CheckAttrs返回falseGetTiling返回-1。Shape 自洽stride 必须与 input/gradOutput Shape、kernel、padding、dilation 满足 4.2 节的正向卷积公式否则CheckCalPads校验失败。在确定 stride 前可先用公式outSize (inSize padBefore padAfter - dilation*(k-1) - 1) / stride 1预推输出尺寸。Conv3DTranspose 场景若使用 Conv3DTranspose不调用SetInputShapeSetStride与SetOutputPadding、SetDilation共同决定InferShape反推出的输入尺寸且CheckTransposeOutputtingRange要求outputPad严格小于同维度的 stride 或 dilation。调试手段开启 Tiling 日志如测试文件中的#define ENABLE_TILING_DEBUG后PrintTilingData会输出 stride、padding、backprop pad 等全部关键参数便于定位参数错误。六、相关代码路径索引以下是本文引用的核心文件便于读者深入阅读文件说明docs/zh/api/SIMD-API/adv_api/convolution_compute/Conv3DBackpropInput_Tiling/SetStride.mdSetStride 接口文档本文主体来源include/adv_api/conv_backprop/conv3d_bp_input_tiling_base.hSetStride 等公共接口声明include/adv_api/conv_backprop/conv3d_bp_input_tiling.hConv3DBpInputTiling 派生类声明include/adv_api/conv_backprop/conv3d_bp_tiling_base.hattrInfo/shapeInfo 结构定义impl/adv_api/tiling/conv_backprop/conv3d_bp_input_tiling_base.cppSetStride 实现与通用参数校验impl/adv_api/tiling/conv_backprop/conv3d_bp_input_tiling.cppstride 校验、Shape 推导、Tiling 计算impl/adv_api/tiling/conv_backprop/conv3d_bp_tiling_util.hstride 取值范围等常量定义tests/api/adv_api/tiling/conv_backprop/test_conv3d_backprop_input_api_tiling_func.cpp功能级单元测试含非法 stride 校验tests/api/adv_api/tiling/conv_backprop/test_conv3d_backprop_input_api_tiling_network.cpp网络级集成测试含完整调用序列总结SetStride是 asc-devkit 中 Conv3DBackpropInput / Conv3DTranspose Tiling 配置链上不可或缺的一环它通过attrInfo结构将strideD/strideH/strideW注入 Tiling 计算流程驱动输出 Shape 推导、backprop padding 计算与核内分块决策并最终随Conv3DBackpropInputTilingData下发到算子侧。使用该接口时需特别注意 H/W 方向[1, 63]、D 方向[1, 255]且不超过 kernel 深度的取值范围限制以及 stride 与 Shape、padding、dilation 之间的整除自洽约束——这些规则均有源码校验逻辑与单元测试背书可在 conv3d_bp_input_tiling.cpp 与 test_conv3d_backprop_input_api_tiling_func.cpp 中直接验证。赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐asc-devkit 算子开发Conv3DBackpropInput Tiling 之 SetInputShape 接口深度解析asc devkit 算子开发Conv3DBackpropInput Tiling 之 SetInputShape 接口深度解析 导读 SetInputSha人工智能深度学习算子库CANNAscendasc-devkit 算子开发Conv3D Tiling 的 SetStride 接口用法与原理详解asc devkit 算子开发Conv3D Tiling 的 SetStride 接口用法与原理详解 导读 本文聚焦 CANN asc devkit 开源算子人工智能深度学习算子库CANNAscendasc-devkit 中 Conv3DBackpropInput Tiling 的 SetPadding 接口反卷积 Padding 参数设置详解asc devkit 中 Conv3DBackpropInput Tiling 的 SetPadding 接口反卷积 Padding 参数设置详解 导读 本人工智能深度学习算子库CANNAscend上一篇PostHog Web Analytics 架构与开发指南从前端 Tiles 到 HogQL 查询与 Sessions 表下一篇Flipper Zero Sub-GHz 完全指南SUB 文件格式、频率限制与信号分析实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考