7 Domain-Specific Architectures

摩尔定律不可能永远持续下去……我们还有10到20年的时间才能达到一个基本的极限。  
——戈登·摩尔,英特尔联合创始人(2005年)
7.1 Introduction
戈登·摩尔不仅在1965年预测了每个芯片上晶体管的惊人增长,开篇的引用也表明,他预测了这一现象在50年后的衰退。作为证据,图7.1显示,即使是他创办的公司——几十年来自豪地将摩尔定律作为资本投资的指导——也正在放缓新半导体工艺的发展。

在半导体繁荣时期,架构师们利用摩尔定律创造了新颖的机制,将大量的晶体管转化为更高的性能。一个五级流水线、32位RISC处理器在1980年代只需大约25,000个晶体管,但其资源增长了100,000倍,以实现加速通用处理器上的通用代码的功能,正如前面的章节所记录的:
- 一级、二级、三级,甚至四级缓存
- 512位SIMD浮点单元
- 15级以上的流水线
- 分支预测
- 超标量执行
- 预测性预取
- 多线程
- 多处理
这些复杂的架构针对的是用高效语言(如C++)编写的百万行程序。架构师们将这些代码视为黑箱,通常对程序的内部结构或它们的功能没有深入了解。像SPEC2017中的基准程序只是测量和加速的工具。编译器作者处于硬件和软件的接口之上,这可以追溯到1980年代的RISC革命,但他们对高层应用行为的理解有限;这就是为什么编译器甚至无法弥合C或C++与GPU架构之间的语义差距。
正如第一章所述,丹纳德缩放(Dennard scaling)结束得比摩尔定律早得多。因此,现在更多的晶体管开关意味着更多的功耗。能源预算并没有增加,我们已经用多个高效核心取代了单个低效处理器。因此,我们在通用架构上没有任何新的手段来继续在成本性能和能效上实现重大改进。由于能源预算是有限的(受电迁移、芯片的机械和热限制影响),如果我们想要更高的性能(更高的每秒操作次数),就需要降低每次操作的能耗。

图7.2是对第一章中提到的内存和逻辑相对能耗的另一种看法,这次是作为算术指令的开销来计算。考虑到这一开销,对现有核心的小幅调整可能会带来10%的性能提升,但如果我们希望实现数量级的改进,同时保持可编程性,就需要将每条指令的算术操作数量从一个增加到数百个。要实现这种效率水平,我们需要从通用核心到领域特定架构(DSA)进行根本性的计算机架构变革。
因此,就像该领域在过去十年中因必要性而从单处理器切换到多处理器一样,绝望也是架构师现在致力于DSA的原因。新常态是,计算机将由标准处理器组成,以运行诸如操作系统等常规大型程序,同时还配备专门执行狭窄范围任务的领域特定处理器,但它们执行这些任务的效率极高。因此,这样的计算机将比以往的均质多核芯片更加异构。
部分论点是,过去几十年利用摩尔定律的架构创新(如高速缓存、乱序执行等)可能并不适合某些领域——特别是在能源使用方面——因此可以回收这些资源,以使芯片更好地与特定领域匹配。例如,高速缓存非常适合通用架构,但对于领域特定架构(DSAs)并不一定合适;对于具有易于预测的内存访问模式或像视频这样的大数据集(几乎没有数据重用)的应用,多级缓存显得过于复杂,占用了可以更好利用的区域和能量。因此,DSAs的承诺在于提高硅效率和更好的能效,后者通常是当今更重要的特性。
架构师可能不会为像SPEC2017基准测试中的编译器那样的大型C++程序创建DSA。领域特定算法几乎总是针对较大系统的小型计算密集型内核,例如用于对象识别或语音理解。DSAs应专注于这部分,而不是计划运行整个程序。此外,改变基准测试的代码不再是违反规则;对于DSAs来说,这是一个完全有效的加速来源。因此,如果想要做出有意义的贡献,感兴趣于DSA的架构师现在必须摒弃局限,学习应用领域和算法。
除了需要扩展他们的专业知识领域外,领域特定架构师面临的另一个挑战是找到一个需求足够大的目标,以证明在系统级芯片(SoC)上或甚至在定制芯片上分配专用硅的合理性。定制芯片和支持软件的非重复工程(NRE)成本会根据制造的芯片数量进行摊销,因此如果只需要1000个芯片,则不太可能在经济上合理。
适应小规模应用的一种方式是使用可重构芯片,如FPGA,因为它们的NRE低于定制芯片,并且多个不同的应用可能能够重用相同的可重构硬件来摊销其成本(参见第7.5节)。然而,由于这些硬件的效率低于定制芯片,因此FPGA带来的收益相对较小。
DSA的另一个挑战是如何将软件移植到其上。像C++编程语言和编译器这样的熟悉编程环境通常不是DSA的合适工具。
本章的其余部分提供了设计DSA的五个指导原则,然后是我们示例领域的教程,即深度神经网络(DNNs)。我们选择DNNs,因为它们正在革新当今计算的许多领域。与某些硬件目标不同,DNNs适用于广泛的问题,因此我们可以重用DNN特定架构来解决语音、视觉、语言、翻译、搜索排名等多个领域的问题。
接下来,我们提供四个DSA的例子:两个加速DNN的定制芯片、一个为数据中心加速多个领域的FPGA,以及一个专为个人移动设备(PMDs)设计的图像处理单元。然后,我们使用DNN基准测试比较这些DSA与CPU和GPU的成本性能,并以对计算机架构即将到来的复兴的预测结束。
7.2 Guidelines for DSAs
以下是一般指导我们在7.4至7.7节中看到的四个领域特定架构(DSA)设计的五个原则。这五条指导原则不仅提高了面积和能效,还提供了两个有价值的附加效果。首先,它们使设计更简单,从而降低了DSA的非重复工程(NRE)成本(见第7.10节中的谬误)。其次,对于与DSA密切相关的用户应用,遵循这些原则的加速器在满足99百分位响应时间截止日期方面比传统处理器的时变性能优化更为匹配,这一点将在第7.9节中看到。图7.3展示了这四个DSA如何遵循这些指导原则。

1. **使用专用内存以最小化数据移动的距离。** 通用微处理器中的多级缓存在尝试为程序最佳移动数据时消耗了大量面积和能量。例如,一个双路集合相联缓存消耗的能量是相应的软件控制的临时存储器的2.5倍。根据定义,DSA的编译器开发者和程序员了解他们的领域,因此硬件无需为他们移动数据。相反,使用专用内存和针对特定功能量身定制的软件控制内存,可以减少数据移动。
2. **将放弃高级微架构优化所节省的资源投入到更多的算术单元或更大的内存中。** 如第7.1节所述,架构师们将摩尔定律带来的丰厚资源转化为对CPU和GPU的资源密集型优化(如乱序执行、多线程、并行处理、预取、地址合并等)。鉴于在这些较狭窄领域内对程序执行的优越理解,这些资源更适合用于更多的处理单元或更大的片上内存。
3. **使用与领域匹配的最简单形式的并行性。** 目标领域的领域特定架构(DSA)几乎总是具有固有的并行性。设计DSA的关键决策是如何利用这种并行性以及如何将其暴露给软件。围绕领域的并行性的自然粒度设计DSA,并在编程模型中简单地暴露这种并行性。例如,针对数据级并行性,如果在该领域中可以使用SIMD,这显然比MIMD对程序员和编译器作者更容易。同样,如果VLIW可以表达该领域的指令级并行性,那么其设计可以比乱序执行更小且更节能。
4. **将数据大小和类型减少到领域所需的最简单形式。** 正如我们将看到的,许多领域的应用通常受限于内存,因此可以通过使用更窄的数据类型来增加有效的内存带宽和片上内存利用率。更窄和更简单的数据还可以让你在相同的芯片面积中容纳更多的算术单元。
5. **使用领域特定编程语言将代码移植到DSA。** 如第7.1节所提到的,DSA面临的一个经典挑战是让应用程序在你的新架构上运行。一个长期存在的误解是,假设你的新计算机如此吸引人,以至于程序员会为你的硬件重写他们的代码。幸运的是,领域特定编程语言在架构师被迫将注意力转向DSA之前就开始流行。例如,Halide用于视觉处理,TensorFlow用于深度神经网络(Ragan-Kelley等,2013;Abadi等,2016)。这些语言使将应用程序移植到你的DSA变得更为可行。如前所述,在某些领域,仅应用程序的一小部分、计算密集型部分需要在DSA上运行,这也简化了移植过程。
DSA引入了许多新术语,主要来自新领域,也来自传统处理器中未见的新架构机制。正如我们在第4章中所做的,图7.4列出了新的缩写、术语和简短解释,以帮助读者理解。

7.3 Example Domain: Deep Neural Networks
人工智能(AI)不仅是计算领域的下一个重大浪潮——它是人类历史上的下一个重大转折点……智能革命将由数据、神经网络和计算能力驱动。英特尔致力于人工智能,因此……我们增加了一系列推动人工智能增长和广泛应用所需的前沿加速器。  
——布莱恩·克扎尼奇,英特尔首席执行官(2016)
自本世纪初以来,人工智能(AI)经历了戏剧性的复苏。与其将人工智能构建为一套庞大的逻辑规则,不如将重点转向通过示例数据进行机器学习,作为通向人工智能的途径。学习所需的数据量远比预期的要大。本世纪的仓储级计算机(WSCs)从数十亿用户及其智能手机上收集和存储互联网上的千兆字节信息,提供了充足的数据。我们也低估了从海量数据中学习所需的计算量,但嵌入WSC数千台服务器中的GPU具有出色的单精度浮点性价比,提供了足够的计算能力。
机器学习的一个部分,称为深度神经网络(DNNs),在过去五年里成为了人工智能的明星。DNN在语言翻译方面的突破实例是:DNN在一次飞跃中所取得的进展超过了前十年所有的进步(Tung,2016;Lewis-Kraus,2016);在过去五年中,DNN的应用使得图像识别比赛中的错误率从26%降低至3.5%(Krizhevsky等,2012;Szegedy等,2015;He等,2016);而在2016年,DNN首次使计算机程序击败人类围棋冠军(Silver等,2016)。虽然许多这些应用运行在云端,但它们也使得我们在第一章中提到的智能手机上的谷歌翻译成为可能。2017年,新的重要DNN成果几乎每周都有出现。
对DNN感兴趣的读者可以下载并尝试TensorFlow中的教程(TensorFlow Tutorials,2016),或者对于不太冒险的读者,可以参考一本免费的在线DNN教科书(Nielsen,2016)。
### DNN的神经元
深度神经网络(DNN)的灵感来源于大脑的神经元。用于神经网络的人工神经元简单地计算一组权重(参数)和数据值的乘积之和,然后通过一个非线性函数来确定其输出。正如我们将看到的,每个人工神经元具有很大的输入连接(fan-in)和输出连接(fan-out)。对于图像处理的DNN,输入数据将是照片的像素,像素值与权重相乘。虽然尝试了许多非线性函数,但如今一种流行的函数是 \( f(x) = \max(x, 0) \),如果 \( x \) 为负,则返回0;如果为正或零,则返回原始值。(这个简单的函数被称为整流线性单元,或ReLU。)非线性函数的输出称为激活(activation),因为它是“激活”后的人工神经元的输出。
一组人工神经元可以处理输入的不同部分,该组的输出成为下一层人工神经元的输入。输入层和输出层之间的层称为隐藏层。在图像处理过程中,可以将每一层视为寻找不同类型的特征,从较低级别的特征(如边缘和角度)到较高级别的特征(如眼睛和耳朵)。如果图像处理应用程序试图判断图像中是否包含一只狗,那么最后一层的输出可能是一个介于0和1之间的概率值,或者是对应于一系列狗品种的概率列表。

### 图7.5 六个DNN应用程序,代表了2016年Google在推理任务中95%的DNN工作负载,这些将在第7.9节中使用。列包括DNN名称、DNN中的层数、权重数量以及每个权重的操作数(操作强度)。第595页的图7.41对这些DNN进行了更详细的说明。
层数赋予了DNN这个名称。最初数据和计算能力的不足使得大多数神经网络相对较浅。图7.5展示了多种近期DNN的层数、权重数量以及每个权重所需的操作数。在2017年,一些DNN的层数达到了150层。
### 训练与推理
前面的讨论涉及到已经投入生产的深度神经网络(DNN)。DNN的开发从定义神经网络架构开始,选择层的数量和类型、每层的维度以及数据的大小。虽然专家们可能会开发新的神经网络架构,但大多数从业者会在许多已经存在的设计中进行选择(例如,图7.5),这些设计在与他们的问题类似的情况下表现良好。
一旦选择了神经架构,下一步是学习与神经网络图中每条边相关的权重。权重决定了模型的行为。根据神经架构的选择,单个模型中的权重数量可以从几千到几亿(见图7.5)。训练是调整这些权重的耗时过程,以使DNN能够近似由训练数据描述的复杂函数(例如,将图片映射到该图片中的对象)。
这一开发阶段通常称为训练或学习,而生产阶段有许多名称:推理、预测、评分、实施、评估、运行或测试。大多数DNN使用监督学习,给定一个训练集来学习,其中数据经过预处理以便具有正确的标签。因此,在ImageNet DNN比赛中(Russakovsky等,2015),训练集由120万张照片组成,每张照片被标记为1000个类别之一。其中一些类别非常详细,例如特定品种的狗和猫。获胜者通过评估一个单独的秘密集(包含50,000张照片)来确定,以查看哪个DNN具有最低的错误率。
设置权重是一个迭代过程,使用训练集在神经网络中向后传播。这个过程称为反向传播。例如,由于你知道训练集中狗图像的品种,你会查看你的DNN对该图像的预测,然后调整权重以改善答案。令人惊讶的是,在训练过程开始时,权重应该被设置为随机数据,你只是不断迭代,直到你对使用训练集时DNN的准确性感到满意。
对于数学爱好者来说,学习的目标是找到一个函数,将输入映射到多层神经网络架构中的正确输出。反向传播代表“误差的反向传播”。它计算所有权重的梯度,并作为输入提供给一个优化算法,该算法试图通过更新权重来最小化误差。DNN最流行的优化算法是随机梯度下降(SGD)。它根据反向传播得到的梯度的下降幅度,成比例地调整权重以最大化下降。
对学习更多感兴趣的读者可以参考Nielsen(2016)或TensorFlow教程(2016)。

