如何对比评价各种深度神经网络硬件?不妨给它们跑个分

By 机器之心2017年7月17日 13:12


面对越来越多的 DNN 专用处理器设计(芯片和 IP),我们很自然的需要解决一个问题「怎样对不同的 DNN 处理器设计做出公平的比较和评价?」能不能像手机跑分一样也让它们跑个分呢?这实际是个基准测试(Benchmarking)问题。正好最近看到两个在这方面的尝试,一个是 MIT Eyeriss 团队给出的 DNN Processor Benchmarking Metrics;另一个是百度 DeepBench 项目的更新。我们可以结合这两个项目讨论一下如何给 DNN 处理器「跑分」。



首先,我们还是简单回顾一下 Benchmark 的背景知识。以下是 Wikipedia 对 Benchmark (computing) 的定义:

In computing, a benchmark is the act of running a computer program, a set of programs, or other operations, in order to assess the relative performance of an object, normally by running a number of standard tests and trials against it.The term 'benchmark' is also mostly utilized for the purposes of elaborately designed benchmarking programs themselves.


实际上,我们非常熟悉的手机跑分也是 Benchmark 的一种。Benchmark 通常用于评估计算机硬件的性能特征, 例如 CPU 的浮点运算性能,GPU 的图像处理能力,存储系统访问的速度等等,有时也用于软件或者编译工具。总的来说,Benchmark 提供了一种比较不同软硬件系统性能的方法。从另一个角度来说,Benchmark 也可以在我们自己的设计过程中帮助我们评价不同版本优化改进的情况,这可以看作是一种纵向比较。


在我们研发的过程中,会用到各种各样的测试程序。Benchmark 本质上也是测试程序,它的特殊性体现在:大家公认它可以评价(一般是定量的)被测试目标的某些特性。如果不是公认的基准测试,也就谈不上横向比较的作用了。


专用的 DNN Processor(或者 DNN/DL/ML Processor/Accelerator)的研究和应用还是最近几年的事情,目前还没有大家公认的基准测试方法和指标。一个原因是,专用硬件针对特定应用(范围比较窄),一般也进行了特殊的优化,设计能够相互比较的基准测试比较困难。但是,由于 AI/Deep Learning 的快速发展和广阔前景,目前很多研究机构和公司都投入到专用的 DNN 处理器的研发当中,对比和竞争在所难免。而技术正是在对比和竞争中不断发展的,DNN 处理器的基准测试已经越来越得到大家的关注。



MIT 的 Eyeriss 团队无疑是 DNN Processor 界一股重要的力量。他们最近搞了一个「Tutorial on Hardware Architectures for Deep Neural Networks」[1],非常全面,建议同学们好好看看。这个 Tutorial 中有一部分就是「Benchmarking Metrics」(基准测试指标)。


通常,我们说 Benchmarking 的时候一般包括两部分内容,一是测试程序(包括测试方法),即 Benchmark 本身;二是结果的表达(或者评价指标),即 Metrics。例如,经典的 Benchmark:Dhrystone,它的测试方法就是在目标处理器上运行一段精心设计的 C 程序:「simple programs that are carefully designed to statistically mimic the processor usage of some common set of programs」。运行这段程序实际会得到很多信息,而它采用的 Dhrystone score 的表达为「 the number of Dhrystones per second (the number of iterations of the main code loop per second)」。这里为什么不用 MIPS (每秒能运行多少百万条指令) 这种更常见表达呢?这是因为,对于 RISC 和 CISC 这两种不同的指令架构,在 task 层面统计结果要比在指令层面更为公平合理。此外,还可以用 DMIPS (Dhrystone MIPS) 作为指标,即 Dhrystone 成绩除以 1757(这是当年在 VAX 11/780 机器上获得的每秒 Dhrystones 的数量,名义上作为 1 MIPS);或者使用 DMIPS/MHz,这样可以方便对比运行在不同时钟频率上的处理器。从 Dhrystone 的例子可以看出,对于一个成功的 Benchmark 来说,合理有效的测试程序和 Metrics 都是非常重要的。


我们回到 Eyeriss 的方案。应该说他们最主要的贡献在于 Metrics。他们并没有专门设计「测试程序」,而是直接使用「widely used state-of-the-art DNNs (e.g. AlexNet, VGG, GoogLeNet, ResNet) with input from well known datasets such as ImageNet」。采用「经典」的 DNN 网络作为 Benchmark 相当于用目标应用来作为测试程序,虽然比较直接,但也有很多问题。我们在本文「下篇」分析百度的 DeepBench 的时候再做详细讨论。

Eyeriss 团队提出两个层次的 Metrics。第一个是 Metrics for DNN Algorithm,主要是算法层面的指标。我们重点看第二个,Metrics for DNN Hardware:


