随着深度学习的不断发展,算力越来越受到深度学习界的关注。任何深度学习模型,归根结底都需要在设备上运行,而模型对设备性能的要求越低,就越能发挥作用——不要让硬件成为模型普及的瓶颈!说到模型对于硬件的要求,大家首先想到的就是计算量,即一个深度学习模型完成一次前馈需要多少次计算。但是,除了计算量之外,模型对内存带宽的需求也是影响实际计算所需时间的重要参数。下面我们会看到,在内存带宽有限的情况下,单纯的减少计算量并不能按比例减少计算时间!内存带宽对硬件系统性能的影响如上图所示。如果把内存比作一个瓶子,把计算单元比作一个杯子,那么数据就是瓶子里的各种颗粒,内存接口就是瓶口,数据可以通过它进入杯子并被消费(处理)。内存带宽是瓶颈的宽度。口宽越窄,数据进入杯子(处理单元)所需的时间就越长。俗话说“巧妇难为无米之炊”,如果带宽有限,即使处理单元速度最快,处理单元大部分时间都在白等数据,造成浪费的计算能力。深度学习网络和Roofline模型的定性分析对于工程师来说是不够的。我们还需要能够定量分析算法对内存带宽的需求以及对计算性能的影响。一个算法对内存带宽的需求通常用“运算强度(或算术强度)”的多少来表示,单位是OPs/byte。这个数量意味着算法中读取的每个数据单元可以支持多少操作。计算强度越大,单位数据所能支持的运算就越多,也就是说算法对内存带宽的要求越低。所以,计算密集型是一件好事!让我们举个例子。对于步幅为1的3x3卷积运算,假设输入数据平面大小为64x64。为简单起见,假设输入和输出特征均为1,此时一共需要62x62次卷积运算,每次卷积需要3x3=9次乘加运算,所以总计算量为34596,计算量为数据为(假设数据和卷积核都使用单精度浮点数2byte):64x64x2(输入数据)+3x3x2(卷积核数据)=8210字节,所以计算强度为34596/8210=4.21。如果换成1x1卷积,那么总的计算量就变成了64x64=4096,需要的数据量为64x64x2+1x1x2=8194。显然,切换到1x1卷积可以减少近9倍的计算量,但计算强度也降低到0.5,即对内存带宽的需求也增加了近9倍。因此,如果内存带宽不能满足1x1卷积计算,切换到1x1卷积计算减少了近9倍的计算量,但无法提高9倍的计算速度。在这里,我们可以看到深度学习计算设备存在两大瓶颈,一是处理器的计算能力,二是计算带宽。如何分析是哪一个限制了计算性能?您可以使用Roofline模型。典型的Roofline曲线模型如上图所示,坐标轴分别为算法的计算性能(纵轴)和算法的计算强度(横轴)。Roofline曲线分为两部分:左边是上升区,右边是饱和区。当算法的计算强度较低时,曲线处于上升区,即计算性能实际上受到内存带宽的限制,许多计算处理单元处于空闲状态。随着算法计算强度的增加,即算法可以用相同的数据量完成更多的计算,所以空闲的计算单元越来越少,此时计算性能会提高。然后,随着计算强度越来越高,空闲的计算单元越来越少,最后所有的计算单元都被使用,Roofline曲线进入饱和区。更多的计算单元可用,因此计算性能不再增加,或者计算性能遇到了由计算能力(而不是内存带宽)决定的“屋顶”(roof)。以前面3x3和1x1卷积为例,3x3卷积可能在roofline曲线右侧的饱和区,而1x1卷积可能会到达roofline左侧的上升区,因为减少计算强度,以便计算1x1卷积。计算性能会下降,无法达到峰值性能。虽然1x1卷积的计算量减少了近9倍,但由于计算性能的下降,实际计算时间不是3x3卷积的九分之一。显然,如果一个计算系统的内存带宽非常宽,算法不需要非常大的计算量,很容易撞到由计算能力上限决定的“屋顶”。下图中,算力保持不变,但随着内存带宽的增加,达到算力天花板所需的计算强度变低。Roofline模型在算法-硬件协同设计中非常有用,它可以决定算法和硬件的优化方向:是增加内存带宽/降低内存带宽需求,还是增加算力/减少计算量?如果算法在屋顶线曲线的上升区域,那么我们应该增加内存带宽/减少内存带宽需求,增加计算能力/减少计算量对这种情况没有帮助。反之亦然。让我们看一个实际示例,比较各种机器学习算法在屋顶模型上的位置。下图摘自谷歌的TPU论文《In-Datacenter Performance Analysis of a Tensor Processing Unit》。从图中可以看出,LSTM算法的计算强度是最高的,所以卡在了roofline模型上升区域的中间,也就是TPU执行LSTM算法时,由于内存带宽的限制,性能只有3TOPS左右,只是峰值。三十分之一的性能(90TOPS)。经典的全连接神经网络(multi-layerperceptrons,MLP)的计算强度略优于LSTM,同样卡在了roofline曲线的上升区域。实际执行性能在10TOPS左右。卷积神经网络模型,尤其是CNN0,因为卷积神经网络可以实现卷积核复用,所以计算强度非常高,所以可以非常接近TPUroofline曲线的屋顶(86TOPS)。CNN1模型虽然也是高计算密集型的,但是由于其他各种原因无法达到屋顶(论文中说CNN1模型的特征深度较浅,无法充分利用TPU的计算单元)。这个例子让我们看到了硬件-算法协同设计的另一个重要点:除了内存带宽,还有“其他原因”可能会阻止算法到达屋顶,我们必须尽量减少这些“其他因素”!【本文为栏目组织《机器之心》原创文章,微信公众号《机器之心(id:almosthuman2014)》】点此查看作者更多好文