如图7.6所示,训练可能需要数周的计算时间。推理阶段通常每个数据样本的时间低于100毫秒,这比训练时间短了百万倍。虽然训练所需时间远长于单次推理,但推理的总计算时间是DNN客户数量和他们调用它的频率的乘积。
训练完成后,你部署你的DNN,希望你的训练集能够代表现实世界,并且你的DNN将会如此受欢迎,以至于你的用户使用它的时间远远超过你在开发上投入的时间!
有些任务没有训练数据集,比如试图预测某个现实世界事件的未来。虽然我们在这里不会详细讨论,但强化学习(RL)是一种在2017年非常流行的算法,适用于这种学习。RL不是依赖训练集进行学习,而是作用于现实世界,然后根据该动作是否改善或恶化了情况,从奖励函数中获得信号。
尽管很难想象还有更快速变化的领域,但到2017年,只有三种类型的深度神经网络(DNN)占据了主导地位:多层感知器(MLPs)、卷积神经网络(CNNs)和递归神经网络(RNNs)。它们都是监督学习的例子,依赖于训练集。
### 多层感知器
多层感知器是最早的DNN。每个新层都是前一层所有输出的加权和的非线性函数F:\( y_n = F(W \cdot y_{n-1}) \)。加权和由输出与权重的向量-矩阵乘法组成(见图7.7)。这样的层被称为全连接层,因为每个输出神经元的结果依赖于前一层的所有输入神经元。

图7.7 显示了左侧的输入层 [i21] 和右侧的输出层 [i] 的多层感知器(MLP)。ReLU 是 MLP 中一种流行的非线性函数。输入层和输出层的维度通常是不同的。这样的层称为全连接层,因为它依赖于前一层的所有输入,即使其中许多输入为零。有研究表明,44% 的输入为零,这可能部分是因为 ReLU 将负数转化为零。
我们可以计算每种DNN类型每层的神经元数量、操作数和权重数。对于多层感知器来说,计算是最简单的,因为它只是输入向量与权重数组的向量-矩阵乘法。以下是确定推理中权重和操作数的参数和公式(我们将乘法和加法计算为两个操作):
- **Dim[i]**:输出向量的维度,即神经元的数量
- **Dim[i-1]**:输入向量的维度
- **权重数量**:Dim[i-1] × Dim[i]
- **操作数**:2 × 权重数量
- **操作数/权重**:2
最后一个术语是从第四章讨论的Roofline模型中得出的操作强度。我们使用每个权重的操作数是因为权重数量可以达到数百万,通常无法全部适配到芯片上。例如,MLP中某一层的维度为Dim[i-1] = 4096和Dim[i] = 2048,因此该层的神经元数量为2048,权重数量为8,388,608,操作数量为16,777,216,操作强度为2。正如我们在Roofline模型中回顾到的,低操作强度使得实现高性能变得更加困难。
卷积神经网络(CNN)
卷积神经网络广泛应用于计算机视觉领域。由于图像具有二维结构,相邻的像素是寻找关系的自然位置。CNN 以来自前一层的空间上相邻区域输出的非线性函数作为输入,然后通过权重进行乘法运算,从而多次重用权重。
CNN 的基本思想是每一层都提升图像的抽象级别。例如,第一层可能仅识别水平线和垂直线。第二层可能将这些线组合在一起以识别角点。接下来的步骤可能是识别矩形和圆形。随后的层可以利用这些输入来检测狗的部分特征,如眼睛或耳朵。更高层次则试图识别不同犬种的特征。

图 7.8 CNN 的简化第一步。在这个例子中,输入图像中每组四个像素都与相同的四个权重相乘,以生成输出特征图的单元。所示的模式在输入像素组之间的步幅为二,但其他步幅也是可能的。为了将此图与多层感知器(MLP)联系起来,可以将每个 2×2 的卷积视为一个小型的全连接操作,用于生成输出特征图的一个点。图 7.9 显示了多个特征图如何将这些点转换为第三维的向量。
每个神经层产生一组二维特征图,其中二维特征图的每个单元都试图识别输入相应区域中的一个特征。图 7.8 显示了起始点,在这里,从输入图像进行的 2×2 模板计算生成了第一个特征图的元素。模板计算使用固定模式中的相邻单元来更新数组的所有元素。
输出特征图的数量将取决于你试图从图像中捕获的不同特征的数量以及应用模板时使用的步幅。这个过程实际上更复杂,因为图像通常不仅是单一的、平面的二维层。通常,彩色图像将有三个红、绿和蓝的层。例如,一个 2×2 的模板将访问 12 个元素:2×2 的红色像素、2×2 的绿色像素和 2×2 的蓝色像素。在这种情况下,对于图像三个输入层的 2×2 模板,每个输出特征图需要 12 个权重。

图 7.9 CNN 的一般步骤,左侧显示了 Layer[i-1] 的输入特征图,右侧显示了 Layer[i] 的输出特征图,以及一个三维模板在输入特征图上以生成单个输出特征图。每个输出特征图都有其独特的权重集合,并且每个输出特征图都会进行向量与矩阵的乘法运算。虚线表示该图中未来的输出特征图。如图所示,输入特征图和输出特征图的维度和数量通常是不同的。与多层感知器(MLP)一样,ReLU 是 CNN 中一种流行的非线性函数。
图 7.9 显示了任意数量的输入和输出特征图的一般情况,这发生在第一层之后。该计算是对所有输入特征图进行的三维模板运算,使用一组权重来生成一个输出特征图。
对于数学导向的人来说,如果输入特征图和输出特征图的数量都为 1,且步幅为 1,那么二维 CNN 的单层计算与二维离散卷积相同。
正如我们在图 7.9 中所见,CNN 比 MLP 更复杂。以下是计算权重和操作的参数和公式:
- **DimFM[i-1]**:输入特征图的维度(平方)
- **DimFM[i]**:输出特征图的维度(平方)
- **DimSten[i]**:模板的维度(平方)
- **NumFM[i-1]**:输入特征图的数量
- **NumFM[i]**:输出特征图的数量
- **神经元数量**:NumFM[i] × DimFM[i]²
- **每个输出特征图的权重数量**:NumFM[i-1] × DimSten[i]²
- **每层的权重总数**:NumFM[i] × 每个输出特征图的权重数量
- **每个输出特征图的操作数量**:2 × DimFM[i]² × 每个输出特征图的权重数量
- **每层的操作总数**:NumFM[i] × 每个输出特征图的操作数量 = 2 × DimFM[i]² × NumFM[i] × 每个输出特征图的权重数量 = 2 × DimFM[i]² × 每层的权重总数
- **操作/权重**:2 × DimFM[i]²
在第 7.9 节中的 CNN 有一个层,参数为 DimFM[i-1] = 28、DimFM[i] = 14、DimSten[i] = 3、NumFM[i-1] = 64(输入特征图的数量)和 NumFM[i] = 128(输出特征图的数量)。该层有 25,088 个神经元,73,728 个权重,执行 28,901,376 次操作,操作强度为 392。
我们的例子表明,CNN 层通常比 MLP 中的全连接层具有更少的权重和更高的操作强度。
### 循环神经网络
第三种类型的深度神经网络(DNN)是循环神经网络(RNN),它们在语音识别或语言翻译中非常流行。RNN 通过在 DNN 模型中添加状态来显式建模序列输入,从而增加了记忆事实的能力。这类似于组合逻辑与状态机之间的硬件差异。例如,您可能会学习一个人的性别,而您希望在翻译单词时将这一信息传递给模型以便以后记住。RNN 的每一层都是来自前一层输入的加权和及先前状态的集合。权重在时间步之间重用。
长短期记忆(LSTM)是目前最受欢迎的 RNN。LSTM 解决了之前 RNN 无法记住重要长期信息的问题。
与另外两种 DNN 不同,LSTM 是一种层次化设计。LSTM 由称为单元的模块组成。您可以将单元视为链接在一起以创建完整 DNN 模型的模板或宏,这类似于 MLP 的层排列在一起形成完整 DNN 模型的方式。

图 7.10 LSTM 单元相互连接。输入位于左侧(英文单词),输出位于右侧(翻译后的西班牙单词)。这些单元可以被视为在时间上展开,从上到下。因此,LSTM 的短期和长期记忆通过在展开的单元之间自上而下地传递信息来实现。它们展开得足够多,以便翻译整个句子甚至段落。这种序列到序列的翻译模型会延迟输出,直到输入结束(Wu et al., 2016)。它们按反向顺序生成翻译,使用最近翻译的单词作为下一步的输入,因此“now is the time”变成了“ahora es el momento。”(这个图和下一个图在 LSTM 文献中通常会旋转 90 度,但我们将其旋转为与图 7.7 和 7.8 保持一致。)
图 7.10 显示了 LSTM 单元之间的连接方式。它们从左到右连接,将一个单元的输出连接到下一个单元的输入。它们在时间上也是展开的,在图 7.10 中自上而下运行。因此,在展开循环的每次迭代中,句子以一个单词的形式输入。赋予 LSTM 名称的长期和短期记忆信息也是自上而下地从一个迭代传递到下一个。