Measure energy and off-chip (e.g., DRAM) access relative to number of non-zero MACs and bit-width of MACs



Energy Efficiency of Design


External Memory Bandwidth


Area Efficiency



这里列出的一些指标是非常有针对性的。它们和传统的指标,比如 Run Time,Power,相结合,希望能够覆盖:Accuracy,Power,Throughput,Cost 这些硬件相关的基本要素,并能够提供 External memory bandwidth,Required on-chip storage,Utilization of cores 这些重要信息。可以看出,很多指标都非常强调效率,Efficiency,特别是对于面积和功耗这些和成本相关的指标。另外,在对 DNN 处理器的核心 MAC 做相关测试时,强调了 non-zero MAC(和稀疏性相关)以及 bit-width of MAC(和精度相关)这两个条件,反映了 DNN 的特点。



说到这里,顺便提一下我刚看到的另一个指标,来自 Intel/Nervana 的 Naveen Rao 在「O'Reilly Artificial Intelligence Conference 2017」上的一个讲演。也可参考 [3]




他提出了 Computational Capacity 的概念,涉及的 3 个变量是:1)bit width of numeric representation;2)memory bandwidth;3)OPs/s。其中:b=# bits of representation,m=memory bandwidth in GigaBits/s,o=TeraOPs/s,分母是 10 的 6 次方。这里使用精度比特数的平方作为一个简单的表达方式,在指标中考虑实现这个精度的乘法器的相对面积。即,在实际芯片中,16 bit 乘法器的面积大约是 8 bit 乘法器的 4 倍。这个概念的提出,是因为常用的 FLOPS 指标已经不能准确的评价处理器的 DNN 处理能力了,而综合上述三个因素才是更合理的表示方法。这个指标和上述 Eyeriss 提出的多个指标有一定的类似之处,它的好处是比较简洁,可以用一个公式来表示,但它包含的信息也要少一些。


另外一个很有用的指标(或者叫性能评价模型)是 Roofline Model[4]。通过这个 model,既可以评估一个设计的效率,还能很容易看出你的设计倒底是 computation-limited 还是 memory bandwidth-limited,可以帮助你确定进一步优化的思路.




比如 Google 在 TPU 的论文里采用这 Roofline Model 来和 GPU,CPU 进行了对比,如下图。


Roofline model 很好的说明了,一个好的评价模型,可以很直观的给我们展示出最重要的信息。它的玩法很多,用好了也很有帮助,建议大家好好看看。



再回到正题,下面是对 Eyeriss 处理器为例进行 Benchmarking 的结果。首先是处理器的 spec 和芯片整体的测试结果。这些需要指出的是,处理器的 Spec 在进行对比的时候也是很有必要的,是很多对比评价的基础信息。


然后是对 Alexnet 各个 layer 分解的测试结果。


最后还给出了用来评价 FPGA 的指标。


