超简单的卷积和加法融合

神经网络的优化除了之前提到的一些硬件优化手段(AI硬件加速拾遗)之外,还有很多图层方面的优化手段。大家好啊,我是董董灿。

而且图层方面的优化,有时效果更佳。往往一个有效的优化,甚至可以“消除”掉一个算子的存在。

这里的“消除”用的引号,是因为这个算子并未被真正消除,从整个神经网络的计算流上看,这个算法仍然存在。

只不过,它的计算过程被其他计算过程掩盖住了,像是被“消除”了。

这里介绍一种算子融合并且使用图层流水进行网络优化的方法。

先看Resnet50 中一个网络片段。关于该网络的算法原理,可以参考以前的文章长文解析Resnet50的算法原理

下图展示的是 Resnet50 中第一个 block 结束时的图结构。

该结构中,存在卷积算子和加法算子,我们可以利用融合手段,将红框标出的两个算子融合成一个算子。

将卷积和加法融合成一个算子后,再通过指令调度,实现卷积和加法指令的 ping-pong 流水,便可以利用卷积的计算掩盖掉加法的计算。

关于ping-pong流水的概念,可以参考 AI加速(五)| 一个例子看懂流水——从指令到算法 来进行理解。

这里说一点,为什么卷积计算可以掩盖掉加法计算呢?

因为在相同的输入输出规模的情况下,由于卷积的计算是乘累加,而加法的计算是单纯地加法,因此,在绝大部分的硬件上,一般都是卷积的计算耗时要大于加法。

那怎么掩盖呢?

正常的一个卷积后面如果跟一个加法的话,它的计算流从上到下是这样的:

先计算卷积Conv,再计算加法Add。假设卷积的计算时间是 A, 加法的计算时间是 B,那么总共的耗时就是 A+B。

这很简单,大家都会算。

那如果将两个算子融合到一起,同时将一张输入图片(Feature Map)切成一半,分两次来运算。每次运算使用 ping-pong memory 来实现计算流水。

那两次计算的计算流从上到下是这个样子。

左侧 Conv 和 Add 计算前半张图,使用ping memory来计算,右侧 Conv 和 Add 计算后半张图,使用pong memory来计算。

这里说明一下:Conv 和 Conv 是不能并行的,因为一般一个硬件上,只有一个Conv 的硬件计算单元,当然,有多个的又是另外的话题了,这里暂时不考虑。

这个时候,可以看到第二行中,第一个 Add 和第二个 Conv 处在一个时间片内,同时由于使用的是不同的memory,两者可以完全并行。

两者并行完成计算,此时,Conv 就掩盖掉了左侧 Add 的时间。

而整个计算流消耗的时间便是:A/2 + A/2(掩盖掉了Add 的 B/2) + B/2 = A + B/2。

可以看到,此时整体的计算耗时已经比不进行流水时,减少了一半的加法。

那如果将图进一步切分,切成4份来进行运算呢?

那此时的计算流从上到下是这个样子:

由于第2、3、4行的 conv 分别掩盖掉了其左侧的Add 计算,因此,整个计算流所消耗的时间变成了 A + B/4。

可以看到,将图切的越小,流水起来之后,掩盖掉的加法的时间越多,剩余的加法的时间越少。

如果切的再多,加法的耗时甚至可以忽略掉了。

这种方法很简单,也很容易实现,但从硬件上来说,需要硬件满足以下条件:

  • 卷积计算单元和加法计算单元在硬件上是独立的。

  • 硬件有成熟的同步机制来完成卷积计算和加法计算的同步

为什么需要同步机制呢?因为每一个横向的时间片段中,Add 和 Conv 没有任何数据依赖,但是纵向的看,Add 的计算总是依赖于上面的 Conv 的输出。

因此,需要在每一个横向时间片段起始时,完成上一个时间片段中 Conv 计算和 Add 计算的同步。

只要硬件上满足了以上条件,软件上的切图、排流水、融合操作其实很简单。

很多深度学习编译器,如TVM提供了图融合和自动 tiling 策略,可以做到切图,并且调度指令完成流水排布。