图 7.11 这个 LSTM 单元包含 5 次向量-矩阵乘法、3 次元素级乘法、1 次元素级加法和 6 个非线性函数。标准输入和短期记忆输入被连接在一起,形成输入向量-矩阵乘法的向量操作数。标准输入、长期记忆输入和短期记忆输入被连接在一起,形成用于其他四个向量-矩阵乘法中的三个的向量。三个门的非线性函数为 Sigmoid 函数 \(f(x) = \frac{1}{1 + \exp(-x)}\);其他的则是双曲正切函数。(这个图和前一个图在 LSTM 文献中通常会旋转 90 度,但我们将其旋转为与图 7.7 和 7.8 保持一致。)
图 7.11 显示了 LSTM 单元的内容。正如我们从图 7.10 中所预期的,输入位于左侧,输出位于右侧,两个记忆输入位于顶部,两个记忆输出位于底部。
每个单元使用五组独特的权重进行五次向量-矩阵乘法。输入的矩阵乘法与图 7.7 中的 MLP 类似。其他三个被称为门,因为它们限制从一个源传递到标准输出或记忆输出的信息量。每个门传递的信息量由其权重设置。如果权重大多数为零或小值,则很少有信息传递;相反,如果它们大多数为大值,则门允许大多数信息通过。这三个门分别称为输入门、输出门和遗忘门。前两个门过滤输入和输出,而最后一个门则决定沿长期记忆路径要遗忘什么。
短期记忆输出是使用短期权重和该单元输出的向量-矩阵乘法。之所以称为短期,是因为它并不直接使用该单元的任何输入。
由于 LSTM 单元的输入和输出都连接在一起,因此三个输入输出对的大小必须相同。观察单元内部,有足够的依赖关系使得所有输入和输出的大小通常是相同的。
我们假设它们的大小都相同,称为 Dim。
尽管如此,向量-矩阵乘法的大小并不完全相同。三个门的向量乘法的向量是 \(3 \times \text{Dim}\),因为 LSTM 将所有三个输入连接在一起。输入乘法的向量是 \(2 \times \text{Dim}\),因为 LSTM 将输入与短期记忆输入连接在一起作为向量。最后一次乘法的向量只是 \(1 \times \text{Dim}\),因为它只是输出。
现在我们终于可以计算权重和操作数了:
- 每个单元的权重数:\(3 \times (\text{3 Dim} \times \text{Dim}) + (2 \times \text{Dim} \times \text{Dim}) + (1 \times \text{Dim} \times \text{Dim}) = 12 \times \text{Dim}^2\)
- 每个单元的 5 次向量-矩阵乘法的操作数:\(2 \times \text{每个单元的权重数} = 24 \times \text{Dim}^2\)
- 3 次元素级乘法和 1 次加法的操作数(向量的大小与输出相同):\(4 \times \text{Dim}\)
- 每个单元的总操作数(5 次向量-矩阵乘法和 4 次元素级操作):\(24 \times \text{Dim}^2 + 4 \times \text{Dim}\)
- 操作数/权重:\(2\)
对于第 7.9 节中的 LSTM 六个单元之一,\(\text{Dim}\) 为 1024。它的权重数量为 12,582,912,操作数为 25,169,920,操作强度为 2.0003。因此,LSTM 与 MLP 类似,通常拥有更多的权重,并且相比 CNN,操作强度较低。
### 批次
由于深度神经网络(DNNs)通常拥有许多权重,因此一种性能优化策略是对一组输入在从内存中获取权重后进行重用,从而提高有效操作强度。例如,一个图像处理的深度神经网络可能同时处理32张图像,以将获取权重的有效成本降低32倍。这种数据集称为批次(batches)或小批次(minibatches)。除了提高推理性能外,反向传播也需要一批示例而不是逐个示例,以便进行良好的训练。
在图7.7中观察一个多层感知器(MLP),批次可以被视为一系列输入行向量,可以将其视为一个高度维度与批次大小匹配的矩阵。在图7.11中,LSTM的五个矩阵乘法的输入行向量序列也可以视为一个矩阵。在这两种情况下,将它们作为矩阵计算,而不是按顺序作为独立向量计算,可以提高计算效率。
### 量化
对于DNN来说,数值精度的重要性不如许多其他应用那样高。例如,不需要使用双精度浮点运算,而双精度浮点运算是高性能计算的标准。甚至不清楚是否需要IEEE 754浮点标准的完整精度,该标准旨在在浮点数尾数的最后一位内达到半个单位的精度。
为了利用数值精度的灵活性,一些开发者在推理阶段使用定点数而非浮点数。(训练几乎总是使用浮点运算。)这种转换称为量化,经过这种转换的应用程序被称为量化应用(Vanhoucke等,2011)。定点数据的位宽通常为8或16位,标准的乘加操作的累积宽度是乘法的两倍。这种转换通常发生在训练后,并且可能会使DNN的准确性降低几个百分点(Bhattacharya和Lane,2016)。
### DNN的总结
即使是这个简要概述也表明,针对DNN的数字信号处理器(DSAs)需要至少能够良好执行这些面向矩阵的操作:向量-矩阵乘法、矩阵-矩阵乘法和模板计算(stencil computations)。它们还需要支持非线性函数,至少包括ReLU、Sigmoid和tanh。这些适度的要求仍然留下了非常大的设计空间,接下来的四个部分将对此进行探索。
7.4 Google’s Tensor Processing Unit, an Inference Data Center Accelerator
### 张量处理单元(TPU)
张量处理单元(TPU)是谷歌首个为数据中心(WSCs)定制的专用集成电路(ASIC)数字信号处理器(DSA)。其应用领域为深度神经网络(DNNs)的推理阶段,使用为DNN设计的TensorFlow框架进行编程。首个TPU于2015年部署在谷歌的数据中心。
TPU的核心是一台65,536(256 × 256)8位算术逻辑单元(ALU)矩阵乘法单元,以及一块大型软件管理的片上内存。TPU的单线程、确定性执行模型与典型DNN推理应用的99百分位响应时间要求非常匹配。
### TPU的起源
早在2006年,谷歌工程师就开始讨论在其数据中心部署GPU、FPGA或定制ASIC的问题。他们得出结论,能够在特殊硬件上运行的少数应用程序,利用大型数据中心的过剩计算能力几乎可以免费完成,而这种免费服务是很难改进的。
2013年,这一讨论发生了变化。当时预测,如果人们每天使用语音识别DNN进行三分钟的语音搜索,将需要谷歌的数据中心翻倍,以满足计算需求。使用传统CPU来满足这一需求将非常昂贵。于是,谷歌启动了一个高优先级项目,迅速生产用于推理的定制ASIC(并为训练购买现成的GPU)。目标是使成本性能比GPU提高10倍。基于这一任务,TPU在短短15个月内完成了设计、验证(Steinberg,2015)、制造并部署在数据中心。
### TPU架构
为了减少延迟部署的可能性,TPU被设计为PCIe I/O总线上的协处理器,这使得它可以插入现有的服务器中。此外,为了简化硬件设计和调试,主机服务器通过PCIe总线直接向TPU发送指令进行执行,而不是让TPU去获取指令。因此,TPU在本质上更接近浮点单元(FPU)协处理器,而不是从其内存中获取指令的GPU。

图7.12显示了TPU的框图。主CPU通过PCIe总线将TPU指令发送到指令缓冲区。内部模块通常通过256字节宽(2048位)的路径连接在一起。从右上角开始,矩阵乘法单元是TPU的核心。它包含256 × 256个算术逻辑单元(ALU),能够对有符号或无符号整数执行8位乘法和加法。16位的乘积被收集到矩阵单元下方的4 MiB 32位累加器中。当使用8位权重和16位激活(或反之)混合时,矩阵单元的计算速度减半;当两者均为16位时,计算速度降至四分之一。它每个时钟周期读取和写入256个值,并可以执行矩阵乘法或卷积。非线性函数由激活硬件计算。
矩阵单元的权重通过片上权重FIFO进行分级,从一个名为权重内存(Weight Memory)的8 GiB外部DRAM中读取(对于推理,权重是只读的;8 GiB支持多个同时激活的模型)。中间结果存储在24 MiB的片上统一缓冲区中,该缓冲区可以作为矩阵乘法单元的输入。一个可编程DMA控制器负责在CPU主存和统一缓冲区之间传输数据。
### TPU指令集架构
由于指令通过相对较慢的PCIe总线传输,TPU指令遵循CISC传统,包括一个重复字段。TPU没有程序计数器,也没有分支指令;指令由主机CPU发送。这些CISC指令的每条指令时钟周期(CPI)通常为10至20。总共有大约十几条指令,但以下五条是关键指令:
1. **Read_Host_Memory**:将数据从CPU主存读取到统一缓冲区(Unified Buffer)中。
2. **Read_Weights**:将权重从权重内存(Weight Memory)读取到权重FIFO中,以作为矩阵单元的输入。
3. **MatrixMultiply/Convolve**:使矩阵乘法单元执行矩阵-矩阵乘法、向量-矩阵乘法、逐元素矩阵乘法、逐元素向量乘法或从统一缓冲区到累加器的卷积操作。一个矩阵操作接受一个可变大小的B×256输入,将其乘以一个256×256的常量输入,并生成一个B×256的输出,完成所需的B个流水线周期。例如,如果输入是4个256元素的向量,B将为4,因此完成所需的时钟周期为4个。
4. **Activate**:执行人工神经元的非线性函数,支持ReLU、Sigmoid、tanh等选项。其输入为累加器,输出为统一缓冲区。
5. **Write_Host_Memory**:将数据从统一缓冲区写入CPU主存。
其他指令包括备用的主机内存读/写、设置配置、两种版本的同步、中断主机、调试标记、空操作(nop)和停止(halt)。CISC矩阵乘法指令为12字节,其中3字节为统一缓冲区地址;2字节为累加器地址;4字节为长度(有时为卷积的2个维度);其余为操作码和标志。
其目标是在TPU中运行整个推理模型,以减少与主机CPU的交互,并灵活匹配2015年及以后深度神经网络的需求,而不仅仅是满足2013年DNN的要求。
### TPU 微架构
TPU的微架构理念是保持矩阵乘法单元的忙碌状态。计划通过将其他指令的执行与矩阵乘法指令的执行重叠来隐藏这些指令的执行。因此,前面提到的四类通用指令有各自独立的执行硬件(其中主机内存的读/写操作被合并到同一个单元中)。为了进一步增加指令并行性,`Read_Weights`指令遵循解耦访问/执行的理念(Smith, 1982b),即它们可以在发送地址后、权重从权重内存中提取之前完成。矩阵单元具有来自统一缓冲区和权重FIFO的“未就绪”信号,如果这些数据尚不可用,将导致矩阵单元停滞。
需要注意的是,TPU指令可以执行多个时钟周期,而不像传统的RISC流水线那样每个阶段仅需一个时钟周期。
由于读取大型SRAM比进行算术运算要昂贵得多,矩阵乘法单元采用了脉动执行(systolic execution)来节省能源,通过减少对统一缓冲区的读写操作(Kung 和 Leiserson,1980;Ramacher等,1991;Ovtcharov等,2015b)。脉动阵列是一种二维的算术单元集合,每个单元独立地计算一个部分结果,输入来自被视为上游的其他算术单元。它依赖于来自不同方向的数据按规律的时间间隔到达阵列中的单元,在那里它们被合并。由于数据以波前的形式通过阵列流动,这类似于血液通过心脏泵送到人体循环系统,因此“脉动”一词源自此。

图7.13 脉动阵列工作的示例,从页面顶部到底部。在这个例子中,六个权重已经在乘加单元内部,这是TPU的常规做法。三个输入以错开的时间进入,以达到所需的效果,在这个例子中,它们显示为从顶部进入。(在TPU中,数据实际上是从左侧进入的。)数组将数据向下传递给下一个单元,并将计算结果传递给右侧的下一个单元。处理结束时,乘积之和位于右侧。图画由Yaz Sato提供。
图7.13展示了脉动阵列的工作原理。底部的六个圆圈是乘加单元,它们用权重 \(w_i\) 初始化。错开的输入数据 \(x_i\) 从上方进入阵列。图中显示的10个步骤代表了从页面顶部到底部的10个时钟周期。脉动阵列将输入数据传递下去,并将乘积与和传递到右侧。随着数据完成通过脉动阵列的路径,所需的乘积和将显现出来。需要注意的是,在脉动阵列中,输入数据只从内存读取一次,输出数据也只写入内存一次。

在TPU中,脉动阵列是旋转的。图7.14显示,权重从顶部加载,输入数据从左侧流入阵列。给定的256元素乘加操作以对角线波前的形式通过矩阵移动。权重被预加载,并与数据块的第一组数据一起生效。控制和数据被流水线处理,给人一种256个输入同时被读取的错觉,并且在一个延迟后,它们更新256个累加器内存的每个位置。从正确性角度来看,软件并不需要了解矩阵单元的脉动特性,但从性能角度来看,软件关注的是该单元的延迟。
### TPU实现

图7.15 TPU芯片的布局图 阴影部分与图7.14相同。浅色数据缓冲区占37%,浅色计算单元占30%,中等I/O占10%,而深色控制部分仅占2%。在CPU或GPU中,控制部分通常更大(并且设计难度更高)。未使用的白色空间是TPU在设计时强调快速流片的结果。
TPU芯片采用28纳米工艺制造,时钟频率为700 MHz。图7.15显示了TPU的布局。尽管具体的芯片尺寸未公开,但其面积小于英特尔Haswell服务器微处理器的二分之一,后者的尺寸为662 mm²。
24 MiB的统一缓冲区几乎占据了芯片面积的三分之一,而矩阵乘法单元占据了四分之一,因此数据通路几乎占据了芯片面积的三分之二。24 MiB的大小部分是为了与芯片上矩阵单元的间距相匹配,鉴于开发周期较短,部分原因是为了简化编译器。控制部分仅占2%。

图7.16展示了TPU在其印刷电路板上的样子,插入到现有服务器的SATA硬盘插槽中。
### TPU软件
TPU软件栈必须与为CPU和GPU开发的软件兼容,以便应用程序能够快速移植。运行在TPU上的应用程序部分通常使用TensorFlow编写,并被编译为可以在GPU或TPU上运行的API(Larabel, 2016)。图7.17展示了一个多层感知机(MLP)部分的TensorFlow代码。

与GPU类似,TPU栈分为用户空间驱动程序和内核驱动程序。内核驱动程序轻量且仅处理内存管理和中断,旨在实现长期稳定性。用户空间驱动程序变化频繁,负责设置和控制TPU的执行,将数据重新格式化为TPU顺序,并将API调用转换为TPU指令,最终生成应用程序二进制文件。用户空间驱动程序在模型首次评估时进行编译,缓存程序映像并将权重映像写入TPU权重内存;第二次及后续评估则以全速运行。
TPU通常能够从输入到输出完全运行大多数模型,最大化TPU计算时间与I/O时间的比率。计算通常是逐层进行的,通过重叠执行,使得矩阵单元能够隐藏大部分非关键路径操作。
### 改进TPU
TPU架构师研究了微架构的变化,以探讨是否能够改进TPU的性能。与浮点单元(FPU)类似,TPU协处理器的微架构相对容易评估,因此TPU架构师创建了一个性能模型,估算了在内存带宽、矩阵单元大小、时钟频率和累加器数量变化时的性能。使用TPU硬件计数器进行的测量发现,模型化的性能与硬件的平均差异在8%以内。

