本文参考网上可查询到的资料简要总结AI加速器的概念和应用等信息 1。
未完待续
更新: 2023 / 3 / 22
AI
、机器学习
、深度学习
最早可追溯到几十年前,但是在过去的十几年才开始流行。在接下来的文章内容中,前 苹果
、飞利浦
、Mellanox
(现属英伟达)工程师、普林斯顿大学博士 Adi Funchs
尝试从 AI加速器
的角度为我们寻找这些问题的答案。
过去,科技公司通过观察用户行为、研究市场趋势,在通常需要数月甚至数年时间的周期中优化产品线来改进产品。
如今,人工智能已经为无须人工干预就能驱动人机反馈的自我改进( self-improving
) 算法铺平了道路。这一切都是在数百万(甚至数十亿)用户的规模下完成的,并极大地缩短了产品优化周期。
人工智能的成功归功于三个重要的趋势:
在这里我们重点关注第3个趋势,具体来说,会对AI应用中的加速器做一个高层次的概述——AI加速器是什么?它们是如何变得如此流行的?
加速器源自一个更广泛的概念,而不仅仅是一种特定类型的系统或实现。而且,它们也不是纯硬件驱动的。事实上,AI加速器行业的大部分焦点都集中在构建稳健而复杂的软件库和编译器工具链上。
人工智能不仅仅是软件和算法
AI
,机器学习
、深度学习
的概念可以追溯到50多年以前,然而在过去的十几年才开始真正流行起来。
深度学习的开始源于 2012
年多伦多大学的 Alex Krizhevsky、Ilya Sutskever、Geoffrey Hinton 等人提出了一个名为 AlexNet
的深度神经网络并凭借该网络赢得了 2012
年大规模视觉识别挑战赛的冠军。在这场比赛中,参赛者需要完成一个名叫 object region
的任务,即给定一张包含某目标的图像和一串目标类别(如飞机、瓶子、猫),每个团队的实现都需要识别出图像中的目标属于哪个类。
AlexNet
的表现颇具颠覆性。这是获胜团队首次使用一种名为 卷积神经网络
( CNN
)的深度学习架构。由于表现过于惊艳,之后几年的 ImageNet
挑战赛冠军都沿用了 CNN
。这是计算机视觉史上的一个关键时刻,也激发了人们将深度学习应用于其他领域(如 NLP
、机器人、推荐系统)的兴趣。
ImageNet
挑战赛冠军团队的分类错误率逐年变化情况(越低越好)。
「为了加速训练,我们用到了非饱和神经元和一个非常高效的 GPU
卷积操作实现。」
事实证明,AlexNet
作者花了相当多的时间将耗时的卷积操作映射到 GPU
上。与标准处理器相比,GPU
能够更快地执行特定任务,如计算机图形和基于线性代数的计算( CNN
包含大量的此类计算)。高效的 GPU
实现可以帮他们缩短训练时间。他们还详细说明了如何将他们的网络映射到多个 GPU
,从而能够部署更深、更宽的网络,并以更快的速度进行训练。
拿 AlexNet
作为一个研究案例,我们可以找到一个回答开篇问题的线索:尽管算法方面的进展很重要,但使用专门的 GPU
硬件使我们能够在合理的时间内学习更复杂的关系(网络更深、更大 = 用于预测的变量更多),从而提高了整个网络的准确率。如果没有能在合理的时间框架内处理所有数据的计算能力,我们就不会看到深度学习应用的广泛采用。
如果我是一名 AI 从业者,我需要关心处理器吗?
作为一名 AI
从业者,如果你探索新的模型和想法,你或多或少需要熟悉一些底层硬件和如何调试性能,以减少你的推理和训练时间。
如果不懂硬件,你所花的时间可能会多 2
- 3
倍,有时甚至多一个数量级。简单地改变做矩阵乘法的方式可能帮你收获巨大的性能提升(或损失)。
那么,为什么不能保证得到最佳性能呢?因为我们还没有有效地达到合理的 user-to-hardware expressiveness
。我们有一些有效利用硬件的用例,但还没泛化到「开箱即用」的程度。这里的「开箱即用」指的是在你写出一个全新的 AI
模型之后,你无需手动调整编译器或软件堆栈就能充分利用你的硬件。
AI User-to-Hardware Expressiveness
上图说明了 user-to-hardware expressiveness
的主要挑战。我们需要准确地描述用户需求,并将其转换成硬件层(处理器、GPU
、内存、网络等)能够理解的语言。这里的主要问题是,虽然左箭头( programming frameworks
)主要是面向用户的,但将编程代码转换为机器码的右箭头却不是。因此,我们需要依靠智能的编译器、库和解释器来无缝地将你的高级代码转换为机器表示。
这种语义鸿沟难以弥合的原因有两个:
GPU
处理核心)、你的程序需要的内存数量、你的程序所展示的内存访问模式和数据重用类型,以及计算图中不同部分之间的关系。以上任何一种都可能以意想不到的方式对系统的不同部分造成压力。为了克服这个问题,我们需要了解硬件 / 软件堆栈的所有不同层是如何交互的。虽然你可以在许多常见的场景中获得良好的性能,但现实中还有无尽的长尾场景,你的模型在这些场景中可能表现极差。因此,你(用户)仍然需要探索正确的方法来识别计算耗时瓶颈。为此,你需要了解处理器,特别是当前的 AI
加速器,以及它们如何与你的 AI
程序交互。
回顾一下处理器的发展历史。
处理器是计算机系统中负责实际数字计算的部分。它接收用户输入数据(用数值表示),并根据用户的请求生成新的数据,即执行一组用户希望的算术运算。
随着计算密集型应用的日益普及和大量新用户数据的出现,当代计算系统必须满足对处理能力不断增长的需求,因此我们总是需要更好的处理器,更好意味着更快,即花同样的时间、使用更少的能源。
计算机系统的进化关键在于半导体行业,以及它如何改进处理器的速度、功率和成本。
处理器是由被称为 晶体管
的电子元件组成的。晶体管是逻辑开关,用作从原始逻辑函数(如 与
、或
、非
)到复杂算术( 浮点加法
、正弦函数
)、存储器(如 ROM
、DRAM
)等所有东西的构建模块。这些年来,晶体管一直在不断缩小。
处理器发展第一阶段:频率时代(1970-2000 年代)
早期,微处理器行业主要集中在 CPU
上,因为 CPU
是当时计算机系统的主力。微处理器厂商充分利用了缩放定律。具体来说,他们的目标是提高 CPU
的频率,因为更快的晶体管使处理器能够以更高的速率执行相同的计算(更高的频率 = 每秒更多的计算)。这是一种有些简单的看待事物的方式;处理器有很多架构创新,但最终,在早期,频率对性能有很大贡献,从英特尔 4004
的 0.5MHz
、486
的 50MHz
、奔腾的 500MHz
到奔腾 4
系列的 3–4GHz
。
功率密度的演变
大约在 2000
年,登纳德缩放比例定律开始崩溃。具体来说,随着频率的提升,电压停止以相同的速率下降,功率密度速率也是如此。如果这种趋势持续下去,芯片发热问题将不容忽视。然而,强大的散热方案还不成熟。因此,供应商无法继续依靠提高 CPU
频率来获得更高的性能,需要想想其他出路。
处理器发展第二阶段:多核时代(2000 年代 - 2010 年代中期)
停滞不前的 CPU
频率意味着提高单个应用的速度变得非常困难,因为单个应用是以连续指令流的形式编写的。但是,正如摩尔定律所说的那样,每过 18
个月,我们芯片中的晶体管就会变为原来的两倍。因此,这次的解决方案不是加快单个处理器的速度,而是将芯片分成多个相同的处理内核,每个内核执行其指令流。
CPU 和 GPU 核数的演化
对于 CPU
来说,拥有多个内核是很自然的,因为它已经在并发执行多个独立的任务,比如你的互联网浏览器、文字处理器和声音播放器(更准确地说,操作系统在创建这种并发执行的抽象方面做得很好)。因此,一个应用可以在一个内核上运行,而另一个应用可以在另一个内核上运行。通过这种实践,多核芯片可以在给定的时间内执行更多的任务。然而,为了加快单个程序的速度,程序员需要将其并行化,这意味着将原始程序的指令流分解成多个指令 子流
或 线程
。简单地说,一组线程可以以任何顺序在多个内核上并发运行,没有任何一个线程会干扰另一个线程的执行。这种实践被称为 多线程编程
,是单个程序从多核执行中获得性能提升的最普遍方式。
多核执行的一种常见形式是在 GPU
中。虽然 CPU
由少量快速和复杂的内核组成,但 GPU
依赖大量更简单的内核。通常来讲,GPU
侧重于图形应用,因为图形图像(例如视频中的图像)由数千个像素组成,可以通过一系列简单且预先确定的计算来独立处理。从概念上来说,每个像素可以被分配一个线程,并执行一个简单的「迷你程序」来计算其行为(如颜色和亮度级别)。高度的像素级并行使得开发数千个处理内核变得很自然。因此,在下一轮处理器进化中,CPU
和 GPU
供应商没有加快单个任务的速度,而是利用摩尔定律来增加内核数量,因为他们仍然能够在单个芯片上获得和使用更多的晶体管。
不幸的是,到了 2010
年前后,事情变得更加复杂:登纳德缩放比例定律走到了尽头,因为晶体管的电压接近物理极限,无法继续缩小。虽然以前可以在保持相同功率预算的情况下增加晶体管数量,但晶体管数量翻倍意味着功耗也翻倍。登纳德缩放比例定律的消亡意味着当代芯片将遭遇「利用墙( utilization wall
)」。此时,我们的芯片上有多少晶体管并不重要——只要有功耗限制(受芯片冷却能力的限制),我们就不能利用芯片中超过给定部分的晶体管。芯片的其余部分必须断电,这种现象也被称为「暗硅」。
处理器发展第三阶段:加速器时代(2010 年代至今)
暗硅本质上是「摩尔定律终结」的大预演——对处理器制造商来说,时代变得具有挑战性。一方面,计算需求飞速增长:智能手机变得无处不在,而且拥有强大的计算能力,云服务器需要处理越来越多的服务,「最糟糕的是」——人工智能重新登上历史舞台,并以惊人的速度吞噬计算资源。另一方面,在这个不幸的时代,暗硅成为晶体管芯片发展的障碍。因此,当我们比以往任何时候都更需要提高处理能力时,这件事却变得以往任何时候都更加困难。
自从新一代芯片被暗硅束缚以来,计算机行业就开始把精力放到了硬件加速器上。他们的想法是:如果不能再增加晶体管,那就好好利用现有的晶体管吧。具体怎么做呢?答案是:专门化。
传统的 CPU
被设计成通用的。它们使用相同的硬件结构来运行我们所有应用(操作系统、文字处理器、计算器、互联网浏览器、电子邮件客户端、媒体播放器等)的代码。这些硬件结构需要支持大量的逻辑操作,并捕获许多可能的模式和程序诱发的行为。这相当于硬件可用性很好,但效率相当低。如果我们只专注于某些应用,我们就可以缩小问题领域,进而从芯片中去除大量的结构冗余。
加速器是专门面向特定应用或领域的芯片,也就是说,它们不会运行所有应用(例如不运行操作系统),而是在硬件设计层面就考虑一个很窄的范围,因为:
1)它们的硬件结构仅满足特定任务的操作;
2)硬件和软件之间的接口更简单。具体来说,由于加速器在给定的域内运行,加速器程序的代码应该更紧凑,因为它编码的数据更少。
举个例子,假如你要开一家餐厅,但面积、用电预算是有限的。现在你要决定这个餐厅具体做哪些菜,
是比萨、素食、汉堡、寿司全做(a)
还是只做披萨(b)?
如果选 a,你的餐厅确实能满足很多口味不同的顾客,但你的厨师就要做很多菜,而且不见得每种都擅长。此外,你可能还需要买多个冰箱来存储不同的食材,并密切关注哪些食材用完了,哪些变质了,不同的食材还有可能混在一起,管理成本大大提高。
但如果选 b,你就可以雇佣一位顶级的披萨专家,准备少量的配料,再买一台定制的烤箱来做披萨。你的厨房会非常整洁、高效:一张桌子做面团,一张桌子放酱汁和奶酪,一张桌子放配料。但同时,这种做法也有风险:如果明天没有人想吃披萨怎么办?如果大家想吃的披萨用你定制的烤箱做不出来怎么办?你已经花了很多钱打造这个专门化的厨房,现在是进退两难:不改造厨房就可能面临关店,改造又要花一大笔钱,而且改完之后,客户的口味可能又变了。
回到处理器世界:类比上面的例子,CPU
就相当于选项 a,面向特定领域的加速器就是选项 b,店面大小限制就相当于硅预算。你将如何设计你的芯片?显然,现实并没有那么两极分化,而是有一个类似光谱的过渡区域。在这个光谱中,人们或多或少地用通用性来换取效率。早期的硬件加速器是为一些特定领域设计的,如 数字信号处理
、网络处理
,或者作为主 CPU
的辅助协处理器。
从 CPU
到主要加速应用领域的第一个转变是 GPU
。一个 CPU
有几个复杂的处理核心,每个核心都采用各种技巧,比如分支预测器和乱序执行引擎,以尽可能加快单线程作业的速度。GPU
的结构则有所不同。GPU
由许多简单的内核组成,这些内核具有简单的控制流并运行简单的程序。最初,GPU
用于图形应用,如计算机游戏,因为这些应用包含由数千或数百万像素组成的图像,每个像素都可以并行独立计算。一个 GPU
程序通常由一些核函数组成,称为「内核( kernel
)」。每个内核都包含一系列简单的计算,并在不同的数据部分(如一个像素或包含几个像素的 patch
)执行数千次。这些属性使得图形应用成为硬件加速的目标。它们行为简单,因此不需要分支预测器形式的复杂指令控制流;它们只需要少量操作,因此不需要复杂的算术单元(比如计算正弦函数或进行 64
位浮点除法的单元)。人们后来发现,这些属性不仅适用于图形应用,GPU
的适用性还可以扩展到其他领域,如线性代数或科学应用。如今,加速计算已经不仅仅局限于 GPU
。从完全可编程但低效的 CPU
到高效但可编程性有限的 ASIC
,加速计算的概念无处不在。
如今,随着越来越多表现出「良好」特性的应用程序成为加速的目标,加速器越来越受关注:视频编解码器
、数据库处理器
、加密货币矿机
、分子动力学
,当然还有 人工智能
。
是什么让 AI 成为加速目标?
商业可行性
设计芯片是一个费力、耗资的事情——你需要聘请行业专家、使用昂贵的工具进行芯片设计和验证、开发原型以及制造芯片。如果你想使用尖端的制程(例如现在的 5nm
CMOS
),耗资将达到数千万美元,不论成功或失败。幸运的是,对于人工智能来说,花钱不是问题。AI
的潜在收益是巨大的,AI
平台有望在不久的将来产生数万亿美元的收入。如果你的想法足够好,你应该能够很容易地为这项工作找到资金。
人工智能无处不在,大型数据中心
、智能手机
、传感器
,机器人
和 自动驾驶汽车
中都有它的身影。每个系统都有不同的现实限制:人们肯定不愿意自动驾驶汽车因为算力太小而无法检测障碍物,也不能接受因为效率低而在训练超大规模预训练模型时每天多花数千美元,AI 的硬件不存在一个芯片适用所有场景的说法,计算需求巨大,每一点效率都意味着花费大量的时间、精力和成本。如果没有适当的加速硬件来满足你的 AI 需求,对 AI 进行实验和发现的能力将受到限制。
可行性
AI
程序具有使其适用于硬件加速的所有属性:
大规模并行
,大部分计算都花在张量运算上,如卷积或自注意力算子。如果可能,还可以增加 batch size
,以便硬件一次处理多个样本,提高硬件利用率并进一步推动并行性。硬件处理器驱动其快速运行能力的主要因素是并行计算。
仅限于少数运算种类:主要是线性代数核的乘法和加法、一些非线性算子,例如模拟突触激活的 ReLU
,以及基于 softmax
的分类的指数运算。狭窄的问题空间使我们能够简化计算硬件,专注于某些运算符。
可以在编译时知道 控制流
,就像具有已知迭代次数的 for
循环一样,通信和数据重用模式也相当受限,因此可以表征我们需要哪些网络拓扑在不同计算单元和软件定义的暂存存储器之间通信数据,以控制数据的存储和编排方式。
硬件友好
不久之前,如果你想在计算架构领域进行创新,你可能会说:「我有一个新的架构改进的想法,它可以显著地提高一些东西,但是——我需要做的就是稍微改变编程界面并让程序员使用这个功能。」在那个时候这种想法会行不通。程序员的 API
是不可触及的,而且用破坏程序「干净」语义流的低级细节来加重程序员的负担是很难的。
此外,将底层架构细节与面向程序员的代码混合在一起并不是一个好习惯。首先它是不可移植的,因为某些架构特征在芯片代际之间发生变化。其次它可能会被错误地编程,因为大多数程序员对底层硬件没有深入的了解。
虽然你可以说 GPU
和多核 CPU
已经因为多线程(有时甚至是——内存墙)偏离了传统的编程模型,但由于单线程性能早已不是指数级增长,我们只能将希望诉诸于多线程编程,因为这是我们唯一的选择。多线程编程仍然很难掌握,需要大量的教育。幸运的是,当人们编写 AI
程序时,他们会使用神经层和其他定义明确的块来构建计算图。
高级程序代码(例如 TensorFlow
或 PyTorch
中的代码)已经在以一种可以标记并行块并构建数据流图的方式编写。因此理论上,你可以构建丰富的软件库和足够精细的编译器工具链来理解程序的语义并将其有效地降为硬件表示,而无需开发应用程序的程序员做任何参与,让数据科学家做他们的事情,他们可以不在乎任务在哪些硬件上运行。在实践中,编译器完全成熟还需要时间。
这里会介绍 AI加速器
的架构基础,包括指令集 ISA
( Instruction Set Architecture
)、特定领域的指令集 ISA
、超长指令字( VLIW
)架构、脉动阵列、可重构处理器、数据流操作、内存处理。
ISA
描述了指令和操作如何由编译器编码,然后由处理器解码和执行,它是处理架构中面向程序员的部分。
常见的例子是 Intel
的 x86
,ARM
,IBM Power
,MIPS
和 RISC-V
。
我们可以将 ISA
视为处理器支持所有操作的词汇表。通常,它由算数指令(如加、乘)、内存操作(加载、存储)和控制操作(例如,在 if
语句中使用的分支)组成。
目前看来,CPU
ISA
已被分类为精简指令集计算( RISC
,Reduced Instruction Set Architecture
)和复杂指令集( CISC
,Complex Instruction Set Architecture
):
RISC
ISA
由简单的指令组成,它们支持少量简单操作(加、乘等)。所有指令的位长相同(例如 32
位),因此,RISC
指令的硬件解码器被认为是最简单的;CISC
ISA
中,不同的指令可以有不同的长度,单个指令就可以描述操作和条件的复杂组合。通常,CISC
程序比其等效的 RISC
程序代码占用空间更小,即存储程序指令所需的内存量。这是因为单个 CISC
指令可以跨越多个 RISC
指令,并且可变长度的 CISC
指令被编码为使得最少的位数代表最常见的指令。然而,为了体现复杂指令带来的优势,编译器需要做的足够复杂才能实现。
x86(橙色)相对于 ARM(紫色)的计算市场递减率预测。图源:AMD/ExtremeTech
早在 1980 年、1990 年和 2000 年代初期,就有「 RISC
与 CISC
之战 」,基于 x86
的 Intel
和 AMD
主要专注于 CISC
,而 ARM
专注于 RISC
。其实每种方法都有利弊,但最终,由于基于 ARM
的智能手机的蓬勃发展,RISC
在移动设备中占据了上风。现在,随着亚马逊基于 ARM
的 AWS Graviton
处理器等的发布,RISC
在云中也开始占据主导地位。
RISC
和 CISC
是用于构建通用处理器的通用指令集架构。但在加速器的背景下,CISC
和 RISC
相比,RISC
具有简单性和简洁性,更受欢迎(至少对于智能手机而言)。
45nm CMOS 处理器中执行 ADD 指令能耗。图源:M.Horowitz ISSCC 2014
很多 AI
加速器公司采用特定领域的 ISA
。鉴于现有的精简指令集架构(以及潜在的处理核心),可以通过仅支持目标应用领域所需的指令子集来进一步减少它。特定领域的 ISA
进一步简化了处理内核和硬件 / 软件接口,以实现高效的加速器设计。在通常由线性代数和非线性激活组成的 AI
应用中,不需要许多「奇异」类型的运算。因此,ISA
可以设计为支持相对较窄的操作范围。
使用现有 RISC
ISA
的简化版本的好处是,一些 RISC
公司(如 ARM
)出售现有 IP
,即支持完整 ISA
的现有处理内核,可用作定制处理的基线,用于加速器芯片的核心。这样,加速器供应商就可以依赖已经过验证并可能部署在其他系统中的基线设计;这是从头开始设计新架构更可靠的替代方案,对于工程资源有限、希望获得现有处理生态系统支持或希望缩短启动时间的初创公司尤其有吸引力。
VLIW
( Very Long Instruction Word
)架构是由 Josh Fisher
在 20
世纪 80
年代早期提出,当时集成电路制造技术和高级语言编译器技术出现了巨大的进步。其主要思想是:
CPU
中有对应数量的 ALU
完成相应的指令操作;就像特定领域的 ISA
可以被认为是 RISC
思想(更简单的指令,支持的操作较少)的扩展,同样地,我们可以将 CISC
进行多个操作组合成单个复杂指令扩展,这些架构被称为超长指令字 ( VLIW
)。
VLIW
架构由 算术
和 存储单元
的异构数据路径阵列组成。异构性源于每个单元的时序和支持功能的差异:例如,计算简单逻辑操作数的结果可能需要 1
- 2
个周期,而内存操作数可能需要数百个周期。
VLIW
架构依赖于一个编译器,该编译器将多个操作组合成一个单一且复杂的指令,该指令将数据分派到数据路径阵列中的单元。
例如,在 AI
加速器中,这种指令可以将 张量
指向矩阵乘法单元,并且 并行
地将数据部分发送到 向量单元
和 转置单元
等等。
VLIW
架构的优势在于,通过指令编排处理器数据路径的成本可能显着降低;缺点是我们需要保证数据路径中各个单元之间的工作负载得到平衡,以避免资源未得到充分利用。因此,要实现高性能执行,编译器需要能够进行复杂的静态调度。更具体地说,编译器需要分析程序,将数据分配给单元,知道如何对不同的数据路径资源计时,并以在给定时间利用最多单元的方式将代码分解为单个指令。归根结底,编译器需要了解不同的数据路径结构及其时序,并解决计算复杂的问题,以提取高指令级并行 ( ILP
) 并实现高性能执行。
脉动阵列
由 H. T. Kung
和 C. E. Leiserson
于 1978
年引入。2017 年,Google
研发的 TPU
采用脉动阵列作为计算核心结构,使其又一次火了起来。
脉动阵列
本身的核心概念就是让数据在运算单元的阵列中进行流动,减少访存次数,并且使得结构更加规整,布线更加统一,提高频率。整个阵列以「节拍」方式运行,每个 PE
( processing elements
)在每个计算周期处理一部分数据,并将其传达给下一个互连的 PE
。
脉动结构
是执行矩阵乘法的有效方式( DNN
工作负载具有丰富的矩阵乘法)。谷歌的 TPU
是第一个使用 AI
的脉动阵列。因此,在这之后,其他公司也加入了脉动阵列行列,在自家加速硬件中集成了脉动执行单元,例如 NVIDIA
的 Tensor Core
。
我们所熟悉的处理器包括 CPU
、GPU
和一些加速器,它们的流程依赖于预先确定数量的算术单元和运行时行为,这些行为是在运行时根据执行的程序指令确定的。但是,还有其他类别的处理器称为「 可重构处理器
」。
可重构处理器由包含互连计算单元、内存单元和控制平面的复制阵列组成。为了运行程序,专用编译器会构建一个配置文件,这个文件包含设置数组中每个元素行为的控制位。最常见的可重构处理器类别是现场可编程门阵列 ( FPGA
)。
FPGA
通过启用位级可配置性来支持广泛的计算范围:可以配置算术单元来实现对任意宽度数量进行操作的功能,并且可以融合片上存储块以构建不同大小的存储空间。
可重构处理器 FPGA
的一个优点是它们可以对用硬件描述语言 ( HDL
) 编写的芯片设计进行建模;这使公司能够在几个小时内测试他们的设计,而不是流片芯片,这个过程可能需要几个月甚至几年的时间。
FPGA
的缺点是细粒度的位级可配置性效率低下,典型的编译时间可能需要数小时,并且所需的额外线路数量占用大量空间,而且在能量上也是浪费。因此,FPGA
通常用于在流片之前对设计进行原型设计,因为由此产生的芯片将比其 FPGA
同类产品性能更高、效率更高。
处理器架构的性能、功耗和灵活性的比较。图源:ACM Computing Surveys
虽然 FPGA
在性能和功耗方面存在问题,但可重构性仍然是 AI
加速器一个非常理想的特性。一般来说,一个芯片的设计周期大约是 2
- 3
年,每天会有数不清的实验依赖芯片运行。但是,一个近期制造完成并花费数百万美元的芯片,往往是基于两年多前存在的 AI
模型的假设设计的,可能与当前的模型无关。
为了将高效、性能和可重构性结合起来,一些初创公司设计了可重构处理器,它们被称为 CGRA
( Coarse-Grained Reconfigurable Arrays
)。
CGRA
在 1996 年被提出,与 FPGA
相比,CGRA
不支持位级可配置性,并且通常具有更严格的结构和互连网络。
CGRA
具有高度的可重构性,但粒度比 FPGA
更粗。
数据流( Dataflow
)已经有一段时间了,起源可以追溯到 1970 年代。不同于传统的冯诺依曼模型,它们是计算的另一种形式。
在传统的冯诺依曼模型中,程序被表示为一系列指令和临时变量。但在数据流模型中,程序被表示为数据流图( DFG
,dataflow graph
),其中输入数据的一部分是使用预定的操作数( predetermined operands
)计算的,计算机中的数据根据所表示的图一直「流动」到输出,这一过程由类似图形的硬件计算而来。值得注意的是,硬件本质上是并行的。
在 AI
加速器的背景下,执行数据流有以下两个优势:
architecturally-agnostic
)表示。它抽象出所有源于架构本身的不必要的约束(例如,指令集支持的寄存器或操作数等),并且程序的并行性仅受计算问题本身的固有并行维度的限制,而不是受计算问题本身的并行维度限制。研究人员在提高加速器的计算吞吐量 ( FLOP
) 上花费了大量精力,即芯片(或系统)每秒提供的最大计算数量。然而,片上计算吞吐量并不是全部,还有内存宽带,因其片上计算速度超过片外内存传输数据的速度,造成性能瓶颈。
此外,从能量角度来看, AI
模型中存在着很高的内存访问成本,将数据移入和移出主存储器比进行实际计算的成本高几个数量级。
45nm CMOS 技术的典型内存和计算成本。图源:ISSCC 2014 / M.Horowitz
AI
加速器公司为降低内存成本常采用「近数据处理,near-data processing
」方法。这些公司设计了小型且高效的软件控制存储器(也称为便笺存储器,Scratchpad Memory
),它们将处理过的部分数据存储在核心芯片上,用于高速和低功耗并行处理。通过减少对片外存储器(大而远存储器)的访问次数,这种方法在减少访问数据时间和能源成本方面迈出了第一步。
近数据处理的极端是 PIM
( Processing-in-Memory
),这种技术可以追溯到 1970 年代。在 PIM
系统中,主内存模块是用 数字逻辑元件
(如 加法器
或 乘法器
)制造的,计算处理位于内存内部。因此,不需要将存储的数据传送到中间线缓冲器。商业化的 PIM
解决方案仍然不是很常见,因为制造技术和方法仍然稳定,而且设计通常被认为是僵化的。
基于点积模拟处理的神经形态计算。图源:Nature Communications
许多 PIM
依赖于模拟计算( analog computations
)。具体来说,在 AI
应用中,加权点积在模拟域中的计算方式类似于大脑处理信号的方式,这就是为什么这种做法通常也被称为「神经形态计算」的原因。由于计算是在模拟域中完成的,但输入和输出数据是数字的,神经形态解决方案需要特殊的模数和数模转换器,但这些在面积和功率上的成本都很高。
这一部分主要介绍 AI加速器
相关公司。
AI 硬件初创公司 - 截至 2021 年 4 月的总融资。图源:AnandTech
此外,还有一些有趣的收购故事。2016 年,英特尔以 3.5 亿美元收购了 Nervana
,2019 年底又收购了另一家名为 Habana
的人工智能初创公司,该公司取代了 Nervana
提供的解决方案。非常有意思的是,英特尔为收购 Habana
支付了 20 亿美元的巨款,比收购 Nervana
多好几倍。
AI
芯片领域,或者更准确地说,AI
加速器领域(到目前为止,它已经不仅仅是芯片)包含了无数的解决方案和方法,所以让我们回顾这些方法的主要原则。
英伟达成立于 1993 年,是最早研究加速计算的大公司之一。英伟达一直是 GPU
行业的先驱,后来为游戏机、工作站和笔记本电脑等提供各种 GPU
产品线,已然成为世界领导者。正如在之前的文章中所讨论的,GPU
使用数千个简单的内核。相比来说,CPU
使用较少的内核。
最初 GPU
主要用于图形,但在 2000 年代中后期左右,它们被广泛用于分子动力学、天气预报和物理模拟等科学应用。新的应用程序以及 CUDA
和 OpenCL
等软件框架的引入,为将新领域移植到 GPU
铺平了道路,因此 GPU
逐渐成为通用 GPU
( General-Purpose GPU
),简称 GPGPU
。
ImageNet 挑战赛:使用 GPU 的获胜误差和百分比。图源:英伟达
从历史上看,人们可能会说英伟达是幸运的,因为当 CUDA
流行和成熟时,现代 AI
就开始了。或者有人可能会争辩说,正是 GPU
和 CUDA
的成熟和普及使研究人员能够方便高效地开发 AI
应用程序。无论哪种方式,历史都是由赢家书写的 —— 事实上,最有影响力的 AI
研究,如 AlexNet
、ResNet
和 Transformer
都是在 GPU
上实现和评估的,而当 AI
寒武纪爆发时,英伟达处于领先地位。
GPU
遵循单指令多线程 ( SIMT
) 的编程模型,其中相同的指令在不同的内核 / 线程上并发执行,每条指令都按照其分配的线程 ID
来执行数据部分。所有内核都以帧同步( lock-step
)方式运行线程,这极大地简化了控制流。
另一方面,SIMT
在概念上仍然是一个多线程类 c
的编程模型,它被重新用于 AI
,但它并不是专门为 AI
设计的。由于神经网络应用程序和硬件处理都可以被描述为计算图,因此拥有一个捕获图语义的编程框架会更自然、更有效。
虽然从 CPU
转向 GPU
架构是朝着正确方向迈出的一大步,但这还不够。GPU
仍然是传统架构,采用与 CPU
相同的计算模型。
CPU
受其架构限制,在科学应用等领域逐渐被 GPU
取代。
因此,通过联合设计专门针对 AI
的计算模型和硬件,才有希望在 AI
应用市场占有一席之地。
英伟达主要从两个角度发展 AI
:
1)引入 Tensor Core
;
2)通过收购公司。比如以数十亿美元收购 Mellanox
,以及即将对 ARM
的收购。
ARM-NVIDIA
首次合作了一款名为「 Grace
」的数据中心 CPU
,以美国海军少将、计算机编程先驱 Grace Hopper
的名字命名。作为一款高度专用型处理器,Grace
主要面向大型数据密集型 HPC
和 AI
应用。新一代自然语言处理模型的训练会有超过一万亿的参数。基于 Grace
的系统与 NVIDIA GPU
紧密结合,性能比目前最先进的 NVIDIA DGX
系统(在 x86
CPU
上运行)高出 10
倍。
Grace
获得 NVIDIA
HPC
软件开发套件以及全套 CUDA
和 CUDA-X
库的支持,可以对 2000
多个 GPU
应用程序加速。
Cerebras
成立于 2016 年。随着 AI
模型变得越来越复杂,训练时需要使用更多的内存、通信和计算能力。因此,Cerebras
设计了一个晶圆级引擎 ( WSE
),它是一个比萨盒大小的芯片。
Andrew Feldman。图源:IEEE spectrum
典型的处理芯片是在一块称为晶圆的硅片上制造的。作为制造过程的一部分,晶圆被分解成称为芯片的小块,这就是我们所说的处理器芯片。一个典型的晶圆可容纳数百甚至数千个这样的芯片,每个芯片的尺寸通常在 10
平方毫米到 830
平方毫米左右。NVIDIA
的 A100
GPU
被认为是最大的芯片,尺寸 826
平方毫米,可以封装 542
亿个晶体管,为大约 7000
个处理核心提供动力。
Cerebras WSE-2 与 NVIDIA A100 规格比较。图注:BusinessWire
Cerebras
不仅在单个大芯片上提供超级计算机功能,而且通过与学术机构和美国国家实验室的合作,他们还提供了软件堆栈和编译器工具链。其软件框架基于 LAIR
( Linear-Algebra Intermediate Representation
)和 c++
扩展库,初级程序员可以使用它来编写内核(类似于 NVIDIA
的 CUDA
),还可用于无缝降低来自 PyTorch
或 TensorFlow
等框架的高级 Python
代码。
总而言之,Cerebras
的非传统方法吸引了许多业内人士。但是更大的芯片意味着内核和处理器因缺陷而导致失败的可能性更高,那么如何控制制造缺陷、如何冷却近百万个核心、如何同步它们、如何对它们进行编程等等都需要逐个解决,但有一点是肯定的,Cerebras
引起了很多人的注意。
GraphCore
是首批推出商业 AI
加速器的初创公司之一,这种加速器被称为 IPU
( Intelligent Processing Unit
)。他们已经与微软、戴尔以及其他商业和学术机构展开多项合作。
目前,GraphCore
已经开发了第二代 IPU
,其解决方案基于一个名为 Poplar
的内部软件堆栈。Poplar
可以将基于 Pytorch
、Tensorflow
或 ONNX
的模型转换为命令式、可以兼容 C++
的代码,支持公司提倡的顶点编程( vertex programming
)。与 NVIDIA
的 CUDA
一样,Poplar
还支持低级 C++
编程以实现更好的潜在性能。
IPU
由 tiled
多核设计组成,tiled
架构由 MIT
于 2000 年代初研发,该设计描述了复制结构的 2D
网格,每个网格都结合了网络交换机、小型本地内存和处理核心。第一代 IPU
有 1216
个 tile
,目前第二代 IPU
有 1472
个 tile
。每个 IPU
内核最多可以执行 6
个线程,这些线程是包含其专有指令集架构 ( ISA
) 的代码流。
IPU
采用的是大规模并行同构众核架构。其最基本的硬件处理单元是 IPU-Core
,它是一个 SMT
多线程处理器,可以同时跑 6
个线程,更接近多线程 CPU
,而非 GPU
的 SIMD/SIMT
架构。IPU-Tiles
由 IPU-Core
和本地的存储器( 256KB
SRAM
)组成,共有 1216
个。因此,一颗 IPU
芯片大约有 300MB
的片上存储器,且无外部 DRAM
接口。连接 IPU-Tiles
的互联机制称作 IPU-Exchange
,可以实现无阻塞的 all-to-all
通信,共有大约 8TB
的带宽。最后,IPU-Links
实现多芯片互联,PCIe
实现和 Host CPU
的连接。
IPU
采用的是大规模并行同构众核架构。其最基本的硬件处理单元是 IPU-Core
,它是一个 SMT
多线程处理器,可以同时跑 6
个线程,更接近多线程 CPU
,而非 GPU
的 SIMD/SIMT
架构。IPU-Tiles
由 IPU-Core
和本地的存储器( 256KB
SRAM
)组成,共有 1216 个。因此,一颗 IPU
芯片大约有 300MB
的片上存储器,且无外部 DRAM
接口。连接 IPU-Tiles
的互联机制称作 IPU-Exchange
,可以实现无阻塞的 all-to-all
通信,共有大约 8TB
的带宽。最后,IPU-Links
实现多芯片互联,PCIe
实现和 Host
CPU
的连接。
Wave Computing
、SambaNova
和 SimpleMachines
是三家推出加速器芯片的初创公司。其中 Wave Computing
成立于 2008 年,其使命是「通过可扩展的实时 AI
解决方案,从边缘到数据中心革新深度学习」,该公司由 Dado Banatao
和 Pete Foley
创立。一段时间以来,它一直处于隐身模式,从各种来源获得资金。
Wave Computing
的核心产品是数据流处理器单元( DPU
),采用非冯诺依曼架构的软件可动态重构处理器 CGRA
( Coarse grain reconfigurable array / accelerator
)技术,适用于大规模异步并行计算问题。2019 年前后,Wave Computing
针对边缘计算市场的算力需求,将 MIPS
技术与 Wave
旗下 WaveFlow
和 WaveTensor
技术相结合,推出 TritonAI 64 IP
平台。但不幸的是,它在 2020 年申请了破产保护。
SambaNova
成立于 2017 年底,自那以来,该公司获得了由 Google Ventures
,Intel Capital
和 Blackrock
领导的三轮融资以及在美国能源部的 Laurence Livermore
和 Los Alamos
的部署。他们现在已经可以为一些客户提供新产品。
SambaNova
正在为数据中心构建芯片和软件栈,目标是用 AI
进行推理和训练。其架构的核心是可重构数据流单元( RDU
,reconfigurable dataflow unit
)。RDU
芯片包含一组计算单元(称为 PCU
)和暂存器存储单元(称为 PMU
),它们以 2D
网格结构组织起来,并与 NoC
交换机连接。RDU
通过一组称为 AGU
和 CU
的单元结构访问芯片外存储器。
SambaNova
的软件堆栈(称为 Sambaflow
)采用高级 Python
应用程序(例如 PyTorch
、TensorFlow
)并将它们降低为可以在编译时对芯片 PCU
、PMU
、AGU
和 CU
进行编程的表示。SambaNova
展示了 RDU
架构可以运行复杂的 NLP
模型、推荐模型和高分辨率视觉模型。
SimpleMachines
由威斯康星大学的一群学术研究人员于 2017
年创立。该研究小组一直在探索依赖于结合冯诺依曼(逐条指令)和非冯诺依曼(即数据流)执行的异构数据路径的可重构架构。
该公司提供的数据均参考了在顶级学术会议和期刊发表的原创研究论文。指导架构原则有点类似于 SambaNova
正在做的事情,即开发一个可重新配置的架构,以支持非常规编程模型,实现能够应对高度变化的 AI
应用程序空间的灵活执行。
SimpleMachines的Mozart芯片。图源:SimpleMachine
该公司的首个 AI
芯片是 Mozart,该芯片针对推理进行了优化,在设计中使用了 16
纳米工艺,HBM2
高带宽内存和 PCIe Gen3x16
尺寸。2020 年,SimpleMachine
发布了第一代加速器,该加速器基于 Mozart
芯片,其由一个可配置的 tile
数组组成,它们依赖于控制、计算、数据收集等的专业化。
世界上首个专门为 AI
量身定制的处理器之一是张量处理单元( TPU
),也称张量处理器,是 Google
开发的专用集成电路( ASIC
),专门用于加速机器学习。自 2015 年起,谷歌就已经开始在内部使用 TPU
,并于 2018 年将 TPU
提供给第三方使用,既将部分 TPU
作为其云基础架构的一部分,也将部分小型版本的 TPU
用于销售。
第一代 TPU
是一个 8
位矩阵乘法的引擎,使用复杂指令集,并由主机通过 PCIe 3.0
总线驱动,它采用 28 nm
工艺制造。TPU
的指令向主机进行数据的收发,执行矩阵乘法和卷积运算,并应用激活函数。
第二代 TPU
于 2017 年 5 月发布,值得注意的是,第一代 TPU
只能进行整数运算,但第二代 TPU
还可以进行浮点运算。这使得第二代 TPU
对于机器学习模型的训练和推理都非常有用。谷歌表示,这些第二代 TPU
将可在 Google
计算引擎上使用,以用于 TensorFlow
应用程序中。
第三代 TPU
于 2018 年 5 月 8 日发布,谷歌宣布第三代 TPU
的性能是第二代的两倍,并将部署在芯片数量是上一代的四倍的 Pod
中。
第四代 TPU
于 2021 年 5 月 19 日发布。谷歌宣布第四代 TPU
的性能是第三代的 2.7 倍,并将部署在芯片数量是上一代的两倍的 Pod
中。与部署的第三代 TPU
相比,这使每个 Pod
的性能提高了 5.4 倍(每个 Pod
中最多装有 4,096
个芯片)。
Groq
谷歌在云产品中提供了 TPU
,他们的目标是满足谷歌的 AI
需求并服务于自己的内部工作负载。因此,谷歌针对特定需求量身定制了 TPU
。
2016 年,一个由 TPU
架构师组成的团队离开谷歌,他们设计了一种与 TPU
具有相似基线特征的新处理器,并在一家名为 Groq
的新创业公司中将其商业化。
Groq
的核心是张量流处理器( TSP
)。TSP
架构与 TPU
有很多共同之处:两种架构都严重依赖脉动阵列来完成繁重的工作。与第一代 TPU
相比,TSP
增加了向量单元和转置置换单元(在第二代和第三代 TPU
上也可以找到)。
Habana
Habana
成立于 2016 年初,是一家专注于数据中心训练和推理的 AI
加速器公司。Habana
已推出云端 AI
训练芯片 Gaudi
和云端 AI
推理芯片 Goya
。
Goya
处理器已实现商用,在极具竞争力的包络功率中具有超大吞吐量和超低的实时延迟,展现出卓越的推理性能。Gaudi
处理器旨在让系统实现高效灵活的横向、纵向扩展。目前 Habana
正在为特定超大规模客户提供样品。
Goya
和 Gaudi
芯片具有相似架构,它们都依赖于 GEMM
引擎,该引擎是一个脉动矩阵乘法单元,与一组 tile
并排工作。每个 tile
包含一个本地软件控制的暂存器内存和一个张量处理核心( TPC
),具有不同精度的矢量计算单元,即它们可以计算 8
位、16
位或 32
位的矢量化操作。TPC
和 GEMM
引擎通过 DMA
和共享内存空间进行通信,并通过 PCIe
与主机处理器进行通信。
Esperanto
Esperanto
成立于 2014 年,并在相当长一段时间内一直处于隐身模式,直到 2020 年底才宣布他们的第一款产品 ET-SoC-1
芯片,其基于台积电 7nm
工艺构建的 SoC
上集成了 1000
多个 RISC-V
内核、160M BYTE
的 SRAM
和超过 240
亿个晶体管,是该公司 AI
加速器系列的第一款产品。ET-SoC-1
是一款推理加速器,预计在今年投产。
Esperanto
的 ET-SoC-1
的架构图。图源:Esperanto/HotChips
TensTorrent
TensTorrent
成立于 2016 年,总部位于加拿大多伦多,目前估值 10 亿美元,这是一家计算公司,开发旨在帮助更快和适应未来算法的处理器。
TensTorrent
提供的芯片系列不仅针对数据中心,也针对小型平台,此外,他们还提供 DevCloud
。
TensTorrent:图的并行性与张量切片。图源:YouTube/TensTorrent
TensTorrent 核心。图源:YouTube/TensTorrent
Mythic
是 AI
硬件领域最早的初创公司之一,它成立于 2012 年。迈克・亨利(Mike Henry)和戴夫・菲克(Dave Fick)为公司的核心创始人,他们分别担任 Mythic
公司的董事长和 CTO
。该公司非常重视具备能源效率和成本更低的模拟技术,Mythic
提出了如何在模拟电路中使用较小的非数字电路电流来降低能量的消耗。
矩阵乘法运算中的权重和输入 / 输出数据差分。图源:Mythic
2020 年底,Mythic
推出了其第一代 AI
芯片 M1108 AMP
。与很多 AI
芯片不同,M1108
基于更加成熟的模拟计算技术,而非数字计算。这提高了 M1108
的能效,也使网络边缘设备访问更加容易。
Mythic
还推出了一个模拟计算引擎 ( ACE
,Analog Compute Engine
),它使用闪存而不是 DRAM
来存储权重。本质上,它们不是从内存中获取输入和权重数据,而是将输入数据传输到权重闪存,并将其转换为模拟域,在模拟域中执行 MAC (multiply-and-accumulate)计算,并将其转换回以获取输出数据,从而避免从内存中读取和传输权重成本。
LightMatter
是一家诞生于 MIT
的初创公司,该公司押注于一种用光子而非电子执行运算的计算机芯片。这种芯片从根本上与传统的计算机芯片相区分,有望成为能够满足 AI
「饥饿」的有力竞争者。
LightMatter
首席执行官尼克・哈里斯(Nick Harris)曾说:「要么我们发明的新计算机继续下去,要么人工智能放慢速度。」
光子学与电子学计算属性。图源:HotChips/LightMatter
LightMatter
设计了一种基于 脉动阵列
的方法,通过使用编码为光信号波中不同相位的相移来操纵光子输入信号,以执行乘法和累加操作。由于光子学数据以光速流动,LightMatter
芯片以非常高的速度执行矩阵和矢量化运算,并且功率可降低几个数量级。
LightMatter
在 2021 年开始发售其首款基于光子的 AI
芯片 —— Envise
,并为常规数据中心提供包含 16
个这种芯片的刀锋服务器。该公司目前已从 GV
(前 Google Ventures
)、Spark Capital
和 Matrix Partners
筹集到了 2200 万美元。
LightMatter
声称,他们推出的 Envise
芯片的运行速度比最先进的 Nvidia A100 AI
芯片快 1.5
至 10
倍,具体根据任务的不同有所差异。以运行 BERT
自然语言模型为例,Envise
的速度是英伟达芯片的 5
倍,并且仅消耗了其六分之一的功率。
NeuReality
是一家于 2019 年在以色列成立的初创公司,由 Tanach 、 Tzvika Shmueli 和 Yossi Kasus 共同创立。
2021 年 2 月,NeuReality
推出了 NR1-P
,这是一个以 AI
为中心的推理平台。2021 年 11 月,NeuReality
宣布与 IBM
建立合作伙伴关系,其中包括许可 IBM
的低精度 AI
内核来构建 NR1
,这是一种非原型生产级服务器,与 FPGA
原型相比, AI
应用程序效率更高。
详解AI加速器(一):2012年的AlexNet到底做对了什么? ↩︎