当前位置:   article > 正文

[计算机视觉]-从ShuffleNet V2来看,为什么有些FLOPs小的模型在实际推理过程中所花费的时间更长/速度更慢?_flops和推理时间

flops和推理时间

惯例资源

论文地址


1.简介

相对于传统卷积方式,目前如分组卷积,空洞卷积,深度可分离卷积等,这些新型的卷积方式可以有效的降低模型的FLOPs,然而在实际设备上,由于各种各样的优化计算操作,导致计算量并不能准确地衡量模型的速度,换言之,相同的FLOPs会有不同的推理速度

具体来说,如在GPU运算的一些操作,底层都是调用cuda算子,而这些算子的操作方式,都是由开发人员优化后的,可能并没有针对具体的如深度可分离卷积进行优化;或在arm架构的cpu上,本质也是调用cpu的算子,可能并无相关优化。


2. 四个设计原则

shuffleNet_v2,指出了四个影响模型实际推理速度的操作,并在对速度和精度进行权衡后提出了shufflenet_v2架构。

FLOPs是理论上的计算量,我们可以把它看为是一种间接的衡量指标,与直接的衡量标准(速度)还是有差异的。

为什么这样说,FLOPs不能作为直接衡量标准?

2.1忽视了MAC

主要原因可能在于FLOPs只考虑了计算量却 忽视了MAC(memory access cost),即内存访问的时间成本。例如分组卷积,其使得底层使用的一些优化实现算法由于分组后实现性能更低,从而导致,分组数越大,时间成本越高。另一个是并行度,同样FLOPs下,高并行度的模型速度快于低并行度的模型。

2.2底层算子优化不同

另一个原因就是不同的算子(如调用cuda、cudnn)对每个具体的操作优化是不同的。举例来说按照FLOPs计算公式:

F L O P s = H ∗ W ∗ C i n ∗ K ∗ K ∗ C o u t FLOPs = H*W*Cin*K*K*Cout FLOPs=HWCinKKCout

K为kernel size大小;H,W分别为输入特征图长宽;Cin为输入维度;Cout为输出维度。

假设我们H,W,Cin,Cout保持不变,分别计算33卷积核与11卷积核,33卷积核的FLOPs为11卷积核的9倍,但实际的运行时间并不是九倍,这是因为底层算子(cuda,cudnn,不同版本也有差异)对3*3卷积核计算做了优化,这就是不同运行平台/设备/环境所带来的差异。

2.3推理时间并不完全取决于计算量

在这里插入图片描述
如论文中的上图所示,这是两个模型在GPU,CPU(ARM)上各项操作所花费的具体时间,可以看到的是,整体的推理耗时除了卷积操作,还有包括Data(数据处理),Elemwise(Element-wise,点单个像素点操作,如ReLU, AddTensor, AddBias等等),以及模型设计所带来的一些固有的操作(shuffle等)
卷积即可用FLOPs表示。

2.4提出四个设计原则

ShuffleNet v2进行了四项实验,得出了一些比较耗时的操作,经过原理分析,提出了四条设计原则。

  1. 卷积层输入输出通道数相同时,MAC最小
  2. 分组卷积的分组数越大,MAC越大
  3. 网络支路会降低模型的并行度
  4. Element-wise操作不可忽视

3.四个设计原则详解

3.1卷积层输入输出唯独相同时,MAC最小

为了简化表达式,论文采用了11卷积核来进行理论推导。对于输入尺寸为HW的特征图,输入维度为Cin,输出维度为Cout:

那么FLOPs = H * W * Cin * Cout;
那么MAC = h * w * (c1 + c2 ) + c1 * c2

这里hwc1为输入特征图内存访问成本,hwc2为输出特征图内存访问时间成本,c1xc2x1x1为卷积核内存访问时间成本。
令FLOPs = B,带入MAC表达式,根据不等式表达定理,可得如下不等式:
在这里插入图片描述
MAC存在下限,当c1 = c2时,MAC取最小值。
来看实验结果,固定总的FLOPs,分别来看不同得到Cin,Cout比例下,模型的运行时间。
在这里插入图片描述
与理论一致,在1:1时模型速度最快

3.2 过多的组卷积增加了MAC

分组卷积一方面在固定FLOPs下,使用了更多的纬度信息同时提高了模型的准确率;另一方面,由于使用了更多的维度信息,所以增加了MAC开销。于是对于1*1,分组数为g的组卷积,我们可以得到如下公式:
在这里插入图片描述
在这里B=FLOPs=h * w * cin * cout / 2。可以由公式得出,g越大,MAC越大。
结果如下,组数越多,速度越慢In theGoogLeNet series [29,30,3,31] and auto-generated architectures [9,11,10]), a “multi-path” structure is widely adopted in each network block. A lot of small operators(called “fragmented operators” here) are used instead of a few large ones. Forexample, inNASNET-A[9] the number of fragmented operators (i.e. the numberof individual convolution or pooling operations in one building block) is 13. Incontrast, in regular structures like ResNet [4], this number is 2 or 3:
在这里插入图片描述
所以对于分组选择,需要我们在精度和速度之间做一个权衡。

3.3过多的支路降低了模型的并行度

在inception_v1这样的网络中,在一个block中应用了多条支路结构同时把一个大的操作改为进行几个小的操作然后串联,最后进行concat,这样做提升了精度,但是同时降低了效率。

这种在一个boock中应用多条支路的同时把一个大的操作改为进行几个小的操作然后串联结构无法较好的利用GPU强大的并行计算能力,在提升精度的同时,却降低了效率同时引入了额外的开销,如内核的启动与同步。
实验结果如下:
在这里插入图片描述
在这里插入图片描述
实验证明,只有一条支路时且只进行单个操作时,运行速度最快。因此,在网络结构中支路数可以提到精度,但也会降低运行速度,从而影响实时性。

3.4Element-wise操作不可忽视

在之前的2.3的图中,已经证明了element-wise虽然不增加FLOPs,但是造成的时耗仍然不可忽视。为了进一步探究其对运行速度的影响,作者选取ResNet中的bottleneck unit结构进行了对比实验,实验结果如图11。

在实验中,作者分别移除了bottleneck unit(也就是1x1卷积后接3x3卷积,再接1x1卷积,中间使用了ReLU, 另有一个shortcut连接)结构中的ReLU和shortcut操作作为对比。结果最终显示当ReLU、shortcut两部分操作均被移除之后,整体速度是最快的。
在这里插入图片描述
对此,shuffleNet v1使用多的分组数,违背了第二条原则,使用bottleneck相似的结构违背了第一条原则,MobileNet v2使用倒残差结构违背了第一条,且在通道数较多的feature map上使用了depthwise conv和ReLU违背了第四条,自动生成的结构有较多支路,违背了第三条。

注意:这里指的违背了这些原则,并不是说设计不好。以第二条分组数和第三条支路数为例,不能因为它们会降低模型运行时间,就再也不使用支路和分组卷积,毕竟它们对模型精度有较大提升,因此需要选择合适的分组数和支路数,以便在速度上和精度上取得权衡。


总结:影响实际模型运行速度的有很多因素,我们在设计时要做一个权衡。不能只要速度不要精度,也不能只考虑精度而忽视了部署时的真正性能

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/990429
推荐阅读
  

闽ICP备14008679号