图7.18 性能随着指标从0.25×扩展到4×的变化:内存带宽、时钟频率+累加器、时钟频率、矩阵单元维度+累加器,以及方形矩阵单元的一个维度。这是根据第7.9节中六个DNN应用计算的平均性能。CNN通常受限于计算,而MLP和LSTM则受限于内存。大多数应用从更快的内存中受益,但更快的时钟对性能影响不大,而更大的矩阵单元实际上会降低性能。该性能模型仅适用于在TPU内部运行的代码,并未考虑CPU主机的开销。
图7.18显示了在这些参数在0.25"到4"范围内扩展时TPU性能的敏感性(第7.9节列出了所使用的基准测试)。除了评估仅提升时钟频率(图7.18中的时钟)的影响外,图7.18还绘制了一个设计(时钟+),该设计在提高时钟频率的同时,适当增加累加器的数量,以便编译器可以保持更多的内存引用在运行中。同样,图7.18还绘制了如果累加器数量以某一维度的平方增长(矩阵+),矩阵单元扩展的情况,因为矩阵在两个维度上都会增长,以及仅增加矩阵单元(矩阵)。
首先,增加内存带宽(内存)的影响最大:当内存带宽增加4"时,性能平均提升3" ,因为这减少了等待权重内存的时间。其次,时钟频率对性能的提升影响不大,无论是否增加更多的累加器。第三,无论应用程序是否获得更多的累加器,图7.18中矩阵单元从256" × 256扩展到512" × 512时,平均性能略有下降。这个问题类似于大页面的内部碎片化,但情况更糟,因为这是在两个维度上。
考虑在LSTM1中使用的600" × 600矩阵。使用256" × 256的矩阵单元,需要九个步骤来铺满600" × 600,总共需要18微秒的时间。更大的512" × 512单元只需四个步骤,但每个步骤耗时是四倍,即32微秒的时间。TPU的CISC指令较长,因此解码时间微不足道,无法掩盖从DRAM加载的开销。
基于性能模型的这些见解,TPU架构师接下来评估了一个替代的假设TPU,如果他们有超过15个月的时间在相同的工艺技术下设计,可能会采用该设计。更激进的逻辑综合和块设计可能将时钟频率提高50%。架构师发现,为K80所使用的GDDR5内存设计接口电路,能够将权重内存带宽提高五倍以上。如图7.18所示,将时钟频率提高到1050 MHz,但不改善内存带宽,几乎对性能没有变化。如果时钟保持在700 MHz,但使用GDDR5作为权重内存,则即使考虑到在修订TPU上调用DNN的主机CPU开销,性能仍提高3.2"。同时进行这两项改进并不会进一步提升平均性能。
### 摘要:TPU 如何遵循指导原则
尽管TPU运行在I/O总线上,并且由于相对较少的内存带宽限制了TPU的充分利用,但大数的小部分仍然可以是相对较大的。正如我们在第7.9节中将看到的,TPU在运行DNN推理应用时实现了相较于GPU的十倍成本性能提升。此外,仅通过将TPU的内存技术改为与GPU相同的技术,重新设计的TPU将会快三倍。
解释TPU成功的一种方式是观察它如何遵循第7.2节中的指导原则。
1. **使用专用内存以最小化数据移动距离。**  
   TPU拥有24 MiB的统一缓冲区,用于存储MLP和LSTM的中间矩阵和向量以及CNN的特征图。它针对每次访问256字节进行了优化。TPU还有4 MiB的累加器,每个累加器宽32位,用于收集矩阵单元的输出并作为计算非线性函数的硬件的输入。8位权重存储在独立的外部权重内存DRAM中,并通过片上权重FIFO进行访问。相比之下,所有这些类型和大小的数据在通用CPU的包容性内存层次结构中的多个级别上都会存在冗余副本。
2. **将从放弃先进微架构优化中节省的资源投入更多的算术单元或更大的内存。**  
   TPU提供28 MiB的专用内存和65,536个8位ALU,这意味着它拥有约60%的内存和250倍于服务器级CPU的ALU数量,尽管其大小和功耗只有一半(见第7.9节)。与服务器级GPU相比,TPU的片上内存是其3.5倍,ALU数量是其25倍。
3. **使用与领域匹配的最简单形式的并行性。**  
   TPU通过其256×256的矩阵乘法单元以二维SIMD并行性提供性能,该单元采用内部流水线和脉动组织,并具有简单的重叠执行流水线。相比之下,GPU依赖于多处理、多线程和一维SIMD,而CPU则依赖于多处理、乱序执行和一维SIMD。
4. **将数据大小和类型简化为该领域所需的最简单形式。**  
   TPU主要计算8位整数,虽然它也支持16位整数并在32位整数中累加。CPU和GPU还支持64位整数以及32位和64位浮点数。
5. **使用领域特定的编程语言将代码移植到DSA。**  
   TPU使用TensorFlow编程框架进行编程,而GPU依赖于CUDA和OpenCL,CPU则必须运行几乎所有的代码。
7.5 Microsoft Catapult, a Flexible Data Center Accelerator
在谷歌考虑在其数据中心部署定制ASIC的同时,微软也在考虑为其数据中心使用加速器。微软的观点是,任何解决方案必须遵循以下指导原则:
- 必须保持服务器的同质性,以便快速重新部署机器,并避免让维护和调度变得更加复杂,尽管这个概念与领域特定架构(DSAs)的概念有些矛盾。
- 必须能够扩展到可能需要比单个加速器能够容纳的更多资源的应用,而不让所有应用都负担多个加速器。
- 必须具备能源效率。
- 不应成为单点故障,从而导致可靠性问题。
- 必须能够适应现有服务器中的可用备用空间和电力。
- 不能影响数据中心网络的性能或可靠性。
- 加速器必须提高服务器的性价比。
第一条规则防止了只在某些服务器上帮助某些应用的ASIC的部署,而这是谷歌所做的决定。微软启动了一个名为Catapult的项目,在数据中心服务器的PCIe总线上放置FPGA。这些板卡为需要多个FPGA的应用提供了专用网络。计划是利用FPGA的灵活性,根据不同服务器上的不同应用量身定制其使用,并在时间上重新编程同一服务器,以加速不同的应用。这一计划增加了对加速器投资的回报。FPGA的另一个优势是,它们的非重复性工程(NRE)成本应该低于ASIC,这也可以改善投资回报。我们将讨论Catapult的两代设计,展示其如何演变以满足WSC(Web服务器集群)的需求。
FPGA的一个有趣的优势是,每个应用程序——甚至每个应用程序的每个阶段——都可以视为其自己的DSA,因此在本节中,我们可以在一个硬件平台上看到许多新颖架构的示例。
### Catapult的实现与架构

### 图7.19 Catapult板卡设计(A)显示了块图,(B)是该板卡正反面照片,尺寸为10 cm × 9 cm × 16 mm。PCIe和FPGA间网络通过底部的连接器连接,直接插入主板。(C)是服务器的照片,高度为1U(4.45 cm),宽度为标准机架的一半。每台服务器配备两颗12核的Intel Sandy Bridge Xeon CPU、64 GiB的DRAM、2个固态硬盘、4个硬盘驱动器以及一张10-Gbit以太网网络卡。在(C)中右侧的高亮矩形显示了Catapult FPGA板在服务器上的位置。凉爽的空气从(C)左侧吸入,热空气则从右侧排出,经过Catapult板。这个热点和连接器可提供的功率量使得Catapult板的功率限制为25瓦。48台服务器共享一个以太网交换机,该交换机连接到数据中心网络,它们占据了数据中心机架的一半。
图7.19展示了微软为其服务器设计的一款PCIe板卡,该板卡的功率和散热限制为25瓦。这一限制促使微软选择了28纳米的Altera Stratix V D5 FPGA作为Catapult的首次实现。该板卡还配备了32 MiB的闪存,并包含两个总容量为8 GiB的DDR3-1600 DRAM银行。FPGA具有3926个18位的算术逻辑单元(ALU)、5 MiB的片上存储器,以及11 GB/s的DDR3 DRAM带宽。
每个数据中心机架一半的48台服务器都包含一块Catapult板卡。Catapult遵循关于支持需要多个FPGA的应用程序的先前指南,同时不会影响数据中心网络的性能。它增加了一条独立的低延迟20 Gbit/s网络,连接48个FPGA。网络拓扑结构为二维6×8环形网络。
为了遵循避免单点故障的指导原则,该网络可以重新配置,即使其中一个FPGA发生故障也能继续运行。该板卡还在FPGA外的所有存储器上具有SECDED保护,这是在数据中心大规模部署所必需的。
由于FPGA在芯片上使用大量内存以提供可编程性,因此在工艺几何尺寸缩小的情况下,FPGA比ASIC更容易受到单事件干扰(SEUs)影响。Catapult板上的Altera FPGA包含检测和纠正FPGA内部SEU的机制,并通过定期擦除FPGA配置状态来减少SEU发生的可能性。
与数据中心网络相比,独立网络还有一个额外的好处,即降低了通信性能的可变性。网络的不确定性增加了尾部延迟,这对面对终端用户的应用程序特别有害,因此独立网络使得从CPU成功卸载工作到加速器变得更加容易。由于错误率大幅降低,网络拓扑结构明确,该FPGA网络可以运行比数据中心更简单的协议。
需要注意的是,恢复能力在重新配置FPGA时需要谨慎,以确保它们既不会表现为故障节点,也不会导致主服务器崩溃或损坏相邻的FPGA。微软开发了一种高级协议,以确保在重新配置一个或多个FPGA时的安全性。
### Catapult软件
Catapult与TPU之间最大的区别可能在于需要使用硬件描述语言(如Verilog或VHDL)进行编程。正如Catapult的作者所写(Putnam et al., 2016):
> 未来,FPGA在数据中心的广泛采用面临的最大障碍可能是可编程性。FPGA开发仍然需要在寄存器传输级(RTL)中进行大量手动编码和手动调优。

为了减少编程Catapult FPGA的负担,寄存器传输级(RTL)代码被分为“外壳”(shell)和“角色”(role),如图7.20所示。外壳代码类似于嵌入式CPU上的系统库。它包含将在同一FPGA板上的多个应用程序中重用的RTL代码,例如数据调度、CPU与FPGA之间的通信、FPGA与FPGA之间的通信、数据移动、重配置和健康监测。外壳RTL代码占Altera FPGA的23%。角色代码是应用逻辑,由Catapult程序员使用剩余的77% FPGA资源编写。使用外壳的附加好处是能够在各个应用程序之间提供标准的API和标准行为。
### Catapult上的CNN

微软开发了一种可配置的CNN加速器,作为Catapult的一个应用。配置参数包括神经网络层的数量、各层的维度,甚至使用的数值精度。图7.21显示了CNN加速器的框图。其关键特性包括:
- 在运行时可配置设计,无需使用FPGA工具重新编译。
- 为了最小化内存访问,它提供了高效的CNN数据结构缓冲(见图7.21)。
- 一个二维的处理单元(PE)阵列,可以扩展到数千个单元。
图像被发送到DRAM,然后输入到FPGA中的多银行缓冲区。输入数据被发送到多个PE,以执行生成输出特征图的模板计算。控制器(如图7.21左上角所示)协调每个PE的数据流动。最终结果被重新循环到输入缓冲区,以计算CNN的下一层。

与TPU类似,PE的设计旨在作为一个脉动阵列(systolic array)使用。图7.22展示了PE设计的详细信息。
### Catapult上的搜索加速
测试Catapult投资回报的主要应用是微软必应搜索引擎中的一个关键功能——排名(ranking)。该功能用于对搜索结果的顺序进行排序。输出为文档评分,决定文档在呈现给用户的网页上的位置。该算法分为三个阶段:
1. **特征提取(Feature Extraction)**:根据搜索查询从文档中提取数千个有趣的特征,例如查询短语在文档中出现的频率。
2. **自由表达式(Free-Form Expressions)**:计算来自前一个阶段的数千个特征组合。
3. **机器学习评分(Machine-Learned Scoring)**:使用机器学习算法评估前两个阶段的特征,以计算返回给主搜索软件的文档浮点评分。
Catapult实现的排名功能产生的结果与相应的必应软件完全一致,甚至重现了已知的错误!
利用上述指导方针,排名功能不必局限于单个FPGA。排名阶段被分布在八个FPGA上,具体分配如下:
- 一个FPGA负责特征提取。
- 两个FPGA负责自由表达式。
- 一个FPGA进行压缩阶段,提高评分引擎的效率。
- 三个FPGA负责机器学习评分。
剩余的一个FPGA作为备用,用于容错。将多个FPGA用于单个应用效果良好,因为有专用的FPGA网络。

### 图7.23 FPGA实现特征提取阶段的架构 命中向量(hit vector)描述了查询词在每个文档中的位置,首先被输入到命中向量预处理状态机中,然后被拆分为控制和数据令牌。这些令牌并行地发送到43个独特的特征状态机。特征收集网络收集生成的特征和值对,并将其转发到下一个自由表达式(Free-Form Expressions)阶段。
图7.23展示了特征提取阶段的组织结构。它使用43个特征提取状态机并行计算每个文档-查询对的4500个特征。
接下来是自由表达式(Free-Form Expressions)阶段。微软并没有直接在门电路或状态机中实现这些功能,而是开发了一款60核心的处理器,通过多线程来克服长延迟操作。与GPU不同,微软的处理器不需要SIMD执行。它具备三个特性,使其能够匹配延迟目标:
1. 每个核心支持四个同时运行的线程,其中一个线程可以因长操作而阻塞,而其他线程仍然可以继续执行。所有功能单元都是流水线化的,因此它们可以在每个时钟周期接受新的操作。
2. 线程使用优先编码器进行静态优先级排序。具有最长延迟的表达式在所有核心上使用线程插槽0,接下来最慢的在所有核心上使用插槽1,以此类推。
3. 表达式如果过大,无法在单个FPGA分配的时间内完成,可以在用于自由表达式的两个FPGA之间进行拆分。
FPGA的可重编程性带来了一个代价,即其时钟频率比定制芯片低。机器学习评分(Machine-Learned Scoring)利用两种形式的并行性来克服这一劣势。第一种是构建一个匹配应用程序中可用流水线并行性的流水线。对于排名,限制为每个阶段8微秒。第二种并行形式是少见的多指令流单数据流(MISD)并行性,其中大量独立的指令流在单个文档上并行操作。

