本文作者栗向滨,中科院自动化所复杂系统国家重点实验室研究生,主攻机器人与人工智能。
Google I/O是由Google举行的网络开发者年会,讨论的焦点是用Google和开放网络技术开发网络应用。这个年会自2008年开始举办,到今年已经是举办的第9届了。
在今年的年会上,Google主要发布了以下8种产品:智能助手Google Assistant,与Amazon Echo竞争的无线扬声器和语音命令设备Google Home,消息应用Allo,视频呼叫应用Duo,VR平台Daydream,独立应用程序的支持Android Wear 2.0,允许不安装而使用应用的Android Instant Apps,以及允许在Chromebook上使用Android应用Google Play on Chrome OS。
而这8中产品主要都集中在了软件领域。
(Google I/O 2016现场图via:webpronews.com)
在Google I/O 2016的主题演讲进入尾声时,Google的CEO皮采提到了一项他们这段时间在AI和机器学习上取得的成果,一款叫做Tensor Processing Unit(张量处理单元)的处理器,简称TPU。在大会上皮采只是介绍了这款TPU的一些性能指标,并在随后的博客中公布了一些使用场景,并没有对这款处理器的架构以及内部的运作机制进行详细阐述,所以我们也许需要从一些常见的处理器的结构出发,试图猜测与探究下这款用于机器学习的专属芯片到底有着怎样的一个面孔。
(Tensor processing unit实物图 via:cio-today.com)
首先我们先来看看我们最熟悉的中央处理器(Central Processing Unit),简称CPU。它是一种超大规模的集成芯片,而且是一种通用芯片,也就是说,它可以用它来做很多种类的事情。我们日常使用的电脑使用的处理器基本上都是CPU,看个电影、听个音乐、跑个代码,都没啥问题。
| 我们来看看CPU的结构
CPU主要包括运算器(ALU,Arithmetic and Logic Unit)和控制器(CU,Control Unit)两大部件。此外,还包括若干个寄存器和高速缓冲存储器及实现它们之间联系的数据、控制及状态的总线。从上面的叙述我们可以看出,CPU主要包含运算逻辑器件、寄存器部件以及控制部件等。
(CPU结构简化图 via:blog.csdn.net)
从字面上我们也很好理解,运算逻辑器件主要执行算术运算、移位等操作,以及地址运算和转换;寄存器件主要用于保存运算中产生的数据以及指令等;控制器件则是负责对指令译码,并且发出为完成每条指令所要执行的各个操作的控制信号。
我们可以运用下面这张图来说明一条指令在CPU中执行的大致过程:
(CPU执行指令图 via:blog.csdn.net)
CPU从程序计数器取到指令,通过指令总线将指令送至译码器,将转译后的指令交给时序发生器与操作控制器,然后运算器对数据进行计算,通过数据总线将数据存至数据缓存寄存器。
我们从CPU的结构以及执行过程可以看出,CPU遵循的是冯诺依曼架构,冯诺依曼的核心就是:存储程序,顺序执行。
从上面的描述我们可以看出,CPU就像一个有条不紊的管家,我们吩咐的事情总是一步一步来做。但是随着摩尔定律的推进以及人们对更大规模与更快处理速度的需求的增加,CPU好像执行起任务来就不那么令人满意了。于是人们就想,我们可不可以把好多个处理器放在同一块芯片上,让他们一起来做事,这样效率是不是就会高很多,这是GPU就诞生了。
| GPU诞生了
GPU全称为Graphics Processing Unit,中文为图形处理器,就如它的名字一样,GPU最初是用在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上运行绘图运算工作的微处理器。因为对于处理图像数据来说,图像上的每一个像素点都有被处理的需要,这是一个相当大的数据,所以对于运算加速的需求图像处理领域最为强烈,GPU也就应运而生。
(CPU与GPU结构对比示意图 via:baike.baidu.com)
通过CPU与GPU结构上的对比我们可以看出,CPU功能模块很多,能适应复杂运算环境;GPU构成则相对简单,大部分晶体管主要用于构建控制电路(比如分支预测等)和Cache,只有少部分的晶体管来完成实际的运算工作。而GPU的控制相对简单,且对Cache的需求小,所以大部分晶体管可以组成各类专用电路、多条流水线,使得GPU的计算速度有了突破性的飞跃,拥有了更强大的处理浮点运算的能力。当前最顶级的CPU只有4核或者6核,模拟出8个或者12个处理线程来进行运算,但是普通级别的GPU就包含了成百上千个处理单元,高端的甚至更多,这对于多媒体计算中大量的重复处理过程有着天生的优势。
这就好比在画一幅画的时候CPU是用一支笔一笔一笔的来画,而GPU则是多支笔对不同的位置同时进行描绘,那自然效率就是突飞猛进的。
(英特尔CPU与英伟达GPU浮点运算性能对比图 via:blog.sina.com.cn)
虽然GPU是为了图像处理而生的,但是我们通过前面的介绍可以发现,它在结构上并没有专门为图像服务的部件,只是对CPU的结构进行了优化与调整,所以现在GPU不仅可以在图像处理领域大显身手,它还被用来科学计算、密码破解、数值分析,海量数据处理(排序,Map-Reduce等),金融分析等需要大规模并行计算的领域。所以GPU也可以认为是一种较通用的芯片。
| FPGA应运而生
随着人们的计算需求越来越专业化,人们希望有芯片可以更加符合我们的专业需求,但是考虑到硬件产品一旦成型便不可再更改这个特点,人们便开始想,我们可不可以生产一种芯片,让它硬件可编程。也就是说——
这一刻我们需要一个比较适合对图像进行处理的硬件系统,下一刻我们需要一个对科学计算比较适合的硬件系统,但是我们又不希望焊两块板子,这个时候FPGA便应运而生。
FPGA是Field Programmable Gate Array的简称,中文全称为场效可编程逻辑闸阵列,它是作为专用集成电路领域中的一种半定制电路而出现的,既解决了全定制电路的不足,又克服了原有可编程逻辑器件门电路数有限的缺点。
FPGA运用硬件描述语言(Verilog或VHDL)描述逻辑电路,可以利用逻辑综合和布局、布线工具软件,快速地烧录至FPGA上进行测试。人们可以根据需要,通过可编辑的连接,把FPGA内部的逻辑块连接起来。这就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者的需要而改变,所以FPGA可以完成所需要的逻辑功能。
(FPGA结构简图 via:dps-az.cz/vyvoj)
FPGA这种硬件可编程的特点使得其一经推出就受到了很大的欢迎,许多ASIC(专用集成电路)就被FPGA所取代。这里需要说明一下ASIC是什么。ASIC是指依产品需求不同而定制化的特殊规格集成电路,由特定使用者要求和特定电子系统的需要而设计、制造。这里之所以特殊说明是因为我们下面介绍的TPU也算是一种ASIC。
FPGA与ASIC芯片各有缺点,FPGA一般来说比ASIC的速度要慢,而且无法完成更复杂的设计,并且会消耗更多的电能;而ASIC的生产成本很高,如果出货量较小,则采用ASIC在经济上不太实惠。但是如果某一种需求开始增大之后, ASIC的出货量开始增加,那么某一种专用集成电路的诞生也就是一种历史趋势了,我认为这也是Google生产Tensor processing unit的一个重要出发点。至此,TPU便登上历史舞台。
随着机器学习算法越来越多的应用在各个领域并表现出优越的性能,例如街景、邮件智能回复、声音搜索等,对于机器学习算法硬件上的支持也越来越成为一种需要。目前很多的机器学习以及图像处理算法大部分都跑在GPU与FPGA上面,但是通过上面的讲述我们可以知道,这两种芯片都还是一种通用性芯片,所以在效能与功耗上还是不能更紧密的适配机器学习算法,而且Google一直坚信伟大的软件将在伟大的硬件的帮助下更加大放异彩,所以Google便在想,我们可不可以做出一款专用机机器学习算法的专用芯片,TPU便诞生了。
(TPU板卡图 via:cloudplatform.googleblog.com)
| Google想做一款专用机机器学习算法的专用芯片——TPU
从名字上我们可以看出,TPU的灵感来源于Google开源深度学习框架TensorFlow,所以目前TPU还是只在Google内部使用的一种芯片。
Google其实已经在它内部的数据中心跑TPU跑了一年多了,性能指标杠杠的,大概将硬件性能提升了7年的发展时间,约为摩尔定律的3代。对于性能来说,限制处理器速度的最大两个因素是发热与逻辑门的延迟,其中发热是限制速度最主要的因素。现在的处理器大部分使用的是CMOS技术,每一个时钟周期都会产生能量耗散,所以速度越快,热量就越大。下面是一张CPU时钟频率与能量消耗的关系,我们可以看到,增长是指数性的。
(CPU时钟频率与功耗关系图 via:electronics.stackexchange.com)
从TPU的外观图我们可以看出,其中间突出一块很大的金属片,这便是为了可以很好地对TPU高速运算是产生大量的热进行耗散。
TPU的高性能还来源于对于低运算精度的容忍,也就是说每一步操作TPU将会需要更少的晶体管。在晶体管总容量不变的情况下,我们就可以单位时间在这些晶体管上运行更多的操作,这样我们就可以以更快的速度通过使用更加复杂与强大的机器学习算法得到更加智能的结果。我们在TPU的板子上看到了插条,所以目前Google使用TPU的方式是将载有TPU的板子插在数据中心机柜的硬盘驱动器插槽里来使用。
而且我觉得TPU的高性能还来源于它数据的本地化。对于GPU,从存储器中取指令与数据将耗费大量的时间,但是机器学习大部分时间并不需要从全局缓存中取数据,所以在结构上设计的更加本地化也加速了TPU的运行速度。
(AlphaGo对战李世乭比赛中使用的载有TPU的服务器机架,不知道为什么侧面贴的围棋图有种萌感。via:googleblog.com)
在Google数据中心的这一年来,TPU其实已经干了很多事情了,例如机器学习人工智能系统RankBrain,它是用来帮助Google处理搜索结果并为用户提供更加相关搜索结果的;还有街景Street View,用来提高地图与导航的准确性的;当然还有下围棋的计算机程序AlphaGo,其实这一点上也有个很有趣的地方,我们在描述AlphaGo的那篇Nature文章中看到,AlphaGo只是跑在CPU+GPUs上,文章中说AlphaGo的完整版本使用了40个搜索线程,跑在48块CPU和8块GPU上,AlphaGo的分布式版本则利用了更多的机器,40个搜索线程跑在1202个CPU和176块GPU上。这个配置是和樊麾比赛时使用的,所以当时李世乭看到AlphaGo与樊麾的对弈过程后对人机大战很有信心。但是就在短短的几个月时间,Google就把运行AlphaGo的硬件平台换成了TPU,然后对战的局势就艰难了起来。
那么除了TPU可以更好更快地运行机器学习算法,Google发布它还有什么其他目的。我觉得说的玄幻一些,Google也许在下一盘大棋。
Google说他们的目标是在工业界的机器学习方面起到先锋带头作用,并使得这种创新的力量惠及每一位用户,并且让用户更好地使用TensorFlow 和 Cloud Machine Learning。其实就像微软为它的HoloLens增强现实头显配备了全息处理单元(holographic processing unit,HPU),像TPU这样的专业硬件只是它远大征程的一小步,不仅仅是想让自己在公共云领域超过市场老大Amazon Web Services (AWS)。随着时间的推移,Google会放出更多的机器学习API,现在Google已经推出了云机器学习平台服务和视觉API,我们可以相信,做机器学习技术与市场的leader才是Google更大的目标。