过去几年,最知名、最具备实用价值的ASIC就是TPU了。各类解读TPU论文内容的文章网上也不少。不过,这些文章更多地是从机器学习或者AI的角度,来说解TPU。算法
上一讲,我为你讲解了FPGA和ASIC,讲解了FPGA如何实现经过“软件”来控制“硬件”,以及咱们能够进一步把FPGA设计出来的电路变成一块ASIC芯片。编程
不过呢,这些彷佛距离咱们真实的应用场景有点儿远。咱们怎么可以设计出来一块有真实应用场景的ASIC呢?若是要去设计一块ASIC,咱们应该如何思考和拆解问题呢?今天,我就带着你一块儿学习一下,如何设计一块专用芯片。缓存
黑格尔说,“世上没有平白无故的爱,也没有平白无故的恨”。第一代TPU的设计并非异想天开的创新,而是来自于真实的需求。机器学习
从2012年解决计算机视觉问题开始,深度学习一会儿进入了大爆发阶段,也一会儿带火了GPU,NVidia的股价一飞冲天。咱们在第31讲讲过,GPU天生适合进行海量、函数
并行的矩阵数值计算,因而它被大量用在深度学习的模型训练上。布局
不过你有没有想过,在深度学习热起来以后,计算量最大的是什么呢?并非进行深度学习的训练,而是深度学习的推断部分。性能
所谓 推断部分,是指咱们在完成深度学习训练以后,把训练完成的模型存储下来。这个存储下来的模型,是许许多多个向量组成的参数。而后,咱们根据这些参数,
去计算输入的数据,最终获得一个计算结果。这个推断过程,多是在互联网广告领域,去推测某一个用户是否会点击特定的广告;也多是咱们在通过高铁站的时候,扫一下身份证进行一次人脸识别,判断一下是否是你本人。学习
虽然训练一个深度学习的模型须要花的时间很多,可是实际在推断上花的时间要更多。好比,咱们上面说的高铁,去年(2018年)一年就有20亿人次坐了高铁,
这也就意味着至少进行了20亿次的人脸识别“推断“工做。优化
因此,第一代的TPU,首先优化的并非深度学习的模型训练,而是深度学习的模型推断。这个时候你可能要问了,那模型的训练和推断有什么不一样呢?主要有三个点。spa
第一点,深度学习的推断工做更简单,对灵活性的要求也就更低。
模型推断的过程,咱们只须要去计算一些矩阵的乘法、加法,调用一些Sigmoid或者RELU这样的激活函数。这样的过程可能须要反复进行不少层,可是也只是这些计算过程的简单组合。
第二点,深度学习的推断的性能,首先要保障响应时间的指标。
咱们在第4讲讲过,计算机关注的性能指标,有响应时间(Response Time)和吞吐率(Throughput)。咱们在模型训练的时候,只须要考虑吞吐率问题就好了。由于一个模型训练少则好几分钟,
多的话要几个月。而推断过程,像互联网广告的点击预测,咱们每每但愿能在几十毫秒乃至几毫秒以内就完成,而人脸识别也不但愿会超过几秒钟。很显然,模型训练和推断对于性能的要求是大相径庭的。
第三点,深度学习的推断工做,但愿在功耗上尽量少一些。
深度学习的训练,对功耗没有那么敏感,只是但愿训练速度可以尽量快,多费点电就多费点儿了。
这是由于,深度学习的推断,要7×24h地跑在数据中内心面。并且,对应的芯片,要大规模地部署在数据中心。一块芯片减小5%的功耗,就能节省大量的电费。
而深度学习的训练工做,大部分状况下只是少部分算法工程师用少许的机器进行。不少时候,只是作小规模的实验,尽快获得结果,节约人力成本。少数几台机器多花的电费,
比起算法工程师的工资来讲,只能算九牛一毛了。
这三点的差异,也就带出了第一代TPU的设计目标。那就是,在保障响应时间的状况下,可以尽量地提升能效比这个指标,也就是进行一样多数量的推断工做,花费的总体能源要显著低于CPU和GPU。
若是你来设计TPU,除了知足上面的深度学习的推断特性以外,还有什么是你要重点考虑的呢?你能够停下来思考一下,而后再继续往下看。
不知道你的答案是什么,个人第一反应是,有两件事情必需要考虑,第一个是TPU要有向前兼容性,第二个是但愿TPU可以尽早上线。我下面说说我考虑这两点的缘由
第一点,向前兼容。在计算机产业界里,由于没有考虑向前兼容,惨遭失败的产品数不胜数。典型的有我在第26讲提过的安腾处理器。因此,TPU并无设计成一个独立的“CPU“,
而是设计成一块像显卡同样,插在主板PCI-E接口上的板卡。
更进一步地,TPU甚至没有像咱们以前说的现代GPU同样,设计成本身有对应的取指令的电路,而是经过CPU,向TPU发送须要执行的指令。
这两个设计,使得咱们的TPU的硬件设计变得简单了,咱们只须要专心完成一个专用的“计算芯片”就行了。因此,TPU整个芯片的设计上线时间也就缩短到了15个月。
不过,这样一个TPU,实际上是第26讲里咱们提过的387浮点数计算芯片,是一个像FPU(浮点数处理器)的协处理器(Coprocessor),而不是像CPU和GPU这样能够独立工做的Processor Unit。
明确了TPU总体的设计思路以后,咱们能够来看一看,TPU内部有哪些芯片和数据处理流程。我在文稿里面,放了TPU的模块图和对应的芯片布局图,你能够对照着看一下
你能够看到,在芯片模块图里面,有单独的矩阵乘法单元(Matrix Multiply Unit)、累加器(Accumulators)模块、激活函数(Activation)模块和归一化/池化(Normalization/Pool)模块。
并且,这些模块是顺序串联在一块儿的。
这是由于,一个深度学习的推断过程,是由不少层的计算组成的。而每个层(Layer)的计算过程,就是先进行矩阵乘法,再进行累加,接着调用激活函数,最后进行归一化和池化。
这里的硬件设计呢,就是把整个流程变成一套固定的硬件电路。这也是一个ASIC的典型设计思路,其实就是把肯定的程序指令流程,变成固定的硬件电路。
接着,咱们再来看下面的芯片布局图,其中控制电路(Control)只占了2%。这是由于,TPU的计算过程基本上是一个固定的流程。不像咱们以前讲的CPU那样,有各类复杂的控制功能,好比冒险、分支预测等等。
你能够看到,超过一半的TPU的面积,都被用来做为Local Unified Buffer(本地统一缓冲区)(29%)和矩阵乘法单元(Matrix Mutliply Unit)了。
相比于矩阵乘法单元,累加器、实现激活函数和后续的归一/池化功能的激活管线(Activation Pipeline)也
用得很少。这是由于,在深度学习推断的过程当中,矩阵乘法的计算量是最大的,计算也更复杂,因此比简单的累加器和激活函数要占用更多的晶体管。
而统一缓冲区(Unified Buffer),则由SRAM这样高速的存储设备组成。SRAM通常被直接拿来做为CPU的寄存器或者高速缓存。咱们在后面的存储器部分会具体讲。
SRAM比起内存使用的DRAM速度要快上不少,可是由于电路密度小,因此占用的空间要大不少。统一缓冲区之因此使用SRAM,是由于在整个的推断过程当中,它会高频反复地被矩阵乘法单元读写,来完成计算。
能够看到,整个TPU里面,每个组件的设计,彻底是为了深度学习的推断过程设计出来的。这也是咱们设计开发ASIC的核心缘由:用特制的硬件,最大化特定任务的运行效率。
除了整个TPU的模块设计和芯片布局以外,TPU在各个细节上也充分考虑了本身的应用场景,咱们能够拿里面的矩阵乘法单元(Matrix Multiply Unit)来做为一个例子。
若是你仔细一点看的话,会发现这个矩阵乘法单元,没有用32 Bits来存放一个浮点数,而是只用了一个8Bits来存放浮点数。这是由于,在实践的机器学习应用中,
会对数据作归一化(Normalization)和正则化(Regularization)的处理。我们毕竟不是一个机器学习课,因此我就不深刻去讲什么是归一化和正则化了,你只须要知道,这两个操做呢,会使得咱们在深度学习里面操做的数据都不会变得太大。一般来讲呢,都能控制在-3到3这样必定的范围以内。
由于这个数值上的特征,咱们须要的浮点数的精度也不须要过高了。咱们在第16讲讲解浮点数的时候说过,32位浮点数的精度,差很少能够到1/1600万。
若是咱们用8位或者16位表示浮点数,也能把精度放到2^6或者2^12,也就是1/64或者1/4096。在深度学习里,经常够用了。特别是在模型推断的时候,要求的计算精度,每每能够比模型训练低。因此,8 Bits的矩阵乘法器,就能够放下更多的计算量,使得TPU的推断速度更快。
那么,综合了这么多优秀设计点的TPU,实际的使用效果怎么样呢?无论设计得有多好,最后仍是要拿效果和数听说话。俗话说,是骡子是马,总要拿出来溜溜啊。
Google在TPU的论文里面给出了答案。一方面,在性能上,TPU比如今的CPU、GPU在深度学习的推断任务上,要快15~30倍。而在能耗比上,更是好出30~80倍。
另外一方面,Google已经用TPU替换了自家数据中内心95%的推断任务,可谓是拿本身的实际业务作了一个明证。
这一讲,我从第一代TPU的设计目标讲起,为你解读了TPU的设计。你能够经过这篇文章,回顾咱们过去32讲提到的各类知识点。
第一代TPU,是为了作各类深度学习的推断而设计出来的,而且但愿可以尽早上线。这样,Google才能节约现有数据中内心面的大量计算资源。
从深度学习的推断角度来考虑,TPU并不须要太灵活的可编程能力,只要可以迭代完成常见的深度学习推断过程当中一层的计算过程就行了。因此,TPU的硬件构造里面,
把矩阵乘法、累加器和激活函数都作成了对应的专门的电路。
为了知足深度学习推断功能的响应时间短的需求,TPU设置了很大的使用SRAM的Unified Buffer(UB),就好像一个CPU里面的寄存器同样,可以快速响应对于这些数据的反复读取。
为了让TPU尽量快地部署在数据中内心面,TPU采用了现有的PCI-E接口,能够和GPU同样直接插在主板上,而且采用了做为一个没有取指令功能的协处理器,就像387之于386同样,仅仅用来进行须要的各类运算。
在整个电路设计的细节层面,TPU也尽量作到了优化。由于机器学习的推断功能,一般作了数值的归一化,因此对于矩阵乘法的计算精度要求有限,
整个矩阵乘法的计算模块采用了8 Bits来表示浮点数,而不是像Intel CPU里那样用上了32 Bits。
最终,综合了种种硬件设计点以后的TPU,作到了在深度学习的推断层面更高的能效比。按照Google论文里面给出的官方数据,它能够比CPU、GPU快上15~30倍,
能耗比更是能够高出30~80倍。而TPU,也最终替代了Google本身的数据中内心,95%的深度学习推断任务。