图7.24 显示了Catapult在给定延迟限制下排名功能的性能。x轴表示Bing排名功能的响应时间。在x轴上,Bing应用程序的95百分位数最大响应时间为1.0,因此右侧的数据点可能具有更高的吞吐量,但到达时间太晚,无法发挥作用。y轴显示了在给定响应时间下,Catapult和纯软件的95%吞吐量。在标准化响应时间为1.0时,Catapult的吞吐量是运行纯软件模式的Intel服务器的1.95倍。换句话说,如果Catapult的吞吐量与Intel服务器在1.0标准化响应时间下的吞吐量相匹配,则Catapult的响应时间减少了29%。
图7.24展示了Catapult上排名功能的性能。正如我们在第7.9节中将看到的,面向用户的应用程序通常有严格的响应时间;如果应用程序错过了截止时间,即使吞吐量再高也没有意义。x轴表示响应时间限制,以1.0为截止点。在这个最大延迟下,Catapult的速度是主机Intel服务器的1.95倍。
### Catapult Version 1 部署
在将数万台服务器填充到整个仓库规模的计算机之前,微软进行了一个17个全机架的测试部署,其中包含17个48英寸、2个或1632个英特尔服务器。Catapult卡和网络链接在制造和系统集成时进行了测试,但在部署时,1632个卡中有7个发生故障(0.43%),3264个FPGA网络链接中有1个(0.03%)存在缺陷。在经过几个月的部署后,没有其他故障发生。
### Catapult Version 2
尽管测试部署成功,微软仍然改变了实际部署的架构,以使Bing和Azure Networking能够使用相同的板和架构(Caulfield等,2016)。V1架构的主要问题在于独立的FPGA网络无法让FPGA识别和处理标准的以太网/IP数据包,这使其无法用于加速数据中心网络基础设施。此外,布线昂贵且复杂,限制在48个FPGA,并且在某些故障模式下流量的重新路由会降低性能,并可能孤立节点。
解决方案是将FPGA逻辑上放置在CPU和网络接口卡(NIC)之间,使所有网络流量都通过FPGA。这种“电缆上的凸起”布局消除了Catapult V1中FPGA网络的许多弱点。此外,它使FPGA能够运行自己低延迟的网络协议,允许它们被视为数据中心及其跨数据中心的所有FPGA的全局池。
在V1和V2之间发生了三个变化,以克服最初担心Catapult应用会干扰数据中心网络流量的问题。首先,数据中心网络从10 Gbit/s升级到40 Gbit/s,增加了余量。其次,Catapult V2为FPGA逻辑添加了速率限制器,确保FPGA应用不会淹没网络。最后,也是可能最重要的变化是,网络工程师现在有了自己的FPGA使用案例,考虑到其“电缆中的凸起”布局。这种布局使这些以前的旁观者转变为热情的合作者。
通过在大多数新服务器中部署Catapult V2,微软实际上拥有一个由分布式FPGA组成的第二台超级计算机,它与CPU服务器共享相同的网络线路,且规模相同,因为每台服务器配备一个FPGA。图7.25和7.26展示了Catapult V2的框图和电路板。


Catapult V2遵循相同的RTL的外壳和角色分离,以简化编程,但在出版时,由于共享数据中心网络线路的更复杂的网络协议,外壳使用了几乎一半的FPGA资源(44%)。
Catapult V2 用于排名加速和功能网络加速。在排名加速中,微软并没有将几乎所有的排名功能都在 FPGA 内部执行,而是只实现了计算密集型的部分,其余工作留给主机 CPU:
- **特征功能单元(FFU)** 是一组有限状态机,用于测量搜索中的标准特征,例如计算特定搜索词的频率。它的概念与 Catapult V1 的特征提取阶段相似。
- **动态编程特征(DPF)** 使用动态编程创建了一套微软专有的特征,并在某种程度上与 Catapult V1 的自由形式表达阶段相似。
这两者的设计使得它们可以使用非本地 FPGA 来完成这些任务,从而简化了调度。

图 7.27 显示了 Catapult V2 与软件性能的比较,格式与图 7.24 相似。现在,通过put率可以提高 2.25 倍,而不会危及延迟,而之前的加速比为 1.95 倍。
当排名在生产环境中部署并测量时,Catapult V2 的尾部延迟优于软件;也就是说,尽管能够承载两倍的工作负载,但 FPGA 的延迟在任何给定需求下都从未超过软件的延迟。
**摘要:Catapult 如何遵循指导原则**
微软报告称,在试点阶段将 Catapult V1 添加到服务器中,使总拥有成本(TCO)增加了不到 30%。因此,在这个应用中,排名的成本性能净增益至少为 1.95/1.30,或约 1.5 的投资回报率。尽管没有关于 Catapult V2 的 TCO 进行评论,但该板上有相似数量的相同类型芯片,因此我们可以猜测 TCO 并没有更高。如果是这样,Catapult V2 的成本性能约为 2.25/1.30,或 1.75 的排名性能。
以下是 Catapult 如何遵循第 7.2 节的指导原则:
1. **使用专用内存以最小化数据移动的距离。**
   Altera V FPGA 具有 5 MiB 的片上内存,应用程序可以根据需要进行定制。例如,对于卷积神经网络(CNN),它用于图 7.21 中的输入和输出特征图。
2. **将通过放弃高级微架构优化节省下来的资源投资于更多的算术单元或更大的内存。**
   Altera V FPGA 还具有 3926 个 18 位算术逻辑单元(ALUs),这些单元根据应用程序进行了定制。对于 CNN,它们用于创建驱动图 7.22 中处理单元的脉冲阵列,并形成排名的自由形式表达阶段所使用的 60 核多处理器的数据路径。
3. **使用与领域匹配的最简单形式的并行性。**
   Catapult 选择与应用程序匹配的并行性形式。例如,Catapult 对于 CNN 应用程序使用二维 SIMD 并行性,而在机器评分阶段的流排名中使用 MISD 并行性。
4. **将数据大小和类型减少到领域所需的最简单形式。**
   Catapult 可以使用应用程序所需的任何大小和类型的数据,从 8 位整数到 64 位浮点数。
5. **使用领域特定的编程语言将代码移植到 DSA。**
   在这种情况下,编程是用硬件寄存器传输语言(RTL)Verilog 完成的,这是一种比 C 或 C++ 甚至更低效的语言。由于使用 FPGA,微软未能(也可能无法)遵循此指导原则。尽管该指导原则涉及将应用程序从软件移植到 FPGA 的一次性过程,但应用程序并不是一成不变的。几乎可以说,软件会不断演变,以添加功能或修复错误,尤其是对于像网络搜索这样重要的东西。维护成功程序的成本可能占软件开发成本的大部分。此外,在 RTL 中编程时,软件维护甚至更加繁重。微软的开发人员和其他使用 FPGA 作为加速器的开发人员一样,希望未来领域特定语言和硬件软件协同设计系统的进步能够减少编程 FPGA 的难度。
7.6 Intel Crest, a Data Center Accelerator for Training
Intel CEO 发表的引言出现在第 7.3 节的开头,来自于宣布英特尔将开始为深度神经网络(DNN)推出专用加速器(DSA,简称“加速器”)的新闻发布会。第一个例子是 Crest,这款产品在我们编写本版本时宣布。尽管细节有限,我们还是在这里提到它,因为像英特尔这样的传统微处理器制造商采取这种大胆步骤来拥抱 DSA,具有重要意义。
Crest 主要用于 DNN 训练。英特尔 CEO 表示,目标是在未来三年内将 DNN 训练速度提高 100 倍。图 7.6 显示训练可能需要一个月时间。显然,市场上可能会有需求将 DNN 训练时间缩短到仅八小时,这将比 CEO 预期的速度快 100 倍。
DNN 在未来三年肯定会变得更加复杂,这将需要更大的训练努力。因此,似乎不太可能出现训练提升 100 倍的情况过度的风险。
Crest 指令操作于 32 × 32 的矩阵块上。Crest 使用一种叫做“flex point”的数值格式,这是一种缩放的定点表示:16 位数据的 32 × 32 矩阵共享一个 5 位的指数,这个指数作为指令集的一部分提供。

图 7.28 显示了 Lake Crest 芯片的框图。为了对这些矩阵进行计算,Crest 使用了图 7.28 中的 12 个处理集群。每个集群包括一个大型 SRAM,一个线性代数处理单元,以及少量用于芯片内外路由的逻辑。四个 8 GiB HBM2 DRAM 模块提供 1 TB/s 的内存带宽,这应该为 Crest 芯片提供了一个有吸引力的 Roofline 模型。除了高带宽的主内存路径外,Lake Crest 还支持处理集群内部计算核心之间的高带宽互连,这促进了快速的核心间通信,而不需要经过共享内存。Lake Crest 的目标是在训练上比 GPU 提高 10 倍。
图 7.28 显示了 12 个芯片间连接(ICL)和 2 个芯片间控制器(ICC),因此可以明显看出,Crest 的设计允许多个 Crest 芯片协同工作,这与 Catapult 中连接 48 个 FPGA 的专用网络在精神上相似。训练性能提升 100 倍的目标可能需要将多个 Crest 芯片连接在一起。
7.7 Pixel Visual Core, a Personal Mobile Device Image Processing Unit
Pixel Visual Core 是 Google 开发的可编程、可扩展的专用加速器(DSA),旨在用于图像处理和计算机视觉,最初面向运行 Android 操作系统的手机和平板电脑,未来可能扩展到物联网(IoT)设备。它采用多核设计,支持 2 到 16 个核心,以实现所需的性价比。它可以是独立的芯片,也可以是系统单芯片(SOC)的一部分。与其 TPU 兄弟相比,它的面积和能耗预算要小得多。图 7.29 列出了本节中出现的术语和缩写。

Pixel Visual Core 是我们称之为图像处理单元(IPUs)的一类新的领域特定架构的例子。IPUs 解决了 GPU 的逆问题:它们分析和修改输入图像,而不是生成输出图像。我们称其为 IPUs,表示作为一种 DSA,它们不需要在所有方面都表现良好,因为系统中还会有 CPU(和 GPU)来执行非输入视觉任务。IPUs 依赖于上述提到的用于卷积神经网络(CNN)的模板计算。
Pixel Visual Core 的创新之处在于用二维处理单元(PEs)的阵列替代了 CPU 的一维 SIMD 单元。它们为 PEs 提供了一个二维的移位网络,能够感知元素之间的二维空间关系,并提供一个二维版本的缓冲区,以减少对外部芯片内存的访问。这种新颖的硬件使得执行对视觉处理和 CNN 算法至关重要的模板计算变得容易。
### ISP:IPU 的硬件前身
大多数便携式移动设备(PMD)都配备了多个摄像头进行输入,这导致了用于增强输入图像的硬件加速器——图像信号处理器(ISP)的出现。ISP 通常是一个固定功能的应用特定集成电路(ASIC)。如今几乎每个 PMD 都包含一个 ISP。

图 7.30 显示了图像信号处理器(ISP)、CPU、DRAM、镜头和传感器之间的互连示意图。ISP 将统计信息发送给 CPU,以及改进后的图像,后者可以发送到显示器或存储到 DRAM 中以便后续处理。然后,CPU 处理图像统计信息,并发送信息以使系统进行自适应:将自动白平衡(AWB)发送到 ISP,将自动曝光(AE)发送到传感器,将自动对焦(AF)发送到镜头,这三者合称为 3A。
图 7.30 显示了一个典型的图像处理系统的组织结构,包括镜头、传感器、ISP、CPU、DRAM 和显示器。ISP 接收图像,去除镜头和传感器所带来的图像伪影,插值缺失的颜色,并显著改善图像的整体视觉质量。PMD 的镜头通常较小,因此像素非常细小且噪声较大,因此这一步骤对于生成高质量的照片和视频至关重要。
ISP 通过计算一系列级联算法以光栅扫描顺序处理输入图像,通常采用软件可配置的硬件构建块组织成一个管道,以最小化内存流量。在管道的每个阶段和每个时钟周期中,输入几个像素并输出几个像素。计算通常在小的像素邻域(模板)上进行。各个阶段通过称为行缓冲区的缓冲区连接。行缓冲区通过捕捉足够的完整行中间图像,帮助保持处理阶段的利用率,从而利用空间局部性以便于下一个阶段所需的计算。
增强后的图像要么发送到显示器,要么存储到 DRAM 中以便后续处理。ISP 还会将图像的统计信息(例如,颜色和亮度直方图、清晰度等)发送给 CPU,CPU 进一步处理这些信息,以帮助系统适应。
尽管 ISP 效率高,但它们存在两个主要缺点。考虑到便携设备对图像质量提高的不断需求,第一个缺点是 ISP 的灵活性不足,特别是设计和制造一个新的 ISP 在系统单芯片(SOC)内需要数年时间。第二个缺点是这些计算资源只能用于图像增强功能,而不能满足 PMD 上任何时候所需的其他功能。当前一代 ISP 在 PMD 的功耗预算下能处理高达 2 兆操作每秒的工作负载,因此,DSA 的替代方案必须实现类似的性能和效率。
Pixel Visual Core 软件
Pixel Visual Core 将图像信号处理器(ISP)内核的典型硬件管道组织形式推广为一个有向无环图(DAG)。Pixel Visual Core 的图像处理程序通常使用 Halide 编写,Halide 是一种针对图像处理的领域特定函数式编程语言。图 7.31 是一个 Halide 示例,用于模糊图像。Halide 包含一个函数部分,用于表达正在编程的功能,还有一个单独的调度部分,用于指定如何将该功能优化到底层硬件上。

