国内人工智能处理器独角兽寒武纪,在这个领域,算是走在了世界前沿,经过最近几年的迅猛发展,取得了辉煌的成果。
最近花了些时间研究了下寒武纪发表的一系列论文中介绍的NPU的结构。
记录下来,算是对最近学习内容的总结。
寒武纪从2014年开始,发表了一系列的论文,博客将依次分析其中的几篇:
(1)DianNao: A Small-Footprint High-Throughput Accelerator for Ubiquitous Machine-Learning
(2)DaDianNao: A Machine-Learning Supercomputer
(3)PuDianNao: A Polyvalent Machine Learning Accelerator
(4)ShiDianNao: Shifting Vision Processing Closer to the Sensor
(5)Cambricon-X: An Accelerator for Sparse Neural Networks
感谢寒武纪的分享!!
DianNao
这是寒武纪的开山之作。
本文所谓的人工智能处理器,是指专门处理人工智能算法的专属芯片。
最开始,广泛采用高性能CPU去计算,但是太慢了,于是有采用GPU去计算,发现速度明显提升,于是许多这类计算都基于成熟的GPU平台,这也是这几年NVIDIA股票起飞的主要原因之一。
但是GPU其实并不是专为人工智能算法而设计的,只能说是恰逢其会,自然就有许多不是那么高效的地方。
导致在加速人工智能算法时,虽然GPU比CPU快得多,但是速度还不够,功耗也很大,还有很大的提升空间。
为人工智能专用处理器的出现,埋下了伏笔。
下面先简单说说人工智能算法中主要涉及到的计算类型。
目前,人工智能算法主要的应用方向可以看成2个方面:(1)计算机视觉,也叫图像识别,属于平面二维数据的处理,具体的特征是某个像素与其周围上下左右的元素都有关系,这类问题一般采用CNN计算;(2)自然语言处理(语音识别,自同声传译,语义识别等),这种属于线性时序数据特征,也就是说这些数据有先后顺序,但是不存在上下关系,这类问题一般采用RNN计算,比如LSTM。
CNN与RNN的计算,分解开来,都可以看作大量矩阵乘法及向量对应元素相乘等基本计算。
以CNN计算为例,CNN计算可看作filter矩阵的每个元素与待识别图像的每个小块的对应元素对应相乘并累加,简单来看,就是两个向量对应元素相乘并累加。
文字描述很抽象,下面举个简单例子。
假设filter是A[3,3],尺寸是3X3,图像的某个小块是B[3,3],尺寸也是3X3,再加一个bias。
那么对应的CNN计算C如下:
C = A[3,3] X B[3,3] + bias
= a[0,0] * b[0,0] + a[0,1] * b[0,1] + … + a[2,2] * b[2,2] + bias
可以看出,为了计算得到C,中间包括9个乘法,9个加法。
如果是传统的CPU,那么一般一次只能计算一个乘法,就算是最先进的服务器用超标量CPU,data128bit宽,执行SIMD指令,也就最多同时计算4个定点乘法(32位的乘法),那么光是计算乘法,就需要3个周期,然后又需要几个周期计算加法。
或许有人会好奇,CPU那么强大,怎么可能一次只能计算最多4个乘法?
其实,CPU是为处理各种不同任务设计的,这就造成CPU内部有许多功能逻辑单元,应该说能用到的常用计算功能,比如定浮点的加减乘除/开方/求倒等常规操作,CPU内部都实现了,但是通常同一种功能只会有一套逻辑,最多4套,比如最常用的32位定浮点乘法计算,其他的计算,可能就只有一套,这就造成CPU可以执行各种复杂的计算,但是针对某种类型的计算任务,就不那么高效了。
为啥不多准备几套计算资源?
因为成本原因,芯片面积是有限的,在有限的面积上,只能放置有限的资源,而且,大部分时候,很多计算资源的使用率并不高,这也是一种浪费。
芯片设计,为了商业利益,可不会讲究养兵千日用兵一时。
好了,接下来,就来看看寒武纪的DianNao的内部结构。
基于神经网络的人工智能算法,是模拟人类大脑内部神经元的结构。
上图中的neuron代表的就是单个神经元,synapse代表神经元的突触。
这个模型的工作模式,就要结合高中生物课的知识了。
应该还记得吧,一个神经元,有许多突触,给别的神经元传递信息。同样,这个神经元,也会接收来自许多其他神经元的信息。这个神经元所有接受到的信息累加,会有一个强烈程度,在生物上是以化学成分的形式存在,当这些信息达到一定的强烈程度,就会使整个神经元处于兴奋状态(激活),否则就是不兴奋(不激活)。如果兴奋了,就给其他神经元传递信息,如果不兴奋,就不传递。这就是单独一个神经元的工作模式。那么有成千上万个这样的神经元组合起来,就是一个神经网络模型。
下面就来看看DianNao的内部结构。
上图中央浅蓝色部分就是用硬件逻辑模拟的神经网络结构。
整个称为NFU(Neural Functional Units)。
分为三个部分,NFU-1,NFU-2,NFU-3.
NFU-1全是乘法单元。16X16=256个乘法器。这些乘法器同时计算,也就是说,一个周期可以执行256个乘法。
NFU-2是加法树。16个。每个加法树是按照8-4-2-1这样组成的结构。每个加法数有15个加法器。
NFU-3是激活单元。16个。
可以看出,NFU的所有逻辑资源,可以整体划分为16份,每一份,包括16个乘法器,15个加法器,1个激活。它的运算过程是,16个乘法器同时计算出16个结果,送给加法树(最左的8个加法器,每个有2个输入,恰好接收16个输入),形成一个结果,然后再送入激活。
NFU-1和NFU-2目的是计算出单个神经元接受到的所有刺激的量。
NFU-3是根据前面两个单元计算得到的刺激量,去判断是否需要激活操作。
除了这三个阶段的计算逻辑,剩下还有三个Buffer。一个存储输入数据,一个存储权值(filter值),一个存储计算结果。
整体来说,结构还是比较简明的。
看起来也不复杂,但是因为是ASIC,少了许多不必要的逻辑功能,所以速度就是快,功耗就是低,效果就是好。
毕竟人家ASIC是专业的。
DianNao的出现,性能甩了CPU好几百条街,就算是GPU,那也是好几十条街。
在当时,引起巨大的震动。
开启了深度学习神经网络专用处理器的先河。
之后,迅速涌现出许多不同的架构。
包括谷歌的TPU。
是滴,大名鼎鼎的TPU,面世也要晚于DianNao。
另外,也就是在DianNao面世的2014年,谷歌将参与了DianNao研发的法国专家挖到了谷歌主持研发TPU。
如果说TPU某种程度上借鉴了DianNao的经验,也是说得过去的。