论文地址: 百度飞桨https://arxiv.org/abs/2109.15099https://arxiv.org/abs/2109.15099
本文提出了一种基于MKLDNN加速策略的轻量级CPU网络,称为PP-LCNet。它提高了轻量级模型在多个任务上的性能。本文列出了在延迟几乎恒定的情况下提高网络精度的技术。通过这些改进,PP-LCNet的精度在相同的推理时间,可以大大超过以前的网络结构。
由图1可以看出,PP-LCNet 精度提升且比MobileNetV3快3倍!
现有问题:随着模型特征提取能力的增加以及模型参数和FLOPs数量的增加,在基于移动设备的ARM架构的基础上或基于CPU设备的架构上实现快速推理速度变得困难。在这种情况下,已经提出了许多优秀的移动网络,但由于MKLDNN的限制,这些网络的速度在启用了MKLDNN的IntelCPU上并不理想。
在本文中,作者重新考虑了在intel-cpu上设计的网络的轻量级模型元素。特别是,考虑以下三个基本问题:
- 如何在不增加延迟的情况下促进网络学习更强的特征表示。
- 提高CPU上轻量级模型精度的要素是什么。
- 如何有效地结合不同的策略,在CPU上设计轻量级的模型。
主要贡献是总结了一系列在不增加推理时间的情况下提高精度的方法,以及如何将这些方法结合起来,以获得更好的精度和速度的平衡。在此基础上,我们提出了设计轻量级CNN的一般规则,并为其他研究人员在CPU设备上构建CNN提供了新的思路。此外,它还可以为神经架构搜索研究人员在构建搜索空间时提供新的思路,从而更快地获得更好的模型。
网络整体结构:
具体细节:
如图2所示,使用MobileNetV1提到的DepthSepConv作为基本模块。这个块没有额外的连接和逐元素相加等额外的操作,这些操作不仅会降低模型的推理速度,而且不会提高小模型的精度。此外,这个块已经被英特尔CPU加速库深入优化,推理速度可以超过其他轻量级块。
import torch
import torch.nn as nn
import torch.nn.functional as F
import math
class Hswish(nn.Module):
def forward(self, x):
out = x * F.relu6(x + 3, inplace=True) / 6
return out
SE modules at appropriate positions
SE模块自被提出以来已被大量的网络使用。该模块还帮助SENet赢得了2017年ImageNet级比赛。它可以很好地加权网络通道以获得更好的功能,它的速度改进版本也可以用于许多轻量级网络,如MobileNetV3。然而,在Intel cpu上,SE模块增加了推理时间,因此我们不能将其用于整个网络。事实上,我们已经做了很多实验,并观察到当SE模块位于网络的末端时,它可以发挥更好的作用。所以我们只将SE模块添加到网络末端的块中。这导致了一个更好的精度-速度平衡。
消融实验:
图像分类对比:
目标检测对比:
语义分割对比:
SE模块在不同位置效果:
large-kernel 在不同位置的影响
不同技术策略的对比: