- 人工智能
- 深度学习
- 算子库
- CANN
- Ascend
【免费下载链接】asc-devkit
本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。
导读
本文聚焦 asc-devkit 开源仓库中 3D 卷积反向传播(Conv3DBackpropInput,又称 Conv3DTranspose / deconvolution)Tiling 阶段的核心参数设置接口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):设置卷积核 Shape;SetInputShape(n, c, d, h, w):设置输入特征图 Shape(同时会把算子类型标记为kConv3DBackpropInput);SetGradOutputShape(n, c, d, h, w):设置反向传播梯度输出 Shape;SetPadding(padFront, padBack, padUp, padDown, padLeft, padRight):设置正向卷积 Padding;SetDilation(dilationD, dilationH, dilationW):设置膨胀系数;SetOutputPadding(outputPadD, outputPadH, outputPadW):设置输出 Padding(仅 Conv3DTranspose 场景可用)。
派生类Conv3DBpInputTiling在 conv3d_bp_input_tiling.h 中继承该接口,并在GetTiling/Compute流程中消费这些参数。
1.2 底层存储:stride 落入 attrInfo 结构
从源码实现看,SetStride的实质是将三个步长参数写入 Tiling 基类的attrInfo(Conv3DBpAttr结构体,定义于 conv3d_bp_tiling_base.h):
void 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 相关字段默认值为1:
int64_t strideD = 1; int64_t strideH = 1; int64_t strideW = 1;也就是说,即使不调用SetStride,Tiling 流程也会按 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 基类层级的通用校验(CheckInputAttr)
conv3d_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_LOW=1、STRIDES_DIM_HW_UP=63 |
| strideW | [1, 63] | DIM_LOW=1、STRIDES_DIM_HW_UP=63 |
| strideD | [1, 255] | DIM_LOW=1、STRIDES_DIM_DEPTH_UP=255 |
取值范围常量定义于 conv3d_bp_tiling_util.h:
const int32_t DIM_LOW = 1; const int32_t STRIDES_DIM_HW_UP = 63; const int32_t STRIDES_DIM_DEPTH_UP = 255;此外CheckAttrs还要求strideD不大于卷积核深度orgkD(stride_d > kernel_d时直接报错),这是从 3D 反卷积的滑动语义出发的硬性限制。测试用例 Invalid_attrs 中SetStride(256, 256, 256)正是由于超出上述范围而使CheckAttrs返回false。
3.3 Stride 与其他参数的联动约束
CheckOutputHeight(conv3d_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_为kConv3DTranspose),InferShape(conv3d_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 场景下,CheckCalPads(conv3d_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 还会影响算子侧的分块与访存策略:
SetSingleCoreInfo(conv3d_bp_input_tiling.cpp)使用attrInfo.strideH/attrInfo.strideD计算houtCopyLine、doutCopyLine等拷贝行数,进而评估 L2 Cache 占用是否超过经验阈值;CalFmapH(conv3d_bp_input_tiling.cpp)中hoExpand = (orgHo - 1) * strideH + 1用于约束 M 方向可展开的高度;SetInitOutput(conv3d_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.cpp),Stride 同理。取值范围:H/W 方向限制在
[1, 63],D 方向限制在[1, 255],且strideD <= kernelD。超过范围时CheckAttrs返回false,GetTiling返回-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(不调用
SetInputShape),SetStride与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.md | SetStride 接口文档(本文主体来源) |
| include/adv_api/conv_backprop/conv3d_bp_input_tiling_base.h | SetStride 等公共接口声明 |
| include/adv_api/conv_backprop/conv3d_bp_input_tiling.h | Conv3DBpInputTiling 派生类声明 |
| include/adv_api/conv_backprop/conv3d_bp_tiling_base.h | attrInfo/shapeInfo 结构定义 |
| impl/adv_api/tiling/conv_backprop/conv3d_bp_input_tiling_base.cpp | SetStride 实现与通用参数校验 |
| impl/adv_api/tiling/conv_backprop/conv3d_bp_input_tiling.cpp | stride 校验、Shape 推导、Tiling 计算 |
| impl/adv_api/tiling/conv_backprop/conv3d_bp_tiling_util.h | stride 取值范围等常量定义 |
| 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 中直接验证。
- 人工智能
- 深度学习
- 算子库
- CANN
- Ascend
【免费下载链接】asc-devkit
本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。
相关推荐
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
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考