
CANN ops-nn 图融合规则深度解析Conv3DBackpropFilterToV2FusionPass 算子升级与 Transpose 插入机制【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn本文基于 CANN 神经网络算子库 ops-nn 中的图融合规则文档系统讲解Conv3DBackpropFilterToV2FusionPass的实现原理与约束条件。该融合规则负责在编译期将网络图中的Conv3DBackpropFilter算子改写为Conv3DBackpropFilterV2并在满足特定形状条件时自动插入Transpose算子以适配 NPU 上 V2 算子的原生计算格式。读完本文你将掌握该融合规则的触发条件、计算量阈值公式的推导、源码级执行流程以及如何通过仓库内的单元测试验证融合行为。一、融合背景为什么要从 Conv3DBackpropFilter 升级到 V2三维卷积反向传播中权重梯度计算算子Conv3DBackpropFilter用于求卷积核权重张量 $w$ 的梯度 $\frac{\partial L}{\partial w}$。在 Ascend 950 系列 NPU 上ops-nn 仓库提供的是更贴近硬件计算特性的新算子Conv3DBackpropFilterV2其计算语义与旧算子完全等价但支持的数据排布NDHWC、NCDHW、DHWCN与底层 tiling 实现针对 950 架构做了专门优化见 conv/conv3d_backprop_filter_v2/README.md 与 op_kernel 下 arch35 内核实现。为了让上层框架TensorFlow 等下发的旧算子图在编译期无缝迁移到新算子ops-nn 在图编译阶段通过DecomposePass机制注册了Conv3DBackpropFilterToV2FusionPass。它不属于运行时的算子替换而是发生在 GE 图优化阶段的自定义融合规则对用户完全透明——网络构图侧无需任何改动。二、融合模式算子改写 按需插入 Transpose按照融合规则文档Conv3DBackpropFilterToV2FusionPass.md的描述该融合的行为可以概括为将符合图融合 pattern 的Conv3DBackpropFilter算子改为Conv3DBackpropFilterV2算子过程中对满足约束条件的输出加入Transpose算子。融合前后的计算图结构如下图所示。从源码看融合后的图有两种形态不插入 Transpose当输出本身是NCDHW排布或形状不满足计算量阈值、shape 未知时仅做算子节点替换插入 Transpose当输出为NDHWC或DHWCN且 shape 已知、计算量在阈值内时在Conv3DBackpropFilterV2输出端追加一个Transpose把 V2 原生产出的NCDHW结果转回下游所需的排布。三、融合规则注册与源码实现3.1 规则注册与匹配融合规则的入口定义在 conv3d_backprop_filter_to_v2_fusion_pass.hconst ge::AscendString CONV_BACKPROP_FILTER Conv3DBackpropFilter; const ge::AscendString CONV_BACKPROP_FILTER_V2_PASS Conv3DBackpropFilterToV2FusionPass;对应的 .cpp 文件末尾通过宏完成注册REG_DECOMPOSE_PASS(Conv3DBackpropFilterToV2FusionPass, {CONV_BACKPROP_FILTER}) .Stage(CustomPassStage::kCompatibleInherited);也就是说该规则会匹配图中所有Conv3DBackpropFilter类型节点并在kCompatibleInherited兼容继承阶段执行。文档中明确指出该融合规则不能关闭源码层面也确实没有提供任何开关或环境变量来控制其启用/禁用——它属于架构强制执行的编译期行为。同时它继承自公共基类ConvBackpropFusionBasePass见 conv_backprop_fusion_base_pass.h该基类统一处理了属性读取、输入输出 Desc 更新等公共逻辑。3.2 Replacement算子节点替换与属性透传核心替换逻辑在Replacement()conv3d_backprop_filter_to_v2_fusion_pass.cpp中实现通过GetNodeDesc()、GetNodeAttrs()读取原节点输入输出描述与属性用EsGraphBuilder重建三个输入x、filter_size、out_backprop创建Conv3DBackpropFilterV2节点并透传strides、pads、dilations、groups、data_format、hf32等属性额外透传_op_impl_mode_enum、from_depthwise、padding三个算子级属性调用CheckTransposeNeeded()判断是否需要插入 Transposebuilder.BuildAndReset(...)返回替换后的子图。其中_op_impl_mode_enum对应算子实现模式基类中HF32_PRECISION_MODE_INT 0x40表示 HF32 精度模式非 HF32 时统一回落为0x1from_depthwise标记是否来自 depthwise 卷积场景padding透传原始 padding 策略字符串这些属性在 conv_backprop_fusion_base_pass.cpp 中被逐一读取并做缺省处理。3.3 Transpose 的插入细节当需要插入 Transpose 时CreateOutputWithTranspose()执行以下步骤把输出 Desc 的形状重排为NCDHW顺序从 NDHWC 或 DHWCN 还原更新到 V2 节点的输出 Desc 上让 V2 算子按原生 NCDHW 语义产出根据原输出格式选择转置排列输出为NDHWCTRANSPOSE_PERM_NDHWC {0, 2, 3, 4, 1}即NCDHW - NDHWC输出为DHWCNTRANSPOSE_PERM_DHWCN {2, 3, 4, 1, 0}即NCDHW - DHWCN通过公共工具ConvBackpropFusionUtilsPass::CreateTransposeNode()conv_backprop_fusion_utils_pass.cpp创建Transpose节点该工具用CompliantNodeBuilder构造节点把perm作为常量输入builder.CreateVector(config.perm)接入 Transpose 的第二个输入并按 perm 计算出转置后的输出 shape 与格式返回 Transpose 的输出作为融合子图的最终输出保证下游节点看到的数据排布与融合前完全一致。值得注意的是这里生成的Transpose节点名称固定为y_transpose输出格式通过TransposeNodeConfig::Create(..., outputOriginFormat)显式指定为原输出的 NDHWC/DHWCN从而保证融合前后图语义等价。四、使用约束何时插入 Transpose融合规则文档给出的约束原文如下该融合规则在满足以下条件时对 format 为NDHWC/DHWCN且 shape 已知的输出新增Transpose算子Din等于 1 时Din*Cout*Cin不大于核数/2*32*32Din大于 1 时Din*Cout*Cin不大于核数*32*32*4。该融合规则不能关闭。4.1 阈值公式的源码对照上述阈值并非凭空设定而是对应 conv3d_backprop_filter_to_v2_fusion_pass.cpp 中的三个常量const int64_t COMPUTE_SIZE_PER_ROUND 32 * 32; // 单核单轮次计算量 const int64_t MAX_ROUND_COUNT 4; // 最大轮次数 const int64_t HALF_CORE_DIVISOR 2; // 2D场景不超过一半的核参与计算IsShapeNeedTranspose()的实现逻辑int64_t totalCount di * cin * cout; int64_t shapeLimit coreCount * COMPUTE_SIZE_PER_ROUND * MAX_ROUND_COUNT; // 3D 场景 if (di 1) { shapeLimit (coreCount / HALF_CORE_DIVISOR) * COMPUTE_SIZE_PER_ROUND; // 2D 场景 } return totalCount shapeLimit;代入常量后即为文档所述的两个不等式Din 12D 卷积退化场景Din*Cout*Cin (核数/2) * 32 * 32Din 1真 3D 场景Din*Cout*Cin 核数 * 32 * 32 * 4。4.2 设计意图计算量估算di * cin * cout衡量的是该权重梯度任务的总体计算规模32*32为单核单轮次可承载的计算量4为允许的最大轮次数二者相乘得到所有核在限定轮次内的总计算量上限2D 场景收紧当Din 1时任务退化为 2D 卷积参与切分的核数被限制为总核数的一半HALF_CORE_DIVISOR因此阈值更小。源码注释也明确说明3D 场景总计算量估算不超过 4 个轮次否则 Transpose 代价过大2D 场景保持原有逻辑不超过一半的核参与计算动态 shape 不插入IsDynamicShape()检查三个关键张量x、filter_size、out_backprop的 shape 是否为-1一旦任一为动态 shape直接判定无需 Transpose见 conv3d_backprop_filter_to_v2_fusion_pass.cpp核数为 0 不插入GetAiCoreCount()从fe::PlatformInfo读取 AI Core 数量若获取失败返回 0则shapeLimit为 0同样不会插入 Transpose。也就是说新增 Transpose 算子是有条件的输出必须是 NDHWC/DHWCN 排布、shape 必须已知、且估算计算量必须在阈值之内。对于输出本身就是NCDHW的图CheckTransposeNeeded()直接返回 false或计算量超过阈值的大 shape 场景融合仍然发生算子替换为 V2只是不追加 Transpose由下游按 NCDHW 语义消费数据。五、支持的型号与平台限制融合规则文档明确列出支持的型号Ascend 950PR / Ascend 950DT这与源码中的支持清单一致。conv_backprop_fusion_utils_pass.h 定义了const std::mapstd::string, NpuArch SUPPORT_SOC_LIST {{Ascend950, NpuArch::DAV_3510}};基类的MeetRequirements()会调用CheckSocAndIntrinsic()conv_backprop_fusion_base_pass.cpp校验当前编译平台的短型号是否在SUPPORT_SOC_LIST中不在列表中的平台直接跳过融合返回GRAPH_NOT_CHANGED。例如单元测试中Ascend910_93与MC62CM12A两个平台均被验证为不支持该融合详见下文测试用例。六、测试用例验证该融合规则在 tests/ut/op_graph/test_conv3d_backprop_filter_to_v2_fusion_pass.cpp 中有 16 个单元测试覆盖了几乎所有分支是理解规则行为的最佳参考。测试通过CheckNodeExists(graph, Conv3DBackpropFilterV2)断言算子替换是否成功、通过CheckNodeExists(graph, Transpose)断言 Transpose 是否插入。典型用例梳理如下测试名场景预期结果patternTest/bf16FusionSuccess/fp32FusionSuccessFP16 / BF16 / FP32 基本融合替换成功unsupportedPlatformFail/mc62cm12APlatformFailAscend910_93、MC62CM12A 平台不融合GRAPH_NOT_CHANGEDnoTransposeCase输出格式为 NCDHW替换成功、无 TransposedhwcFormatCase输出格式为 DHWCN替换成功、有 TransposeshapeLimitExceededNoTranspose3D 大 shapedi16, cin256, cout128totalCount524288 131072替换成功、无 TransposediEqualsOneNeedTranspose2D 场景di1totalCount64 16384替换成功、有 TransposediEqualsOneShapeLimitExceeded2D 大 shapedi1totalCount65536 16384替换成功、无 TransposexNdwhcFormatCase/xDhwhnFormatCasex 输入分别为 NDHWC / DHWCN 格式替换成功、有 Transposeboundary3DNeedTranspose3D 边界值totalCount shapeLimit替换成功、有 Transpose含等号boundary2DNeedTranspose2D 边界值totalCount shapeLimit替换成功、有 Transpose含等号coreCountZeroNoTransposeAI Core 数为 0替换成功、无 Transpose其中两个边界测试boundary3DNeedTranspose、boundary2DNeedTranspose特别验证了不等式采用小于等于的判定当totalCount恰好等于shapeLimit时依然插入 Transpose。七、总结Conv3DBackpropFilterToV2FusionPass是 ops-nn 在 Ascend 950 平台上为兼容旧图而设计的编译期图融合规则其核心价值在于无缝算子升级将旧版Conv3DBackpropFilter编译期替换为性能更优的Conv3DBackpropFilterV2属性全量透传上层框架零改动格式自适应仅在输出为 NDHWC/DHWCN 且形状已知、计算量可控时插入TransposeNCDHW - NDHWC用{0,2,3,4,1}NCDHW - DHWCN用{2,3,4,1,0}其余场景保持纯替换避免不必要的转置开销强制生效且平台受限规则无法关闭且仅对 Ascend 950PR/Ascend 950DT 生效其他平台自动跳过。如需进一步了解融合后的 V2 算子本身的功能、参数与硬件约束可阅读 conv/conv3d_backprop_filter_v2/README.md相关的 2D 版本融合规则Conv2DBackpropFilterToV3FusionPass与测试可参考 conv2d_backprop_filter_to_v3_fusion_pass.cpp 及 test_conv2d_backprop_filter_to_v3_fusion_pass.cpp。【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-nn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考