### Pixel Visual Core 架构理念
PMD 的功耗预算为 6-8 瓦特,持续 10-20 秒,然后在屏幕关闭时降至几十毫瓦。考虑到 PMD 芯片的能源目标非常具有挑战性,Pixel Visual Core 架构受到第一章中提到的原始操作的相对能源成本的强烈影响,并在图 7.32 中明确体现。显著的是,单次 8 位 DRAM 访问所需的能量相当于 12,500 次 8 位加法或 7-100 次 8 位 SRAM 访问,这取决于 SRAM 的组织结构。IEEE 754 浮点操作相比于 8 位整数操作的更高成本(22“到 150”),加上存储较窄数据的芯片面积和能量效益,强烈支持在算法能够适应时使用较窄的整数。

除了第 7.2 节中的指导方针外,这些观察还引导了 Pixel Visual Core 设计的其他主题:
- **二维优于一维**:二维组织在处理图像时可能是有益的,因为它最小化了通信距离,并且图像数据的二维和三维特性可以利用这样的组织结构。
- **距离越近越好**:移动数据是昂贵的。此外,将数据移动到 ALU 操作的相对成本正在增加。当然,DRAM 的时间和能量成本远远超过任何本地数据存储或移动的成本。
从 ISP 转向 IPU 的主要目标是通过可编程性获得更多的硬件重用。以下是 Pixel Visual Core 的三个主要特征:
1. 遵循“二维优于一维”的主题,Pixel Visual Core 采用二维 SIMD 架构,而非一维 SIMD 架构。因此,它具有一个独立处理元素(PE)的二维数组,每个 PE 包含 2 个 16 位 ALU、1 个 16 位 MAC 单元、10 个 16 位寄存器和 10 个 1 位谓词寄存器。16 位算术遵循提供领域所需精度的指导方针。
2. Pixel Visual Core 在每个 PE 需要临时存储。遵循第 7.2 节中避免使用缓存的指导方针,这种 PE 存储是编译器管理的暂存内存。每个 PE 内存的逻辑大小为 128 个 16 位条目,即仅 256 字节。由于在每个 PE 中实现单独的小 SRAM 效率低,Pixel Visual Core 而是将 8 个 PE 的内存组合在一个宽的 SRAM 块中。由于 PEs 以 SIMD 方式操作,Pixel Visual Core 可以将所有单个读写操作绑定在一起,形成一个“更方正”的 SRAM,这比狭窄且深或宽且浅的 SRAM 更高效。图 7.33 显示了四个 PEs。

3. 为了能够在所有 PE 中执行同时的模板计算,Pixel Visual Core 需要从最近的邻居收集输入。这种通信模式需要一个“ NSEW”(北、南、东、西)移位网络:它可以在任何方向上批量移动 PE 之间的数据。为了在图像移动时不丢失边缘像素,Pixel Visual Core 将网络的端点连接在一起,形成一个环面。
需要注意的是,移位网络与 TPU 和 Catapult 中的处理元素数组的脉动阵列形成对比。在这种情况下,软件明确地将数据向所需方向移动,而脉动方法是由硬件控制的二维管道,以波前的形式移动数据,这对软件是不可见的。
### Pixel Visual Core Halo
一个 3×3、5×5 或 7×7 的模板将从正在计算的二维子集边缘的 1、2 或 3 个外部像素获取输入(模板尺寸的一半减去半个像素的维度)。这留下了两个选择:要么 Pixel Visual Core 在边界附近的元素中未充分利用硬件,因为它们仅传递输入值,要么 Pixel Visual Core 稍微扩展二维处理元素(PE),使用简化的 PE,而不包含算术逻辑单元(ALU)。由于标准 PE 和简化 PE 之间的尺寸差异约为 2.2“,因此 Pixel Visual Core 拥有一个扩展数组。这个扩展区域被称为光晕(halo)。图 7.34 显示了一个 8×8 PE 数组周围的两行光晕,并说明了左上角的 5×5 模板计算如何依赖于光晕。

### 图 7.34 这个图展示了一个由完整处理元素(以未阴影的圆圈表示)组成的二维数组,周围环绕着两层简化处理元素(以阴影的菱形表示),称为光晕(halo)。在这个图中,有 8×8 或 64 个完整的 PE,光晕中有 80 个简化 PE。(Pixel Visual Core 实际上有 16×16 或 256 个完整 PE,以及两层光晕,因此有 144 个简化 PE。)光晕的边缘连接在一起(以灰色线条表示),形成一个环面。Pixel Visual Core 在所有处理元素之间进行一系列的二维移动,以将每个模板计算的邻近部分移入模板的中心 PE。左上角展示了一个 5×5 的模板示例。请注意,25 个数据点中有 16 个来自光晕处理元素。
### Pixel Visual Core 的处理器
16×16 个处理元素(PE)以及每个维度中的 4 条光晕通道的集合称为 PE 数组或向量数组,是 Pixel Visual Core 的主要计算单元。它还具有一个称为 Sheet Generator (SHG) 的负载-存储单元。SHG 指的是对 1×1 到 256×256 像素块的内存访问,这些块称为“表单”(sheets)。这一过程发生在下采样过程中,典型的值为 16×16 或 20×20。
Pixel Visual Core 的实现可以根据可用资源拥有任意偶数个 2 个或更多的核心。因此,它需要一个网络将这些核心连接在一起,因此每个核心也有一个与芯片网络(Network on Chip,NOC)的接口。然而,Pixel Visual Core 的典型 NOC 实现并不会采用昂贵的交叉开关,因为那需要数据在较长距离内传输,而这会增加成本。利用应用程序的管道特性,NOC 通常只需要与相邻的核心进行通信。它被实现为一个二维网格,这样可以在软件控制下实现对成对核心的电源门控。
最后,Pixel Visual Core 还包括一个称为标量通道(scalar lane,SCL)的标量处理器。它与向量通道相同,只是增加了处理跳转、分支和中断的指令,控制指令流向向量数组,并调度所有针对表单生成器的加载和存储。它还有一个小型指令内存。请注意,Pixel Visual Core 具有单一的指令流来控制标量和向量单元,类似于 CPU 核心如何为其标量和 SIMD 单元提供单一的指令流。
除了核心之外,还有一个 DMA 引擎用于在 DRAM 和行缓冲区之间传输数据,同时高效地在图像内存布局格式之间进行转换(例如,打包/解包)。除了顺序访问 DRAM,DMA 引擎还执行类似向量的 DRAM 聚合读取,以及顺序和跨步的读取和写入。
### Pixel Visual Core 指令集架构
像 GPU 一样,Pixel Visual Core 采用两步编译过程。第一步是将目标语言(例如 Halide)中的程序编译为 vISA 指令。Pixel Visual Core 的 vISA(虚拟指令集架构)部分受到 RISC-V 指令集的启发,但它使用特定于图像的内存模型,并扩展指令集以处理图像处理,特别是二维图像的概念。在 vISA 中,核心的二维数组是无限的,寄存器的数量没有限制,内存大小同样没有限制。vISA 指令包含纯函数,这些函数不会直接访问 DRAM(见图 7.36),这大大简化了将它们映射到硬件上的过程。

下一步是将 vISA 程序编译为 pISA(物理指令集架构)程序。将 vISA 作为编译器的目标,使得处理器能够与过去的程序软件兼容,同时接受 pISA 指令集的更改,因此 vISA 在功能上与 GPU 的 PTX 相似(见第 4 章)。从 vISA 降级到 pISA 包括两个步骤:编译和使用早绑定参数的映射,然后使用晚绑定参数修补代码。必须绑定的参数包括 STP 大小、光晕大小、STP 数量、行缓冲区的映射、内核到处理器的映射,以及寄存器和局部内存分配。

图 7.35 显示 pISA 是一个非常长的指令字(VLIW)指令集,指令宽度为 119 位。前 43 位字段用于标量通道,接下来的 38 位字段指定由二维 PE 数组进行的计算,第三个 12 位字段指定二维 PE 数组的内存访问。最后两个字段是用于计算或寻址的立即数。所有 VLIW 字段的操作都是您所期望的:二进制补码整数运算、饱和整数运算、逻辑运算、位移、数据传输,以及一些特殊操作,如除法迭代和计数前导零。标量通道支持二维 PE 数组中的操作超集,并添加了用于控制流和表单生成器控制的指令。上述提到的 1 位谓词寄存器使得条件移动到寄存器成为可能(例如,若 C,则 A = B)。
尽管 pISA VLIW 指令非常宽,但 Halide 内核通常较短,通常只有 200 到 600 条指令。请记住,作为一个 IPU,它只需要执行应用程序的计算密集部分,其余的功能则留给 CPU 和 GPU。因此,Pixel Visual Core 的指令存储器仅保存 2048 条 pISA 指令(28.5 KiB)。
标量通道发出访问行缓冲区的指令生成器指令。与 Pixel Visual Core 内部的其他内存访问不同,这些访问的延迟可能超过 1 个时钟周期,因此它们具有类似 DMA 的接口。通道首先在特殊寄存器中设置地址和传输大小。
**Pixel Visual Core 示例**

图 7.36 显示了从 Halide 编译器输出的 vISA 代码,针对图 7.31 中的模糊示例,添加了注释以便于理解。它首先在 x 方向计算模糊,然后在 y 方向使用 16 位算术进行计算。该 vISA 代码与 Halide 程序的功能部分相匹配。这段代码可以被视为在图像的所有像素上执行。
### Pixel Visual Core 处理单元
架构设计的一个决策是如何构建 halo。Pixel Visual Core 使用 16×16 的处理单元(PE),并增加了 2 个额外元素的 halo,因此它可以直接支持 5×5 的模板。请注意,PE 数组越大,支持特定模板大小的 halo 开销就越小。
对于 Pixel Visual Core,halo PE 的较小尺寸和 16×16 数组意味着 halo 的面积仅增加 20%。对于 5×5 的模板,Pixel Visual Core 每个时钟周期可以计算 1.8 倍的结果(162/122),而对于 3×3 的模板,比例为 1.3(162/142)。
PE 的算术单元设计是以乘加(MAC)为驱动的,乘加是模板计算的一种基本运算。Pixel Visual Core 的本地 MAC 在乘法时为 16 位宽,但可以以 32 位宽进行累加。由于读写额外的流水线寄存器会不必要地消耗能量,因此流水线 MAC 会影响时钟周期。乘法加法硬件决定了时钟周期。其他操作是之前提到的传统逻辑和算术运算,以及饱和版本的算术运算和一些专用指令。
PE 具有两个 16 位的算术逻辑单元(ALU),可以在单个时钟周期内以多种方式操作:
- 独立操作,产生两个 16 位的结果:A op B, C op D。
- 融合操作,产生一个 16 位的结果:A op (C op D)。
- 结合操作,产生一个 32 位的结果:A:C op B:D。
### 二维行缓冲区及其控制器
由于 DRAM 访问消耗了大量能量(见图 7.32),Pixel Visual Core 的内存系统经过精心设计,以尽量减少 DRAM 访问的次数。关键创新是二维行缓冲区。
内核在逻辑上运行在独立的核心上,并以有向无环图(DAG)的形式连接,输入来自传感器或 DRAM,输出到 DRAM。行缓冲区在内核之间保存正在计算的图像部分。

图 7.37 显示了 Pixel Visual Core 中行缓冲区的逻辑使用。
以下是二维行缓冲区必须支持的四个特性:
1. 必须支持各种大小的二维模板计算,这些大小在设计时是未知的。
2. 由于 halo 的存在,对于 Pixel Visual Core 中的 16×16 PE 数组,STP 希望从行缓冲区读取 20×20 像素块,并将 16×16 像素块写入行缓冲区。(如前所述,他们将这些像素块称为 sheets。)
3. 由于 DAG 是可编程的,我们需要可以由软件在任意两个核心之间分配的行缓冲区。
4. 几个核心可能需要从同一行缓冲区读取数据。因此,行缓冲区应支持多个消费者,但只需一个生产者。
Pixel Visual Core 中的行缓冲区实际上是建立在相对大量的 SRAM 之上的多读者、二维 FIFO 抽象:每个实例 128 KiB。它包含仅使用一次的临时“图像”,因此小型、专用的本地 FIFO 比远程内存中的缓存要高效得多。
为了适应读取 20×20 像素块和写入 16×16 像素块之间的大小不匹配,FIFO 中的基本分配单位是 4×4 像素组。每个模板处理器有一个行缓冲池(LBP),可以有八个逻辑行缓冲区(LB),以及一个用于 DMA 的 I/O LBP。
LBP 具有三个抽象层次:
1. 在顶部,LBP 控制器支持作为逻辑实例的八个 LB。每个 LB 有一个 FIFO 生产者和最多八个 FIFO 消费者。
2. 控制器跟踪每个 FIFO 的一组头指针和尾指针。注意,LBP 内部行缓冲区的大小是灵活的,由控制器决定。
3. 在底部,有许多物理内存块以支持带宽需求。Pixel Visual Core 具有八个物理内存块,每个块具有 128 位接口和 16 KiB 的容量。
LBP 的控制器具有挑战性,因为它必须满足 STP 和 I/O DMA 的带宽需求,并调度它们对物理 SRAM 内存块的所有读写操作。LBP 控制器是 Pixel Visual Core 中最复杂的部分之一。
### Pixel Visual Core 实现

