读 ncnn 源码(XXII):`fuse_convolutiondepthwise_add`——合并深度卷积的偏置链
读 ncnn 源码(XXII):fuse_convolutiondepthwise_add——合并深度卷积的偏置链
在第十九篇中,我们分析了标准 Convolution 如何融合后续的逐通道加法 (fuse_convolution_add)。与乘法融合类似,深度可分离卷积 (ConvolutionDepthWise) 后也可能跟随一个执行逐通道加法的 BinaryOp 层。fuse_convolutiondepthwise_add 正是 ncnn 针对这一模式提供的专属优化 Pass。
本篇,我们将剖析该函数的源码,理解其如何将偏置合并的逻辑应用于 ConvolutionDepthWise 场景。
TL;DR
- 目标: 将
ConvolutionDepthWise层后接一个执行逐通道加法 (Per-Channel Bias Addition,由BinaryOp(Add)+MemoryData实现) 的操作进行融合。 - 模式匹配: 查找
ConvolutionDepthWise -> BinaryOp结构,附加条件与fuse_convolution_add完全一致:BinaryOp必须是Add(op_type == 0),非标量 (!with_scalar),且第二输入来自形状匹配通道数的MemoryData向量(支持[channels]或[1, 1, channels]等广播形式)。 - 数学原理: 与
fuse_convolution_add完全一致。融合公式为:- 新权重 (权重不变)。
- 新偏置 (将
MemoryData的偏置向量 加到ConvDW的原有偏置 上)。
- 代码实现: 几乎与
fuse_convolution_add完全相同。- 从
memorydata->data提取偏置向量B。 - 如果
ConvolutionDepthWise没有偏置 (bias_term == 0),则将B设为其新偏置。 - 如果已有偏置 ,则将
B逐元素地加到convolutiondepthwise->bias_data上。
- 从
- 图结构修改: 将
ConvolutionDepthWise的top指向原BinaryOp的top,更新blob的producer,并将BinaryOp标记为"ncnnfused"。 - 效果: 消除了
BinaryOp引入的冗余加法计算和内存访问,将偏置合并到ConvDW层中,进一步优化计算图。
1. 融合动机:简化连续偏置操作
ConvolutionDepthWise 的计算 可能包含一个偏置项 。如果后续 BinaryOp 层只是对每个通道加上一个固定的偏置值 (来自 MemoryData),即 ,那么这两个加法操作可以被合并为一次加法 。
将这个合并后的偏置存入 ConvolutionDepthWise 层的 bias_data 中,就可以在推理时跳过 BinaryOp 层,实现优化。
2. 代码实现:复用偏置合并逻辑
fuse_convolutiondepthwise_add 的代码实现与 fuse_convolution_add 高度一致,再次体现了融合逻辑的通用性。
1 | int NetOptimize::fuse_convolutiondepthwise_add() |
关键点:
- 模式匹配: 与
fuse_convolution_add逻辑一致,仅层类型改为"ConvolutionDepthWise"。 - 参数更新: 将
MemoryData中的偏置数据bias_data(向量B) 加到convolutiondepthwise->bias_data(向量 ) 上。如果 不存在,则直接用B初始化。卷积核权重不发生改变。 - 图修改: 标准的重定向连接 + 标记融合操作。
3. 意义与应用场景
ConvDW -> Add(per-channel) 模式虽然不如 ConvDW -> BN 常见,但 fuse_convolutiondepthwise_add Pass 的存在,确保了 ncnn 优化工具箱的完备性。它可以处理一些特定情况,例如:
- 模型转换过程中产生的冗余加偏置操作。
- 网络设计中手动添加的逐通道偏置层。
通过与其他针对 Depthwise Convolution 的融合 Pass(如 _batchnorm, _mul, _activation)协同工作,ncnn 能够最大程度地简化计算图中的线性计算链。
4. 结语
fuse_convolutiondepthwise_add 是 ncnn 图优化中针对深度可分离卷积线性链优化的又一个具体体现。它遵循与其他融合 Pass 相同的模式匹配、参数变换和图修改逻辑,专注于合并 ConvolutionDepthWise 层后的逐通道加法操作。虽然应用场景可能不如 BN 融合广泛,但它的存在展现了 ncnnoptimize 追求计算图极致简化的决心。这一系列细致入微的优化 Pass 共同确保了 ncnn 模型在部署时的最佳性能表现。





