1.CPU和GPU
CPU(CentralProcessing Unit)中央处理器,是一块超大规模的集成电路,主要逻辑架构包括控制单元Control,运算单元ALU和高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus)。简单说,就是计算单元、控制单元和存储单元。
架构图如下所示
CPU遵循的是冯·诺依曼架构,其核心是存储程序/数据、串行顺序执行。因此CPU的架构中需要大量的空间去放置存储单元(Cache)和控制单元(Control),相比之下计算单元(ALU)只占据了很小的一部分,所以CPU在进行大规模并行计算方面受到限制,相对而言更擅长于处理逻辑控制。
CPU无法做到大量数据并行计算的能力,但GPU可以。
GPU(GraphicsProcessing Unit),即图形处理器,是一种由大量运算单元组成的大规模并行计算架构,早先由CPU中分出来专门用于处理图像并行计算数据,专为同时处理多重并行计算任务而设计。
GPU中也包含基本的计算单元、控制单元和存储单元,但GPU的架构与CPU有很大不同,其架构图如下所示。
2.脉动架构
对于为什么要设计这样的架构,作者给出了三个理由:
1.Simple and regular design:可以说,简单和规则是脉动阵列的一个重要原则。而这样的设计主要是从“成本”的角度来考虑问题的。由于一个专用系统往往是功能有限的,因此它的成本必须足够低才能克服这一劣势。这也是设计专用处理器的一个基本考虑。
2. Concurrency and communication:这一点主要强调并行性和通信的重要。
3. Balancing computation with I/O:平衡运算和I/O,应该说是脉动阵列最重要的设计目标。
一个处理单元(PE)从存储器(memory)读取数据,进行处理,然后再写回到存储器。这个系统的较大问题是:数据存取的速度往往大大低于数据处理的速度。因此,整个系统的处理能力(MOPS,每秒完成的操作)很大程度受限于访存的能力。这个问题也是多年来计算机体系结构研究的重要课题之一。而脉动架构用了一个很简单的方法:让数据尽量在处理单元中多流动一会儿。
第一个数据首先进入第一个PE,经过处理以后被传递到下一个PE,同时第二个数据进入第一个PE。以此类推,当第一个数据到达最后一个PE,它已经被处理了多次。所以,脉动架构实际上是多次重用了输入数据。因此,它可以在消耗较小的memory带宽的情况下实现较高的运算吞吐率。当然,脉动架构还有其它一些好处,比如模块化的设计容易扩展,简单和规则的数据和控制流程,使用简单并且均匀的单元(cell)
脉动架构有几个特征:
1.由多个同构的PE构成,可以是一维或二维,串行、阵列或树的结构(现在我们看到的更多的是阵列形式);
2.PE功能相对简单,系统通过实现大量PE并行来提高运算的效率;
3.PE只能向相邻的PE发送数据(在一些二维结构中,也可能有对角线方向的数据通道)。数据采用流水线的方式向“下游”流动,直到流出最后的PE。
3.TPU
matrix单元就是一个典型的脉动阵列。weight由上向下流动,activation数据从左向右流动。在最下方有一些累加单元,主要用于weight矩阵或者activation矩阵超出matrix单元范围的时候保存部分结果。控制单元实际上就是把指令翻译成控制信号,控制weight和activation如何传入脉动阵列以及如何在脉动阵列中进行处理和流动。
几组寄存器分别存储weight,activation和来自上方cell的部分和。weight从上向下传播,可以在weight path register中存储,保持不动或者传输给weight register进行运算。weight register可以把数据发到乘法器进行处理,也可以直接传递给下方的cell;同样activation register也可以把数据发到乘法器进行处理,或者直接传递给右侧的cell。乘法器的输出和Sum in register的数值求和并传递给下方的cell。所有运算和传递都由控制寄存器控制(通过指令决定)
TPU 中的脉动阵列仅仅完成了卷积的工作,而完成整个神经网络的计算还需要其他计算单元的配合。
如下图,端口接收来自于脉动阵列中的卷积计算的结果,通过激活单元中的非线性函数电路来产生矢量计算单元通过输入数据激活值。在适量计算单元中,还可以通过归一化函数对激活值进行归一化,再经过池化单元就可以对激活值进行池化输出。这些操作都由队列模块进行控制。
例如队列模块可以通过配置参数的端口指定激活函数、归一化函数或池化函数,以及处理步长等参数。矢量计算单元处理完成后将激活值发送到片上的统一缓冲区中暂存,作为下一层网络的输入。TPU 按照这种方法,一层一层地完成整个神经网络的计算。
TPU 还有一个重要步骤是量化 (quantization)。由于谷歌的 Edge TPU 使用 8 位权重进行计算,而通常使用 32 位权重,所以我们应该将权重从 32 位转换为 8 位。这个过程叫做量化。
量化基本上是将更精确的 32 位数字近似到 8 位数字
4.Nvidia Tensor core
那么当矩阵大小超过4x4的时候,上图展示了如何将8x8的矩阵分解为多个4x4的矩阵乘加,从而可以继续利用4x4x4三维计算单元进行乘加硬件加速
Nvidia官方给出的TensorCore 加速矩阵乘加运算示意图
5.神经网络在CPU、GPU、TPU运行的情况
在 CPU 上进行累积乘加运算
CPU 通过从内存中读取每个输入和权重,将它们与其 ALU 相乘,然后将它们写回内存中,最后将所有相乘的值相加,从而执行乘积累加运算。
GPU 上的乘积累加运算
GPU 的原理类似,但它有成千上万的 ALU 来执行计算。计算可以在所有 ALU 上并行进行。这被称为 SIMD (单指令流多数据流),一个很好的例子就是神经网络中的多重加法运算。
读取 TPU 上的乘加操作的权重
TPU 的运作方式非常不同。它的 ALU 是直接相互连接的,不需要使用内存。它们可以直接提供传递信息,从而大大减少延迟。神经网络的所有权重都被加载到 ALU 中。完成此操作后,神经网络的输入将加载到这些 ALU 中以执行乘积累加操作。