即使编译器限于某些开发难度限制,无法自动完成融合和tiling,也可以手动写一个融合大算子出来,手动排指令流水,也不是很难的事。

总之,这种方法作为一个行之有效的融合方法,可以用在很多的神经网络性能优化中。

而且效果很出众。



v v v v v v

本文为作者原创,请勿转载,转载请联系作者。
点击下方卡片,关注我的公众号,有最新的文章和项目动态。

v v v v v v

### 多尺度特征融合卷积神经网络中的应用与实现 #### 1. 主要概念技术背景 多尺度特征融合是指通过对图像的不同分辨率或尺度下的特征进行组合,从而增强模型对目标对象的理解能力。这种技术广泛应用于计算机视觉领域,特别是在目标检测、语义分割以及实例分割等任务中[^1]。 #### 2. 基于主干梯度聚合梯度的多尺度回归算法 一种典型的多尺度特征融合方法是在主干网络中引入主干梯度集成结构聚合梯度集成结构。具体而言,主干梯度集成结构被设计用于提取基础网络的主要特征;而聚合梯度集成结构则负责将来自多个层次的梯度信息整合到最终的植株特征图中,这有助于捕捉更丰富的细节并提升检测精度[^1]。 为了进一步扩展感受野,该算法还在主干网络的最后一层执行了多尺度池化操作。通过使用大小分别为 \(1 \times 1\)、\(5 \times 5\)、\(9 \times 9\) \(13 \times 13\) 的最大池化核,可以有效增加模型对接收范围内植物叶片信息的学习能力,同时显著区分重要上下文特征。 #### 3. 不同类型的特征融合方式 除了上述提到的方法外,在卷积神经网络中还有其他多种常见的特征融合策略: - **串联 (Concatenation)**:将不同层的特征向量简单拼接在一起形成新的高维表示。 - **加法 (Addition)**:当两组特征具有相同维度时可以直接相加以完成融合过程。 - **乘法 / 注意力机制 (Multiplication/Attention)**:利用逐元素乘积或者自注意力机制突出某些特定区域的重要性。 - **全局池化 (Global Pooling)**:通过平均或最大值计算得到整个图片级别的描述符。 - **特征金字塔网络 (Feature Pyramid Network, FPN)**:构建一个多级联结架构以便更好地处理从小物体到大场景的各种情况。 - **跨模态融合 (Cross-Modal Fusion)**:适用于涉及不同类型数据源的任务,比如视频分析中的音频与视觉信号同步。 - **自注意力机制 (Self-Attention Mechanism)**:允许网络关注输入序列中最相关的部分,这对于长距离依赖关系特别有用[^2]。 这些方法各有优劣,并可根据实际应用场景灵活选用。 #### 4. SoTA 方法及其改进方向 当前最先进的一些语义分割 CNN 架构也采用了类似的思路来进行多尺度特征融合。例如: - ParseNet 提出了通过连接全局池化的特征来获取更加广泛的上下文信息; - PSPNet 则借助空间金字塔池化模块收集多样性的尺度特性; - Atrous Spatial Pyramid Pooling (ASPP),它结合了空洞卷积的优势,在不增加过多参数负担的情况下实现了高效的多尺度建模[^3]。 以下是 ASPP 的一个简化版本代码示例: ```python import torch.nn as nn class ASPP(nn.Module): def __init__(self, in_channels, out_channels, rates=[6, 12, 18]): super(ASPP, self).__init__() self.branches = nn.ModuleList([ nn.Conv2d(in_channels, out_channels, kernel_size=1), *[nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=r, dilation=r)) for r in rates], nn.AdaptiveAvgPool2d((1, 1)), nn.Conv2d(in_channels, out_channels, kernel_size=1) ]) def forward(self, x): outputs = [] size = x.shape[-2:] for branch in self.branches[:-1]: output = branch(x) if isinstance(branch, nn.AdaptiveAvgPool2d): output = nn.functional.interpolate(output, size=size, mode='bilinear', align_corners=True) outputs.append(output) result = sum(outputs) return result ``` 此段代码定义了一个简单的 ASPP 层,支持三种不同的扩张率(即 `rates` 参数),并通过求的方式完成了最终的特征融合--- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值