由于我们关注的是 Benchmarking 的指标设计,这里就不具体分析测试结果了。Eyeriss 团队还设立了一个网站(http://www.rle.mit.edu/eems/dnn-benchmarking-form-2/),供大家提交自己的测试结果。在这个网站上可以下载相应的表格,也可以看到 Eyeriss 处理器的实例。


总的来说,由于 DNN 处理器的特殊性,比如对 memory bandwidth 的需求、DNN 稀疏性的特点、MAC 利用率问题等等,对于它做基准测试的时候很难简单的借用传统处理器的评价指标。我们需要综合性的或更有针对性的指标才能更好的表征 DNN 处理器的实际效能。Eyeriss 团队提出一系列比较有针对性的指标,基本上能够覆盖了 DNN 处理器的各方面性能。不过这些指标能否以更简洁直观的形式表达,也是值得我们思考的问题。



Eyeriss 团队总结的 Benchmarking Metrics,对于评价 DNN 处理器,甚至设计 DNN 处理器都很有启发。但是,他们使用几种 DCNN 网络(AlexNet,VGG16,GoogleNet,ResNet-50)作为 Benchmark 的方法是否合有效理呢?

首先,一个实际的问题是,要得到所有这几个网络在目标硬件上运行的数据,是一项巨大的工程,特别是对于小规模的研究团队来说。我们看到即使是 Eyeriss 处理器也只给出了 AlexNet 和 VGG16 的结果。实际上,这几种 DCNN 网络还是有不少相似之处的,用它们作为 Benchmark,是否是做了很多重复和冗余的测试?


第二个问题是,这几种网络是否真正覆盖了各种 DNN 的需求。虽然 Eyress 更关注卷积层的处理,但 FC/RNN/LSTM/GRU 这类网络的应用也很广泛,在很多新出现非常有效的模型中,FC/RNN 类型的层和卷积层经常是结合在一起使用的。对于这种情况,只用这几种以 CNN 为主的网络作为 Benchmark 是否有足够的代表性呢?如果还是采取把实际网络用作 Benchmark 的思路,我们就需要不断的扩大这个 Benchmark 的集合。显然这也是不可取的。


解决上述问题的一个思路就是「设计」新的 Benchmark,就像 Dhrystone 这样的「Synthetic Benchmark」一样。下面我们就结合 Baidu 的 DeepBench 讨论一下「Synthetic Benchmark」的设计问题。



DeepBench 项目 [5] 在百度众多的开源项目中受到的关注相对较少,不过他们对于 Deep Learning 硬件 Benchmarking 的讨论和实践,既是非常有意义的尝试,也是我们讨论 Benchmarking 问题的很好的参考。我们首先看看他们对项目目标的描述:


「The primary purpose of DeepBench is to benchmark operations that are important to deep learning on different hardware platforms. Although the fundamental computations behind deep learning are well understood, the way they are used in practice can be surprisingly diverse. For example, a matrix multiplication may be compute-bound, bandwidth-bound, or occupancy-bound, based on the size of the matrices being multiplied and the kernel implementation. Because every deep learning model uses these operations with different parameters, the optimization space for hardware and software targeting deep learning is large and underspecified.」


「DeepBench attempts to answer the question, "Which hardware provides the best performance on the basic operations used for deep neural networks?". We specify these operations at a low level, suitable for use in hardware simulators for groups building new processors targeted at deep learning. DeepBench includes operations and workloads that are important to both training and inference.」


上述文字中的一个关键词就是「basic operation」,和 Eyeriss 团队直接用经典的 DCNN 网络作为 Benchmark 不同,DeepBench 尝试使用基本操作而非完整网络模型来作为 Benchmark。而另一个差别在于,Eyeriss 团队主要工作在于设计 Inference 专用的硬件加速器,因此他们更关心 Inference 应用,而 DeepBench 则同时考虑 Training 和 Inference 的硬件评测问题。


下面这幅图是 DeepBench 在一个 Deep Learning 生态系统中的定位。


以下是他们对这个定位的说明:


DeepBench uses the neural network libraries to benchmark the performance of basic operations on different hardware. It does not work with deep learning frameworks or deep learning models built for applications. We cannot measure the time required to train an entire model using DeepBench. The performance characteristics of models built for different applications are very different from each other. Therefore, we are benchmarking the underlying operations involved in a deep learning model. Benchmarking these operations will help raise awareness amongst hardware vendors and software developers about the bottlenecks in deep learning training and inference.


可以看出,DeepBench 试图设计更具普遍性的 Benchmark,因此选择使用底层的操作(underlying operations)来评测在 Training 和 Inference 中的瓶颈问题。这实际上也是试图解决我们在上篇文章中提到的,「使用几个 DCNN 网络作为 Benchmark 是否具有普遍性?」这一问题。到这里,我们可以比较清楚的看到 DeepBench 的基本思路是设计类似 Dhrystone 这样的「Synthetic Benchmark」思路。


需要指出的是,DeepBench 使用了硬件厂家提供的 Library,比如 Nvidia 的 cuDNN,Intel 的 MKL,还有 ARM 的 Compute Library。也就意味着它的「基本操作」是比这些 Library 封装的「基本操作」(比如矩阵乘法)的粒度要粗的,并且需要 Library 的支持。如果其它硬件厂商也想使用 DeepBench,则也需要提供类似的 Library(当然还包括一些 porting 的工作)。另外,它评估的结果实际是包括了目标硬件加 Library 的整体性能,而非单纯硬件本身。由于实际的应用者一般也是基于 Library 进行开发,所以这种方式也是合理的。但是,对于需要定位硬件设计问题或者瓶颈的人来说,使用这样的方法还需要考虑到 Library 对结果的影响。比如在 DeepBench 最新发布的时候,ARM 的 Compute Library 还只支持单精度浮点的卷积操作,不支持 8 比特定点;同时它也没有对 RNN 对的支持,这些功能限制对于测试效果的评估还是有比较大的影响的。


和 Eyeriss 提出了很多有特色的「Benchmarking Metrics」不同,DeepBench 的测试指标是比较简单的,主要就采用运行时间「Time(msec)」进行性能的评价。所以,我们对 DeepBench 的讨论主要还是集中于它设计的「测试程序」。



下面我们就具体看看 DeepBench 设计的用于 Training 和 Inference 的 Benchmark。


对于 Training,DeepBench 从不同的应用模型(Source 列)中总结出了一些特定的操作(Type of Operations)。如下表所示:


其中最基本的操作包括三类:Dense Matrix Multiplication,Convolution,Recurrent Layers。这些选择是比较自然的,基本可以覆盖各种 DNN 的情况。最后一类 All-Reduce 是专门针对多 GPU 并行 Training 的场景。


对于每一种 Operation,都有不同的参数。比如 Converlution 操作,就有如下的参数:W (input - time), H (input), C (channels), N (batch size), K  (number f filters), R (filter width), S (filter height), pad_h pad_w, Vertical Stride, Horizontal Stride, Platform (server or device), Forward, wrt Inputs, wrt Parameters。DeepBench 对每种 Operation 都定义并且实现了多种不同的参数组合,反映各种应用中比较常见的配置(可以看作是一个测试内核 Kernel)。具体的各种 case 大家可以看网站提供的 Excel 表格,以及 Kernel 的具体实现。


以下是 Inference 的主要操作和对应的一些典型应用(Source 列):


对于 Inference 的 BenchMark,除了基本操作以外 DeepBench 还讨论了以下几个问题。


Deployment Platform:分析了 DNN 模型部署在 Server 端(我们之前经常说的 Cloud/Datacenter)和 Device 端(Edge/Embedded)的特点,也说明了 DeepBench 对不同的部署平台做了有针对性的测试。


Inference Batch Size:分析 Batch Size 对于效率和延时的影响(Batch Size 越大,并行处理的可能性阅读,实现效率越高,但处理延时也越大),以及在两者之间如何平衡。从 DeepBench 测试的结果来看,「在 Server 端采用 4~5 的 batch size,而在 Device 端采用 1 的 batch size 是一个比较好的选择」。


Inference Precision:讨论 Inference 精度的问题,以及 DeepBech 对精度选择的原因。


Sparse Operations:分析稀疏性对 inference 性能的影响。一个有趣的结论是「基于我们的研究,与其密集模型基线相比,具有 90 至 95%稀疏度的神经网络可以实现相对较好的性能。然而,当前实现的稀疏矩阵乘法主要是对更高的稀疏度(大约 99%或更高)而优化的。通过包含稀疏内核(我们在上面的表格中看到的「Sparse Matrix Multiplication」operation),我们希望激励硬件供应商和软件开发人员构建为 90%至 95%的稀疏性提供更好性能的硬件和库。」


Measuring Latency:「许多 Inference 应用具有实时延迟要求。DeepBench 定义的内核可以作为衡量单个操作的最佳延迟的起点。但是,考虑到基础操作不是完整的应用程序,测量全系统延迟不在本版本 DeepBench 的范围之内。」这里反映了使用基本操作作为测试程序的问题:无法统计整个实际应用程序(比如 AlexNet)所花费完整时间。这是目前 DeepBench 面临的一个主要困难。在未来能否设计出更好的基本操作,并基于这些基本操作设计一些组合操作来模拟实际的应用程序,是值得研究的课题。


对于最后这个问题的讨论,也反映出 Synthetic Benchmark 设计的难度:如何通过「设计」,让不是真实应用的测试程序来准确「模仿」真实的应用,并得到能够反映现实世界情况的结果。从更大范围来看,随着 DNN 软硬件实现的不断优化,如何对其进行评价,验证和测试将会是我们一直要思考的问题。DeepBench 是一个非常有益的尝试,希望未来还能看到更多更好的解决方案。


Reference:


[1]「Tutorial on Hardware Architectures for Deep Neural Networks」, http://eyeriss.mit.edu/tutorial.html

[2] "Benchmarking DNN Processors" , http://eyeriss.mit.edu/benchmarking.html

[3] "Comparing dense compute platforms for AI", https://www.intelnervana.com/comparing-dense-compute-platforms-ai/

[4] Williams, Samuel; Waterman, Andrew; Patterson, David (2009-04-01). "Roofline: An Insightful Visual Performance Model for Multicore Architectures". Commun. ACM. 52 (4): 65–76. ISSN 0001-0782. doi:10.1145/1498765.1498785

[5]「DeepBench」, https://github.com/baidu-research/DeepBench


作者简介:唐杉博士先后在 T3G(STE)、中科院计算所、紫光展锐(RDA)工作。具有 15 年以上的芯片设计经验,在 3G/4G 通信基带处理,专用处理器 ASIP,多核 SoC 架构,ESL 级设计和 Domain-specific 计算等方面有深入研究和实际经验。近一年来主要关注 Deep Learning 处理器和相关技术,现在 Synopsys 公司任职。公众号:StarryHeavensAbove。


声明:本文为机器之心「矽说」专栏文章,版权归作者唐杉所有,转载请查看要求,机器之心对于违规侵权者保有法律追诉权。