选择深度学习计算硬件时,我们在考虑些什么
- 2021 年 3 月 25 日
- AI
“ 选择深度学习计算硬件时,我们在考虑些什么?”
前两天做一个交流时,被问到一个问题,大概是“怎么看待深度学习对计算芯片的影响或者要求”。无独有偶,早前我有两篇文章或多或少讲了一些观点:
-
现在用于深度学习的计算芯片(比如说NVIDIA的显卡GPU),大多都标榜自己有多少TOPS的算力,以彰显芯片的先进性。而运算时的实际算力和标榜的理论峰值算力一般存在不小的gap,这一gap便是芯片的软件+硬件设计效率的体现。(参见《人脑的算力估算》)
-
你以为是深度学习算法选择了GPU,使得近些年云计算中心对NVIDIA显卡的采购越来越多。换个角度想,也是GPU选中了深度学习——没有恰好存在的GPU这一硬件,就没有近十年对深度学习的大规模运用。(参见《硬件彩票:GPU和神经网络加速器》)
今天便更具体的讲一讲,在选择深度学习计算硬件时,我们应该考虑些什么?
PS. 这篇文章的主要参考资料来源于Efficient Processing of Deep Neural Networks一书的第三章Key Metrics and Design Objectives。
图源[1] 2020年初版的介绍深度神经网络软硬件设计的书
深度学习的背后是神经网络,神经网络本质是矩阵运算,矩阵运算也就是很多次乘加运算(Multiply-Accumulate (MAC))。对于一款用于深度学习的计算硬件,其核心便是执行MAC的速度。因此,业界会使用TOPS(Tera-operations per second,每秒万亿次运算)作为评估硬件算力的一个关键指标:每秒能够执行的MAC次数越高,算力越强。
然而,这一TOPS指标只是硬件能够达到的理论峰值,它与芯片运算单元的个数(PE(处理单元,Process Element)的个数)、运行频率有关。实际使用中的TOPS值又和下面的一些因素有关:
-
模型的并行性:数据并行和运算并行的程度,这与神经网络模型的设计和编译器有关;
-
内存的大小和内存带宽的大小:与硬件设计有关。如下图的roofline模型,当算法的运算强度较小时,运算性能(实际的OPS)实际受限于带宽,大量PE会处于闲置状态。
图源[1] The roofline model
既然实际中不能仅以TOPS作为选择硬件的唯一指标,并且在不知道硬件内部及其编译器具体设计和实现方案的基础上,我们需要更多的指标,用以综合评价硬件:
-
理论峰值TOPS:虽然我们认为不能以TOPS作为唯一的评价指标,但不能否认TOPS仍然是最直观的指标。它直接反映了硬件上的“堆料”情况,即处理单元PE的数量。
-
能耗(Energy and Power):能耗对于边缘计算非常重要,毕竟没人会想要一个会大幅缩短手机电池使用时间的应用。一个神经网络应用的能耗可以分为两大块——MAC运算和数据搬运。下图展示了一些运算的能耗情况,其中涉及SRAM和DRAM的内存读写带来的能耗远大于普通的MAC运算。
图源[1] 不同运算和内存访问的能耗情况(45nm制程)
因此在设计时需要:
-
减少数据搬运次数、利用数据复用方法、减少MAC数、避免片外存储的访问次数
-
硬件成本(Cost):要提高第1、2点的指标,最直接的方法便是增加PE数量、片上存储空间、使用HBM(High Bandwidth Memory)、更先进的制程等,但这必然会带来更高的硬件成本。因此,一个设计目标是——在给定的成本下,提升其他指标。
-
吞吐量和延迟(Thoughput and Latency):吞吐量表示每秒处理的数据量,延迟表示从输入到得到输出的时间。吞吐量和延迟在某些时候是冲突的,例如积攒一个星期的脏衣服进洗衣机,这样的吞吐量很高,但是对于其中第一件衣服而言,就存在一个星期的延迟(可能你其实马上就想穿)。因此,对于批处理的情况,需要对吞吐量和延迟进行权衡。
吞吐量的计算理论上由下式表示:
其中operations/inference指的模型每次推理所需要的MAC数量,该项由神经网络的模型设计支配,即减少模型的运算数量可以提升吞吐量。
operations/second可以继续分解为下式:一个PE的吞吐量(可以通过超频、硬件设计、优化MAC的指令设计等进行提升)、PE的数量(通过提升单位面积下的PE个数)、PE的利用率(通过调度平衡多个PE的工作量、提供足够的带宽,避免出现空闲的PE)。
下表列出了影响吞吐量的关键因素,以及所属类别(硬件、模型、输入数据):
图源[1] 影响吞吐量的关键因素
吞吐量和延迟是一个比较复杂的指标,会受到诸多因素的影响。在设计轻量化神经网络模型时,需要考虑模型的运算量、参数的稀疏化程度,以及结合硬件设计的模型效率(书的第九章专门讲到了“硬件在环的神经网络模型设计”,之后再专门开一篇文章简要介绍)。
-
准确性(Accuracy):不同模型在不同数据集/任务下的模型指标(如视觉的分类任务的准确率指标)。
-
灵活性(Flexibility):能够(高效)支持的深度学习模型、算子等。深度学习模型的更新速度一定是快于计算硬件的设计,因此硬件的设计和实现需要a)功能上支持多个模型的运行;b)性能上也能保障不同模型的吞吐量、准确性。
-
扩展性(Scalability):随着硬件资源的增加,性能的扩展性。例如随着PE和片上存储的资源扩展,吞吐量和能耗是否也能够随之扩展。
-
易用性(Usability):这一项和计算硬件的工具链或者生态相关。在训练深度学习模型时,可能因人而异会涉及到多种不同的框架(tensorflow、caffe、pytorch、mxnet等),计算硬件的生态对框架的支持程度、工具链对算法开发人员的易用程度也会作为考量因素。
最后,我们会发现,这些指标是会相互影响的——选择合适的硬件,竟然还是一个带约束的多目标优化问题:约束可以是【必须支持某一些模型、必须支持某一框架】,目标可以是【成本最低、准确率最高、吞吐量最高等】。
一个多目标优化问题,必然意味着取舍,不同的人站在不同角度会作出不同的选择。我个人对这些指标做了一些排序,只代表个人想法:
-
准确性:决定了这款硬件是否能够满足应用需求;
-
吞吐量和延迟:决定了这款硬件的效率,是否能满足边缘计算的实时性要求;
-
灵活性:决定了这款硬件能够支持的任务类型、能够支持的算法丰富度;
-
易用性:决定了开发人员的工作效率;
-
成本:影响了边缘系统的整体成本;
-
能耗:影响了边缘系统的整体能源效率;
-
扩展性:在算力不够时,一个好的扩展性表示,可以采用多个相同硬件的连接,达到有效补充算力的目的;
-
理论TOPS:如果上述的指标都能得到答案,那么TOPS只不过是一个好看的数字罢了。
参考资料:
[1] Vivienne Sze; Yu-Hsin Chen; Tien-Ju Yang; Joel S. Emer, Efficient Processing of Deep Neural Networks , Morgan & Claypool, 2020, doi: 10.2200/S01004ED1V01Y202004CAC050.
– END –
新朋友们可以看看我过往的相关文章
⬇
【相关推荐阅读】
长按二维码关注我⬇