随着 AI 对算力的需求不断增长,以 TPU 为代表的面向 DNN 的特定领域架构为 DNN 计算提供了几十倍的性能提升以及能效优化。本文基于谷歌真实业务场景数据,介绍了 TPU 相对 CPU/GPU 的实际性能、能效指标。原文: A Domain-Specific Architecture for Deep Neural Networks
摩尔定律的终结使人们意识到特定领域架构才是计算的未来。谷歌的张量处理单元(TPU)就是一个开创性的例子,自从 2015 年首次部署以来,已经为超过 10 亿人提供了服务。TPU 运行深度神经网络(DNN)的速度比同时代 CPU 和 GPU 要快 15 到 30 倍,能效比同类技术的 CPU 和 GPU 高 30 到 80 倍。
所有指数定律都有终结的时候[26]。
1965 年,Gordon Moore 预测芯片的晶体管数量将每一两年翻一番。尽管 Communications 杂志 2017 年 1 月的封面报道认为:"关于摩尔定律死亡的报道被大大夸大了",但摩尔定律确实正在终结。2014 年推出的 DRAM 芯片包含 80 亿个晶体管,而 160 亿个晶体管的 DRAM 芯片要到 2019 年才量产,但摩尔定律预测 DRAM 芯片的规模应该会扩大 4 倍。2010 年的英特尔至强 E5 微处理器有 23 亿个晶体管,而 2016 年的至强 E5 有 72 亿个晶体管,与摩尔定律相差 2.5 倍。半导体技术仍然在继续演进,但比过去慢很多。
另一个没那么出名但同样重要的观察是 Dennard Scaling。Robert Dennard 在 1974 年发现,当晶体管变小时,功率密度是不变的。如果晶体管的线性尺寸缩小 2 倍,那就可以提供 4 倍的晶体管数量。如果电流和电压也都缩小 2 倍,那么功率就会下降 4 倍,从而在相同频率下得到相同的功率。Dennard Scaling 在首次被观察到 30 年后就结束了,不是因为晶体管没有继续缩小,而是因为电流和电压无法在保证可靠的情况下不断下降。
计算机架构师们利用摩尔定律和 Dennard Scaling 通过增加资源、采用复杂的处理器设计和内存层次结构,提高指令的并行性,从而在程序员不知情的情况下提升了性能。不幸的是,架构师们最终耗尽了可以有效利用的指令级并行性。2004 年,Dennard Scaling 的结束和缺乏更多(有效的)指令级并行性,迫使业界从单核处理器芯片转向多核处理器。
重要见解
Gene Amdahl 在 1967 年提出的一个观点现在来看仍然正确,这一观点说明增加处理器数量带来的收益会逐渐递减。Amdahl 定律说,并行化的理论速度提升受到任务顺序部分的限制,如果任务的 1/8 是串行的,即使其余部分很容易并行,而且架构师增加能够增加 100 个处理器,其速度提升最多是原来性能的 8 倍。
图 1 显示了过去 40 年里这三个定律对处理器性能的影响。按照目前的速度,标准处理器基准性能在 2038 年前不会翻倍。
图 1. 按照 Hennessy 和 Patterson[17]的说法,我们绘制了过去 40 年 32 位和 64 位处理器内核每年最高 SPECCPUint 性能;面向吞吐量的 SPECCPUint_rate 也反映了类似的情况,并在几年后逐渐平稳。
由于晶体管技术没有多大进步(反映了摩尔定律的终结),每平方毫米芯片面积的峰值功率在增加(由于 Dennard Scaling 的终结),但每芯片功率预算没有增加(由于电迁移和机械及热限制),而且芯片设计师已经转向多核(受 Amdahl 定律的限制),架构师们普遍认为在性能-成本-能耗方面进行重大改进的唯一途径是特定领域架构[17]。
云上大型数据集和为其提供动力的众多计算机之间的协作使机器学习取得了显著进步,特别是在 DNN 方面。与其他领域不同,DNN 具有广泛的适用性。DNN 的突破包括将语音识别的单词错误率相对传统方法降低了 30%,这是 20 年来最大的进步[11]; 将 2011 年以来进行的图像识别比赛的错误率从 26%降低到 3.5%[16][22][34]; 在围棋中击败人类冠军[32]; 提高搜索排名; 等等。虽然 DNN 架构只能适用于某个较小的领域,但仍然有许多应用。
神经网络以类似大脑的功能为目标,基于简单的人工神经元: 基于非线性函数(例如max(0,value))及其输入的加权和(weighted sum of the inputs)。这些人工神经元按层组织,一个层的输出成为下一层的输入,DNN 的"深度"部分就来自于多层的处理。因为云上大型数据集允许通过使用额外的更大的层来捕捉更高层次的模式或概念来建立更精确的模型,而 GPU 能够提供足够的算力来开发这些模型。
DNN 的两个阶段被称为训练(或学习)和推理(或预测),类似于开发和生产。训练 DNN 一般需要几天时间,但训练好的 DNN 可以在几毫秒内完成推理或预测。开发者选择层数和 DNN 类型(见"深度神经网络的类型"),训练决定权重。几乎所有训练都是以浮点方式进行的,这也是 GPU 在训练中如此受欢迎的原因之一。
深度神经网络的类型 目前有三种 DNN 在谷歌数据中心很受欢迎:
一个被称为"量化(quantization)"的步骤将浮点数转化为足以用于推理的窄整数(通常只有 8 位)。与 IEEE 754 的 16 位浮点乘法相比,8 位整数乘法所需能耗和芯片面积可减少 6 倍,而整数加法的优势是能耗减少 13 倍,面积减少 38 倍[10]。
表 1 针对三种类型的 DNN 分别例举了两个例子,代表了 2016 年谷歌数据中心 95%的 DNN 推理工作量,我们将其作为基准。这些 DNN 通常是用 TensorFlow 编写的[1],代码很短,只有 100 到 1500 行。这些例子代表了在主机服务器上运行的较大应用程序的小组件,这些应用程序可能是数千到数百万行的 C++代码,通常是面向最终用户的,从而需要严格的响应时间限制。
表 1. 截至 2016 年 7 月,6 个 DNN 应用(每种 DNN 类型 2 个应用)代表了 TPU 95%的工作量。列是 DNN 名称; 代码行数; DNN 类型和层数; FC 是全连接; Conv 是卷积; Vector 是二进制运算; Pool 是 pooling,在 TPU 上做非线性裁剪; 非线性函数; 权重数; 运算强度; 批量大小; 以及截至 2016 年 7 月的 TPU 应用普及度。多层感知器(MLP)是 RankBrain[9]; 长短时记忆(LSTM)是 GNM Translate 的一个子集[37]; 卷积神经网络(CNN)是 Inception 和 DeepMind AlphaGo[19][32]。ReLU 代表 Rectified Linear Unit,是函数 max(0,value)。
如表 1 所示,每个模型需要 500 万到 1 亿权重,需要消耗大量时间和资源来访问(参见"能耗比例")。为了分摊访问成本,推理或训练期间,通过在独立示例之间重用相同的权重从而提高性能。
能耗比例(Energy Proportionality) 热设计功率(TDP, Thermal design power)影响到电源供应成本,数据中心必须在硬件满功率运行时才能提供足够的电力和制冷。然而由于一天中的工作负荷并不相同,电力成本是基于平均消耗的。Barroso 和 Hölzle[4]发现服务器只有在不到 10%的时间里是 100%繁忙的,因此提出了能耗比例,认为服务器耗电量应与工作量成正比。图 4 中对能耗的估计基于谷歌数据中心 TDP 的一部分。
由于工作负载利用率不同,我们测量了运行生产程序 CNN0 的三台服务器的性能和功率,然后基于服务器芯片数量将其归一化。 上图显示,TPU 功率最低,每芯片 40W,但能耗比例很差(谷歌 TPU 设计时间较短,无法纳入许多节能功能)。Haswell CPU 在 2016 年有最好的能耗比例。在 TPU-Haswell 组合系统中,CPU 的工作量减少了,因此 CPU 功率也减少了。因此,Haswell 服务器加上四个低功耗 TPU 使用不到 20%的额外功率,但因为有四个 TPU 和两个 CPU,运行 CNN0 比单独的 Haswell 服务器快 80 倍。
早在 2006 年开始,谷歌就考虑在其数据中心部署 GPU、现场可编程门阵列(FPGA, , field programmable gate array)或特定应用集成电路(ASIC, application-specific integrated circuit)。结论是,少数可以在特殊硬件上运行的应用可以利用谷歌大型数据中心的过剩容量免费实现,而且很难在此基础上有所改进。这种情况在 2013 年发生了变化,当时有一个预测,即谷歌用户每天使用 3 分钟基于语音识别 DNN 的语音搜索,使谷歌数据中心的计算需求增加了一倍,因此使用传统 CPU 将会非常昂贵。于是谷歌启动了一个高优先级项目,快速生产用于推理的定制芯片,并购买现成的 GPU 用于训练,其目标是将性价比提高 10 倍。由于这一任务,只花了 15 个月的时间就完成了 TPU 的设计、验证、制造和部署。
为了降低延迟部署的风险,谷歌工程师将 TPU 设计成 I/O 总线上的协处理器,而没有与 CPU 紧密集成,使其能够像 GPU 一样插入现有服务器中。此外,为了简化硬件设计和调试,主机服务器向 TPU 发送指令供其执行,而不是自己获取。因此,TPU 在概念上更接近浮点单元(FPU, floating-point unit)协处理器,而不是 GPU。
谷歌工程师从系统角度优化了设计。为了减少与主机 CPU 的互动,TPU 运行整个推理模型,但不止支持 2013 年的 DNN,还提供了匹配 2015 年及以后的 DNN 的灵活性。
图 2 是 TPU 的框图。TPU 指令通过 PCIe Gen3 x16 总线从主机发送至指令缓冲区,内部块通常由 256 字节宽的路径连接在一起。从右上角开始,矩阵乘法单元是 TPU 的核心,有 256×256 个 MAC,可以对有符号或无符号整数进行 8 位乘法和加法。16 位的乘积被收集在矩阵单元下面的 4M 字节 32 位累加器中,4M 代表 4,096 个 256 元素的 32 位累加器。矩阵单元每周期产生一个 256 元素的部分和。
图 2. TPU 框图和平面布置图。主要计算部分是黄色的矩阵乘法单元,它的输入是蓝色的带权重 FIFO 和蓝色的统一缓冲器,输出是蓝色的累加器。黄色的激活单元执行非线性功能。右边的 TPU 芯片平面图显示蓝色存储器占 35%,黄色计算单元占 35%,绿色 I/O 占 10%,红色控制只占芯片的 2%。在 CPU 或 GPU 中,控制部分要大得多(而且更难设计)。
矩阵单元权重通过片上"权重 FIFO"分阶段进行,该 FIFO 从我们称之为"权重存储器"的片外 8GB 字节 DRAM 读取。对于推理,权重是只读的,8GB 字节支持许多同时活跃的模型。权重 FIFO 的深度为 4 层,中间结果被保存在 24M 字节的片上"统一缓冲区"中,可以作为矩阵单元的输入。可编程 DMA 控制器将数据传入或传出 CPU 主机存储器和统一缓冲区。为了能够在大规模可靠部署,内外部存储器内置了硬件错误检测和纠正功能。
TPU 微架构背后的理念是让矩阵单元保持忙碌。为了达到这个目的,读取权重的指令遵循解耦访问/执行的理念[33],因此可以在发送地址后以及从权重存储器获取权重前完成。如果没有活跃输入或权重数据没有准备好,矩阵单元将暂停执行。
由于读取大型静态随机存取存储器(SRAM, static random-access memory)比计算的能耗更大,矩阵单元通过"收缩执行(systolic execution)",即通过减少统一缓冲区的读写来节省能耗[23],因此依赖不同来源的数据以固定时间间隔到达阵列单元,并将其合并。体现为给定 65,536 个元素的向量矩阵乘法操作以对角线波阵的形式在矩阵中移动。权重被预先加载,并随着新区块的第一个数据的推进波生效。控制和数据是流水线式的,这给程序员一种错觉,即 256 个输入被一次性读取,并立即更新 256 个累加器中的一个位置。从正确性的角度来看,软件不知道矩阵单元的收缩性,但为了性能,必须考虑单元的延迟。
TPU 软件堆栈必须与那些为 CPU 和 GPU 开发的软件兼容,以便应用程序可以快速移植到 TPU 上。在 TPU 上运行的那部分应用程序通常是用 TensorFlow 编写的,并被编译成可以在 GPU 或 TPU 上运行的 API[24]。
大多数架构研究论文都基于模拟运行小型、容易移植的基准测试,预测可能的性能。本文不是这样,而是对 2015 年以来在数据中心运行的真实大型生产工作负载的机器进行回顾性评估,其中一些机器由超过 10 亿人常规使用。如表 1 所示,这 6 个应用代表了 2016 年 TPU 数据中心 95%的使用量。
由于我们要测量的是生产工作负载,所以比较的基准平台也必须可以部署在谷歌数据中心,和生产工作负载运行环境一致。谷歌数据中心的大量服务器和大规模应用的可靠性要求意味着机器必须至少能对内存错误做出检查。由于 Nvidia Maxwell GPU 和最近的 Pascal P40 GPU 不检查内部内存错误,因此没法满足谷歌大规模部署的严格可靠性要求。
表 2 显示了部署在谷歌数据中心的服务器,用于与 TPU 进行比较。传统 CPU 服务器的代表是英特尔的 18 核双插槽 Haswell 处理器,这个平台也是 GPU 或 TPU 的主机服务器,谷歌工程师在服务器中使用四个 TPU 芯片。
表 2. 基准服务器采用 Haswell CPU、K80 GPU 和 TPU。Haswell 有 18 个核心,K80 有 13 个处理器,GPU 和 TPU 使用 Haswell 服务器作为主机。芯片工艺单位是 nm。TDP 代表热设计功率; TOPS/s 是 10^12 次操作/秒; 内存带宽是 GB/s。TPU 芯片的大小不到 Haswell 芯片的一半。
表 3. 2015 年至 2017 年,Nvidia GPU 发布与云计算部署之间的差距[5][6]。GPU 的世代是 Kepler、Maxwell、Pascal 和 Volta。
一些计算机架构师对于从公布产品直到芯片、板卡和软件都准备好并能可靠服务于数据中心客户所需要的时间没有概念。表 3 指出,从 2014 年到 2017 年,商业云公司部署 GPU 的时间差是 5 到 25 个月。因此,与 2015 年的 TPU 相比,对应的 GPU 显然是 Nvidia K80,它采用相同的半导体工艺,并在 TPU 部署前六个月发布。
每块 K80 卡包含两个芯片,并在内部存储器和 DRAM 上内置了错误检测和纠正功能。每台服务器最多可以安装 8 个 K80 芯片,这就是我们的基准配置。CPU 和 GPU 都使用大型芯片封装,大约为 600mm2,是 Core i7 的三倍。
为了说明上述 6 个应用在 3 类处理器上的性能,我们采用了高性能计算(HPC, high-performance computing)中的 Roofline 性能模型[36]。虽然不是完美的视觉模型,但可以洞察到性能瓶颈的原因。该模型背后的假设是,应用不适合在片上缓存,所以要么计算受限,要么内存带宽受限。对于 HPC 来说,Y 轴是每秒浮点运算的性能,因此峰值计算率构成了屋顶的平坦部分。X 轴是计算强度(operational intensity),以每个浮点操作访问的 DRAM 字节来衡量。由于(FLOPS/s)/(FLOPS/Byte)=Bytes/s,因此内存带宽的单位是字节/秒,从而构成屋顶的斜面部分。如果没有足够的计算强度,程序就会受到内存带宽的限制,停留在屋顶的斜面部分。
应用实际的每秒操作数与其上限之间的差距显示了在不触及计算强度的情况下进一步调整性能的潜在好处,增加计算强度的优化(如缓存模块化)可能会实现更好的性能。
为了将 Roofline 模型应用于 TPU,当 DNN 应用被量化时,首先用整数运算取代浮点运算。由于权重通常不适用于 DNN 应用的片上存储器,第二个变化是重新定义计算强度为每字节读取权重的整数乘积操作,如表 1 所示。
图 3 显示了 TPU、CPU 和 GPU 在对数尺度上的单芯片 Roofline 模型。TPU 的屋顶有很长的倾斜部分,计算强度意味着性能受限于内存带宽,而不是峰值计算量。6 个应用中有 5 个无法触及上线,MLP 和 LSTM 受内存限制,而 CNN 受计算限制。
图 3. TPU、CPU 和 GPU 的 Roofline 合并成一个对数图。星形代表 TPU,三角形代表 K80,圆形代表 Haswell。所有 TPU 的星星都处于或高于其他两个 Roofline。
与图 3 的 TPU 相比,6 个 DNN 应用普遍低于其在 Haswell 和 K80 的上限,原因是由于响应时间。这些 DNN 应用中有许多是面向终端用户服务的,研究人员已经证明,即使是响应时间的小幅增加也会导致客户减少使用服务。虽然训练可能没有严格的响应时间限制,但推理通常会有,或者说推理更倾向于延迟而不是吞吐量[28]。
例如,按照应用开发者的要求,MLP0 的 P99 响应时间限制为 7ms。(每秒的推理和 7ms 的延迟包含服务器主机和加速器的执行时间)。如果放宽响应时间限制,Haswell 和 K80 的运行速度分别只有 MLP0 可实现的最高吞吐量的 42%和 37%。这些限制也影响到了 TPU,但在 80%的情况下,其运行速度更接近 TPU 的最大 MLP0 吞吐量。与 CPU 和 GPU 相比,单线程 TPU 没有任何复杂的微架构特性,这些特性消耗晶体管和能量来改善平均情况,但不是 99%的情况。也就是说,没有缓存、分支预测、失序执行、多处理、投机预取、地址凝聚、多线程、上下文切换等等。极简主义是特定领域处理器的一大美德。
表 4 显示了每个芯片的相对推理性能的底线,包括两个加速器与 CPU 的主机服务器开销,显示了 6 个 DNN 应用的相对性能加权平均值,表明 K80 芯片的速度是 Haswell 芯片的 1.9 倍,而 TPU 芯片的速度是其 29.2 倍,因此 TPU 芯片的速度是 GPU 芯片的 15.3 倍。
表 4. K80 GPU 芯片和 TPU 芯片相对于 CPU 的 DNN 工作负载性能。加权平均值基于表 1 中 6 个应用的实际组合。
当购买大量计算机时,性能开销胜过性能。数据中心的最佳成本指标是总拥有成本(TCO, total cost of ownership)。如谷歌这样的组织为成千上万的芯片支付的实际价格取决于相关公司之间的谈判,由于商业机密的原因,我们无法公布这类价格信息或可能用于推导这类信息的数据。然而,功率与总拥有成本相关,而且我们可以公布每台服务器的功率,所以我们在这里使用每瓦性能(performance/Watt)作为性能/TCO 的代表。我们在本节中比较了整个服务器,而不是单个芯片。
图 4 显示了 K80 GPU 和 TPU 相对于 Haswell CPU 的平均每瓦性能。我们提出了两种不同的每瓦性能计算方法。第一种"总量",在计算 GPU 和 TPU 的每瓦性能时包含主机 CPU 服务器消耗的功率。第二种"增量",从 GPU 和 TPU 中减去主机 CPU 服务器的功率。
图 4. GPU(蓝色)、TPU(红色)与 CPU 的相对每瓦性能,以及 TPU 与 GPU(橙色)的相对每瓦性能(TDP)。TPU′是使用 K80 的 GDDR5 内存的改进型 TPU。绿色条显示了改进后的 TPU 与 CPU 的每瓦性能比率,淡紫色条显示了与 GPU 的比率。总量包含主机服务器功率,增量不包含主机功率。
就每瓦总性能而言,K80 服务器是 Haswell 的 2.1 倍。就每瓦增量性能而言,如果忽略 Haswell 服务器的功率,K80 服务器是 Haswell 的 2.9 倍。TPU 服务器的每瓦总性能比 Haswell 高 34 倍,使得 TPU 服务器的每瓦性能是 K80 服务器的 16 倍。TPU 的相对每瓦增量性能(谷歌定制 ASIC 的理由)是 83 倍,从而使 TPU 的每瓦性能达到 GPU 的 29 倍。
与 FPU 一样,TPU 协处理器也比较容易评估,所以我们为 6 个应用建立了性能模型,模型结果与硬件性能计数器之间的差异平均不到 10%。
如果我们有超过 15 个月的时间,就可以用同样的工艺技术来设计一款新芯片 TPU',我们用性能模型来评估这款理论上的芯片。更积极的逻辑合成和模块设计仍然可以将时钟频率提高 50%。就像 K80 那样为 GDDR5 内存设计一个接口电路,可以将加权内存带宽提高 5 倍以上,将其 roofline 最高点从 1350 降到 250。
将时钟速度提高到 1050MHz,但不改善内存,这样影响不会太大。而如果我们将时钟速度保持在 700MHz,但使用 GDDR5(双数据率 5 型同步图形随机存取存储器)作为加权存储器,加权平均值就会跳到 3.9。做到这两点并不改变平均值,所以理论上的 TPU'只是拥有更快的内存。
仅仅用 K80 一样的 GDDR5 内存替换 DDR3 加权内存,需要将内存通道的数量增加一倍,达到四个,这一改进将使芯片尺寸扩大约 10%。因为每台服务器有四个 TPU,GDDR5 还将使 TPU 系统的功率预算从 861W 增加到大约 900W。
图 4 报告了 TPU 的每芯片的每瓦相对总性能,比 Haswell 跃升 86 倍,比 K80 跃升 41 倍。增量指标相对 Haswell 达到惊人的 196 倍,相对 K80 高达 68 倍。
本节遵循 Hennessy 和 Patterson 的谬误-易犯错误-反驳(fallacy-and-pitfall-with-rebuttal)模式[17]:
谬误(Fallacy)。数据中心的 DNN 推理应用重视吞吐量和响应时间。 我们感到惊讶的是,由于有人在 2014 年提出,批量大小足以使得 TPU 达到峰值性能(或者对延迟要求不那么严格),因此谷歌 TPU 开发人员对响应时间有着强烈的要求。其中一个驱动应用是离线图像处理,谷歌开发人员的直觉是,如果交互业务也想要 TPU,大多数人只会积累更大的批处理。即使到 2014 年某个关心响应时间的应用(LSTM1)的谷歌开发人员也说,限制是 10ms,但在实际移植到 TPU 时缩减到了 7ms。许多这样的服务对 TPU 的意外需求,加上对快速响应时间的影响和偏好,改变了平衡,应用开发者往往选择减少延迟,而不是等待积累更大的批次。幸运的是,TPU 有一个简单、可重复的执行模型,以帮助满足交互业务的响应时间目标,以及高峰值吞吐量,即使是相对较小的批次规模,也能带来比当代 CPU 和 GPU 更高的性能。
谬误(Fallacy)。K80 GPU 架构非常适合 DNN 推理。 我们看到 5 个具体原因,即 TPU 在性能、能耗和成本方面都比 K80 GPU 更有优势。首先,TPU 只有一个处理器,而 K80 有 13 个,用单线程更容易达到严格的延迟目标。其次,TPU 有非常大的二维乘法单元,而 GPU 有 13 个较小的一维乘法单元。DNN 的矩阵乘法强度适合排列在二维阵列中的算术逻辑单元。第三,二维数组还能实现系统化,通过避免寄存器访问来提高能源效率。第四,TPU 的量化应用使用 K80 上不支持的 8 位整数,而不是 GPU 的 32 位浮点数。较小的数据不仅提高了计算的能源效率,而且使加权 FIFO 的有效容量和加权存储器的有效带宽翻了两番。(这些应用经过训练,尽管只使用 8 位,却能提供与浮点数相同的精度)。第五,TPU 省略了 GPU 需要但 DNN 不使用的功能,因此缩小了芯片面积,节省了能源,并为其他升级留出了空间。TPU 芯片的尺寸几乎是 K80 的一半,通常以三分之一的功率运行,但包含 3.5 倍内存。这五个因素解释了 TPU 在能源和性能方面 30 倍的优势。
易犯错误(Pitfall)。在设计特定领域架构时,忽视架构历史。 那些在通用计算中没有成功的想法可能是特定领域架构的理想选择。对于 TPU 来说,有三个重要的架构特征可以追溯到 20 世纪 80 年代初: 收缩阵列(systolic arrays)[23]、解耦访问/执行[33]和复杂指令集[29]。第一个特征减少了大型矩阵乘法单元的面积和功率; 第二个特征在矩阵乘法单元的操作中同时获取权重; 第三个特征更好利用了 PCIe 总线的有限带宽来传递指令。因此,具有历史意识、特定领域的架构师可以拥有竞争优势。
谬误(Fallacy)。如果谷歌更有效的使用 CPU,那么 CPU 的结果将与 TPU 相当。 我们最初在 CPU 上只有一个 DNN 的 8 位结果,这是因为需要做大量工作来有效使用高级向量扩展(AVX2)的整数支持,这样做大约能获得 3.5 倍好处。以浮点方式呈现所有的 CPU 结果,而不是让一个例外情况有自己的顶线,这样比较不容易混淆(而且需要更少的空间)。如果所有 DNN 都有类似的加速,每瓦性能将从 41-83 倍下降到 12-24 倍。
谬误(Fallacy)。如果谷歌能使用适当的较新版本,GPU 的结果将与 TPU 相匹配。 表 3 显示了 GPU 的发布和可以在云端被客户使用之间的时间差异。较新的 TPU 可以与较新 GPU 公平比较,而且,只要增加 10W,我们就可以通过使用 K80 的 GDDR5 内存将 28 纳米、0.7GHz、40W 的 TPU 的性能提高两倍。将 TPU 转移到 16 纳米工艺将进一步提高其每瓦性能。16 纳米的 Nvidia Pascal P40 GPU 的峰值性能是原来 TPU 的一半,但 250W 的功率却比原来多出许多倍[15]。如前所述,缺乏错误检查意味着谷歌无法在其数据中心部署 P40,因此无法在其上运行生产工作负载以确定其实际相对性能。
两篇调查文章证实定制 DNN ASIC 至少可以追溯到 20 世纪 90 年代初[3][18]。正如 2016 年 Communications 杂志所介绍的,支持四种 DNN 体系架构的 DianNao 家族通过对 DNN 应用中的内存访问模式提供高效的体系架构支持,最大限度的减少了片上和外部 DRAM 的内存访问[7][21]。原生 DianNao 使用 64 个 16 位整数乘法累加单元。
谷歌去年 5 月推出的 TPU 3.0,比 2.0 强大 8 倍,性能高达 100 petaflops。
DNN 的特定领域架构仍然是计算机架构师的热门话题,其中一个主要焦点在于稀疏矩阵架构,出现于 2015 年首次部署 TPU 之后。高效推理引擎基于第一道程序,通过独立步骤过滤掉非常小的值,将权重数量减少大约 10[13]倍,然后使用 Huffman 编码进一步缩小数据,以提高推理性能[14]。Cnvlutin[1]通过避免激活输入为零时的乘法(大概有 44%的乘法是这种类型,其原因可能部分由于调整线性单元、ReLU、非线性函数,将负值转化为零),平均提高 1.4 倍性能。Eyeriss 是新型低功耗数据流架构,通过运行长度编码数据利用零值,以减少内存占用,并通过避免输入为零时的计算来节省能源[8]。Minerva 是一个跨越算法、架构和电路学科的代码设计系统,通过部分修剪具有小值的激活数据和部分量化数据实现 8 倍功率的降低。2017 提出的 SCNN[27]是一个用于稀疏和压缩卷积神经网络(CNN)的加速器。权重和激活函数都被压缩在 DRAM 和内部缓冲区中,从而减少数据传输所需的时间和能耗,并允许芯片存储更大的模型。
2016 年以来的另一个趋势是用于训练的特定领域架构。例如,ScaleDeep[35]是针对 DNN 训练和推理而设计的高性能服务器,包含成千上万的处理器。每个芯片包含重度计算模块和重度存储模块,比例为 3:1,性能比 GPU 高出 6 倍到 28 倍,以 16 位或 32 位浮点运算进行计算。芯片通过高性能互连拓扑结构连接,与 DNN 的通信模式类似。像 SCNN 一样,这种拓扑结构完全是在 CNN 上评估的。2016 年,CNN 在谷歌数据中心的 TPU 工作负荷中仅占 5%。计算机架构师们期待着在其他类型的 DNN 上评估 ScaleDeep,并期待出现硬件实现。
DNN 似乎是 FPGA 作为数据中心计算平台的一个很好的用例,一个实际倍部署的例子是 Catapult[30]。虽然 Catapult 在 2014 年公开发布,但它和最新的 TPU 产品是同一代的,2015 年微软在数据中心部署了 28nm Stratix V FPGA。Catapult 运行 CNN 的速度比服务器快 2.3 倍。也许 Catapult 和 TPU 之间最重要的区别是,为了达到最佳性能,用户必须用低级硬设计语言 Verilog 编写长程序,而不是用高级的 TensorFlow 框架编写短程序。也就是说,TPU 软件相对 FPGA 固件提供了更好的"可编程性"。
尽管 I/O 总线和相对有限的内存带宽限制了 TPU 的利用率(6 个 DNN 应用中有 4 个是内存受限的),但正如 Roofline 性能模型所证明的那样,某些计算的能力提升相对还是比较大的,比如每周期可以完成 65,536 次乘法。这一结果表明 Amdahl 定律的一个推论: 大量廉价资源的低利用率仍然可以提供高性价比的性能。
我们知道推理应用往往是面向终端用户的应用的一部分,因此对响应时间有很高的要求,所以 DNN 架构需要在 99%的情况下表现出良好的延迟特性。
TPU 芯片利用其在 MAC 和片上存储器方面的优势,运行面向特定领域的 TensorFlow 框架编写的短程序的速度比 K80 GPU 芯片快 15 倍,从而使每瓦性能优势提升 29 倍,从而优化了性能/总拥有成本。与 Haswell CPU 芯片相比,相应提升了 29 和 83 倍。
五个架构因素可以解释这种能效差距:
单一处理器。 TPU 只有一个处理器,而 K80 有 13 个,CPU 有 18 个。单线程使系统更容易保证固定的延迟限制。
大型二维乘法单元。 TPU 有一个非常大的二维乘法单元,而 CPU 和 GPU 分别有 18 和 13 个较小的一维乘法单元,二维乘法硬件单元更适合于计算矩阵乘法。
压缩数组。 对二维组织进行阵列收缩,以减少寄存器访问和能量消耗。
8 位整数。 TPU 应用使用 8 位整数运算而不是 32 位浮点运算,以提高计算和内存的效率。
放弃额外功能。 TPU 放弃了 CPU 和 GPU 需要而 DNN 不需要的功能,使 TPU 成本更低,同时节省能源,并允许晶体管被重新用于特定领域的片上存储器。
虽然 CPU 和 GPU 在未来肯定会以更快的速度运行推理,但重新设计的 TPU 通过使用 2015 年左右的 GPU 内存将性能提升了三倍,并将每瓦性能优势提升到 K80 的 70 倍以及 Haswell 的 200 倍。
至少在过去十年里,计算机架构研究人员一直在发表基于模拟的创新成果,使用有限基准,并声称基于通用处理器的改进幅度不超过 10%,而我们现在可以说,部署在真实硬件中的特定领域架构的改进幅度超过了 10 倍[17]。
商业产品之间的数量级差异在计算机架构中比较罕见,甚至可能导致 TPU 成为该领域未来工作的原型。我们预计,今后很多人都会构建类似的架构,并将标准提得更高。
感谢 TPU 团队所有成员在项目中的贡献[20]。设计、验证和实现类似 TPU 这样的系统硬件和软件,并制造、部署和大规模应用,需要很多人共同努力,正如我们在谷歌看到的那样。
Norman P. Jouppi (jouppi@google.com) 谷歌杰出硬件工程师
Cliff Young (cliffy@google.com) 谷歌大脑团队成员
Nishant Patil (nishantpatil@google.com) 谷歌技术主管
David Patterson (pattrsn@cs.berkeley.edu) 加州大学伯克利分校电子工程与计算机科学学院 Pardee 荣誉教授,谷歌杰出工程师
你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。微信公众号:DeepNoMind
领取专属 10元无门槛券
私享最新 技术干货