训练 SOTA AI 模型所需的计算量。 自从新一代芯片被暗硅束缚以来,计算机行业就开始把精力放到了硬件加速器上。他们的想法是:如果不能再增加晶体管,那就好好利用现有的晶体管吧。具体怎么做呢?答案是:专门化。 传统的 CPU 被设计成通用的。它们使用相同的硬件结构来运行我们所有应用(操作系统、文字处理器、计算器、互联网浏览器、电子邮件客户端、媒体播放器等)的代码。这些硬件结构需要支持大量的逻辑操作,并捕获许多可能的模式和程序诱发的行为。这相当于硬件可用性很好,但效率相当低。如果我们只专注于某些应用,我们就可以缩小问题领域,进而从芯片中去除大量的结构冗余。
通用 CPU vs. 面向特定应用的加速器。 加速器是专门面向特定应用或领域的芯片,也就是说,它们不会运行所有应用(例如不运行操作系统),而是在硬件设计层面就考虑一个很窄的范围,因为: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 程序具有使其适用于硬件加速的所有属性。首先最重要的是,它们是大规模并行的:大部分计算都花在张量运算上,如卷积或自注意力算子。如果可能,还可以增加 batch size,以便硬件一次处理多个样本,提高硬件利用率并进一步推动并行性。硬件处理器驱动其快速运行能力的主要因素是并行计算。其次,AI 计算仅限于少数运算种类:主要是线性代数核的乘法和加法、一些非线性算子,例如模拟突触激活的 ReLU,以及基于 softmax 的分类的指数运算。狭窄的问题空间使我们能够简化计算硬件,专注于某些运算符。 最后,由于 AI 程序可以表示为计算图,因此我们可以在编译时知道控制流,就像具有已知迭代次数的 for 循环一样,通信和数据重用模式也相当受限,因此可以表征我们需要哪些网络拓扑在不同计算单元和软件定义的暂存存储器之间通信数据,以控制数据的存储和编排方式。 AI 算法是以硬件友好的方式构建的 不久之前,如果你想在计算架构领域进行创新,你可能会说:「我有一个新的架构改进的想法,它可以显著地提高一些东西,但是——我需要做的就是稍微改变编程界面并让程序员使用这个功能。」在那个时候这种想法会行不通。程序员的 API 是不可触及的,而且用破坏程序「干净」语义流的低级细节来加重程序员的负担是很难的。 此外,将底层架构细节与面向程序员的代码混合在一起并不是一个好习惯。首先它是不可移植的,因为某些架构特征在芯片代际之间发生变化。其次它可能会被错误地编程,因为大多数程序员对底层硬件没有深入的了解。 虽然你可以说 GPU 和多核 CPU 已经因为多线程(有时甚至是——内存墙)偏离了传统的编程模型,但由于单线程性能早已不是指数级增长,我们只能将希望诉诸于多线程编程,因为这是我们唯一的选择。多线程编程仍然很难掌握,需要大量的教育。幸运的是,当人们编写 AI 程序时,他们会使用神经层和其他定义明确的块来构建计算图。 高级程序代码(例如 TensorFlow 或 PyTorch 中的代码)已经在以一种可以标记并行块并构建数据流图的方式编写。因此理论上,你可以构建丰富的软件库和足够精细的编译器工具链来理解程序的语义并将其有效地降为硬件表示,而无需开发应用程序的程序员做任何参与,让数据科学家做他们的事情,他们可以不在乎任务在哪些硬件上运行。在实践中,编译器完全成熟还需要时间。 几乎没有其他选择 人工智能无处不在,大型数据中心、智能手机、传感器,机器人和自动驾驶汽车中都有它的身影。每个系统都有不同的现实限制:人们肯定不愿意自动驾驶汽车因为算力太小而无法检测障碍物,也不能接受因为效率低而在训练超大规模预训练模型时每天多花数千美元,AI 的硬件不存在一个芯片适用所有场景的说法,计算需求巨大,每一点效率都意味着花费大量的时间、精力和成本。如果没有适当的加速硬件来满足你的 AI 需求,对 AI 进行实验和发现的能力将受到限制。 原文链接:https://medium.com/@adi.fu7/ai-accelerators-part-ii-transistors-and-pizza-or-why-do-we-need-accelerators-75738642fdaa