Google深度揭秘TPU:一文看懂原理,以及为何碾压GPU
李林 舒石 编译整理
量子位 报道 | 公众号 QbitAI
搜索、街景、照片、翻译,这些Google提供的服务,都使用了Google的TPU(张量处理器)来加速背后的神经网络计算。
△ 在PCB板上的Google首款TPU和部署了TPU的数据中心
去年Google推出TPU并在近期对这一芯片的性能和架构进行了详细的研究。简单的结论是:TPU与同期的CPU和GPU相比,可以提供15-30倍的性能提升,以及30-80倍的效率(性能/瓦特)提升。
这意味着,Google的服务既可以大规模运行于最先进的神经网络,而且可以把成本控制在可接受的程度上。以下的内容,将深入解读Google TPU中的技术,并且讨论如何实现更为出色的性能。
通往TPU之路
早在2006年,Google就在考虑为神经网络构建一个专用集成电路(ASIC)。2013年这个需求变得更加紧迫,当时Google意识到快速增长的计算需求,可能意味着数据中心的数量需要翻番才能满足。
通常而言,ASIC的开发需要耗时数年。但具体到TPU而言,从设计到验证、构建和部署到数据中心里,只需要15个月。
TPU ASIC采用了28nm工艺制造,主频700MHz,功耗40W。为了尽快把TPU部署到现有的服务器中,Google选择把这个芯片打包成外部扩展加速器,然后插到SATA硬盘插槽里使用。所以TPU通过PCIe Gen3 x16总线与主机相连,也就是说12.5GB/s的有效带宽。
用神经网络预测
要说明TPU的设计思路,需要先来简介一下神经网络的计算。
这是一个TensorFlow Playground的例子。用以训练一个神经网络,以标签对数据进行分类,或者对缺失数据进行估计,或者推断未来的数据。对于推断来说,神经网络中的每个神经元都进行如下计算:
输入数据(x)乘以权重(w)以表示信号强度
乘积加总,成为代表神经元状态的唯一值
应用激活函数(f),例如ReLU、Sigmoid等调节神经元
△ 神经网络把输入数据与权重矩阵相乘,并输入激活函数
例如,对于有三个输入数据和两个全连接神经元的单层神经网络而言,需要把输入和权重进行六次相乘,并得出两组乘积之和。这个乘法和加法序列,可以写成一个矩阵乘法,然后通过激活函数进一步处理矩阵的输出。
在更复杂的神经网络架构中,乘法矩阵通常也是计算量最大的部分。
实际业务中需要多少次乘法运算?2016年7月,Google团队调查了实际业务中,六个有代表性的神经网络应用,结果如下表所示:
如上表所示,每个神经网络中的权重数量从500万到1亿不等。每一个预测,都需要许多步的输入数据和权重矩阵相乘,并输入到激活函数中。
总而言之,计算量超大。作为优化的第一步,Google应用了一种称为量化的技术进行整数运算,而不是在CPU或者GPU上对所有数学工作进行32位或者16位浮点运算。这能减少所需的内存容量和计算资源。
神经网络中的量化
通常而言,神经网络的预测不需要32位或16浮点计算精度,通过一些方法,可以用8位整数对神经网络进行预测,并保持适当的准确度。
所谓量化,就是一种使用8位整数来近似预设的最小值和最大值之间任意数值的优化技术。
△ TensorFlow中的量化
量化是降低神经网络预测成本的利器,同时带来的内存减少也很重要,特别是对于移动和嵌入式部署。举个例子,在Inception中应用量化之后,这个图像识别模型能从91MB压缩到23MB,成功瘦身四分之三。
使用整数而不是浮点计算,大大减小了TPU的硬件尺寸和功耗。一个TPU钟包含65,536个8位整数乘法器。云环境中使用的主流GPU,通常包含数千个32位浮点乘法器。只要能用8位满足精度需求,就能带来25倍以上的性能提升。
RISC,CISC和TPU指令集
可编程性是TPU的另一个重要设计目标。TPU不是设计用来运行某一种神经网络,而是要能加速许多不同类型的模型。
大多数当代CPU都采用了精简指令集(RISC)。但Google选择复杂指令集(CISC)作为TPU指令集的基础,这一指令集侧重于运行更复杂的任务。
我们来看看TPU的结构图。
TPU包括以下计算资源:
矩阵乘法单元(MUX):65,536个8位乘法和加法单元,运行矩阵计算
统一缓冲(UB):作为寄存器工作的24MB容量SRAM
激活单元(AU):硬件连接的激活函数
为了控制MUX、UB和AU进行计算,Google定义了十几个专门为神经网络推理而设计的高级指令。以下是五个例子。
简而言之,TPU设计封装了神经网络计算的本质,可以针对各种神经网络模型进行编程。为了编程,Google还创建了一个编译器和软件栈,将来自TensorFlow图的API调用,转化成TPU指令。
△ 从TensorFlow到TPU:软件堆栈
矩阵乘法单元的并行计算
典型的RISC处理器提供简单计算的指令,例如乘法或加法。这些事所谓的标量(Scalar)处理器,因为它们每个指令处理单一运算,即标量运算。
即使主频千兆赫兹的CPU,仍然需要很长时间才能通过一系列标量运算来完成大型矩阵的计算。改进的方法就是矢量(Vector)运算,同时针对多个数据元素执行相同的操作。
GPU的流处理器(SM)就是一种高效的向量处理器,赞单个时钟周期内,可以处理数百到数千次运算。
至于TPU,Google为其设计了MXU作为矩阵处理器,可以在单个时钟周期内处理数十万次运算,也就是矩阵(Matrix)运算。
TPU的核心:脉动阵列
MXU有着与传统CPU、GPU截然不同的架构,称为脉动阵列(systolic array)。之所以叫“脉动”,是因为在这种结构中,数据一波一波地流过芯片,与心脏跳动供血的方式类似。
如图所示,CPU和GPU在每次运算中都需要从多个寄存器(register)中进行存取;而TPU的脉动阵列将多个运算逻辑单元(ALU)串联在一起,复用从一个寄存器中读取的结果。
MXU中的权值阵列专门为矩阵乘法运算进行了优化,并不适用于通用计算。
△ 脉动阵列中,输入向量与权值矩阵相乘
△ 脉动阵列中,输入矩阵与权值矩阵相乘
MXU的脉动阵列包含256 × 256 = 65,536个ALU,也就是说TPU每个周期可以处理65,536次8位整数的乘法和加法。
TPU以700兆赫兹的功率运行,也就是说,它每秒可以运行65,536 × 700,000,000 = 46 × 1012次乘法和加法运算,或每秒92万亿(92 × 1012)次矩阵单元中的运算。
△ TPU中的MXU
我们对CPU、GPU和TPU的每周期算术运算量进行一下对比:
每周期运算量CPU数个CPU (向量扩展)数十GPU数万TPU数十万这种基于复杂指令集计算(CISC)的矩阵运算设计,实现了出色的性能功耗比:TPU的性能功耗比,比同时期的CPU强83倍,比同时期的GPU强29倍。
极简&确定性的设计
极简 这一点,在Google之前发布的TPU论文第8页提到过。与CPU和GPU相比,单用途的TPU就是一个单线程芯片,不需要考虑缓存、分支预测、多道处理等问题。
TPU的设计之简洁,从冲模平面图上就能看出来:
△ 黄色代表运算单元;蓝色是数据单元;绿色是I/O,红色是控制逻辑单元。
与CPU和GPU相比,TPU的控制单元更小,更容易设计,面积只占了整个冲模的2%,给片上存储器和运算单元留下了更大的空间。而且,TPU的大小只有其他芯片的一半。硅片越小,成本越低,良品率也越高。
而确定性 ,是单用途带来的另一个优势。CPU和GPU需要考虑各种任务上的性能优化,因此会有越来越复杂的机制,带来的副作用就是这些处理器的行为非常难以预测。
而用TPU,我们能轻易预测运行一个神经网络、得出预测,需要多长时间,这样,我们能让芯片以吞吐量接近峰值的状态运行,同时严格控制延迟。
以上面提到的MLP0为例,在同样将延迟控制在7毫秒之内的情况下,TPU的吞吐量是CPU和GPU的15到30倍。
△ 各种处理器上每秒可运行的MLP0预测
下面,是TPU、CPU、GPU在六种神经网络上的性能对比。在CNN1上,TPU性能最为惊人,达到了CPU的71倍。
总结
如上文所述,TPU性能强劲的秘诀,是因为它专注于神经网络推断。这使得量化选择、CISC指令集、矩阵处理器和最小设计都成为可能。
神经网络正推动计算模式的转变,Google预计未来几年中,TPU将成为快速、智能和价格实惠的重要芯片。
原文发布于Google云
作者:
谷歌云 Kaz Sato, Staff Developer Advocate
谷歌大脑软件工程师Cliff Young, Software Engineer
谷歌大脑杰出工程师David Patterson
【完】
招聘
量子位正在招募编辑记者、运营、产品等岗位,工作地点在北京中关村。相关细节,请在公众号对话界面,回复:“招聘”。
One More Thing…
今天AI界还有哪些事值得关注?在量子位(QbitAI)公众号对话界面回复“今天”,看我们全网搜罗的AI行业和研究动态。笔芯~
「科普」一头雾水?TPU、IPU、NPU是什么?
在 AI 崛起的这几年来,在高通、苹果、三星、麒麟、联发科、Google 的 SoC 上,大家经常会看到“TPU、IPU、NPU”之类的名字,这些“XPU”有什么分别?是真的有那么多不同的架构?还是厂商的概念营销?
为了解答这个问题,SemiEngineering 搜集了大量业内人的看法并汇总成文,原文链接:https://semiengineering.com/what-is-an-xpu。我们对此进行精简和编译,但文章内容依然非常硬核,做好心理准备,我们现在发车!
图源aita
从 CPU 及其发展方式的角度来看,这些“XPU”中的大部分都不是真正的处理器。机器学习加速器是一类处理器,但它们用来加速的处理部分却多种多样。它们更像是 GPU,是用于执行特殊工作负载的加速器,而且它们本身就有很多类型。
处理器的本质可以归结为三件事,最后还是回到指令集架构 (ISA):首先定义要做的事,然后是 I/O 和内存(支持 ISA 和它试图完成的任务)。而未来我们将看到比过去两、三年更多的创新和变化。
许多新架构都不是单一处理器,它们是不同类型的处理器或可编程引擎的组合,它们存在于同一个 SoC 或同一个系统中,将软件任务分派到不同的硬件或可灵活变动的可编程引擎上。所有这些处理器可能共享一个公共 API,但执行域有所不同。在这个层面,确实是有各种类型的不同架构。
但现实情况是,大部分“XPU”的命名都是营销,而且这些命名和缩写,同时指代两种东西:一种是用于解释处理器的架构,例如 SIMD(单指令多数据),而另一种定义了它正在寻址的应用程序段。所以它既可以用来定义处理器架构,也可以用作如“张量处理单元(TPU)”这样的品牌名,毕竟厂商们不是在为单个处理器命名,而是在为他们的架构命名。
历史
在40 年前,命名的问题要简单很多。首先是大家最熟悉的中央处理器 (CPU) ,虽然它有很多演变版本,但它们基本上都是冯诺依曼架构,是图灵完备的处理器。每个都有不同的指令集来提升处理效率,当年还针对复杂指令集 (CISC) 与精简指令集 (RISC) 优缺点,有过非常广泛的讨论。
后来的 RISC-V 的出现给 ISA 带来了很多关注。 ISA 定义了处理器针对已定义任务的优化程度,人们可以查看 ISA 并开始计算周期。例如,如果一个 ISA 具有本机指令并以 1GHz 运行,那我们就能将它与另一个 ISA 处理器进行比较,后者要完成相同的功能可能需要两条指令,但频率是 1.5GHz,孰强孰弱就很明显了。
CPU 有多种封装方式,有时将 IO 或内存放在同一个封装中,而后两者被称为微控制器单元 (MCU)。在调制解调器大行其道的时候,数字信号处理器(DSP) 出现了,它们的不同之处在于它们使用了哈佛架构,将指令总线与数据总线分开了,其中一些还用了 SIMD 架构来提升数据处理效率。
指令和数据的分离是为了提高吞吐率(虽然它确实限制了自编程之类的边缘编程)。通常,这里的边界条件不是计算,而是 I/O 或内存。业内的重点已经从提升计算能力,转变成确保有足够的数据来让计算进行下去并保持性能。
当单个处理器的性能无法再继续提升,那就把多个处理器连在一起。通常它们还会使用共享内存,让每个处理器和整个处理器集群都保持图灵完备。程序的任何部分在哪个核心上执行都无关紧要,反正结果是一样的。
而下一个重大发展,是图形处理单元(GPU)的出现。GPU打破了常规,因为每个处理单元或管线都有自己的内存,无法在处理单元外部寻址。因为内存大小有限,只能执行那些能放入内存的任务,所以对任务本身有限制。
对于某些类型任务,GPU 是非常强大,但它们的管线非常长,导致了延迟和不确定性。这些管线让 GPU 单元不断处理数据,但如果要刷新管线,效率就会大打折扣。
GPU 和后来的通用 GPU (GPGPU) 定义了一种编程范式和软件栈,使它们比以前的加速器更容易上手。多年来,某些工作一直是专业化的,有用于运行连续程序的 CPU,有专注于图像显示,并将我们带入高度并行世界的图形处理器,后者使用很多小的处理单元来执行任务(包括现在的机器学习任务)。
那有什么架构规则可以用来解释所有的新架构吗?有的,或许片上网络 (NoC)是个合适的定义 。过去,处理器阵列通常用内存或固定网络拓扑连接(网状或环形),而 NoC 让分布式异构处理器能以更灵活的方式进行通信。而将来,它们还可以在不使用内存的情况下进行通信。
现在的 NoC 是针对数据的,而未来的 NoC 也能发命令和通知等数据,可以扩展到那些加速器间不只是交互数据的领域。加速器阵列或集群的通信需求可能与 CPU 或标准 SoC 的通信需求不同,但 NoC 并不会将设计者限制在一个子集里,他们能通过满足不同加速器的特殊通信需求来优化和提高性能。
执行架构
另一种区分处理器的方式,是看它们对特定运行环境进行的优化。例如,云端和微型物联网设备上可能可以跑相同的软件,但在不同环境中使用的架构是完全不同的,它们对性能、功耗、成本、极端条件下的运行能力等要求都是不同的。
这可能是因为对低延迟的需求,或者是因为功耗的原因,一些原来针对云计算的软件,现在被逐渐放到设备端侧运行。虽然是不同的硬件架构,但大家自然希望拥有完全相同的软件栈,以便软件能够在两种场合跑起来。云端需要提供灵活性,因为它会跑不同类型的应用程序,而且用户众多。这要求服务器硬件又要有针对应用的优化,又要能提供不同的规模。
而机器学习任务也有自己的要求,在使用神经网络和机器学习构建系统时,你需要使用软件框架和通用软件栈,让网络编程并映射到硬件,然后你可以从 PPA 的角度让软件适配不同的硬件。这推动了“让不同类型的处理和处理器适应各种硬件”的需求。
这些需求是由应用定义的。举个例子,就像一家公司设计了一个用于图形操作的处理器,他们优化和加速图形跟踪,并执行诸如图形重新排之类的操作,还有其他像矩阵乘法之类的加速机器学习的蛮力部分。
而内存访问对于每个架构来说都是一个特殊的问题,因为当你构建加速器时,最重要的目标是让它尽量长时间保持满载,你必须将尽可能多的数据传送到 ALU,让它尽可能多地吞吐数据。
它们有许多共同之处,它们都有本地内存,有片上网络来进行通信,每个执行算法的处理器都在处理一小块数据,这些操作都由运行在 CPU 上的操作系统调度。
对于硬件设计人员,棘手之处在于任务预测。尽管在某些层面上会有类似的操作类型,但人们正在研究不同层面上差异。为了处理神经网络,需要几种类型的处理能力。这意味着你需要对神经网络的一部分进行某种方式的处理,然后在另一层又可能需要另一种处理操作,而且数据移动和数据量也是逐层变化的。
你需要为处理管线构建一整套不同的加速器,而理解和分析算法并定义优化过程,是涉及到完整体系结构的任务。就像对于基因组测序,你可能需要进行某些处理,但你不能用单一类型的加速器来加速所有东西。CPU负责管理执行流水线,对其进行设置、执行 DMA、进行决策。
当中可能涉及到分区执行的问题。没有任何一种处理器可以针对每种任务进行优化——FPGA、CPU、GPU、DSP都做不到。芯片设计商可以创建一系列包含所有这些处理器的芯片,但客户应用端的难点在于,他们要自己确定系统的各个部分要在哪些处理器上运行,是在 CPU 上?在 FPGA 上?还是在 GPU 上?
但无论如何,里面总是需要有 CPU 的,CPU 要负责执行程序的不规则部分,CPU 的通用性有自己的优势。但反过来,如果是专门的数据结构或数学运算,CPU就不行了。毕竟 CPU 是通用处理器,它没有针对任何东西进行优化,没有特别擅长的项目。
抽象层的改变
以前,硬件/软件边界由 ISA 定义,并且该内存是连续可寻址的。而涉及到多处理器时,一般内存定义也是也是一致的。但是可以想象,在数据流引擎中,一致性并不那么重要,因为数据会从一个加速器直接传到另一个加速器。
Speedster 7t FPGA结构图
如果你对数据集进行分区,那一致性会成为障碍,你需要对照和更新数据,并会占用额外的运算周期。所以我们需要,也必须考虑不同的内存结构,毕竟可用的内存就那么点。或许可以访问相邻的内存,但也会很快耗尽,然后无法及时访问。所以必须在设计中加以理解,而且是要在理解架构的情况下去设计它。
我们还需要更高级别的抽象层。有些框架可以将已知网络映射或编译到目标硬件上,例如在一组低级内核或 API,它们将在软件堆栈中使用,并最终由神经网络的映射器使用。在底层,你可能在用不同类型的硬件,这由你想要实现的目标来决定。反正就是用不同的硬件,不同的 PPA ,实现了相同的功能。
而这会给编译器带来很大的压力。主要的问题是你未来要如何对加速器进行编程?你是否搞了个像初代 GPU 那样串在一起的硬连线引擎?或者你是否构建了具有自己指令集的小型可编程引擎?现在你必须单独对这些东西进行编程,并将这些引擎中的每一个都与数据流连接起来,然后执行任务。
一个处理器拥有整个指令集的某个子集,另一个处理器拥有一个不同的子集,它们都将共享控制流的某些重叠部分,编译器得了解它的库并进行映射。
结论
Google 的 TPU
其实处理器的架构并没有改变,它们仍然遵守过去 40 年来一直遵循的规则。变的是芯片的构造方式,它们现在包含大量异构处理器,这些芯片根据各自的任务,对内存和通信进行优化。每个芯片都对处理器性能、优化目标、所需的数据吞吐量以及数据流做出了不同的选择。
每个硬件供应商都希望将自己的芯片与其他芯片区分开来,品牌推广比谈论内部技术细节要容易得多。厂商给自己的芯片起了“XPU”的名字,并将它与特定类型的应用联系起来,但“XPU”并不是关于某个特定硬件架构的名字。
就像 Google 把自己开发的专用集成电路(ASIC)叫做 TPU(Tensor Processing Unit)张量处理单元/处理器,但实际上 TPU 指代的,并非特定的硬件架构。
相关问答
tpu和pc区别?
它们在化学构成、物理性质、用途和加工工艺等方面有所不同,具体如下:1.化学构成:TPU是一种热塑性聚氨酯弹性体,是由聚酯多元醇、聚醚多元醇和异香氧基二异...
mpu与tpu的区别?
mpu有两种意思,微处理器和内存保护单元。MPU是单一的一颗芯片,而芯片组则由一组芯片所构成,早期甚至多达7、8颗,但大多合并成2颗,一般称作北桥(NorthBridg...
EPU是什么?
TPU是一颗由华硕自主研发的控制芯片,通过这颗芯片玩家可以在不占用CPU性能的基础上对玩家的CPU通过硬件控制的方式进行超频。EPU节能引擎,可检测目前的PC负载...
芯片、处理器、soc、CPU、GPU、NPU有什么区别?
《许多数码类文章中都会提及芯片、处理器、SOC、CPU、NPU等概念,那么这几个概念分别是什么意思?之间又有什么关...芯片、处理器、SOC、CPU、GPU、NPU有什么区别...
tpU缩水是多少?
根据目前的技术和市场需求,tpU(张量处理单元)的缩水程度是相对较小的。tpU是谷歌开发的专用芯片,用于加速人工智能计算任务,具有高效能和低功耗的特点。虽然...
有谁知道:导电TPU是什么材料拜托了帮个忙
[回答]导电塑料按导电塑料的制作方法分类,可分为结构型导电塑料和复合型导电塑料。结构型导电塑料又称本征型导电塑料,是指本身具有导电性或经化学改性后...
华硕主板如何启动EPU?
华硕EPU是实时系统节能芯片,自动检测现在系统的负载并智能地调整电力的使用,提供整个系统的电力最佳化、减少风扇噪音,并延长软件元件的使用寿命。华硕主板的...
华为盘古ai大模型算力芯片谁做的?
盘古AI大模型算力芯片是一种基于先进的7纳米工艺制造的AI芯片,其重要部分是DaVinci架构,这是一种独特的AI加速...华为盘古AI大模型算力芯片是由华为自主研发...
什么叫AI芯片,和普通芯片有何区别?
所谓的AI芯片,一般是指针对AI算法的ASIC(专用芯片)。传统的CPU、GPU都可以拿来执行AI算法,但是速度慢,性能低,无法实际商用。比如,自动驾驶需要识别道路...所谓...
驭帅16有芯片吗?
没有,驭帅16没有芯片。驭帅16主要科技配置:高强度透气网布结合TPU纱线材质鞋面、外侧整包TPU设计、PROBARLOC稳定装置、SYNCHRO-ADJUSTSYSTEM同步协调系统(...