Pixel Visual Core 的第一次实现是作为一个独立芯片。图 7.38 显示了该芯片的布局,芯片拥有 8 个核心。该芯片于 2016 年在 TSMC 28 nm 工艺下制造。芯片尺寸为 6" × 7.2 mm,工作频率为 426 MHz,并与 512 MB DRAM 叠加在一起,形成硅封装(Silicon in Package)。根据工作负载的不同,芯片的功耗(包括 DRAM)在 187 到 4500 mW 之间变化。约 30% 的功耗用于控制的 ARMv7 A53 核心、MIPI、PCIe 和 LPDDR 接口,接口的面积超过了这颗芯片的一半,达到了 23 mm²。

在运行最坏情况下的“功率病毒”时,Pixel Visual Core 的功耗可以高达 3200 mW。图 7.39 显示了一个核心的布局。
### 总结:Pixel Visual Core 如何遵循指导原则
Pixel Visual Core 是一种用于图像和视觉处理的多核数据专用架构(DSA),旨在作为独立芯片或移动设备 SOC 的 IP 模块。正如我们在第 7.9 节中将看到的,它在卷积神经网络(CNN)方面的每瓦性能比 CPU 和 GPU 高出 25 到 100 倍。以下是 Pixel Visual Core 如何遵循第 7.2 节中的指导原则。
1. **使用专用存储器以最小化数据移动的距离。**  
   Pixel Visual Core 最显著的架构特征之一是软件控制的二维行缓冲区。每个核心有 128 KiB 的行缓冲区,占据了相当大的面积。每个核心还拥有 64 KiB 的软件控制的处理单元(PE)内存用于临时存储。
2. **将省下的资源从放弃先进的微架构优化转投入更多的算术单元或更大的存储器。**  
   Pixel Visual Core 的另两个关键特性是每个核心有一个 16 × 16 的二维处理单元阵列,以及处理单元之间的二维移位网络。它提供了一个光环区域,充当缓冲区,允许其 256 个算术单元的充分利用。
3. **使用与领域匹配的最简单形式的并行性。**  
   Pixel Visual Core 依赖于二维 SIMD 并行性,利用其处理单元阵列,使用超长指令字(VLIW)来表达指令级并行性,并使用多程序多数据(MPMD)并行性来充分利用多个核心。
4. **将数据大小和类型简化到领域所需的最简单形式。**  
   Pixel Visual Core 主要依赖于 8 位和 16 位整数,但它也支持 32 位整数,尽管速度较慢。
5. **使用特定领域的编程语言将代码移植到 DSA。**  
   Pixel Visual Core 使用领域特定语言 Halide 进行图像处理编程,并使用 TensorFlow 进行卷积神经网络编程。
7.8 Cross-Cutting Issues Heterogeneity and System on a Chip (SOC)
将 DSA 集成到系统中的简单方法是通过 I/O 总线,这也是本章数据中心加速器采用的方法。为了避免通过较慢的 I/O 总线获取内存操作数,这些加速器配备了本地 DRAM。
阿姆达尔定律提醒我们,加速器的性能受限于主机内存和加速器内存之间数据传输的频率。肯定会有一些应用受益于将主机 CPU 和加速器集成到同一个系统芯片(SoC)中,这也是 Pixel Visual Core 及最终 Intel Crest 的目标之一。
这样的设计被称为 IP 块,代表知识产权(Intellectual Property),但一个更具描述性的名称可能是可移植设计块(portable design block)。IP 块通常使用硬件描述语言(如 Verilog 或 VHDL)来指定,以便集成到 SoC 中。IP 块使得市场上出现了许多公司可以生产 IP 块,其他公司则可以购买这些块以构建适用于其应用的 SoC,而不必自己设计所有内容。图 7.40 显示了 IP 块的重要性,通过绘制 Apple PMD SoC 各代的 IP 块数量,可以看到它们在短短四年内增加了三倍。另一个表明 IP 块重要性的例子是,CPU 和 GPU 仅占 Apple SoC 的三分之一面积,而 IP 块则占据了剩余部分(Shao 和 Brooks,2015)。

设计 SoC 就像城市规划,各个独立小组为有限资源进行游说,而找到合适的折衷方案则很困难。CPU、GPU、缓存、视频编码器等具有可调设计,可以缩小或扩大以使用更多或更少的面积和能量,从而提供更多或更少的性能。预算会因 SoC 是用于平板电脑还是物联网而有所不同。因此,IP 块必须在面积、能量和性能上具备可扩展性。此外,新 IP 块提供小资源版本尤其重要,因为它可能尚未在 SoC 生态系统中建立稳固的基础;如果初始资源请求能够适度,采用就会容易得多。Pixel Visual Core 的方法是多核设计,允许 SoC 工程师在 2 到 16 个核心之间选择,以匹配面积、功耗预算和期望性能。
有趣的是,集成的吸引力是否会导致大多数数据中心处理器来自传统的 CPU 公司,且这些 CPU 芯片上集成了 IP 加速器,还是系统公司将继续设计自己的加速器并在其 ASIC 中包含 IP CPU。
### 开放指令集
设计 DSA 的一个挑战是如何与 CPU 协作以运行其余应用程序。如果它要在同一个 SoC 上,那么一个重要的决定就是选择哪个 CPU 指令集,因为直到最近,几乎每个指令集都属于单一公司。过去,SoC 的实际第一步是与一家公司签署合同以锁定指令集。另一种选择是设计自己的定制 RISC 处理器,并将编译器和库移植到上面。许可 IP 核的成本和麻烦导致 SoC 中出现了出乎意料的数量的 DIY 简单 RISC 处理器。一位 AMD 工程师估计,现代微处理器中有 12 种指令集!
RISC-V 提供了第三种选择:一种可行的免费开放指令集,预留了大量操作码空间用于为特定领域的协处理器添加指令,这使得之前提到的 CPU 和 DSA 之间的紧密集成成为可能。SoC 设计师现在可以选择一个标准指令集,该指令集带有大量支持软件,而不必签署合同。
他们仍然需要在设计早期选择指令集,但不必选择一个公司并签署合同。他们可以自己设计一个 RISC-V 核心,可以从多个销售 RISC-V IP 块的公司购买一个,或者可以下载由其他人开发的免费开源 RISC-V IP 块。最后一种情况类似于开源软件,提供网页浏览器、编译器、操作系统等,志愿者为用户维护并免费提供下载和使用。
作为额外的好处,开放指令集的特性改善了小公司提供 RISC-V 技术的商业案例,因为客户不必担心拥有自己独特指令集的公司的长期生存能力。
RISC-V 对 DSA 另一个吸引力在于,指令集的重要性不如通用处理器那么高。如果 DSA 使用更高层次的抽象编程,比如 DAG 或并行模式(例如 Halide 和 TensorFlow),那么在指令集层面上的工作就会减少。此外,在一个通过添加 DSA 来实现性能和能耗进步的世界中,二进制兼容性可能不再像过去那样重要。
在撰写本文时,开放 RISC-V 指令集的未来看起来充满希望。(我们希望能窥探未来,了解 RISC-V 从现在到本书下一版的状态!)
7.9 Putting It All Together: CPUs Versus GPUs Versus DNN Accelerators
我们现在使用深度神经网络(DNN)领域来比较本章中加速器的成本性能。我们首先对 TPU 与标准 CPU 和 GPU 进行全面比较,然后再简要比较 Catapult 和 Pixel Visual Core。图 7.41 显示了我们在此比较中使用的六个基准。这些基准包含了第 7.3 节中三种类型 DNN 的每种类型的两个示例。这六个基准代表了 2016 年 Google 数据中心中 TPU 推理工作负载的 95%。它们通常用 TensorFlow 编写,令人惊讶的是,它们的代码非常简短:仅有 100 到 1500 行代码。它们是运行在主机服务器上的更大应用程序中的小部分,而这些应用程序的 C++ 代码可能多达数千到数百万行。应用程序通常是面向用户的,这导致了严格的响应时间限制,正如我们将看到的那样。图 7.42 和 7.43 显示了正在比较的芯片和服务器。它们是与 TPU 部署同时在 Google 数据中心部署的服务器级计算机。为了在 Google 数据中心部署,它们至少必须检查内部内存错误,这排除了某些选择,例如 Nvidia Maxwell GPU。为了让 Google 购买和部署这些机器,这些机器必须合理配置,而不是仅仅为了赢得基准测试而组装的笨拙人工制品。传统的 CPU 服务器由一款 18 核、双插槽的 Intel Haswell 处理器代表。这个平台也是 GPU 或 TPU 的主机服务器。

图 7.41 显示了六个 DNN 应用程序(每种 DNN 类型两个),它们代表了 TPU 工作负载的 95%。这 10 列包括:DNN 名称、代码行数、DNN 中的层类型及数量(FC 为全连接层;Conv 为卷积层;Element 为 LSTM 的逐元素操作,见第 7.3 节;Pool 为池化层,是一个降维阶段,用平均值或最大值替代一组元素);权重数量;TPU 的运算强度;以及 2016 年 TPU 应用程序的受欢迎程度。由于批量大小的不同,TPU、CPU 和 GPU 之间的运算强度各不相同。TPU 可以拥有更大的批量大小,同时仍能保持在响应时间限制之内。一个 DNN 是 RankBrain(Clark, 2015),一个 LSTM 是 GNM Translate(Wu et al., 2016),一个 CNN 是 DeepMind AlphaGo(Silver et al., 2016;Jouppi, 2016)。

Haswell 是采用 Intel 22 纳米工艺制造的。CPU 和 GPU 都是非常大的芯片:约 600 mm²!GPU 加速器是 Nvidia K80。每个 K80 卡包含两个芯片,并且在内部内存和 DRAM 上提供 SECDED。Nvidia 表示(Nvidia, 2016),K80 加速器通过使用更少、更强大的服务器显著降低了数据中心的成本,提供了应用程序性能。2015 年,DNN 研究人员频繁使用 K80,这也是它们在 Google 部署的时间。请注意,K80 也被 Amazon Web Services 和 Microsoft Azure 在 2016 年底选择用于新的基于云的 GPU。由于每个经过基准测试的服务器的芯片数量在 2 到 8 之间变化,以下图表显示的是每个芯片标准化后的结果,除了图 7.50,它比较了整个服务器的性能/瓦特。
性能:Roofline模型、响应时间和吞吐量  
为了说明在三种处理器上六个基准测试的性能,我们借鉴了第四章中的Roofline性能模型。为了将Roofline模型应用于TPU,当深度神经网络(DNN)应用被量化时,我们首先将浮点运算替换为整数乘加运算。由于权重通常不适合DNN应用的片上内存,第二个变化是重新定义操作强度为每读取字节权重的整数运算数(见图7.41)。

 

图7.44 TPU Roofline。其峰值点位于右侧,达到每字节权重内存1350次乘加运算。CNN1的性能远低于其Roofline,相比于其他DNN,CNN1花费了大约三分之一的时间等待权重加载到矩阵单元中,并且由于CNN中某些层的特征深度较浅,导致矩阵单元中只有一半的元素持有有效值(Jouppi等,2017)。
图7.44展示了在对数坐标系中单个TPU的Roofline模型。TPU的Roofline模型具有一条较长的“倾斜”部分,在该部分,操作强度意味着性能受到内存带宽的限制,而非峰值计算能力。六个应用中有五个正好触碰到上限:多层感知机(MLPs)和长短期记忆网络(LSTMs)受内存限制,而卷积神经网络(CNNs)受计算限制。唯一未触碰上限的DNN是CNN1。尽管CNN具有非常高的操作强度,CNN1的运行速度仅为每秒14.1万亿次运算(TOPS),而CNN0则以令人满意的86 TOPS运行。

 图7.45 限制神经网络工作负载TPU性能的因素,基于硬件性能计数器。第1、4、5和6行总和为100%,基于矩阵单元的活动测量。第2和3行进一步细分了在活动周期中,矩阵单元中64K权重中持有有效权重的比例。我们的计数器无法准确解释第6行中矩阵单元空闲时的时间;第7和8行显示了两种可能的原因,包括RAW管道危害和PCIe输入停顿。第9行(TOPS)基于生产代码的测量,而其他行基于性能计数器的测量,因此它们并不完全一致。此处未包括主机服务器的开销。MLP和LSTM受内存带宽限制,但CNN则不受此限制。CNN1的结果在文中进行了说明。
对于想深入了解CNN1的读者,图7.45利用性能计数器提供了TPU利用率的部分视图。TPU在执行CNN1的矩阵运算时,花费的周期不到一半(第7列,第1行)。在每一个活跃周期中,只有约一半的65,536个乘加运算单元(MACs)持有有效权重,因为CNN1中的某些层具有较浅的特征深度。大约35%的周期用于等待将权重从内存加载到矩阵单元,这发生在四个完全连接层上,这些层的操作强度仅为32。这留下了大约19%的周期未被矩阵相关计数器解释。由于TPU的重叠执行,我们无法准确计算这些周期,但我们可以看到,23%的周期由于数据依赖性在流水线中停顿,1%的周期因通过PCIe总线的输入停顿而浪费。  

图7.46和7.47展示了Haswell和K80的Roofline模型。这六个神经网络(NN)应用的表现通常比图7.44中的TPU更低于其上限。响应时间限制是原因之一。许多这些DNN应用是面向最终用户的服务的一部分。研究表明,响应时间的微小增加会导致客户减少对服务的使用(见第六章)。因此,尽管训练可能没有严格的响应时间截止日期,但推理通常有。这就是说,推理关注吞吐量的同时,也需保持延迟约束。  

