zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

AI芯片:寒武纪ShiDianNao结构分析

芯片AI 分析 结构
2023-09-14 09:09:26 时间

link

ShiDianNao

ShiDianNao的出现是寒武纪在深度学习处理器上细分领域的更加深入。

前面介绍的DianNao针对的是大部分的深度学习神经网络算法,包括CNN和RNN等。
目前比较火而且应用面非常广的领域是计算机视觉,若在这个领域的算法精度实现巨大突破,那么,就将开启广阔的应用领域,能够真正明显地改变世界。比如自动驾驶/安防等等,利润丰厚的领域。
图像识别,这类算法主要采用CNN结构。
于是乎,开发专门针对CNN的ASIC就变得可行且有商业价值。

寒武纪为何在已经有了DianNao的基础上,还要设计ShiDianNao?

先来分析下,目前DianNao存在的缺陷。
众所周知,深度学习类的算法都是计算密集型和存储密集型。
这就造成了不低的功耗。
当这类芯片应用到终端嵌入式设备上有许多限制,比如智能手机,对芯片功耗有着严苛的要求。

因为DianNao中的数据会存储在DRAM中,而DRAM的读写会消耗非常大的功耗。
如果能够避免用DRAM存储数据,那么就能很大程度上降低功耗。
是的,就是基于这个想法,ShiDianNao诞生了。

ShiDianNao的想法就是,在实际应用时,将用于图像识别的人工智能处理器在物理位置上比较靠近图像来源(CMOS/CCD传感器),这样就避免了图像数据需要DRAM的存储。
另外,对于CNN算法,其中常用的一类CNN是共享权值的,这样权值的数量就不大,可以完整存放在片上SRAM中,从而使得权值也能避免存储在DRAM中。
这样处理后,整个系统就不需要DRAM做存储,从而大幅降低功耗。
这里写图片描述
上图将Acc(人工智能处理器)放置在离传感器很近的位置,直接从传感器获取图像数据,避免了DRAM的使用。

ShiDianNao架构
ShiDianNao的架构如下图所示。
这里写图片描述
整个架构与DianNao一脉相承。三个buffer分别存储权值/输入数据/输出数据。
核心逻辑是右边的NFU,也就是PE阵列。PE(processing elements),是最小的处理单元。
NFU的内部结构如下图所示。
这里写图片描述
从上图可以看出,权重是同时广播到所有的PE,输出也是同时传递到output,而输入数据则配合每个PE内部的两个fifo,有不同的输入规律,有时一次给所有PE提供输入,有时又只给一列提供输入其余列靠相邻右边的fifo提供,有时又给一列提供输入其余列靠相邻下方的PE的fifo提供。
单个PE结构如下图所示。
这里写图片描述

ShiDianNao与TPU1对比
与TPU的脉动矩阵相对比,发现二者都共用了权重和输入数据。但是细细分析,还是觉得TPU的脉动矩阵更加优秀高效。

比如,二者都共用了权值,ShiDianNao是统一获取权值,然后同一周期广播到所有PE。受限于信号在导线中传递速度,信号完整性以及时序同步的问题,ShiDianNao的PE阵列无法做到比较大的规模,且规模越大,需要的传输布线长度约长,传输时间越久,因此频率也无法做到很高。而且,每个PE都是单独出结果,也就是说,在PE阵列中央的PE也要直接给输出传递数据,这就意味着需要不菲的布线资源。所以,ShiDianNao的缺点还是比较明显的。

再比如,二者都共用了输入数据。ShiDianNao是在PE内部有两个FIFO来存储多个输入数据。而且因为输入数据共享的方式有几种不同的情况,所以就造成了为了共享数据,不同时刻,数据的传递方向是不同的,比如,可能是按列,从右往左传递,也可能是按行,从下往上传递。而反观谷歌的TPU,采用了脉动阵列,于是,输入数据只需要从阵列的左侧进入,然后所有输入数据都从左往右依次传递,传递方式非常简单,也不需要在PE中内置FIFO。
几种不同的输入数据传递方式,见下图所示。
这里写图片描述

另外,脉动阵列只有最下面一行的PE会输出计算结果,只有最左边的一列会接受输入数据,整体来说,所需要的布线资源就少很多。另外,因为PE所需的输入数据/权重相关信息/中间计算结果,都来自邻近的PE,不需要很长的走线,且能够轻易做到相邻PE的距离相同,那么相邻PE之间的信号传递时间就完全一致,可以保持整个脉动阵列工作在非常高的频率。

总体来看,个人认为还是谷歌TPU的脉动阵列更加高效。

计算卷积
下面看看ShiDianNao是怎么计算的。
以卷积为例。
这里写图片描述
Figure13(a)显示了一个2X2的PE阵列。所以可以同时计算4个输出。所需输入数据如图右侧的4个不同颜色方框所示。中间则表示了从cycle0开始,每个cycle,给每个PE的输入数据。可以看出,其中有部分数据可以反复利用。于是,这就给增加FIFO来实现数据复用提供了可能。
Figure13(b)则配合图(a),给出了每个cycle,每个PE中的FIFO应该如何存储输入数据,以及输出数据复用。

这种方式有个缺点,一般而言,图像数据存储在RAM中,都是按照一张图的数据集中存储在一起,那么,取同一张图像上的某些像素点作为输入数据时,每个周期的像素地址并未对齐,无法在一个周期中获取该周期需要的所有有效数据,难以满足PE阵列的需求,会降低计算速度。

状态机
整个ShiDianNao的运行,会因为算法中的不同计算而有不同的控制方式,这就需要用到状态机,如下图所示。
这里写图片描述
引入状态机控制ShiDianNao工作,就可以采用指令集的方式,描述需要的操作,然后由状态机执行。
这一点,比较赞。

猜测寒武纪的一系列芯片应该都采用了这样的状态机进行控制。