深度学习的异构硬件加速:TPU 特性与数据中心的 ASIC 应用(概述篇)

一、背景

2017年4月,Google在arxiv上传了一篇文章“In Datacenter Performance Analysis of a Tensor Processing Unit1”,公布了部署两年的张量处理器——TPU的构架,以及在深度学习中的应用。5月的Google IO大会上,公布的第二代TPU(简称TPU2)。深度学习的降临伴同样伴随着以TPU为代表的计算平台的进步:

  • 16年3月,AlphaGo战胜李世石,使用了1202个CPU和176个GPU;
  • 其后,Google将AlphaGo部署于TPU;
  • 17年5月,AlphaGo战胜柯洁,其算法运行在云端单卡4片的TPU2上。

TPU的发力及其在深度学习领域的算力提升使寂寂的计算机体系结构学科焕发了生机,在业界引发了对非冯诺依曼计算体系的热议。

处理器的通用性越强,计算效率越低。尤其近年来,CPU与存储器发展的不平衡,高达64核的CPU依然采用传统的存储构架,带宽问题严重,使数据中心对高性能计算的缺口增加,以GPU为代表的非冯构架的异构处理器被广泛应用。

目前的异构处理器大致可分为三类,即量子计算,类脑计算,和领域计算。量子计算是一种利用量子力学规律调控量子信息的新型计算模式,尚未登场即展现了无限潜力,从学术界到工业界无不对其青眼有加,如Google、IBM、NASA等;类脑计算将神经突触及其脉冲传导机制引入ASIC,主要针对低功耗领域,以期实现人脑860亿神经元,功耗仅有20W的超高能效,如IBM的TrueNorth2。领域计算是指这样一类处理器,他们并不像传统ASIC那样处理特定问题,而是具备了一定的通用性,来处理一类问题。例如最常见的GPU,可以覆盖大部分的图像处理问题。相比于CPU,GPU在通用性上有所牺牲,却对以图像为代表的可并行的计算模式做了针对性优化,从而提升了性能和处理效率。TPU也是这样一类领域处理器。

二、TPU vs GPU:GPU在什么时候不达标

TPU(即Tensor Processing Unit,张量处理器),是Google针对深度学习相关应用而设计定制的ASIC。其设计不是针对某一种深度学习算法,而囊括了CNN、LSTM和MLP(即全连接层),在深度学习领域具备了一定的通用性,因此可称为领域处理器。Google早在2013年即意识到深度学习的价值,并有可能使数据中心的计算量翻倍,于是开始TPU的研发,以期实现10倍以上于GPU的处理能力。2013年,TPU立项,并于2015年完成部署,同时,TPU2也同步研发,于2017年5月前完成部署,并应用于搜索、地图、语音识别,以及无人驾驶等研究项目,如图1所示。

图1 TPU和TPU2的板卡

目前,GPU的生态已经非常完善了,从芯片、板卡、Cuda环境到社区,开发群体已经形成。那么,TPU存在的意义到底何在呢?GPU到底有什么问题?

首先,从计算能力上看,无论是CPU还是GPU,从内核数量上远没有达到极限,达到极限的是IO能力,也就是带宽。以腾讯云使用的GPU M40为例,峰值性能为2.2 TFLOPS,其中包含3072个Core。若这么多Core同时读写数据,对显存带宽的占用是相当恐怖的。因此,一方面GPU采用类似CPU片内多级缓存的方案,并通过几个Core之间的共享局部复用数据,减少对DDR显存的压力。

另一方面,采用最先进的存储器,增大带宽,从而在计算时可以跑满更多的Core。因此我们看到,显卡上的存储技术始终代表了存储器的最新成果。当还在使用DDR3内存时,显存已经上了DDR5和HBM(一种片内堆叠存储)。尤其是HBM的应用,首次采用低廉的方案使GB级别的存储可以在片内实现,其带宽不再受制于外部引脚数量,从而一举使GPU的峰值处理能力从10TFlops左右提升到120TFlops(Tesla V100,Tensor深度学习性能)。带宽瓶颈带来的另一个缺点,就是延迟。当众多Core同时访问显存时,队列机制导致对每个Core的请求无法第一时间响应,从而增大了任务处理的延迟。TPU的设计瓶颈也是带宽。其论文中曾酸酸的提到,如果能将DDR3的外存提升到对标的GPU K80的DDR5,性能会提升3倍。

其次,从定制性和计算粒度上看,处理器的性能有两个指标,即峰值计算能力,和计算效率。当处理能力≤最大带宽时,才能接近峰值算力,否则就存在资源跑不满的情况。然而对于GPU,其应用对象为通用并行计算,为了兼容更多的应用,在构架设计上存在一定的平衡和冗余,导致性能功耗比上相比于TPU并不占优势。TPU是根据深度学习的应用场景的定制处理器,相比于GPU具有更窄的通用性,更容易处理性能和带宽的平衡,定制更恰当的计算规模,实现更高的计算效率和性能功耗比。

