读 ncnn 源码(XXI):`fuse_convolutiondepthwise_mul`——为深度可分离卷积“乘”胜追击
读 ncnn 源码(XXI):fuse_convolutiondepthwise_mul——为深度可分离卷积“乘”胜追击
在第十八篇中,我们分析了标准
Convolution如何融合后续的逐通道乘法 (fuse_convolution_mul)。鉴于深度可分离卷积(Depthwise Separable Convolution)在现代轻量级网络中的广泛应用,ncnn 自然也提供了针对ConvolutionDepthWise后接逐通道乘法的特定融合优化:fuse_convolutiondepthwise_mul。本篇,我们将剖析该函数的源码,理解其如何将
fuse_convolution_mul的逻辑应用于ConvolutionDepthWise这一特殊卷积形式。
TL;DR
- 目标: 将
ConvolutionDepthWise层后接一个执行逐通道乘法(Per-Channel Scaling,由BinaryOp(Mul)+MemoryData实现)的操作进行融合。 - 模式匹配: 查找
ConvolutionDepthWise -> BinaryOp结构,附加条件与fuse_convolution_mul完全一致:BinaryOp必须是Mul(op_type == 2),非标量 (!with_scalar),且第二输入来自形状匹配通道数的MemoryData向量。 - 数学原理: 与
fuse_convolution_mul完全一致。因为ConvolutionDepthWise也是线性操作(逐通道独立),后接逐通道乘法同样构成连续线性变换链。融合公式为:- 新权重 (第
o通道的 DW 卷积核乘以该通道的缩放系数 )。 - 新偏置 (第
o通道的偏置乘以 )。
- 新权重 (第
- 代码实现: 几乎与
fuse_convolution_mul完全相同。- 遍历
ConvolutionDepthWise的每个输出通道i。 - 将该通道对应的所有权重 (
weight_per_outch = kernel_w * kernel_h个元素) 乘以memorydata->data[i]。 - 如果存在偏置,则将
bias[i]也乘以memorydata->data[i]。
- 遍历
- 图结构修改: 将
ConvolutionDepthWise的top指向原BinaryOp的top,更新blob的producer,并将BinaryOp标记为"ncnnfused"。 - 效果: 消除了
BinaryOp带来的冗余计算和内存访问,对于使用逐通道缩放的深度可分离卷积结构(尽管不如 BN 常见)有所优化。
1. 融合动机:合并线性链的通用性
ConvolutionDepthWise 对每个通道独立进行卷积,其计算 是线性的。如果后续 BinaryOp 层执行 的逐通道缩放,这同样是线性的。因此,将这两个操作合并为一个等效的 ConvolutionDepthWise 具有明确的代数基础和性能优势(减少计算和访存)。
2. 代码实现:高度复用的融合逻辑
fuse_convolutiondepthwise_mul 的代码实现与 fuse_convolution_mul 高度相似,仅在层类型匹配上有所不同。
1 | int NetOptimize::fuse_convolutiondepthwise_mul() |
关键点:
- 模式匹配: 与
fuse_convolution_mul的逻辑一致,仅将查找目标从"Convolution"改为"ConvolutionDepthWise"。 - 参数更新: 同样是遍历每个输出通道
ch,将该通道对应的权重(kernel_w * kernel_h个)和偏置(如果存在)乘以MemoryData中对应的缩放系数memorydata->data[ch]。 - 图修改: 标准的重定向连接 + 标记融合操作。
3. 意义与应用场景
虽然 ConvDW -> Mul(per-channel) 的模式不如 ConvDW -> BN 常见,但在某些特定情况下(例如模型转换、特定网络设计或手动插入的缩放层),此优化 Pass 仍然能发挥作用。它体现了 ncnnoptimize 试图覆盖尽可能多的可融合线性计算链的完备性。
通过提供针对 Depthwise Convolution 的特定融合规则(包括 _batchnorm, _mul, _add),ncnn 确保了基于深度可分离卷积构建的轻量级网络能够得到充分的优化。
4. 结语
fuse_convolutiondepthwise_mul 是 ncnn 图优化工具针对深度可分离卷积线性链优化的补充。其实现逻辑与标准卷积的融合高度一致,再次证明了合并连续线性变换这一优化原理的普适性。通过消除冗余的逐通道乘法操作,进一步提升了相关网络结构的推理效率。这一系列精细化的融合 Pass 共同构成了 ncnnoptimize 强大的模型“精炼”能力。
该封面图片由Kang-Rui LENG在Pixabay上发布





