ShuffleNetV2

原文:ShuffleNet V2: Practical Guidelines for Ecient CNN Architecture Design

模型性能指标

​ 绝大多数的模型压缩和加速的文章中都使用FLOPs(float-point operations)作为模型的评价指标,用来衡量卷积计算量。但是本文开始就通过一组对比试验指出即使是相同MFLOPs的模型,在不同平台上实际的处理速度仍差别很大。GPU和ARM平台上相同MFLOPs的模型处理速度对比

文中分析了相同FLOPs时造成模型速度差别的原因:

  • 有很多影响速度的因素FLOPs指标没能包含,比如并行程度和MAC。例如对于分组卷积,在算力强的平台上MAC会成为运算性能的瓶颈。
  • 相同FLOPs时在不同平台上进行操作也会有不同的时间。CUDNN针对$3\times3$的卷积进行了优化,所以速度上不是$1\times1$卷积的9倍

接着指出评价网络的效率时:

  • 使用更直接的指标,比如上文测试的处理速度
  • 评价指标时需要针对具体平台进行测试

加速网络的四点准则

文中通过实验体现模型的运行时间的主要组成中,不仅仅是FLOPs体现的卷积运算量(卷积运算是主要部分),也有很多数据有关的I/O操作或者element-wise的操作(ReLU,AddTensor)等。

测试不同平台上模型运行的消耗来源

G1:相同的通道宽度可最小化MAC

使用$1\times1$卷积核时,记输入通道$c{1}$输出通道$c{2}$,输入尺寸$h, w$,卷积层FLOPs记作$B$就是:

也即是$B=hwc{1}c{2}$

卷积层的内存操作过程,输入特征需要$h\times w\times c{1}$输出需要$h\times w\times c{2}$,卷积核自身需要$c{1}c{2}$所以总的内存消耗:

在FLOPs一定时,也即$B=hwc{1}c{2}$一定,对MAC使用均值不等式,进行简单的变换带入B便可得到

等号成立条件$c{1}==c{2}$,所以得出$1\times 1$卷积操作输入输出通道数相同时$MAC$最小

接着文中进行了对比实验,实验网络是10个block组成,每个block是2个$1\times 1$卷积操作,第一个是$c{1}$到$c{2}$,第二个是$c{2}$到$c{1}$. 对比了四种不同比例下的运算处理速度,可以看到$c{1}==c{2}$时速度最快,如下表:

验证第一点,对不同比例的输入输出通道数进行测试

G2:过多的分组增加MAC

分组卷积有效的减少了FLOPs,成为当前模型加速的一个常用方法,应用在MobileNet、Xception和Shufflenet等这些经典网络结构中。分组有效减少FLoPs所以即使加宽网络宽度也不会使得FLOPs超过未分组时,但是FLOPs不怎么增加时,网络处理速度不一定会加速,反而分组在一定程度上会使速度变慢,如ResNeXt训练时比ResNet慢。具体分析和实验如下:

分组卷积中FLOPs是:

在FLOPs固定时,分组计算中MAC:

可以看到,此时随着分组$g$的增加$MAC$也会随之增加。

接着文中对不同的分组数$g$时的速度进行了对比实验,$c$表示$c{1}+c{2}$,保证FLOPs相同时,对比不同的$g$

验证第一点,对不同比例的输入输出通道数进行测试

从表中很清楚的看到,大的分组数降低运行速度。GPU平台上,1分组的是8分组的2倍以上。ARM平台上,8分组的也比1分组的慢30%。

在设计网络时,针对不同的平台和具体任务选择和设计分组,使用大量分组是不明智的,虽然通道增加,但是有限的性能提升也带来计算成本的快速增大。

G3:网络分支会降低并行度

在很多网络中如GoogleNet系列中,多路结构被广泛使用,

设计实验进行了验证,使用1到4个$1\times 1$的卷积块,分别组成序列和分支结构如下:

验证第一点,对不同比例的输入输出通道数进行测试

每种结构重复十次分别在GPU和ARM平台上进行测试,结果如下表:

验证第一点,对不同比例的输入输出通道数进行测试

可以看到在GPU平台中,分支并行结构对处理速度影响很大,双分支和四分支序列与并行结构各自对比可以看到,并行结构对处理速度的影响,但在ARM平台上影响较小。

G4:元素级运算不可忽视

在第二部分刚开始,分析不同平台上的消耗结构中可以看到,尤其是在GPU平台上, element wise操作占用相当一部分。Element wise的操作包括ReLU,AddTensor,这小操作FLOPs很小但是伴随着很大的MAC。

设计实验部分,文中使用ResNet的bottleneck块进行速度测试,然后将ReLU和shortcut移除后进行对比测试

验证第一点,对不同比例的输入输出通道数进行测试

从结果可以看到,移除ReLU和shortcut操作后,在GPU和ARM平台上都有20%的提升。

总结

根据前面提到的4点准则,设计网络时

  • 卷积通道数量前后一样
  • 注意分组消耗
  • 减少分支程度
  • 减少element wise操作

这些准则在设计的时候还要考虑到具体得平台

Shufflenet V2: 一种高效结构

shufflenet广泛使用在终端设备中,轻量级网络设计时有限的设备算力限制了特征提取的通道数,为了增加通道同时不能过度提升FLOPs两个主要的操作被使用: pointwise group conv和 bottleneck-like结构。同时使用channel shuffle操作使不同组操作中的信息可以连通,具体结构如下图(a)和(c):

验证第一点,对不同比例的输入输出通道数进行测试

根据前面的4点建议,可以看到pointwise的分组卷积核bottleneck结构违反G1和G2。大量使用分组违反G3,同时Add操作在shortcut中也是违反了G4。

通道分离和Shufflenet V2如上图(c)和(d)

对比(a)与(c)结构设计的改进:

  • (c)中再开始处有channel split操作,将输入特征通道分成了$c-c’$和$c’$,文中使用$c’=\frac{c}{2}$这与$G1$对应

  • 取消$1\times 1$卷积的分组操作,与$G2$对应

  • channel shuffle在concat之后,与$G3$对应
  • 将element wise Add换成concat与$G4$对应

同样的对于(b)和(d)也是针对性的进行设计和改进吗,不过在(d)中开始没有channel shuffle,所以最后concat后特征通道数量翻倍。最后是ShuffleNetV2的详细组成部分,如下图

验证第一点,对不同比例的输入输出通道数进行测试

本文标题:ShuffleNetV2

文章作者:Aitical

发布时间:2019年07月31日 - 19:27:27

最后更新:2019年08月02日 - 18:04:25

原始链接:http://www.aitical.cn/2019/07/31/ShuffleNetV2/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

帮我买本书吧
0%