深度学习飞速发展过程中,人们发现原有的处理器无法满足神经网络这种特定的大量计算,大量的开始针对这一应用进行专用的硬件设计。谷歌的张量处理单元(Tensor Processing Unit,后文简称TPU)是完成较早,具有代表性的一类设计,基于脉动阵列设计的矩阵计算加速单元,可以很好的加速神经网络的计算。本系列文章将利用公开的TPU V1相关资料,对其进行一定的简化、推测和修改,来实际编写一个简单版本的谷歌TPU,以更确切的了解TPU的优势和局限性。

动手写一个简单版的谷歌TPU系列目录

谷歌TPU概述和简化

TPU中的脉动阵列及其实现

神经网络中的归一化和池化的硬件实现

TPU中的指令并行和数据并行

Simple TPU的设计和性能评估

SimpleTPU实例:图像分类

拓展

TPU的边界(规划中)

重新审视深度神经网络中的并行(规划中)

1. 完成SimpleTPU的设计

谷歌TPU概述和简化中给出过SimpleTPU的框图,如下图所示。

TPU中的脉动阵列及其实现中介绍了矩阵/卷积计算中的主要计算单元——乘加阵列(上图4),完成了该部分的硬件代码并进行了简单的验证;在 神经网络中的归一化和池化的硬件实现中介绍了卷积神经网络中的归一化和池化的实现方式(上图6),同时论述了浮点网络定点化的过程,并给出了Simple TPU中重量化的实现方式,完成了该部分的硬件代码并进行了验证。

TPU中的指令并行和数据并行中对整个处理单元的体系结构进行了分析和论述,包括指令并行和数据并行两个方面。那么,如何在TPU中的指令并行和数据并行中提到的设计思路下,将TPU中的脉动阵列及其实现神经网络中的归一化和池化的硬件实现中提到的计算单元充分的利用,是完成Simple TPU设计的最后一部。根据SimpleTPU的框图可知,需要实现的功能包括

  • 指令的取指和译码(上图4)
  • Weight的读取(上图2)
  • 各个执行单元的控制和调度(上图1)
  • 读取图像和写回结果(上图5)

在SimpleTPU的设计中,指令的取指和译码和Weight的读取功能都较为简单,可直接参照代码。

在对各个执行单元进行控制和调度时需要确保各个单元可以共同执行,没有相互之间的数据以来关系。

除此之外,还需要单独实现读取图像和写回结果的功能。SimpleTPU中只关注核心的计算功能,该部分功能并未进行优化,后续对实现效果进行分析时,也会将该部分运行时间排除在外。

至此,Simple TPU的设计基本完成了,代码可参见https://github.com/cea-wind/SimpleTPU

2. SimpleTPU的特性

SimpleTPU的主要特性包括

  • 支持INT8乘法,支持INT32的累加操作
  • 采用VLIW进行指令并行
  • 采用向量体系结构进行数据并行

SimpleTPU依照Google TPU V1的设计思路,可以完成神经网络推理过程中的大部分运算。依据设计,支持的运算包括(理论)

运算

说明

Conv3d

in_channels:资源受限

out_channels:资源受限

kerner_size:几乎无限制

stride:几乎无限制

padding:几乎无限制

dilation:几乎无限制

groups:极有限支持,架构限制

bias:支持

ConvTranspose3d

同上

Maxpool2d

kernel_size:几乎无限制

stride:几乎无限制

padding:几乎无限制

Avgpool2d

同上

Relu

仅支持RELU作为非线性函数

BatchNorm2d

推理中BatchNorm2d被融合到Conv或者Pool完成

Linear

资源受限

UpscalingNearest2D

多次调用pool完成

UpscalingBilinear2D

多次调用avgpool完成

其中,资源受限代表该参数的取值范围有限,主要受限于SimpleTPU的存储设计等;几乎无限制表示其取值仅受到寄存器位宽等限制。由于架构设计上的问题,SimpleTPU对groupconv支持极为有限,在不合适的参数下效率可能远低于普通卷积;类似的,Google TPU也不能很好支持groupconv,并明确告知不制止depthwise conv(极度稀疏化的group conv)。

BatchNorm2d在推理过程中实际上时进行逐点的乘法和加法,其中加法计算可以融合到下一层或者上一层的卷积计算中进行,乘法计算可以和pooling计算融合。在SimpleTPU设计,Pooling模块实际上一直在工作,即使网络中没有pooling层,SimipleTPU增加了一个1*1,stride=1的pooling层进行等价。

Upscaling操作通过pooling完成计算。这是因为在SimpleTPU中,reshape操作(支持的)是没有代价的。pooling操作可以完成双线性插值的计算,因此可以完成upscaling中的所有数值的计算。可以理解为通过pooling+reshape完成了upscaling的计算。

3. SimpleTPU的性能

Simple TPU设计了一个32×32的int8乘加阵列计算矩阵乘法和卷积,和一个1×32的int32乘法阵列进行池化和归一化的计算。根据Xilinx HLS工具的综合结果,在UltraScale+系列的FPGA器件上,工作频率可达500MHz。因此SimpleTPU的算力约为

32×32×500MHz×2 = 1Tops

