TPU结构总结

TPU只完成推理过程,训练过程在GPU上完成。TPU可以像GPU一样通过PCIe总线接口挂载到现有的服务器上。设计目标是为了在TPU上完成所有的推理模型,从而减少和主机CPU的交互,进而满足2015年及今后的神经网络需求。下图是TPU的整体结构框图。

TPU结构总结

主机通过PCIe Gen3x16的总线发送TPU的指令到其中的指令buffer内,内部模块之间通过典型的256位宽通路连接。右上角的矩阵乘法单元是TPU的核心,它由256x256个MACs组成,每个MACs可以对有符号和无符号整形的数据完成8bit的乘加运算。在矩阵单元的下面有一个4MiB大小32bit位宽的Accumulator,收集上面16bit的计算结果。4MiB代表4096个, 256-element, 32-bit累加器。矩阵单元每个时钟周期产生一个256-element的局部和(partial sum)。当使用8 bit权重(weight)和16 bit**(activation)(或反之亦然)的混合时,矩阵乘法单元以半速计算,并且当它们都是16bit时以四分之一速度计算。它每个时钟周期读取和写入256个值,可以执行矩阵乘法或卷积。矩阵单元保存一个64KiB的权重块( tile of weights),并使用了双缓冲(这样可以在处理时同时读入权重)。该单元设计用于密集矩阵,而没有考虑稀疏的架构支持(部署时间的原因)。稀疏性将在未来的设计中占有优先地位。

矩阵乘法单元的权重通过片上的权重FIFO(Weight FIFO)进行缓存,该FIFO从片外8 GiB DRAM读取。由于是用于推论,权重为只读。8 GiB可以同时支持许多模型。权重FIFO的深度是4个tile。中间结果保存在24 MiB片上统一缓冲区(Unified Buffer)中,可以作为矩阵乘法单元的输入。可编程DMA实现和CPU Host内存以及统一缓冲区传输数据。

下图是TPU的平面图,24MiB的统一缓冲区几乎占了三分之一,矩阵乘法单元占了四分之一,数据通路几乎就是其中的三分之二。24MiB的的尺寸是为了匹配矩阵单元的间距,受开发周期较短的限制,也是为了简化编译器。

TPU结构总结

随着指令通过相对较慢的PCIe总线发送,TPU指令遵循CISC传统,包括重复字段。这些CISC指令的每个指令(CPI)的平均时钟周期通常为10到20.它总共有大约十个指令,但是这五个是关键指令:

1.       Read_Host_Memory从CPU内存中读取数据存入统一缓冲区;

2.       Read_Weights从权重内存中读取权值存入权重FIFO,作为矩阵单元的输入;

3.       MatriMultiply/Convolve使矩阵单元执行矩阵乘法或者计算从统一缓存区到累加器的卷积;

4.       Activate执行人造神经元的非线性函数,例如ReLU、Sigmoid等。它的输入是累加器,输出是同意缓冲区。它还可以使用芯片上的专用硬件执行卷积运算所需的池化操作,因为它连着非线性功能逻辑。

5.       Write_Host_Memory从统一缓冲区内读取数据存入CPU主机内存

其他的指令是备用主机内存读写、设置配置、两个同步版本、中断主机、调试标签、无操作和停止。CISC MatrixMultiply指令格式为12个字节,其中3个为统一缓冲区地址; 2个是累加器地址; 4个是长度(有时对于卷积是2个维度);其余的是操作码和标志。

TPU微架构的理念是保持矩阵单元的繁忙。它为这些CISC指令使用4级流水线,其中每条指令在单独的阶段中执行。该计划是通过将其执行与MatrixMultiply指令重叠来隐藏其他指令的执行。为此,Read_Weights指令遵循解耦访问/执行原理,因为它可以在发送地址之后,但是在从Weight Memory获取权重之前完成。如果输入**或重量数据尚未就绪,矩阵单元将停止。
    CISC指令可以占用数千个时钟周期,与传统的RISC流水线不同,每个阶段占用一个时钟周期。由于阅读大型SRAM使用的功率比运算功率高得多,所以矩阵单元使用脉动执行来减少统一缓冲区的读写。这要根据从不同方向按一定时间间隔到达矩阵中单元格的数据来定,在矩阵中数据被组合在一起。
 
  上图显示矩阵乘法单元的脉动数据流,数据从左侧流入,权重从顶部加载。给定的256元乘法累加运算通过矩阵作为对角波前移动。预先加载的权值与新块的第一个数据一起作用在数据流上。控制和数据被流水线化,看起来就好像给出的256个输入数据是一次读取的,并且它们立即更新256个累加器中的每一个的位置的值。正常来说,上次软件并不在乎矩阵单元的脉动性,但是考虑到性能问题,它更加在意各单元的延迟。
TPU软件堆栈必须与为CPUGPU开发的软件栈兼容,以便应用程序可以快速移植到TPU。在TPU上运行的应用程序的一部分通常写在TensorFlow中,并被编译成可以在GPUTPU上运行的API。像GPU一样,TPU堆栈分为用户空间驱动程序和内核驱动程序。内核驱动程序是轻量级的,只处理内存管理和中断。它是为长期稳定而设计的。用户空间驱动程序频繁更改,完成的工作包括:配置并控制TPU的执行、将数据重新格式化为TPU命令、将API调用转换为TPU指令,进而将其转换为应用程序的二进制文件。用户空间驱动程序在第一次评估时编译模型,缓存程序映像并将权重映像写入TPU的权重存储器;第二次和接下来的评估则全速运行。TPU从输入到输出完全可以运行大多数的模型,可以最大化TPU计算时间与I / O时间的比率。计算通常每次进行一层,异步执行允许矩阵乘法单元隐藏大多数非关键路径操作。