Not All Ops Are Created Equal!

最近读了一片文章“Not all Ops Are Created Equal!”,以前大家手工设计网络结构的时候,都是尽量在减少模型的计算量和模型参数量,认为计算量和参数量小的模型inference的效率就一定高。其实不然,首先我们要明确设计轻量级网络的最终的目的是什么?——在保证精度损失在可接受范围内的同时,降低模型推理的延迟和功耗才是重中之重!

论文连接:Not All Ops Are Created Equal!

一. 每次推理的功耗

每次推理消耗的功耗对于嵌入式系统的电池寿命来说是一个非常重要的评判依据,因此我们设计一个模型时要尽可能的减小功耗。通常来讲我们将使用间接指标每次推理的功耗来作为直接指标功耗的代理,但是我们要注意的是功耗不仅仅和计算量(MAC)有关系,而且和每次基本运算的类型也有关系啊!不同类型的操作执行起来的速度也不同,进而会影响网络的推理延迟。

Figure 1展示了基于Caffe框架的CIFAR-10数据集上CNN网络的不同操作的吞吐率(Throughput)、功耗(Power consumption)和每次操作的功耗(Energy Per Op),我们可以看到不同类型的操作吞吐率差异最高可以到达5x,但是平均消耗的功耗几乎是相同的,这反映了整体功耗大部分取决于吞吐率。在所有的操作类型中,max pooloing是最慢的,这是由于它的基本运算是比较而不是乘加。而在典型的CNN结构中卷积和全连接层占据了超过90%的计算量,同时这两个层的吞吐率很高(因为它们可以高效利用SIMD里的MAC指令)。
Not All Ops Are Created Equal!
Figure 2展示了不同操作的吞吐率随着MAC数量的变化曲线,卷积比全连接层的吞吐率要低,因为卷机需要额外的im2col开销;但是1x1卷积不需要im2col,它使用矩阵与矩阵乘法(GEMM)计算,要比全连接层使用的矩阵向量乘法(GEMV)更快(数据的重复利用更好)。在所有的操作类型中,深度可分离卷积最慢,因为它具有较高的im2col开销,并且通常得到输出output feature map上一个点所需要的MAC更低。
Not All Ops Are Created Equal!
Figure 3展示了5中具有不同层数量和特征的DS 模型的能耗、计算量和精度,从图中可以发现一个问题,具有相似精度和计算量的网络,它们的推理功耗最高可以相差30%。
Not All Ops Are Created Equal!
Figure 4对上图中的DS-CNN-3和DS-CNN-4模型中的操作类型占比进行了比较,相比于model 3,model 4中深度分离卷积的占比更大,而深度分离卷积的吞吐率很低,所有model 4的功耗要比model 3高了近30%。这说明仅仅考虑计算量的多少而不考虑不同操作类型的吞吐率将只能得到一个次优的设计。

二. 内存占用

系统的内存占用是另一个制约在资源受限的设备上运行模型的因素。举个例子,典型的微处理器SOC中通常有100kB-1MB大小的flash来存储模型的权重,10-300kB的SRAM来存储**数据。(SRAM相比于flash来说读写速度更快,所以用来存储推理期间得到的中间**层)。

而我们通常使用模型参数量衡量模型的“轻量级”程度,但这其实不是一个对整体内存占用进行衡量的好指标,因为它没有考虑存在SRAM中的**值。对于有跳层连接的结构,我们可能需要同时保存好几层的**值,这个就会占据很大的内存。Figure 5展示了4中模型的内存占用情况,可以看出来整体内存中**层数据占用内存从1%到30%不等。
Not All Ops Are Created Equal!

总结:

网络结构的探索中,我们应该充分考虑功耗和内存占用,来保证前向推理的高效性。