
人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载本文聚焦 CANN asc-devkit 中 Conv3DBackpropFilter3D 卷积反向滤波器计算Tiling 侧接口SetPadding说明如何在调用GetTiling前设置六个方向的 Padding 信息并结合仓库源码剖析该参数在 Tiling 计算、参数校验与最终 Tiling 结构体中的完整流转。读完本文你将掌握 Conv3DBackpropFilter Tiling 接口的配置顺序、SetPadding各参数含义与约束以及 padding 对 Kernel 侧数据切分和搬运的影响。一、背景为什么 Conv3DBackpropFilter 需要单独设置 PaddingConv3DBackpropFilter 是 3D 卷积的反向传播算子其职责是根据正向卷积时的输入Input与输出梯度GradOutput计算权重的梯度GradWeight。在正向卷积中输入特征图会按指定大小在 Depth / Height / Width 各维度进行 Padding 填充而这些 Padding 大小正是反向计算还原输入各位置对输出梯度的贡献时所必须的关键几何信息。在 asc-devkit 中Tiling 侧通过ConvBackpropApi::Conv3dBpFilterTiling类声明见 include/adv_api/conv_backprop/conv3d_bp_filter_tiling.h为 Kernel 计算生成切分参数。其中SetPadding接口就是用来向该 Tiling 对象注入六个方向的 Padding 值这些值最终会写入TConv3DBpFilterTiling结构体供 Kernel 侧完成数据切分、数据搬运与计算。在 Tiling 使用流程中Padding 属于如果存在则必须设置的可选属性类参数只有当正向卷积配置了 Padding 时才需要调用SetPadding完整流程见 Conv3DBackpropFilter_Tiling_usage.md。二、函数原型与调用时机SetPadding的函数原型如下见 SetPadding.mdvoid SetPadding(int64_t padFront, int64_t padBack, int64_t padUp, int64_t padDown, int64_t padLeft, int64_t padRight)返回值无void。调用时机在创建 Tiling 对象之后、调用GetTiling之前调用。六个参数分别对应 3D 卷积三个空间维度的前后/上下/左右六个方向的填充大小且均以正向卷积过程中的 Input 维度为参照参数名输入/输出描述padFront输入卷积正向过程中 Input Depth 维度的前方向 Padding 大小padBack输入卷积正向过程中 Input Depth 维度的后方向 Padding 大小padUp输入卷积正向过程中 Input Height 维度的上方向 Padding 大小padDown输入卷积正向过程中 Input Height 维度的下方向 Padding 大小padLeft输入卷积正向过程中 Input Width 维度的左方向 Padding 大小padRight输入卷积正向过程中 Input Width 维度的右方向 Padding 大小三、源码实现SetPadding 到底做了什么SetPadding的实现位于 impl/adv_api/tiling/conv_backprop/conv3d_bp_filter_tiling_base.cpp其本质是把六个参数分别存入 Tiling 对象的内部属性结构attrInfoConv3DBpAttrvoid Conv3dBpFilterTilingBase::SetPadding( int64_t padFront, int64_t padBack, int64_t padUp, int64_t padDown, int64_t padLeft, int64_t padRight) { this-attrInfo.padFront padFront; this-attrInfo.padBack padBack; this-attrInfo.padUp padUp; this-attrInfo.padDown padDown; this-attrInfo.padLeft padLeft; this-attrInfo.padRight padRight; }Conv3DBpAttr结构体定义于 include/adv_api/conv_backprop/conv3d_bp_tiling_base.h六个 padding 字段的默认值均为0即无填充是默认状态。除 padding 外该结构体还承载strideD/H/W默认 1、dilationD/H/W默认 1、groups默认 1、hf32Enable等 Tiling 计算所需的卷积属性它们分别由SetStride、SetDilation等接口注入。可以看到SetPadding只做赋值、不做任何计算真正的校验与消费发生在后续流程中。四、约束说明来自源码的参数合法性校验尽管SetPadding.md中的约束说明为无但从 Tiling 计算流程的源码可以确认padding 参数在GetTiling内部会经过严格校验见 impl/adv_api/tiling/conv_backprop/conv3d_bp_filter_tiling_base.cpp 的CheckInputAttr非负约束六个 padding 值必须 0。一旦传入负数CheckInputAttr会记录错误日志Illegal attrs have set: ... which must 0.并返回false进而导致GetTiling失败返回 -1。这一约束与Conv3DBpAttr中默认值 0 的设计一致。Load3D 指令上限约束在CheckLoad3DLimits中Height / Width 方向的四个 paddingpadUp、padDown、padLeft、padRight还须满足LOAD3D_MAX_PAD上限。该上限定义于 impl/adv_api/tiling/conv_backprop/conv3d_bp_tiling_util.hconstexpr uint32_t LOAD3D_MAX_PAD 255;即 Height / Width 方向的 padding 取值须 255见 conv3d_bp_filter_tiling_base.cpp否则将报错Attrs not satisfying load3ds limits: ... which must 255.。这一限制源于 Load3D 硬件指令本身对 pad 的编码位宽属于指令级约束。Depth 方向的 padFront / padBack 在 Load3D 检查中未设上限但仍须满足非负约束。校验失败的处理链路CheckInputAttr是CheckInputParam的组成部分GetTiling的Compute()首先执行CheckInputParam()失败即返回 -1见 impl/adv_api/tiling/conv_backprop/conv3d_bp_filter_tiling.cpp因此非法 padding 会直接导致本次 Tiling 结果不可用调用方应通过GetTiling的返回值判断成功与否。五、Padding 如何流转到最终 Tiling 结构体SetPadding注入的六个值最终会通过SetFinalTiling写入TConv3DBpFilterTiling结构体见 impl/adv_api/tiling/conv_backprop/conv3d_bp_filter_tiling_base.cpptiling.dwTiling.set_padFront(static_castuint32_t(this-attrInfo.padFront)); tiling.dwTiling.set_padBack(static_castuint32_t(this-attrInfo.padBack)); tiling.dwTiling.set_padUp(static_castuint32_t(this-attrInfo.padUp)); tiling.dwTiling.set_padDown(static_castuint32_t(this-attrInfo.padDown)); tiling.dwTiling.set_padLeft(static_castuint32_t(this-attrInfo.padLeft)); tiling.dwTiling.set_padRight(static_castuint32_t(this-attrInfo.padRight));同时PrintTilingData也会以调试日志输出这六个 padding 值见 conv3d_bp_filter_tiling_base.cpp便于排查 Tiling 生成问题。TConv3DBpFilterTiling结构体中与 padding 相关的字段说明完整字段见 TConv3DBpFilterTiling_struct.md字段说明padFront卷积反向计算中 Padding 的 Depth 维度的前方向单位元素padBack卷积反向计算中 Padding 的 Depth 维度的后方向单位元素padUp卷积反向计算中 Padding 的 Height 维度的上方向单位元素padDown卷积反向计算中 Padding 的 Height 维度的下方向单位元素padLeft卷积反向计算中 Padding 的 Width 维度的左方向单位元素padRight卷积反向计算中 Padding 的 Width 维度的右方向单位元素该结构体被传递给 Conv3dBackpropFilter 核函数Kernel侧用于数据切分、数据搬运和计算参考 Init.md。当前暂不支持用户自定义配置该结构体中的参数只能通过 Tiling 侧接口获取。六、完整调用示例SetPadding 在 Tiling 流程中的位置以下示例来自 Conv3DBackpropFilter_Tiling_usage.md 与 GetTiling.md展示了包含SetPadding在内的完整配置顺序#include tiling/conv_backprop/conv3d_bp_filter_tiling.h optiling::Conv3DBackpropFilterTilingData tilingData; auto ascendcPlatform platform_ascendc::PlatformAscendCManager::GetInstance(); ConvBackpropApi::Conv3dBpFilterTiling conv3dBpDwTiling(*ascendcPlatform); conv3dBpDwTiling.SetWeightType( ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::FRACTAL_Z_3D, ConvCommonApi::ConvDtype::FLOAT32); conv3dBpDwTiling.SetInputType( ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::NDC1HWC0, ConvCommonApi::ConvDtype::FLOAT16); conv3dBpDwTiling.SetGradOutputType( ConvCommonApi::TPosition::GM, ConvCommonApi::ConvFormat::NDC1HWC0, ConvCommonApi::ConvDtype::FLOAT16); conv3dBpDwTiling.SetInputShape(n, c, d, h, w); conv3dBpDwTiling.SetGradOutputShape(n, c, d, h, w); conv3dBpDwTiling.SetWeightShape(cout, cin, d, h, w); conv3dBpDwTiling.SetPadding(padFront, padBack, padUp, padDown, padLeft, padRight); conv3dBpDwTiling.SetStride(strideD, strideH, strideW); conv3dBpDwTiling.SetDilation(dilationD, dilationH, dilationW); int ret conv3dBpDwTiling.GetTiling(tilingData); // 如果 ret -1获取 Tiling 结果失败 // 也可以使用 AscendC::tiling 命名空间中的 Tiling 结构体获取 Tiling 参数 AscendC::tiling::Conv3DBackpropFilterTilingData tilingDataNotOp; ret conv3dBpDwTiling.GetTiling(tilingDataNotOp);调用要点归纳创建 Tiling 对象通过PlatformAscendCManager::GetInstance()获取平台实例构造Conv3dBpFilterTiling构造函数细节见 Conv3DBackpropFilter_Tiling_constructor.md。平台信息L1/L0A/L0B/L0C/UB 各存储容量会被用于后续 Tiling 计算中的内存合法性判断。设置类型与形状分别调用SetWeightType、SetInputType、SetGradOutputType设置各张量的 Position、Format、DType再调用对应的 Shape 设置接口。设置卷积属性存在 Padding 时调用SetPadding存在 Stride 时调用 SetStride存在扩张时调用 SetDilation。这些接口均为简单的属性注入不涉及计算。获取 Tiling 结果调用GetTiling返回值非 -1 表示成功-1 表示失败、结果不可用。需要包含的头文件#include lib/conv_backprop/conv3d_bp_filter_tiling.h七、测试用例佐证真实场景中的 SetPadding 取值仓库测试用例 tests/api/adv_api/tiling/conv_backprop/test_conv3d_backprop_filter_api_tiling_network.cpp 提供了大量SetPadding的真实调用组合可作为参数取值的参考对称填充SetPadding(3, 3, 3, 3, 3, 3)配合SetStride(2, 2, 2)、SetDilation(1, 1, 1)用于核尺寸 4×4×4 的卷积场景仅 Depth 方向填充SetPadding(9, 9, 0, 0, 0, 0)配合SetStride(2, 2, 2)对应 Depth 维度深填充、Height/Width 不填充的场景无填充SetPadding(0, 0, 0, 0, 0, 0)是最常见的默认场景在 stride 取 (1,2,2)、(2,1,1)、(1,1,1) 等各类组合下均有覆盖测试中还覆盖了SetPadding与不同 Weight/Input Shape如 N16/21/8、C 通道 3~1152、空间尺寸 20×28 到 404×1027的组合验证 Tiling 算法在多样输入下的正确性。八、常见注意事项六个参数缺一不可SetPadding的六个形参没有默认值即使某个方向不填充也要显式传0调用形式必须完整SetPadding(padFront, padBack, padUp, padDown, padLeft, padRight)。方向语义以正向卷积为准padFront/padBack 对应 DepthpadUp/padDown 对应 HeightpadLeft/padRight 对应 Width切勿与 Kernel 侧反算时的方向混淆。注意 Load3D 指令上限Height / Width 方向的 padding 取值需 255超过会触发CheckLoad3DLimits校验失败Depth 方向目前无 Load3D 上限但仍需非负。务必检查 GetTiling 返回值padding 非法或其他属性校验失败都会使GetTiling返回 -1此时 Tiling 数据不可用应先修正参数再重新生成。与其他属性接口配合使用SetPadding仅设置 PaddingStride 与 Dilation 需分别通过 SetStride、SetDilation 设置三者共同决定反向卷积的几何映射关系。综上SetPadding是 Conv3DBackpropFilter Tiling 侧一个轻量但关键的属性注入接口它将正向卷积的六方向填充信息送入 Tiling 对象经过非负与 Load3D 上限校验后最终写入TConv3DBpFilterTiling结构体供 Kernel 侧使用。理解其参数语义、约束与调用顺序是正确使用 Conv3DBackpropFilter Tiling API 的前提。赞分享人工智能深度学习算子库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 AICPU 算子 Tiling 下沉计算样例从 device 侧 Tiling 到 PyTorch 图模式调度优化asc devkit AICPU 算子 Tiling 下沉计算样例从 device 侧 Tiling 到 PyTorch 图模式调度优化 本文基于 asc d人工智能深度学习算子库CANNAscendAscend C 算子开发Conv3DBackpropInput Tiling 的 SetGradOutputShape 接口详解Ascend C 算子开发Conv3DBackpropInput Tiling 的 SetGradOutputShape 接口详解 导读 SetGradOut人工智能深度学习算子库CANNAscend上一篇personalDNSfilter Android版使用教程手机隐私保护一步到位下一篇从单元测试到功能验证VKCOM/kphp项目测试体系深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考