深度学习飞速发展过程中,人们发现原有的处理器无法满足神经网络这种特定的大量计算,大量的开始针对这一应用进行专用的硬件设计。谷歌的张量处理单元(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. Google C++测试框架系列高级篇:第二章 让GTest学习打印自定义对象

    上一篇:更多关于断言的知识 原始链接:Teaching Google Test How to Print Your Values 词汇表 版本号:v_0.1 让GTest学习打印自定义对象 当一个断言 ...

  2. Md2All:好用的markdown文件转换工具,文章迁移微信公众号的利器

    目录 简介 使用体验 极速上手 更多功能 总结 简介 markdown以简单的语法和强大的功能,征服了无数技术创作者,几乎主流的技术博客网站都开始支持markdown语言撰写博客.但是微信公众号的文章 ...

  3. SYN5104型 时间综合测试仪

    SYN5104型  时间综合测试仪 gps时钟测试仪时间/频率测量仪器使用说明视频链接: http://www.syn029.com/h-pd-73-0_310_6_-1.html 请将此链接复制到浏 ...

  4. Python连载12-shutil模块

    一.shutil模块 1.函数:copy() (1)用法:复制文件0 (2)格式:copy(来源路径,目标路径) (3)返回值:返回目标路径 (4)注意:拷贝的同时可以给文件重命名 source_pa ...

  5. kubernetes实战篇之dashboard搭建

    系列目录 kubernetes dashboard是kubernetes官方提供的web管理界面,通过dashboard可以很方便地查看集群的各种资源.以及修改资源编排文件,对集群进行扩容操作,查看日 ...

  6. Kali Linux Web渗透测试手册(第二版) - 1.1 - Firefox浏览器下安装一些常用的插件

    一.配置KALI Linux和渗透测试环境 在这一章,我们将覆盖以下内容: l  在Windows和Linux上安装VirtualBox l  创建一个Kali Linux虚拟机 l  更新和升级Ka ...

  7. Codeforces Round #564 (Div. 2)B

    B. Nauuo and Chess 题目链接:http://codeforces.com/contest/1173/problem/B 题目 Nauuo is a girl who loves pl ...

  8. Appium+python自动化(十三)- 输入中文 - 一次填坑记(超详解)

    简介 无论你在哪里,在做什么都会遇到很多坑,这些坑有些事别人挖的,有些是自己挖的.别人挖的叫坑人,自己挖的叫自杀,儿子挖的叫坑爹.因此在做app自动化道路上也不会是一帆风顺的,你会踩很多坑,这些坑和你 ...

  9. 如何成长为一名合格的web架构师?

    写代码要经历下面几个阶段.  一 .你必须学习面向对象的基础知识,如果连这个都忘了,那你的编程之路注定是在做原始初级的重复! 很多程序员都知道类.方法.抽象类.接口等概念,但是为什么要面向对象,好处在 ...

  10. 13 | 效率为王:脚本与数据的解耦 + Page Object模型