CVPR 2023 | 神经网络家族添新丁!小步快跑追求高速的FasterNet
作者丨科技猛兽
编辑丨极市平台
本文目录
1 FasterNet:追求更快的神经网络
(来自 HKUST,Rutgers University)
1 FasterNet 论文解读
1.1 背景和动机
1.2 深度可分离卷积和常规卷积的内存访问成本
1.3 部分卷积 PConv 的设计
1.4 PConv 之后的 Point-Wise Convolution
1.5 基于 PConv 的视觉骨干模型 FasterNet
1.6 PConv 具有更高的 FLOPS
1.7 实验结果
太长不看版
为了设计更快的神经网络,许多工作都集中在减少总浮点运算数量 (Floating-Point OPerations) 上。但是,FLOPs 和神经网络的延时 (Latency) 不一定遵循严格的一一对应关系,换句话,FLOPs 的减少不一定会导致类似水平的延迟 (Latency) 减少。这主要是由于每秒浮点运算数量 (Floating-Point OPerations per Second) 较低。
为了实现更快的网络,本文重新审视了流行的算子,并证明了较低的 FLOPS 主要是由于算子的频繁内存访问,尤其是 Depth-wise Convolution。
因此,本文提出了一种新的部分卷积 (Partial Convolution, PConv),通过同时减少冗余计算和内存访问,可以更有效地提取空间特征。在 PConv 的基础上,作者进一步提出了 FasterNet,一种新的神经网络家族,在各种设备上的运行速度远高于其他网络。例如,在 ImageNet1k 上,小型的 FasterNet-T0 在 GPU、CPU 和 ARM 处理器上分别比 MobileViT XXS 快3.1倍、3.1倍和2.5倍,同时准确率高 2.9%。大型 FasterNet-L 实现了令人印象深刻的 83.5% 的 top-1 精度,与 Swin-B 不相上下,同时在 GPU 上的推理吞吐量提高了 49%,并在 CPU 上节省了 42% 的计算时间。
1 ViT 的前奏:Scale up 卷积神经网络学习通用视觉表示
论文名称:Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networks (CVPR 2023)
论文地址:
https://arxiv.org/pdf/2303.03667.pdf
1.1 背景和动机
神经网络在图像分类、检测和分割等各种计算机视觉任务中取得了快速的发展。一个蓬勃发展的趋势是追求具有低延迟和高吞吐量的快速神经网络,以获得出色的用户体验、即时响应和安全原因。
如何把网络做得更快呢?目前研究人员不想去寄希望于寻找到一些计算代价更大的设备,而是希望尽量减小浮点运算数量 (Floating-Point OPerations)。目前 FLOPs,在许多经典的工作中都指的是 multiply-adds,即:一次乘法和一次加法这个整体的数量。像 MobileNets[1][2],ShuffleNets[3][4],GhostNet[5]等都借助 depthwise convolution (DWConv) 或者 group convolution (GConv) 等操作来降低整个网络的 FLOPs。
但是这些操作在带来 FLOPs 减小的过程中还会带来另一种副作用,即:内存访问 (memory access) 的增加。而且,以上这些模型通常伴随着额外的数据操作,如拼接 (concatenation), 打乱 (shuffling), 和池化 (pooling),其运行时间对于小模型往往是显著的。
除了以上的纯卷积神经网络,小型 ViT 和 MLP 的研究也越来越多。比如 MobileViTs[6][7][8] 和 MobileFormer[9] 通过结合 DWConv 和改进的注意力机制来降低计算复杂度。但是,它们仍然受到前述 DWConv 问题的困扰,并且还需要专门的硬件支持来改进注意力机制。一些 Normalization 和激活函数层也会进一步地限制这些模型的速度。
所以,以上 "快" 的神经网络并不是真的很快,而一个模型延时的计算方法如下:
式中,FLOPs 是总浮点运算数量 (Floating-Point OPerations),FLOPS 是每秒浮点运算数量 (Floating-Point OPerations per Second),用来衡量有效计算速度。
虽然目前的方法大多尝试来减少 FLOPs,但他们很少同时考虑优化 FLOPS 来实现真正的低延时。作者比较了典型神经网络在英特尔 CPU 上的 FLOPS,结果如下图1所示。可以看出,很多现有的神经网络的 FLOPS 都较低,甚至普遍低于经典的 ResNet50。在如此低的 FLOPS 下,这些 "快速" 的神经网络实际上还不够快,换句话讲,它们在总计算量 FLOPs 上的减少并不能转化为延迟的确切减少量。在某些情况下,没有任何改善,甚至会导致更严重的延迟。例如,CycleMLP-B1 的 FLOPs 只有 ResNet50 的一半,但运行速度更慢 (CycleMLPB1 vs ResNet50: 111.9ms vs 69.4ms)。
图1:典型神经网络在英特尔 CPU 上的 FLOPS
因此,本文作者重新检查了现有的运算符 DWConv 的计算速度,发现导致低 FLOPS 问题的主要原因是频繁的内存访问,并希望基于此提出解决方案。
1.2 深度可分离卷积和常规卷积的内存访问成本
DWConv 是 Conv 的一种流行变体, 已经被许多神经网络广泛采用。对于输入 , DWConv 使用个滤波器来得到输出 , 如下图 1(b) 所示。每个滤波器在一个输入通道上空间滑动, 并只计算一个输出通道的值。
DWConv 把 Conv 的计算量由 缩小到了 。
虽然 DWConv 可以有效地降低 FLOPs, 但它不能简单地用来取代常规的 Conv, 因为会导致严重的精度下降。所以说 DWConv 通常会跟随 Pointwise Convolution (PWConv)。一般在实践中 DWConv 的通道数会变宽为 以补偿精度的下降 (比如 MobileNet V2 中变为了6倍宽)。但是这会带来更高的内存访问, 降低整体计算速度, 尤其是对于 I/O-bound 设备。
DWConv 的内存访问数量:
常规卷积的内存访问数量:
1.3 部分卷积 PConv 的设计
本文给出的解决方案部分卷积 (Partial Convolution, PConv) 的出发点是卷积神经网络特征的冗余性。如下图2所示是在预训练的 ResNet50 的中间层中可视化特征图,左上角的图像是输入,特征图在不同通道之间具有很高的相似性。
图2:预训练的 ResNet50 的中间层中可视化特征图,左上角的图像是输入
部分卷积设计的目的是同时减小内存访问和计算冗余,其和常规卷积,DWConv 的区别如下图3所示,工作原理如下图4所示。
图3:PConv 和常规卷积,DWConv 的区别
图4:PConv 的工作原理和 FasterNet 架构
PConv 对部分输入通道应用常规的 Conv 来进行空间特征提取,而对其余通道保持不变。有点像 GhostNet,但是没有使用 GhostNet 中的 DWConv,而是依然保持着普通的卷积。我们来看看 PConv 的 FLOPs 和内存访问情况:
PConv 的 FLOPs
式中, 是特征图的宽和高, 是卷积核的大小, 是常规卷积作用的通道数。在实际实现时一般有 , 所以 PConv 的 FLOPs 仅仅为常规卷积的 1/16。
PConv 的内存访问情况
式中, 是特征图的宽和高, 是卷积核的大小, 是常规卷积作用的通道数。PConv 的内存访问数量仅仅为常规卷积的 , 其余的个通道不参与计算, 所以无需进行内存的访问。
1.4 PConv 之后的 Point-Wise Convolution
为了充分有效地利用来自所有通道的信息,作者进一步在 PConv 之后增加了 Point-Wise Convolution (PWConv)。如下图5所示,在输入特征图上的有效感受野一起看起来像一个 T 型的 Conv,和常规 Conv 相比,它更关注中心位置。
图5:在输入特征图上的有效感受野一起看起来像一个 T 型的 Conv,和常规 Conv 相比,它更关注中心位置
虽然型的 Conv 可以直接实现, 但将 型的 Conv 分解为 PConv 和 PWConv 更好, 因为分解的过程利用了过滤器间冗余并进一步节省了 FLOPs。对于相同的输入 和输出
T 型的 Conv 的 FLOPs
解耦成 PConv 和 PWConv 的 FLOPs
式中,,所以解耦成 PConv 和 PWConv 的两步实现有利于节约计算量。
PConv 的 PyTorch 伪代码如下:
import torch
import torch.nn as nn
from torch import Tensor
class PConv(nn.Module):
""" Partial convolution (PConv).
"""
def __init__(self,
dim: int,
n_div: int,
forward: str = "split_cat",
kernel_size: int = 3) -> None:
""" Construct a PConv layer.
:param dim: Number of input/output channels
:param n_div: Reciprocal of the partial ratio.
:param forward: Forward type, can be either 'split_cat' or 'slicing'.
:param kernel_size: Kernel size.
"""
super().__init__()
self.dim_conv = dim // n_div
self.dim_untouched = dim - self.dim_conv
self.conv = nn.Conv2d(
self.dim_conv,
self.dim_conv,
kernel_size,
stride=1,
padding=(kernel_size - 1) // 2,
bias=False
)
if forward == "slicing":
self.forward = self.forward_slicing
elif forward == "split_cat":
self.forward = self.forward_split_cat
else:
raise NotImplementedError
def forward_slicing(self, x: Tensor) -> Tensor:
""" Apply forward pass for inference. """
x[:, :self.dim_conv, :, :] = self.conv(x[:, :self.dim_conv, :, :])
return x
def forward_split_cat(self, x: Tensor) -> Tensor:
""" Apply forward pass for training. """
x1, x2 = torch.split(x, [self.dim_conv, self.dim_untouched], dim=1)
x1 = self.conv(x1)
x = torch.cat((x1, x2), 1)
return x
1.5 基于 PConv 的视觉骨干模型 FasterNet
作者基于 PConv 进一步提出了 FasterNet,这是一种新的神经网络家族,运行速度非常快,对许多视觉任务非常有效。本文的目标是使架构尽可能简单,没有花哨的功能,使其总体上对硬件友好。
如上图4所示是 FasterNet 的整体架构。它有四个 stages,Stage1 之前通过 Embedding 层 (一个常规的 Conv 4×4,stride 为4),其他 Stage 之前使用 Merging 层 (一个常规的 Conv 2×2,stride 为2) 处理,用于空间下采样和通道数扩展。每个 Stage 都由一些 FasterNet 块堆叠而成。
具体的设计细节
细节1: 最后2个 Stage 消耗更少的内存访问,往往有更高的 FLOPS。因此,作者在最后2个 Stage放置了更多的 FasterNet 块,并相应地将更多的计算分配到最后2个 Stage。
细节2: 每个 FasterNet 块都是由1个 PConv 和后续的两个 1×1 的 Point-wise Convolution 构成的。这三者构成了一个倒残差的架构,中间层的通道数量更多,并放置了一个 Shortcut 连接以重用输入特征。
Normalization 层和激活函数的使用
Normalization 层和激活函数神经网络而言是必不可少的,但是如果在整个网络中过度使用这些层,就有可能会限制特征的多样性,从而损害网络的性能,还可能会降低整体计算速度。所以作者只把它们放在每个中间层的 PWConv 之后,以保持特征多样性并获得更低的 Latency。
FasterNet 使用 BN 来代替 LN 等。BN 的好处是它可以通过结构重参数化的方式合并到相邻的 Conv 层中,以便更快地推断。
对于激活函数,考虑到运行时间和有效性,作者经验性地选择 GELU 作为较小的 FasterNet 变体,ReLU 作为较大的 FasterNet 变体。
为了在不同的计算预算下服务于广泛的应用程序,作者提供了 FasterNetT0/1/2,FasterNet-S,FasterNet-M,和 FasterNet-L。
1.6 PConv 具有更高的 FLOPS
作者在3种不同设备上测量 Latency (Batch Size=1) 和 Throughput (Batch Size=32),GPU (2080Ti), CPU (Intel i9-9900X, using a single thread), 和 ARM。
本小节作者展示了 PConv 速度更快,更好地利用了设备上的计算能力。比如将10层 PConv 堆起来,然后测量GPU、CPU 和 ARM 处理器上的 FLOPs 和延迟/吞吐量6所示。
图6:不同算子的 On-device FLOPS,PConv 高 FLOPS,低 FLOPs,似乎是一个有吸引力的选择
PConv 的 FLOPs 只有普通 Conv 的 1/16,在 GPU、CPU 和 ARM 上分别比 DWConv 高14倍、6.5倍和22.7倍。常规的 Conv 拥有最高的 FLOPS,因为它已经不断优化了多年。GConv 和 DWConv 尽管显著降低了 FLOPs,但 FLOPS 却急剧下降。此外,它们倾向于增加通道数量以弥补性能下降,但是这会增加它们的延迟。
1.7 实验结果
ImageNet-1K 实验结果
如下图7和8所示是 ImageNet-1K 实验结果,展示了 FasterNet 显著优于最先进的分类模型。从另一个角度来看,在具有相似 Top-1 精度的情况下,FasterNet 在广泛的设备上比各种 CNN、ViT 和 MLP 模型运行得更快。Faststernet-T0 在 GPU、CPU 和 ARM 处理器上分别比 MobileViT-XXS 快3.1倍、3.1倍和2.5倍,准确率提高 2.9%。大型 FasterNet-L 达到了 83.5% 的 Top-1 精度,与新兴的 Swin-B 和 ConvNeXt-B 相当,同时在 GPU 上具有 49% 和 39% 的高推断吞吐量,以及在 CPU 上节省 42% 和 22% 的计算时间。而且,FasterNet 在架构设计方面比许多其他模型简单得多,这表明了设计简单而强大的神经网络的可行性。
图7:不同硬件类型的结果
图7:ImageNet-1K 实验结果
下游任务实验结果
数据集使用 COCO,检测和实例分割头使用 Mask R-CNN。实验结果,即 FasterNet 与代表性模型的比较如下图8所示。FasterNet 一直优于 ResNet 和 ResNext,具有更低的延迟和更高的 AP。具体而言,与标准 ResNet50 相比,FasterNet 节省了 36% 的计算时间,并产生 +1.9 的 box AP 和 +2.4 的 mask AP。FasterNet 与 ViT 变体相比也具有竞争力。在类似的 FLOPs 下,FasterNet-L 将 PVT-Large 的延迟降低了一半,即在 GPU 上从 152 ms 降低到 74 ms,实现了 +1.1 的 box AP 和 +0.4 的 mask AP。
图8:下游任务实验结果
总结
为了实现更快的网络,本文重新审视了流行的算子,并证明了较低的 FLOPS 主要是由于算子的频繁内存访问,尤其是 Depth-wise Convolution。本文提出了一种新的部分卷积 (Partial Convolution, PConv),通过同时减少冗余计算和内存访问,可以更有效地提取空间特征。在 PConv 的基础上,作者进一步提出了 FasterNet,一种新的神经网络家族,在各种设备上的运行速度远高于其他网络。例如,在 ImageNet1k 上,小型的 FasterNet-T0 在 GPU、CPU 和 ARM 处理器上分别比 MobileViT XXS 快3.1倍、3.1倍和2.5倍,同时准确率高 2.9%。大型 FasterNet-L 实现了令人印象深刻的 83.5% 的 top-1 精度,与 Swin-B 不相上下,同时在 GPU 上的推理吞吐量提高了 49%,并在 CPU 上节省了 42% 的计算时间。
参考
- ^Searching for MobileNetV3
- ^MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
- ^ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
- ^ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
- ^GhostNet: More Features from Cheap Operations
- ^MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer
- ^Separable Self-attention for Mobile Vision Transformers
- ^MobileViTv3: Mobile-Friendly Vision Transformer with Simple and Effective Fusion of Local, Global and Input Features
- ^Mobile-Former: Bridging MobileNet and Transformer.