面试时遇到过计算神经网路的参数个数以及FLOPS计算,当时对FLOPS计算比较蒙圈,这两天又看到了美团发布的技术博客对深度学习计算量的解决方案中又出现了FLOPS相关概念,所以通过查阅好多大佬的博客把FLOPS的计算问题理解清楚。
前言
深度学习的计算量
上表列举了,ImageNet图像识别中常见算法的模型大小以及单张图片一次训练(One Pass)所需要的计算量。
自2012年,Hinton的学生Alex Krizhevsky提出AlexNet,一举摘下ILSVRC 2012的桂冠后,ILSVRC比赛冠军的准确率越来越高。与此同时,其中使用到的深度学习算法也越来越复杂,所需要的计算量也越来越大。SENet与AlexNet相比,计算量多了近30倍。我们知道,ImageNet大概有120万张图片,以SENet为例,如果要完成100个epoch的完整训练,将需要2.52 * 10^18的计算量。如此庞大的计算量,已经远远超出传统的机器学习算法的范畴。更别说,Google在论文《Revisiting Unreasonable Effectiveness of Data in Deep Learning Era》中提及的、比ImageNet大300倍的数据集。
物理计算性能
面对如此庞大的计算量,那么,我们业界当前常用的计算单元的计算力是多少呢?
- CPU 物理核:一般浮点运算能力在10^10 FLOPS量级。一台16 Cores的服务器,大致上有200 GFLOPS的运算能力。实际运行,CPU 大概能用到80%的性能,那就160 GFLOPS的运算能力。完成上述SENet运行,需要182天。
- NVIDIA GPGPU: 目前的V100,单精度浮点运算的峰值大概为14 TFLOPS, 实际运行中,我们假设能用到50%的峰值性能,那就是7 TFLOPS,需要4天。
根据以上数据结果可以看出:在深度学习领域,GPU训练数据集所需要耗费的时间,远远少于CPU,这也是当前深度学习训练都是采用GPU的重要原因。
1. AlexNet网络结构回顾
2012年AlexNet在ImageNet大赛上一举夺魁,开启了深度学习的时代,虽然后来大量比AlexNet更快速更准确的卷积神经网络结构相继出现,但是AlexNet作为开创者依旧有着很多值得学习参考的地方,它为后续的CNN甚至是R-CNN等其他网络都定下了基调,所以下面我们将从AlexNet入手,理解卷积神经网络的一般结构。
基本结构
先给出AlexNet的一些参数和结构图:
- 卷积层:5层
- 全连接层:3层
- 深度:8层
- 参数个数:60M
- 神经元个数:650k
- 分类数目:1000类
AlexNet结构图:
由于当时的显卡容量问题,AlexNet 的60M个参数无法全部放在一张显卡上操作,所以采用了两张显卡分开操作的形式,其中在C3,R1,R2,R3层上出现交互,所谓的交互就是通道的合并,是一种串接操作。
AlexNet中的卷积层
在AlexNet中,卷积层是上图所示的C1……C5,一共5层。而每次卷积后的结果在上图中可以看到,比如经过卷积层C1后,原始的图像变成了55*55的尺寸,一共有96个通道,分布在2张3G的显卡上,所以上图中一个立方体的尺寸是 55 × 55 × 48 55×55×48 55×55×48,48是通道数目(后面会详细的说明),而在这个立方体里面还有一个 5 × 5 × 48 5×5×48 5×5×48的小立方体,这个就是C2卷积层的核尺寸,48是核的厚度(后面会详细说明)。这样我们就能看到它每一层的卷积核尺寸以及每一层卷积之后的尺寸。我们按照上面的说明,推到下每一层的卷积操作:
需要说明的是,虽然AlexNet网络都用上图的结构来表示,但是其实输入图像的尺寸不是 224 × 224 × 3 224×224×3 224×224×3,而应该是 227 × 227 × 3 227×227×3 227×227×3,大家可以用244的尺寸推导下,会发现边界填充的结果是小数,这显然是不对的,在这里就不做推导了。
输入层:227×227×3
C1:96×11×11×3 (卷积核个数/宽/高/厚度)
C2:256×5×5×48(卷积核个数/宽/高/厚度)
C3:384×3×3×256(卷积核个数/宽/高/厚度)
C4:384×3×3×192(卷积核个数/宽/高/厚度)
C5:256×3×3×192(卷积核个数/宽/高/厚度)
针对这五层卷积,说明一下三点:
1.推导下C1后的输出是什么:
用11×11×3的卷积核卷积227×227×3的图像,卷积后的尺寸是55×55×1。这是因为:
( 227 − 11 + 2 × 0 ) 4 + 1 = 55 \frac{\left ( 227-11+2\times0 \right )}{4}+1=55