已合并
适配双输出场景 #9254
适配双输出场景 #9254
已合并
YuanTianyi创建于 12 天前
YuanTianyi成员
12 天前

描述

1. 双输出 Tiling 与 Kernel

  • 注册 ExtendConvTransposeV2 TilingData,并复用现有 Conv3D Backprop Tiling 模板。
  • 通过私有属性 dual_output=true 标识双输出场景。
  • 新增独立的 extend_conv_transpose_v2.cpp Kernel 入口,处理两路输出及各自的 scale/quant mode。

2. 保持原算子兼容

  • 双输出能力仅通过 ExtendConvTransposeV2 暴露,不影响原有图入口。

关联的Issue

https://gitcode.com/cann/ops-nn/issues/4910

测试

rdv,自验证用例通过

文档更新

更新了ExtendConvTransposeV2算子的README.md 文件

类型标签

AI/Agent生成声明

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 YuanTianyi 的贡献)
YYuanTianyi成员
12 天前 创建了 pull request,commit 49b0112d
atomgit-bot
atomgit-bot
12 天前 评论:

变更摘要

该 PR 新增双输出(y0/y1)的 V2 算子 ExtendConvTransposeV2,其底层复用 conv3d_backprop_input_v2 的 tiling 与 kernel 实现,通过引入第二路输出 y1 及对应量化参数 scale1,支持双输出独立量化(quantMode0/quantMode1)与独立 ReLU(enRelu0/enRelu1)控制。为支撑该能力,将原单输出的 quantMode/enRelu 字段拆分为两路,并将 fusion_mode 改为位编码语义,同时在 arch35 卷积反向 kernel 链路中为各 Block 类扩展了 y1/scale1 的输入与处理逻辑。

主要改动

  • 新增 ExtendConvTransposeV2 算子: 新增算子注册定义(extend_conv_transpose_v2_proto.hextend_conv_transpose_v2_def.cpp),声明 scale0/scale1 可选输入及 y0/y1 两个输出;extend_conv_transpose_v2_infershape.cppinput_size 全零时按转置卷积公式重新推导输出 shape 并复制到 y1;新增 tiling 注册(复用 Conv3DDXV2 系列模板类)与 kernel 入口 extend_conv_transpose_v2.cpp(通过 DTYPE_Y1 宏启用双输出路径)。

  • Tiling 数据与运行参数扩展为双输出: 在 conv3d_backprop_input_v2_tiling_data_arch35.h 中新增 dualOutputenRelu1quantMode1 字段,将原 quantMode/enRelu 重命名为 quantMode0/enRelu0Conv3dBpInputV2RunInfo 同步拆分两路字段,SCALE_INDEX 拆为 SCALE0_INDEX/SCALE1_INDEX,并从 dual_output 属性读取 hasDualOutput_ 写入 tiling 数据;各 tiling 类按 GetVectorScaleCount() 计算 scale L1 占用(scale0/scale1 双路向量量化)。

  • kernel 双输出计算链路: Conv3dDxBaseConv3dDxOswBlockConv3dDxKsBlockConv3dDxSmallKernel 均扩展 scale0Type/scale0Formaty1Typescale1Type/scale1Format 模板参数,新增 y1Gm_/scale1Gm_hasSecondOutput_,并新增 SetScale1 与双输出 IterateAll/GetTensorC/LoadL0c2GmDual 路径;ConvBpContext/Output1IntfIsSecondOutput 机制使两路输出写回时分别选择 enRelu0/enRelu1scale0/scale1

  • fusion_mode 位编码与量化模式扩展: GetFusionModefusion_mode 按位解析为两路 ReLU(bit0=y0、bit1=y1,取值范围扩展为 {0,1,2,3}),extend_conv_transpose_v2_proto.h 中同步更新注释说明;同时为 NO_QUANT/SCALAR_QUANT 场景补充标量反量化分支(SetQuantInt32ToHalf/SetQuantInt8 等),并新增 GetOutputQuantMode/GetScaleGlobal/GetScaleL1Buf 辅助函数按当前输出路选择量化模式与 scale 缓冲。

  • 双输出约束与校验调整: Conv3DDXV2KernelSplitTiling 在开启双输出(hasDualOutput_)时禁用 KernelSplitHW 路径;fixedShiftVal 校验改为限定在 (0, fixedShiftValDefault] 区间,并新增 DUAL_OUTPUT_EXTEND_CONV_TRANSPOSE_INDEX 属性索引;同时新增 infershape 与 tiling 的 UT 用例(test_extend_conv_transpose_v2_infershape.cpptest_extend_conv_transpose_v2_tiling.cpp)。

likedislike
不准确?
atomgit-bot
atomgit-bot
12 天前 评论:

🤖 AI Code Review

⚠️ 审查未能完成

本次代码审查未能完成,可能是临时性故障。

你可以在评论区输入 /ai review 重新发起审查。若多次失败,请联系管理员并附上下方追踪 ID。

追踪 ID: task-223766-run-212641

likedislike
不准确?
CANN-robotCANN-robot成员
12 天前 添加了label:stat/needs-squash
CANN-robotCANN-robot成员
12 天前 添加了label:cann-cla/yes
此处折叠了314条消息 查看更多
CANN-robot
CANN-robot成员
7 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
conv2d_ci
7 天前 评论:
pipeline history
TimeNameResultChangeidTimeStamp
2026-08-31 15:45:50commit2026-08-31T11:17:43+08:00f89a0c6f
SC_Result :x: FAILUREIed7c4c6
RDV_Result :white_check_mark: SUCCESSIed7c4c6
本次未执行的rdv任务为
序号任务名未执行理由
1tbe该组的RDV疑似不需要运行:[1951DC, 1951MDC, rdv_tbe_1971_01, rdv_tbe_1981_01, rdv_tbe_1951dc_01, Smoke_1951lite, Smoke_1911mdc, rdv_tbe_1971_02, rdv_tbe_1911rc_01, rdv_tbe_1911ep_01, Smoke_davinci_rdv_Nano, Smoke_nanoc11, rdv_tbe_1952_01]
2David该组的RDV疑似不需要运行:[rdv_tbe_david_01, David_RDV_V100_EVB_02, rdv_tbe_david_03]
3transpose该组的RDV疑似不需要运行:[Davinci_RDV_conv_back_V121, conv_backward_1982_rdv, conv_backward_1971_rdv, conv_transpose_1952_rdv]
likedislike
cheng_gao
cheng_gao成员7 天前进行代码检视1
common/inc/op_host/tbe_tiling_api.h
@@ -53,6 +53,7 @@ enum OpTypeV2 : size_t {
5353 kConv3DBackpropInputV2,
5454 kConv3DTransposeV2,
5555 kExtendConvTranspose,
56+ kExtendConvTransposeV2,
cheng_gao
cheng_gao7 天前评论:

与TBE解耦,该枚举续迁移到conv目录

likedislike
cheng_gaocheng_gao成员
7 天前 解决了最后一个问题
CANN-robot
CANN-robot成员
7 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike