寒武纪神经网络处理器效能怎样

3月23日听了陈老师的报告,感觉受益良多。

陈老师课题组做的工作应该算是很开创性的工作了。以往我们总是说国内的科研人员做课题喜欢跟热点凑热闹,现在看来全球的研究人员其实也都是这样——陈老师的工作发表以后,去年一年国际上就有几十篇paper跟住了他们,针对他们的工作做了一些改进。

陈老师首先介绍了为什么要有神经网络处理器:
CPU/GPU用于智能信息的处理时,效率十分低下,谷歌大脑项目用了1.6万个CPU核跑了7天才完成猫脸识别。为了追求更高的识别能力,神经网络的规模正在快速增长。目前阻碍Deep Learning发展的很大的一个瓶颈就是速度了。他认为要克服这个瓶颈,神经网络处理器是迄今为止最好解决方案。

而且回顾计算的历史,我们会发现一个从通用计算走向专用计算的一个细分趋势:
图形处理-\u0026gt; GPU
信号处理-\u0026gt; DSP
认知处理-\u0026gt; 神经网络处理器

其实我本来是挺想把神经网络处理器叫NNP(Neural Network Processor)的,但陈老师他们把它起了名字叫DianNao(电脑)。这里面还有一段渊源:
本来陈老师课题组想给这个芯片起个electric brain之类的名字的,后来与陈老师课题组合作的一位法国学者建议他们给成果起个中文名字,这样对于法国方面来说是外文,显得比较“洋气”。

要说效能的话,我们可以摆一点数据:1GHz, 0.485W@65nm, 通用CPU 1/10的面积,100的性能。但是我觉得这个数据放在这里并没有太大的意义。首先,DianNao系列处理器现在并没有完全进入商业生产阶段,芯片制程方面的优化应该还有很大的余地。其次,他是神经网络处理器,算的东西跟通用CPU不一样。发明有先后,术业有专攻,你让GPU跟CPU去比浮点计算能力意义也不大。
如果硬要比的话,从陈老师课题组2012年的成果来看,在计算DNN,CNN,MLP,SOM等人工神经网络算法时,他们可以用CPU(Xeon E5-4620)和GPU(K20M)十分之一的面积,分别达到CPU-117倍,GPU-1.1倍的性能。
不从上面数据的角度看,我认为利用DianNao来做神经网络的运算,主要的优点有两个:
1、由于硬件的支持,效率的提升是成数量级的。
2、DianNao支持任意规模的神经网络!
这里任意规模神经网络很值得我们关注一下,这也是他们的处理器技术关键点所在。传统的神经网络芯片的做法是把硬件运算单元和算法神经元一一对应起来,这样一来只能对一个固定的神经网络进行计算。他们采用了对小尺度神经网络分时复用的方法来支持任意规模的神经网络,这个做法很厉害,极大地提高了芯片对于不同算法的能力。
从08年到16年的这八年里,陈老师课题组针对神经网络处理器做了一系列的出色研究:
12年国际首个神经网络硬件测试集
13年国际首个深度学习处理器
DianNao(电脑):ASPLOS\u0026#39;14最佳论文 亚洲首获计算机硬件A类会议最佳论文
14年国际首个深度学习多核处理器
DaDianNao(大电脑):MICRO\u0026#39;14最佳论文
15年国际首个通用机器学习处理器
PuDianNao(普电脑):ASPLOS\u0026#39;15
15年摄像头上的智能识别IP
ShiDianNao(视电脑) ISCA\u0026#39;15
16年国际首个神经网络通用指令集
DianNaoYu(电脑语)ISCA2016接收,分数第一


针对这个芯片,陈老师课题组还成立了公司,申请了一系列专利保护,目前也在和华为三星等一系列企业洽谈合作。相信不久将来我们就可以在移动设备上看见DianNao的应用了。

真棒,祝他们成功。

