J6P 上 ConvTranspose3d 编译落 CPU 的问题分析与等价改写优化实践
1. 背景

ConvTranspose3d -> Conv3D 1x1x1 + Reshape/Transpose
ConvTranspose3d -> ConvTranspose2D + Reshape/Transpose
2. 问题现象
客户原始 PyTorch 模型中存在如下结构(示例):
客户模型中的配置如下:
层 | 输入通道 | 输出通道 | kernel_size | stride |
|---|---|---|---|---|
deblock_seg_v2.0 | 128 | 64 | (5,2,2) | (5,2,2) |
deblock_seg_v2.3 | 64 | 48 | (2,2,2) | (2,2,2) |
deblock_seg_v2.6 | 48 | 32 | (2,2,2) | (2,2,2) |
3. 编译图现象:kernel 为什么从 (5,2,2) 变成 1x1x1

但在编译后的图中,相关节点变成了:
这容易造成误解:是不是工具链把 kernel 改错了?
答案是否定的。
该层满足以下条件:
以第一层为例:
每个输入点会生成一个:
大小的空间块。由于 stride 和 kernel 相同,这些空间块之间不会相互重叠。
因此,可以把原始空间展开先折叠到 channel 维度中:
也就是说:
建议配图:
4. 为什么最终落到 CPU

结合算子支持约束,可以看到关键限制包括:
第一层中:
工具链为了保证模型语义正确,会对该结构做自动 lowering。但自动 lowering 生成的是:
该节点属于 CPU fallback 路径。
这里需要注意一个重要区别:
5. 方案一:改写为 Conv3D 1x1x1 + Reshape/Transpose
5.1 原理
可以将其等价改写为:
原始形式:
等价改写形式:
5.2 PyTorch 侧修改示例
可以封装一个模块:
客户原始构图处可以替换为:
5.3 ONNX 直接改图脚本
示例命令:
6. 方案二:改写为 ConvTranspose2D + Reshape/Transpose
6.1 原理
方案二是将 3D 反卷积降维为 2D 反卷积。
原始输入:
先把 D 维并入 batch:
然后使用 2D ConvTranspose 处理 H/W 方向上采样:
输出:
以第一层为例:
6.2 PyTorch 侧修改示例
客户原始构图处可以替换为:
6.3 ONNX 直接改图脚本
示例命令:
7. 两种方案的等效性验证
两种改写都必须先验证 ONNX 输出等效性。
示例命令:
对于本案例,修改前后 ONNX 输出验证结果为:
说明修改前后模型输出完全一致,改写没有改变模型语义。
8. 板端性能对比
两种方案都可以使模型完整落到 BPU,但性能并不相同。
方案 | 平均延迟 | FPS | 说明 |
|---|---|---|---|
Conv3D 1x1x1 + Reshape/Transpose | 36.860 ms | 27.065 FPS | 可落 BPU,但性能一般 |
ConvTranspose2D + Reshape/Transpose | 23.733 ms | 41.972 FPS | 可落 BPU,性能更优 |
从延迟看:
从速度比看:
8.1 为什么 2D 方案更快
虽然两种方式在数学上等价,并且都能落 BPU,但执行形态不同。
层 | Conv3D 1x1x1 中间 channel |
|---|---|
(64, KD=5, KH=2, KW=2) | 64*5*2*2 = 1280 |
(48, KD=2, KH=2, KW=2) | 48*2*2*2 = 384 |
(32, KD=2, KH=2, KW=2) | 32*2*2*2 = 256 |
层 | ConvTranspose2D 中间 channel |
|---|---|
(64, KD=5) | 64*5 = 320 |
(48, KD=2) | 48*2 = 96 |
(32, KD=2) | 32*2 = 64 |
因此,2D 方案具有以下优势:
核心计算是 2D ConvTranspose,更接近 BPU 常规高效路径。
中间 channel 更小,数据搬运和 layout 压力更低。
H/W 方向直接由 2D 反卷积展开,不需要把 KH/KW 也折叠到 channel 后再搬回空间。
整体 reshape/transpose 的数据重排压力更小。
9. 推荐结论
针对当前模型,建议采用:
作为最终部署改写方案。
原因如下:
- 该方案与原始 ConvTranspose3d 数学等价。
ONNX 修改前后输出完全一致,等效性验证通过。
编译后所有算子可以落到 BPU,规避原始 CPU fallback。
- 板端实测性能明显优于 Conv3D 1x1x1 方案。
该方案更符合 BPU 对 2D 卷积/反卷积的高效执行形态。
本文章用到的脚本:https://pan.baidu.com/s/1oCE-RmT7LMI2W9sPMERqGA?pwd=8erf