最后,从交互方式和部署模式上,GPU采用PCIE接口并具备NVLink板间总线,支持8卡互联;TPU采用PCIE接口,TPU2采用专用网络互联接口,可以实现更多的芯片级互联,如图2-3所示。把任务完全部署到芯片上,从而取代了运算过程中因互联规模受限而导致的CPU交互,并将CPU的功耗进一步分摊。

图2 TPU2的板级部署,包括:单板4芯片(图中A),2组25GB/s专用网络(图中B),2个OPA(Omni-Path Architecture)接口(图中C),电源接口(图中D)。

图3 TPU2的整体部署,其中A、D为CPU机架,B、C为TPU2机架;其中蓝线为UPS,红色虚线为供电电源,绿色虚线为机架的网络切换配置。

三、TPU的成因:为何Google选择设计自己的领域处理器

设计并部署一款领域处理器芯片,制定各种指标,其核心是平衡,而不是将每个指标做到极致。常见的芯片指标如下:

功耗:芯片本身功耗,以及部署中的额外功耗,如GPU部署中应包含折算的服务器功耗;

峰值性能和吞吐量:峰值性能是指芯片结构中每秒计算操作数的总和,吞吐量为在实际运行中每秒完成任务的数量或输出的数据量。当完成处理单一任务的设计后,可通过复制该结构并行增加同时处理的任务路数,直至达到芯片的输入输出带宽。当然,处理规模的增加也会降低芯片的良品率;

面积:受到服务器板卡尺寸的限制,影响单卡上放置芯片的数量。芯片的面积不仅取决于内部处理构架的规模,还受限于芯片加工工艺,如20nm,16nm等。工艺越精密,芯片尺寸越小,功耗越低,发热量越小,成本越高。

灵活性和可编程能力:可编程能力以适用于更多的应用,是领域处理器不可或缺的能力。增加了可编程能力和兼容性,在单一任务中的性能会有所下降,但适用更多的应用场景。

成本:芯片制造的成本分为一次性投入的设计费用,和取决于数量的加工费用。其中前者比重较大。如Google在TPU的流片中,由于采用当时难度较高的28nm,设计费近千万刀。如果能保证更大的通用性,兼容更多的应用场景,就可提升TPU的部署数量。业界有句名言,当数量提升到足够量,芯片的成本接近沙子(硅,Si)。若TPU的部署数量增加到1万片,芯片成本限制到1K刀以内,成为取代GPU的关键论据。

综上所述,Google使用TPU的关键在于两个平衡:定制性和通用性的平衡,以及性能和带宽的平衡,其中前者对立项来说更为重要。对于TPU,为了提升部署数量,Google开辟了对内和对外两条应用路线。对内,即公司内部的深度学习应用场景,如搜索、地图、语音等;对外,推行自家的TensorFlow,并打通TensorFlow——编译——TPU片上算法部署的通路,如图4所示,实现明面推行TensorFlow,暗地打包推行TPU的模型,并向研究机构开放,营造深度学习端到端的生态链。TPU的部署数量上去了,低廉的成本加上生态和影响力的收益,Google自然盆满钵满。

图4 TensorFlow到TPU,软件到硬件资源的无缝连接

本文从应用背景的角度论述了Google研制TPU 并将其应用于数据中心的原因。在后续的技术篇中,会从技术架构的角度,并结合其论文加以讨论。

参考文献

1 Norman P. Jouppi etc. In-Datacenter Performance Analysis of a Tensor Processing Unit. ISCA 2017 .

2 Caulfield A M, Chung E S, Putnam A, et al. A cloud-scale acceleration architectureC. Microarchitecture (MICRO), 2016 49th Annual IEEE/ACM International Symposium on. IEEE, 2016: 1-13.

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏海说

Java应用中常见的JDBC连接字符串(SQLite、MySQL、Oracle、Sybase、SQLServer、DB2)

Java应用中常见的JDBC连接字符串 Java应用中连接数据库是不可或缺的,于是便整理一些可能用到的JDBC的jar包及其相匹配的URL,以备日后查阅。 1)...

2940
来自专栏DT乱“码”

连接数据库操作

package com.chendongj.dbUtil; import java.sql.Connection; import java.sql.Drive...

2129
来自专栏james大数据架构

数据自定义格式化

如 <asp:Label ID="lblOne" runat="server" Text='<%# Bind("rq", "{0:yyyy年M月d日}") %>...

1979
来自专栏码匠的流水账

聊聊spring cloud的LoadBalancerAutoConfiguration

本文主要研究一下spring cloud的LoadBalancerAutoConfiguration

1282
来自专栏c#开发者

简体-繁体内码转换API

 public class ANSIConversionAPI     {         const int SIMPLIFIED_CHINESE =...

3665
来自专栏Pulsar-V

C# 数据类型之String转byte[]

string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str...

2895
来自专栏xingoo, 一个梦想做发明家的程序员

windows程序设计-第四章 system1.c

/*---------------------------------------------------- SYSMETS1.C -- System M...

26010
来自专栏C/C++基础

C#获取系统当前时间

ystem.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=Sy...

1273
来自专栏跟着阿笨一起玩NET

C# Stream 和 byte[] 之间的转换

691
来自专栏Pulsar-V

C#下各种获取时间的姿势

直接贴代码吧 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21...

3376

扫码关注云+社区