首页 > 国策经纬 > 文化 > 

陈云霁:神经网络处理器是怎样工作的?

2016-12-19 14:22:49 学习中国 陈云霁

  中国科学院计算技术研究所研究员 陈云霁

  介绍一下神经网络处理器或者深度学习处理器它到底是怎么工作的,它里面的架构是什么样子?这是我们做的第一个深度学习处理器架构这样的一个架构跟版图。

  事实上神经网络硬件这个事情并不是一个今天才有的事情。在上个世纪80年代,就是日本五代机那个浪潮的时候,包括英特尔、摩托罗拉、TI等国际商的知名的企业都做过神经网络硬件的研究,但是当时的情况跟现在是很不一样的,当时的神经网络算法都还很原始,都还很粗糙。当时的神经网络一般就是两层或者三层,非常小,每层就几个神经元,所以说当时的神经网络硬件基本上一个摊大饼的方式,就说我算法上有一个神经元,硬件上就做一个神经元,算法上有一个突触,硬件上就做一个突触,然后再用导线把它连起来就做完了。

  但这套做法对于深度学习来说是完全走不通的。因为深度学习这种神经网络里面,它里面的这个规模实在是太大了,它里面可能有几十亿个突触,甚至上百亿个突触,那如果每一个突触要做一个乘法的话,那一个芯片就要做几十亿个乘法器,那这是不现实,因为现在最大的芯片可能也只能去做,里面也只能放几千个乘法器。所以说这种摊大饼的方式对于深度学习处理器来说是不现实的。

  另外还有个问题,即使我们在芯片上做了很多硬件的神经元和突触,访存供不上数据也是白搭。就是说芯片你可以做得很快,但是你访问内存条的那个接口大小是有限的,所以访问内存就可能成为一个性能的关键的瓶颈。另外我们还有一个发现,就是说把数据从内存搬到硬件运算单元,比做神经元运算要花的能量要多好几十倍。所以由于这几方面原因,深度学习处理器,它必须是要一个是小尺度的一个芯片,但是能够支持任何大规模的的神经网络。那事实上这里面存在两个矛盾。第一个矛盾是什么呢,硬件是固定的,而算法是或者说应用是多变的,那么识别人脸的神经网络可能是一种拓扑,是一种模式,识别语音的可能是一种拓扑,一种模式。那么如何去用固定的硬件去支持多变的算法呢,这是一个矛盾。第二个矛盾是说,硬件的大小毕竟是有限的,因为一个芯片上面硬件的神经元数量永远都是有限的,但是算法上面的神经元的数量是几乎无限的,因为每一个程序员他都可以任意地去把这里面的算法里面的神经元数量给增加。所以这第二个矛盾就是说我们如何用有限大小的硬件去支持任意大规模的这种神经网络。所以就是这两个矛盾就使得我们提出了这样的策略,就是分时复用,就是我们通过硬件神经元的分时复用,我们可以虚拟出任意大规模的神经网络,这样的话我们就去解决了这样两个矛盾。这里面我们拿一个例子,比如说我们有一个非常大的人工神经网络,我们已知甲层,要去算乙层,要去算丙层这些东西,但我们的硬件非常小,每个周期只能处理这么多,那怎么办呢?那我们就通过一个类似于蚂蚁搬大饼的方式,我第一个周期我就让我的硬件虚拟出框中的黑色的这一部分,这个算法,那下一周期我再换一块上来处理,再下一周期再换一块,再下一个周期再换一块,在这个过程中,我们不断地让我们的硬件虚拟成不同的算法上神经元,最后就可以通过蚂蚁搬大饼的方式,一口一口地,最后就可以把整个非常大的人工神经网络给吃掉。

  这里面还有很多细节我就不多说了。当然了这里面还有一个非常重要的地方,就是访存。就是在一个计算机里面,运算是很容易做得很快的,但是访存往往是真正性能的瓶颈跟能耗的瓶颈。在传统的CPU或者GPU里面,在传统的芯片里面,所有的数据都是放在一个统一的,我们称为一级缓存里边,但是我们看到在人工智能这些应用,特别是在深度学习里面,数据是由很多不相干的三类数据,比如说输入神经元、输出神经元,还有突触,这些数据组织在一起。它完全有不同的模式、不同的重用次数、不同的重用距离、不同的读写宽度,把它们都混在一块,这样的话通用的CPU跟GPU在进行神经网络处理的时候效率就比较低。我们就提出说,要把这个三类要分开来存放,这样的话就达到了一个非常高的效率。

  这是我们跟英特尔的至强服务器CPU的性能的一个对比,大概能够达到它百倍的性能,面积只有它十分之一不到。

  电脑是从一个单芯片的角度上去看,怎么去处理深度的学习的这样一个应用,那么大电脑是从另外一个视角,就是从超级计算机的视角去看,怎么去处理神经网络应用。我们中科院计算所实际上是长期从事计算机体系结构,包括超级计算机的研制,所以我们很自然就会想,超级计算机怎么去把这个深度学习给处理好,我们看到现在深度学习的神经网络,它的这个规模有一个很重要的这种趋势,就是越来越大。但是最大的人工神经网络规模也就是上百亿或者几百亿的突触,我们要把它存下来,实际上所需要的数据量并不多,也就是几十Gbyte。几十Gbyte对于一个芯片来说,你肯定是存放不下的,但对于一个超级计算机来说,就完全没有这个问题了。一个超级计算机里面可能有上百个芯片,每个芯片可能有几十M大B,或者上百G大B的存储,那这样连在一起,就可以把整个人工神经网络的模型,把所有的神经元的突触都放在芯片上面。这样达到效果什么呢,就是没有内存条了,我们知道传统的冯诺一曼架构它最重要的性能偏性就是计算芯片跟内存之间这个瓶颈。

  我们现在绕过了这个瓶颈,因为我们不需要内存条了,我们的芯片就可以达到一个非常高的效率,我们的这个架构就可以到一个非常高的效率。当然这个里面不仅仅是架构上的创新,还需要包括一系列微电子上的创新,比如说这种我们用每个晶体管就可以存放1个byte这样EDRAM技术等等。

  最后我们达到实际的效果就是我们每个芯片相对同期主流的GPU可以到20倍的这种性能的这种提升,然后比GPU有300倍能耗的这种降低。所以这个都是数量级的提升。

  我们下面第三个工作是普电脑,普就是普适,普遍的这种意思。机器学习里面实际上有很多种方法,这里我介绍一个概念,就是说人工智能是一个非常大的一个领域。它是一个计算机科学、神经科学、心理学这样的一个交叉点,它是个非常大的,那么人工智能里面又有很多种不同的分支,比如说机器学习,比如说知识表示等等,那么机器学习里面又有很多种不同的方法,比如说神经网络、决策树、支持向量机等等,但是现在的深度学习是或者说人工神经网络是最主要的机器学习方法,而机器学习又是现在最主要的人工智能方法,这个是一个基本的概念。

  在机器学习里面有很多种不同的算法,深度学习是其中一种,还有包括决策树、支持向量机等等很多很多。那么为什么会有很多种不同的机器学习算法呢,这是因为问题跟数据本身就存在多样性,在机器学习领域有一个非常知名的这样一个定理叫做 No-Free-Lunch Theorem,就说没有一个算法可以在所有的应用上都比其它的算法效果好。所以就是因为这个原因,大家会设计出各种各样不同的这种机器学习的算法。由于有多种不同的机器学习算法,我们就想我们做一个芯片不能只是深度学习,因为深度学习只是其中一种,如果别人需要线性回归,需要支持向量机怎么办呢,所以我们就找了好几十种不同的机器学习算法。我们去分析它两件事情,第一是分析它最耗时,最普遍的运算操作集合,分析这个干嘛呢,我们就可以得到我们的功能部件,第二个是寻找我们各种不同机器学习算法的数据的共性的局部性,来降低各种算法的访存的这种需求。研究这个东西是为了什么呢,这是为了设计我们的这种片上存储。有了我们的这种共性的这种运算跟访存特征,我们就可以设计出很好的这种功能部件跟片上存储,使得我们能够把各种各样的机器学习算法、我们做出来的芯片都能够跑得非常快。这里我们分析了很多种算法,就不一一列举了,包括像K-NN、K-Means,比如说支持向量机、朴素贝叶斯、贝叶斯网络、决策树,包括深度神经网络,包括线性回归等等,很多很多。最后我们的发现是什么呢,我们发现机器学习算法虽然有很多,可能有几十种甚至是上百种,甚至更多,但它里面共性的运算其实是很简单,很少的,主要是就这几种,向量内机、向量距离、技术、非线性函数跟排序,主要就这五种,95%以上的时间都是在集中在这五个东西上面,其他的时间可能都是一些我们称为胶水代码的东西。

  第二个特征是共性的数据局部性的特征,我们称为三个柱子,就说如果我们对机器学习里面算法有不同的变量进行聚类的话,我会发现基本上都是聚成两到三类,这就是因为机器学习里面它虽然涉及到计算很多,涉及到数据很多,但数据的类型、数据的模式是很少的。而我们看一般传统的一些应用,比如说微信、office,你就会看到它里面的数据类型是非常多的。而机器学习有些类型基本上就两到三种。

  所以基于我们刚刚讲的这几个共性,一个是共性的运算,第二个是共性的存储,我们设计了这样的一个特定的架构。这个架构里面有三个专门的缓存,就是HotBuf、ColdBuf跟OutputBuf,去应对这三类不同类型的数据。包括我们还有专门的可重塑的机器学习的功能部件,通过各级流水级之间的这种拼接,包括组合,包括动态的关闭跟开启等等,就会去完成刚刚我们讲的各种主要的,就跟我们讲的那个五种主要的机器学习的运算,包括向量内积、向量距离、非线性函数、计数、排序等等。

  通过仿真我们发现这样的一个架构,它能到什么效果,它可以跟主流GPU相比,性能跟它相当,但是功耗只需要它200分之一,也就是0.6瓦左右。所以这个还是很划算的一件事情。面积也非常小,也不到GPU的1%了。

  最后这个是视电脑,视就是视觉的意思,就是说我们希望做一个神经网络的一个芯片,能够去直接去解决各种各样的视觉处理的问题,什么样的视觉处理,识别人脸、识别图像,包括识别视频,包括这种价值等等,这里面背后这种东西都是做这个视觉的处理,所以我们就专门做了这样的一个加速器,它基本是这样,能够一个集成在摄像头里面的视觉处理器,能够直接对输入图像进行识别跟理解,这样它就不需要内存跟访问了。具体是怎么做到呢?我们看在传统的深度学习里面,它基本有两部分,主要有两部分会引起内存跟访问,两个部分,第一个部分是访问图片,你得把图片从内存里面或者硬盘里面什么地方导出来对吧,第二部分是访问这个深度学习的模型,需要把这个模型从内存里面加载到我们芯片上面。在对视电脑来说,我们就解决了这两个问题。

  第一个就说输入图片,我们从Sensors这种感光,就是相当于你拍照一拍完,还没有存到内存里,我们就直接对它进行识别和理解,这样我们就不需要反复地从内存里面再去把我们需要看的照片拿出来了,所以把这部分的访存干掉了。

  另外一部分,就是说我们的这个视电脑,它处理这个神经网络模型,它只处理卷积神经网络,刚刚我们讲的这些电脑、大电脑、普电脑这些,这是各种各样的神经网络,但视电脑只支持卷积神经网络,为什么一定要卷积神经网络呢,因为卷积神经网络里面数据有大量的重用性。它里面比如说在一个图片,你对一个图片进行卷积的时候,在图片的不同位置,比如这个点那个点,它进行卷积的时候,卷积的模板是完全一样的,所以说它需要的存储量非常的小,我们就可以在一个芯片里面,我们就可以去把它的这个神经网络模型完全放在芯片上。那这样的话我们输入图像不需要访问内存,然后我们的模型也不需要访问内存,加在一起整个都不需要访问内存了。

  所以这样一个不需要访问内存的一种架构,我们就可以达到GPU几十倍的性能,接近30倍,然后我们的能效,就说我们做同样的事情,花的能量就只是GPU的五千分之一左右。这就非常适合在各种各样的这种嵌入式的这种领域去使用。


分享到:
  • 欢迎,   已有0条评论
最新评论

学习网首页
思想理论
资    政
学习中国
党史党建
企业天地
科学技术
海外风采
综合专题
理论百科
干部论坛