■网友
正好最近因为一些需要,在系统性的关注AI硬件加速方面的东西,也找来陈博士的研究团队最新的ISCA 2016文章《Cambricon: An Instruction Set Architecture for Neural Networks》研读了一下。分享一下我阅读这篇论文之后的一些总结及点评感想(直接插入在正文中,没有刻意区分)。这篇论文实际上是陈氏兄弟围绕AI加速器(虽然他们主要的工作集中在神经网络硬件加速上,但是也有一些工作加入了对其他机器学习算法的支持,比如Linear Regression/Naive Bayes/KNN/K-Means/SVM/etc.,所以用AI加速器来代指会更为全面)这个领域开展的一系列工作中的一个,也是public出来的最新的工作。介绍这篇论文,有必要先简要回顾一下陈氏兄弟的相关工作历程。AI加速器这个概念的始作俑者其实并不是陈氏兄弟,而是Inria的Temam教授。在ISCA 2010上,Temam教授做了一个名为“The Rebirth of Neural Networks”的talk。在这个talk里,Temam首次提出了机器学习加速器的思想,并回顾了07年Larochelle和Bengio他们在Deep Neural Network上的一个评估工作,在这个工作里,Larochelle他们在一些识别任务上验证了通过增加网络层数可以获得比shallow model更强大的建模能力。在回顾深度神经网络相比于shallow model更强的建模能力的同时,Temam同时也结合硬件工艺遇到极限,单纯通过工艺进步来获得计算效率提升的方式已经行将走向尽头的这个trend,提出了异构计算和应用定制加速器的思想。这其实也在近几年来体系结构领域顶会的论文主题构成可见一斑。之后,在12年的ISCA上,Temam提出了第一个AI加速器的设计。随后就启动了Temam与陈氏兄弟的合作项目,这个项目的名字也比较有趣,直接取了电脑的拼音,名之为Diannao项目。Diannao项目的核心实际上就是提出了一系列定制的AI加速器的设计方案。包括第一个加速器Diannao,第二个加速器DaDiannao(Diannao的多片版本,通过多片设计,可以将较大的模型hold在on-chip memory上),第三个加速器ShiDiannao(将AI加速器与传感器直连,从而减少内存通讯的开销),第四个加速器PuDiannao(将加速器从只支持特定神经网络扩宽到支持多种常规机器学习算法)。PuDiannao也是Diannao项目的最后一个工作。随后,陈氏兄弟就提出了Cambricon指令集的思想,试图在更为泛化的层面来完成AI加速器的设计。在Cambricon之前,Diannao的四代加速器设计大体上走得还是比较纯粹的专用逻辑加速的路子,加速逻辑的设计粒度比较粗,大约在神经网络的layer这个层级,这就限制了加速器的泛化性。网络结构稍有变化,机器学习算法的逻辑有所调整,就可能导致加速器无法支持。而在Cambricon里,则试图针对AI算法,提取出更为细粒度,泛化性更强的building block,在更具原子性的building block上完成硬件结构设计,从而提升了加速器的通用性。接下来我们就具体看一下这篇论文的细节内容。本质上指令集的设计实际上是一个体系结构设计的工作,而体系结构设计这个领域从计算机诞生到现在,已经存在着大量的积累和经验可供复用。比如指令集类型的选取(RISC or CISC),访存体系的设计(Cache Hierarchy or Scratchpad Memory),硬件流水线的设计等等。从我个人的感觉,在这篇论文中所使用的building block并没有原创性的东西,真正原创性的地方在于,作者跨越了多个domain,对于一个比较经典的问题(深层神经网络),使用已经经过验证成熟的building block技术,给出了一个性能/功耗/开发效率 更高的解决方案。真正的核心贡献在于问题的定义和提出,而并不是解决问题的技术细节。所以,Cambricon的设计原则也比较简洁,总结起来是几点:I. 采用基于load-store访存模式的RISC指令集。具体指令的选取,根据workload的类型进行计算层面的抽象得出。对于深层神经网络来说,主要的计算和控制任务有几种: 向量计算 矩阵计算 标量计算 分支跳转其中向量计算、矩阵计算、标量计算属于标准的计算工作。形式上看起来与通用处理器没有区别,主要的区别在于细节的支撑上。比如,对于神经网络计算任务中的高频操作,就可以直接提供硬件指令集的支持,典型的例子就是应用于drop-out的Random-Vector指令,用于在一条指令内部为一个向量进行快速随机初始化,以及应用于激活层的Vector-Expotential,用于在一条指令内部为一个向量进行快速的非线性变换(这里稍微展开一些,针对神经网络的计算任务类型,在硬件层面,还可以为指数运算这样的高耗时操作进行特定优化,比如通过高阶Taylor展开来近似逼近指数运算,因为神经网络往往对于一定程度的数值误差表现出较强的tolerance,这也是一系列模型压缩技术得以有效运转的关键基石)。而分支跳转的逻辑在神经网络计算任务里,并不像常规计算任务那么复杂,所以指令集的设计上并不需要提供丰富的分支跳转逻辑的支持,相应地,在结构设计环节,也可以减少在分支预测上花费的设计\u0026amp;实现精力。II. 不引入复杂的Cache体系和相关控制逻辑。这跟AI算法的workload类型有强关联,对于AI算法来说,data locality并不强,cache对性能的影响不像常规计算任务那么大,所以把用于实现cache hierarchy的控制逻辑精简掉,对于提升芯片的计算功耗比会有很大的助益。III. 使用Scratchpad Memory而不是寄存器堆来作为计算数据的主存储。因为AI算法的计算任务与常规的多媒体计算任务不同,指令所操作的数据长度往往是不定长的,所以应用于多媒体指令优化(SIMD)的寄存器堆就不如Scrathpad Memory灵活。以上就是我总结的Cambricon的核心设计思想。接下来可以来看一些具体的指令集示例。Cambrian里所有的指令都是64-bit的长度,这也算是RISC设计思想的体现,可以有效简化指令解码器的负担,有助于减少功耗和芯片面积。指令集可以划分为四大类,分别是计算类/逻辑类/控制类/数据存取类。计算类指令主要是针对神经网络的常用计算逻辑提供了指令集的支持。比如矩阵与矩阵的相乘,矩阵与向量的相系,向量与向量的相乘,等等。这类指令的一个特点是,指令所操作数据的长度是不定长的,以灵活支持不同尺寸的矩阵和向量。逻辑类指令主要是针对向量或矩阵数据,完成逻辑判断操作。比如用于支持max-pooling的条件merge指令就可以对多组feature map,通过条件赋值,完成max-pooling的操作。关于这个操作,下面的图片可能描述得会更形象一些:


推荐阅读