图7.48说明了应用开发者要求的在Haswell和K80上为MLP0设定的99百分位响应时间限制7毫秒的影响。(每秒推理次数和7毫秒延迟包括服务器主机时间以及加速器时间。)如果响应时间限制放宽,它们分别可以以42%和37%的最高吞吐量运行MLP0。因此,尽管CPU和GPU的潜在吞吐量可能更高,但如果不能满足响应时间限制,这部分性能将被浪费。这些约束对TPU也有影响,但在图7.48中,TPU以80%的利用率运行,接近其最高的MLP0吞吐量。与CPU和GPU相比,单线程TPU没有第7.1节中讨论的复杂微架构特性,这些特性消耗晶体管和能量以改善平均情况,而不改善99百分位的情况。

图7.49给出了每个芯片的相对推理性能的总结,包括两个加速器的主机服务器开销。请记住,当架构师不知道将要运行的程序的实际组合时,会使用几何平均值。然而,对于此比较,我们确实知道组合(见图7.41)。图7.49最后一列使用实际组合的加权平均值显示,GPU的速度是CPU的最多1.9倍,TPU的速度是CPU的29.2倍,因此TPU的速度是GPU的15.3倍。
成本性能、总拥有成本(TCO)和性能/瓦特
在成千上万地购买计算机时,成本性能优于一般性能。在数据中心中,最佳的成本指标是总拥有成本(TCO)。谷歌实际支付的数千个芯片的价格取决于相关公司之间的谈判。出于商业原因,谷歌无法公布这样的价格信息或可能使其被推断的数据。然而,功耗与TCO相关,谷歌可以公布每台服务器的功率,因此我们使用性能/瓦特作为性能/TCO的代理。在本节中,我们比较的是服务器(图7.43),而不是单个芯片(图7.42)。

图7.50显示了K80 GPU和TPU相对于Haswell CPU的加权平均性能/瓦特。我们提供了两种不同的性能/瓦特计算方式。第一种(“总计”)在计算GPU和TPU的性能/瓦特时,包括主机CPU服务器的功耗。第二种(“增量”)在计算GPU和TPU的总功耗之前,从总功耗中减去主机CPU服务器的功耗。
对于总性能/瓦特,K80服务器的性能是Haswell的2.1倍。对于增量性能/瓦特,当省略Haswell功耗时,K80服务器的性能是2.9倍。TPU服务器的总性能/瓦特比Haswell高出34倍,这使得TPU服务器的性能/瓦特是K80服务器的16倍。相对的增量性能/瓦特(这是谷歌定制ASIC的依据)对于TPU是83倍,这使得TPU的性能/瓦特是GPU的29倍。
评估Catapult和Pixel Visual Core,Catapult V1以2.3倍的速度运行CNN,速度相当于一台2.1 GHz、16核的双插槽服务器(Ovtcharov等,2015a)。使用下一代FPGA(14纳米Arria 10),性能提高了7倍,经过更仔细的布线规划和处理单元的扩展,可能会提高到17倍(Ovtcharov等,2015b)。在这两种情况下,Catapult的功耗增加不到1.2倍。虽然这是不同的比较,但TPU运行其CNN的速度是某些更快服务器的40到70倍(参见图7.42、7.43和7.49)。
由于Pixel Visual Core和TPU都是由谷歌制造的,值得庆幸的是,我们可以直接比较CNN1的性能,这是一个常见的深度神经网络,尽管它需要从TensorFlow转换。它的批量大小为1,而不是TPU中的32。TPU以大约是Pixel Visual Core的50倍的速度运行CNN1,这使得Pixel Visual Core的速度大约是GPU的一半,稍快于Haswell。CNN1的增量性能/瓦特将Pixel Visual Core的性能提高到TPU的约一半,GPU的25倍,以及CPU的100倍。由于Intel Crest旨在用于训练而非推理,因此即使可以进行测量,将其包括在本节中也是不公平的。
7.10 Fallacies and Pitfalls
在早期的数字信号处理器(DSA)和深度神经网络(DNN)阶段,误解层出不穷。
**误解**:设计一款定制芯片的成本为1亿美元。

图7.51展示了一篇文章中的图表,揭穿了广为流传的1亿美元神话,实际上设计成本“仅为”5000万美元,其中大部分成本是工资(Olofsson, 2011)。请注意,作者的估计是针对包含DSA定义中所省略的特性的复杂处理器,因此即使开发过程没有改善,你也可以预计DSA设计的成本会更低。
那么,六年后我们为何更加乐观,尤其是在小型工艺技术的掩模成本甚至更高的情况下呢?
首先,软件是成本最大的部分,占近三分之一。使用领域特定语言编写的应用程序的可用性使得编译器可以完成将应用程序移植到DSA的大部分工作,正如我们在TPU和Pixel Visual Core中所看到的那样。开放的RISC-V指令集也将有助于降低系统软件的获取成本,并削减大量的知识产权成本。
通过多个项目共享单一掩模,可以节省掩模和制造成本。只要有小型芯片,令人惊讶的是,以3万美元的价格,任何人都可以获得100个未经测试的28纳米TSMC技术零件(Patterson和Nikoli!c,2015)。
或许最大的变化在于硬件工程,硬件工程占成本的四分之一以上。硬件工程师已经开始效仿软件同事,采用敏捷开发。传统的硬件流程不仅在设计需求、架构、逻辑设计、布局、验证等各个阶段有不同的流程,而且执行每个阶段的人员也有不同的职位名称。这个过程在计划、文档和排期方面较为繁重,部分原因是每个阶段的人事变动。
软件曾经也遵循这种“瀑布”模型,但项目常常超期、超预算甚至被取消,这导致了一种截然不同的方法。2001年的敏捷宣言基本上表示,与其使用传统的计划和文档方式,能够定期向客户展示一个不完整但可工作的原型的小团队更有可能按时按预算交付有用的软件。
现在,小型硬件团队也进行敏捷迭代(Lee等,2016)。为了减轻芯片制造的长期延迟,工程师们利用FPGA进行一些迭代,因为现代设计系统可以从单一设计生成FPGA的EDIF和芯片布局。FPGA原型的运行速度比芯片慢10到20倍,但这仍然比模拟器快得多。他们还进行“磁带输入”迭代,即对工作但不完整的原型进行所有的磁带输出工作,但不需要支付制造芯片的成本。
除了改进的开发流程,还有更现代的硬件设计语言来支持这些流程(Bachrach等,2012),以及从高级领域特定语言自动生成硬件的进展(Canis等,2013;Huang等,2016;Prabhakar等,2016)。可以免费下载和修改的开源核心也应该降低硬件设计的成本。
**陷阱**:性能计数器作为DSA硬件的附加思考而被添加。  
TPU有106个性能计数器,设计者希望有更多(见图7.45)。DSA的存在理由是性能,而在它们的演变过程中,现在还为时尚早,无法充分了解其运行情况。
**谬论**:建筑师正在解决正确的DNN任务。  
建筑界正关注深度学习:2016年ISCA会议上15%的论文集中于DNN的硬件加速器!然而,所有九篇论文都研究了CNN,只有两篇提到其他DNN。CNN比MLP更复杂,并且在DNN比赛中占据主导地位(Russakovsky等,2015),这可能解释了它们的吸引力,但它们仅占谷歌数据中心神经网络工作负载的约5%。因此,尝试以同样的热情加速MLP和LSTM似乎更为明智。
**谬论**:对于DNN硬件,每秒推理次数(IPS)是一个合理的总体性能指标。  
IPS不适合作为DNN硬件的单一总体性能摘要,因为它仅仅是应用中典型推理复杂度的倒数(例如,神经网络层的数量、大小和类型)。例如,TPU在360,000 IPS下运行4层的MLP1,但89层的CNN1仅为4700 IPS;因此TPU的IPS变化达到75倍!因此,将IPS作为唯一速度总结对神经网络加速器的误导性远高于MIPS或FLOPS对传统处理器的误导性,因此IPS更应被贬低。为了更好地比较DNN机器,我们需要一个高层次编写的基准测试套件,以便将其移植到各种DNN架构。Fathom是这样一个基准测试套件的一个有前景的新尝试(Adolf等,2016)。
**陷阱**:在设计DSA时对架构历史的无知。  
在通用计算中未能成功的想法可能非常适合DSA,因此了解历史的架构师可能会拥有竞争优势。对于TPU,有三个重要的架构特征可以追溯到1980年代初期:脉冲阵列(Kung和Leiserson,1980)、解耦访问/执行(Smith,1982b)和CISC指令(Patterson和Ditzel,1980)。第一个特征减少了大型矩阵乘法单元的面积和功耗,第二个特征在矩阵乘法单元操作期间同时提取权重,而第三个特征则更好地利用了用于传送指令的PCIe总线的有限带宽。我们建议阅读本书每一章末尾的历史视角部分,以发现可能为您设计的DSA增光添彩的珍贵思想。
7.11 Concluding Remarks
在本章中,我们看到了一些商业实例,展示了从改善通用计算机以使所有程序受益的传统目标,向利用数据特定架构(DSA)加速部分程序的转变。
Catapult 的两个版本通过设计一个小型低功耗 FPGA 板来保持数据中心的同质性,该 FPGA 板可以装入服务器。希望 FPGA 的灵活性能够使 Catapult 对许多当前应用程序以及部署后出现的新应用程序都能派上用场。Catapult 在搜索排序和卷积神经网络(CNN)的运行速度上超越了 GPU,为排名相较于 CPU 提供了 1.5 到 1.75 倍的性能/总拥有成本提升。
TPU 项目最初是以 FPGA 开始的,但在设计者得出当时的 FPGA 与 GPU 相比性能不具竞争力的结论后放弃了 FPGA。他们还认为 TPU 的功耗将远低于 GPU,同时速度相同或更快,这使得 TPU 有可能在性能上优于 FPGA 和 GPU。最终,TPU 并没有打破谷歌数据中心的同质性,因为其数据中心中的一些服务器已经配备了 GPU。TPU 基本上是跟随 GPU 的脚步,仅仅是另一种类型的加速器。
TPU 的非重复工程成本可能远高于 Catapult,但其回报也更大:ASIC 的性能和性能/瓦特都远高于 FPGA。风险在于 TPU 只适用于 DNN 推理,但正如我们所提到的,DNN 是一个有吸引力的目标,因为它们可以用于许多应用程序。在 2013 年,谷歌的管理层抱着信心,认为 2015 年及以后对 DNN 的需求将证明投资 TPU 的合理性。
Catapult 和 TPU 的确定性执行模型更适合用户应用程序的响应时间截止,而 CPU 和 GPU 的时间变化优化(如缓存、乱序执行、多线程、并行处理、预取等)则更多地帮助平均吞吐量而非延迟。缺乏此类特性有助于解释为什么尽管 TPU 拥有众多 ALU 和大内存,但其相对较小且低功耗。这个成就表明了阿姆达尔定律的一个“丰饶推论”:低利用率的大型廉价资源仍然可以提供高性价比的性能。
总之,TPU 成功用于 DNN 的原因在于其大型矩阵单元;大量软件控制的片上内存;能够运行整个推理模型以减少对主 CPU 的依赖;单线程的确定性执行模型很好地契合了 99 百分位的响应时间限制;足够的灵活性以匹配 2017 年及 2013 年的 DNN;由于省略了通用功能,尽管数据路径和内存较大,仍实现了小巧低功耗的芯片;量化应用程序使用 8 位整数;以及应用程序是使用 TensorFlow 编写的,这使得将它们高效地移植到 DSA 上变得简单,而不是必须重新编写以便在完全不同的硬件上良好运行。
Pixel Visual Core 展示了为 PMD 设计 DSA 的约束,涉及芯片尺寸和功耗。与 TPU 不同,Pixel Visual Core 是一个独立的处理器,能够自行获取指令。尽管主要针对计算机视觉,Pixel Visual Core 在性能/瓦特方面的表现比 K80 GPU 和 Haswell CPU 提高了一个到两个数量级。
对于 Intel Crest 进行评判还为时尚早,尽管其被 Intel CEO 热情宣布,标志着计算领域的转变。
### 架构复兴
在过去十年中,架构研究人员一直在发布基于有限基准的创新,声称通用处理器的性能提升不超过 10%。而如今,许多公司报告的专用硬件(DSA)产品的性能提升却达到了 10 倍或更多。
我们认为这表明该领域正在经历转变,并预计在下一个十年中将看到架构创新的复兴,原因包括:
- Dennard 缩放和摩尔定律的历史终结,这意味着提升成本-能耗-性能的需求将需要计算机架构的创新;
- Agile 硬件开发和新的硬件设计语言带来的生产力进步,这些语言充分利用了现代编程语言的进展;
- 由于免费和开放的指令集、开源 IP 模块以及商业 IP 模块(目前大多数 DSA 都基于这些)而降低的硬件开发成本;
- 上述生产力和开发成本的提升意味着研究人员可以通过在 FPGA 或定制芯片中构建自己的想法来证明它们,而不是试图用模拟器说服怀疑者;
- DSA 的潜在优势及其与领域特定编程语言的协同效应。
我们相信,许多架构研究人员将构建出更高水平的 DSA,超越本章讨论的内容。我们迫不及待想要看到下一版书籍发布时计算机架构的世界会是什么样子!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值