作为对比,GoogleTPU V1的算力约为91Tops(int8),差异主要在SimpleTPU的规模为其1/64,同时在FPGA上的工作频率会低于ASIC的工作频率。

依据设计,SimpleTPU在适合的任务下会有很高的运行效率,TPU中的指令并行和数据并行中针对这一点又更为具体的描述。从宏观上看,SimpleTPU的各个运行单元可以流水并行的,即

而针对网络中计算量最大的全连接层和卷积层,针对性设计的乘法整列和向量计算的设计方法可以让其在每个时钟周期都完成有效的乘加计算;这意味着和CPU相比,SimpleTPU可以达到极高的效率。

Simple TPU的设计和性能评估的更多相关文章

  1. 第 9 章 MySQL数据库Schema设计的性能优化

    前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只 ...

  2. MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

    第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就 ...

  3. [转]网络性能评估工具Iperf详解(可测丢包率)

    原文链接:安全运维之:网络性能评估工具Iperf详解:http://os.51cto.com/art/201410/454889.htm 参考博文:http://linoxide.com/monito ...

  4. Linux网络性能评估工具iperf 、CHARIOT测试网络吞吐量

    网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理.网络存在安全漏洞等原因,都会导致网络带宽利用率不高.要找到网络带宽利用率不高的原因,就需要对网 ...

  5. Linux服务器性能评估与优化--转

    http://www.itlearner.com/article/4553 一.影响Linux服务器性能的因素 1. 操作系统级 Ø       CPU Ø       内存 Ø       磁盘I/ ...

  6. [转载]Linux服务器性能评估与优化

    转载自:Linux服务器性能评估与优化 一.影响Linux服务器性能的因素 1. 操作系统级 CPU 内存 磁盘I/O带宽 网络I/O带宽 2.        程序应用级 二.系统性能评估标准 影响性 ...

  7. 转贴---Linux服务器性能评估

    http://fuliang.iteye.com/blog/1024360 http://unixhelp.ed.ac.uk/CGI/man-cgi?vmstat ------------------ ...

  8. 目标检测模型的性能评估--MAP(Mean Average Precision)

    目标检测模型中性能评估的几个重要参数有精确度,精确度和召回率.本文中我们将讨论一个常用的度量指标:均值平均精度,即MAP. 在二元分类中,精确度和召回率是一个简单直观的统计量,但是在目标检测中有所不同 ...

  9. Linux服务器性能评估

    一.影响Linux服务器性能的因素 1. 操作系统级 CPU 内存 磁盘I/O带宽 网络I/O带宽 2. 程序应用级 二.系统性能评估标准 影响性能因素 影响性能因素 评判标准 好 坏 糟糕 CPU ...

随机推荐

  1. Qt之界面数据存储与获取(userData)

    http://blog.csdn.net/u011012932/article/details/52413012#comments

  2. C# — WinForm TCP连接IPv4和IPv6的判断

    大家都知道, XP系统默认使用的是IPv4格式的IP地址, 而Win7系统默认使用的是IPv6格式的IP地址. 所以有些关于TCP连接的WinForm系统,在XP下可能运行正常,但在Win7下却不能运 ...

  3. java多线程之线程安全

    线程安全和非线程安全是多线程的经典问题,非线程安全会在多个线程对同一个对象并发访问时发生. 注意1: 非线程安全的问题存在于实例变量中,如果是方法内部的私有变量,则不存在非线程安全问题. 实例变量是对 ...

  4. 【数据结构】31、hashmap=》resize 扩容,不测不知道,一测吓一跳

    来来来,今天就跟hashmap杠到底... 不要叫我杠精了,主要是还是被问到hashmap的时候,我并不能很清晰明了得告知这种数据结构到底是一个什么构造,里面细节并不了解 既然这样,我们就把他解析一波 ...

  5. php.ini Xdebug配置

    在此记录: xdebug.profiler_output_dir="H:\install\phpStudy\tmp\xdebug"xdebug.trace_output_dir=& ...

  6. Python自学day-2

    一.模块     模块分两种:标准库和第三方库,标准库是不需要安装就可以使用的库.     import [模块名]:导入一个库,优先是在项目路径中寻找.自定义模块名不要和标准库模块名相同.   sy ...

  7. 【Netty整理01-快速入门】Netty简单使用Demo(已验证)

    多处摘抄或手打,为了十积分厚着脸皮标为原创,惭愧惭愧~本篇文章用于快速入门搭建一个简单的netty 应用,如想稍微深入系统的了解,请参照本人下一篇博客,链接: 参考地址: 官方文档:http://ne ...

  8. yii中获取当前模块,控制器,方法

    在控制器里 $name = $this->getModule()->id; // module $name = $this->getId();  // controller $nam ...

  9. 算法与数据结构基础 - 堆栈(Stack)

    堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...

  10. HDU 5527:Too Rich(DFS+贪心)***

    题目链接 题意 给出p块钱,现在要用十种硬币凑出,每种硬币有c[i]个,问最多能用多少个硬币. 思路 首先确定,对于每个硬币就是能用小的替换就不用大的. 所以,可以先把硬币尽量用小的替换,如果小的不够 ...