前言

本书面向的读者

本书面向所有希望理解机器学习系统究竟如何运行的读者,内容涵盖定义神经网络的数学原理、执行神经网络的硬件,以及使其高效运行的工程决策。

大多数读者不会成为机器学习硬件架构师或编译器工程师。然而,每一位构建、训练、优化或部署模型的实践者,都会做出依赖于对代码底层系统的理解的决策。本书为首次接触机器学习系统的本科生、希望夯实基础的在职工程师,以及需要推理分析性能与部署问题的研究人员提供系统基础。

为什么需要一本系统教材

1968 年,在德国加米施举行的一次北约会议,推动了软件工程作为一门独立学科的确立。当时,人们担忧软件系统已变得过于复杂,无法再依靠临时拼凑的编程方式来开发 (Naur and Randell 1969)。可靠的软件需要自身的原则、方法和严谨性。数十年后,Hennessy 和 Patterson 将定量分析置于计算机体系结构教育的核心,系统化地阐述了工程师如何测量、预测和优化处理器性能 (Hennessy and Patterson 2017)。这两个例子都说明,共同的方法如何使复杂的工程工作变得系统化且可以传授。

Naur, Peter, and Brian Randell, eds. 1969. Software Engineering: Report of a Conference Sponsored by the NATO Science Committee, Garmisch, Germany, 7–11 October 1968. Scientific Affairs Division, NATO.

机器学习正面临自身的加米施时刻。

过去十年,机器学习研究一直由以模型为中心的思维主导,重点是发现新的算法和架构。这一重点固然重要,但模型并不等于系统。一个在研究笔记本中表现良好的神经网络,如果无法满足延迟约束、其数据流水线无法处理所需的数据量,或其能源成本超过了自身的经济价值,就毫无用处。可用模型与生产系统之间的差距,不仅仅是实现上的差距,更是基础工程原则上的差距。

本书将机器学习系统工程视为一门以定量界限、模型和设计原则为基础的学科,而非 Kubernetes、PyTorch 和 CUDA 等工具的集合。正如土木工程师依靠基础物理学和结构原理,人工智能工程师也必须明确每一种系统模型背后的支配原则:

  • 机器学习系统铁律:将系统分解为数据移动、计算和开销,并通过关键路径处理它们之间的重叠。
  • 数据引力:大规模数据和受限网络所产生的部署位置压力。
  • 能耗核算:单次事件的成本与事件次数决定了数据移动或计算何者占主导。
  • 阿姆达尔定律:流水线中的串行部分比例限制了整个系统的加速比。

计算机科学研究什么是可计算的。机器学习研究什么是可学习的。人工智能工程则研究,在真实硬件和真实数据的物理条件下,什么是可构建的。

我撰写本书,是希望帮助建立这一基础,并为人工智能系统做出如同 Hennessy and Patterson (2017) 为计算机体系结构所做的贡献:以测量取代直觉,以工程取代技艺。目标是在实现之前先教授系统层面的推理,将数据、算法和硬件视为一个相互耦合的优化问题,而非彼此分离的孤岛。

Hennessy, John L., and David A. Patterson. 2017. Computer Architecture: A Quantitative Approach. 6th ed. Morgan Kaufmann.

想象一盒乐高积木。同样的拼接组件可以搭建宇宙飞船、城堡,乃至整座城市。套装在变,积木不变。机器学习系统也是如此。用于图像分类的卷积网络、用于语言生成的 Transformer,以及用于机器人技术的强化学习智能体,是截然不同的应用,但其底层都有相同的构建模块:计算图、内存层次结构、数据流水线、优化循环,以及延迟、吞吐量和能耗之间的权衡。掌握这些构建模块,就能理解陌生的系统。

因此,本书教授的是持久适用的原则,而非当下的工具。不到十年,主流框架就从 Theano 转向 TensorFlow,再转向 PyTorch。硬件也从改作他用的图形处理器,演进为专门设计的张量加速器,而且每年都有新架构出现。任何教授当下工具的教材,都将在下一版问世之前过时。构建模块则会经久不衰。

本书涵盖的内容

本书以单个计算节点为中心:一台配备一至八个加速器的主机,通常具有通过互连连接的独立设备内存。在有助于阐明节点级设计的地方,本书也会介绍多加速器训练和生产运维;对大规模机群的系统论述则不在本书范围内。

全书内容分为四个部分,各自在系统论述中承担不同的作用:

  • 第一部分:机器学习系统基础介绍指导每个机器学习项目的术语、思维模型和端到端工作流程,内容从机器学习系统区别于传统软件的特征,一直到为其提供数据的数据工程流水线。
  • 第二部分:开发与训练通过深度学习计算、神经网络架构、框架和训练过程,将数学基础与实际运行的系统联系起来。
  • 第三部分:优化与加速讨论数据效率、模型压缩、硬件加速,以及严格衡量进展所需的基准测试方法。
  • 第四部分:部署与运维涵盖服务基础设施、运维实践,以及面向必须在生产环境中保持公平、透明和可信的系统的负责任工程。

这四个部分沿着机器学习系统栈展开。该系统栈参照经典计算机系统栈,采用分层抽象。每一层向上层提供抽象,并使用下层提供的功能:从底部的硬件,经由框架、模型、训练和模型服务,一直到顶部的运维和应用。数据作为贯穿各层的互连要素流经所有层,类似于计算机体系结构中的数据总线。

全书各章的页边图都会突出显示该章涉及的层,反复提供系统栈的定位图。

系统栈旁的数据条并非仅作装饰。其均匀的着色反映了数据在每章所讨论问题中的核心程度,这是独立于各层着色深浅的另一个维度。各层与数据条之间的连线表明,在该章的语境下,哪些层与数据交互。以下三章展示了观察视角如何变化。

在 硬件加速 中,较深的着色集中在系统栈底部,而数据条的颜色很浅:该章讨论的是芯片,而非数据。在 模型训练 中,中间各层较为突出,数据条的着色深浅适中,反映出训练虽然消耗数据,但本质上关注的是优化。在 负责任工程 中,顶部各层占主导,数据条的着色深浅适中,因为即使训练数据与应用之间隔着若干层,训练数据中的偏差仍会表现为应用中的偏差。同一个系统栈讲述了三个不同的故事,而数据是一个独立维度。

页边还会在某种关系最容易通过视觉理解的位置,提供小型图示说明。 这些图示不是供后文引用的编号插图, 而是阅读辅助工具。阶梯图直观呈现数量级差距,趋势草图展示 变化方向,Roofline 缩略图定位瓶颈所处的区域,而主导项条形图 展示哪个项决定了总量。当小型图示采用对数刻度时,会在图内 明确标注。

页边图示示例:三个橙色水平条以对数刻度比较能耗为 640 pJ 的 DRAM 访问、3.7 pJ 的 FP32 乘法和 0.5 pJ 的 SRAM 访问。

页边图示示例:两条上升曲线展示了随着累积速率提高,数据债务之间的差距不断扩大。

页边图示示例:一幅 Roofline 缩略图,展示由批大小决定的运行点向计算上限移动。

页边图示示例:两个堆叠延迟条展示了组件加速只能部分改善端到端延迟。

每一部分都建立在前一部分的基础上。建议初入该领域的读者按顺序阅读,而以下定制路径则支持特定的职业目标:

建议阅读路径

具有不同背景和目标的读者,可以选择适合自己的阅读路径:

  • 完整路径(按顺序阅读所有章节):面向本科生和初次接触机器学习系统的读者。从第一部分开始,然后依次学习第二、第三和第四部分。这条路径从基本原理出发,逐步建立每一个概念。
  • 机器学习工程师路径(面向实践者的系统深度学习):面向已经从事模型训练和部署、但希望理解底层系统的工程师。略读第一部分以熟悉术语,然后重点阅读 机器学习框架、模型训练、硬件加速、基准测试 和 模型服务。
  • 优化路径(以效率为重点):面向从事模型效率、边缘部署或资源受限系统工作的工程师。阅读第一部分后,直接转到 数据选择、模型压缩、硬件加速 和 基准测试。

体例约定

本书采用少量排版约定,标明各段文字所起的作用。

粗体标记首次定义

正文中以粗体显示的术语,表示该术语在本卷中的首次正式引入。每个术语仅在一处采用这种处理。后续出现时不再加粗;此时,该术语已成为本章后续论述所使用的基本词汇。

每个机器学习系统都肩负双重使命:必须同时应对统计不确定性和物理约束。

粗体是一项约定:请记住这个术语,因为它还会反复出现。书末对应的索引条目会在 definition 子条目下指向定义所在的位置,便于读者回查。关键技术术语也收录于术语表中。

粗体还承担另一种结构性作用:用作提示框内条目或总结性列表项开头的功能标签,例如建议、权衡或结果。在这种情况下,粗体用于组织内容,而非标记首次定义。

斜体承担特定的修辞功能

斜体不用于一般性强调。本书中的每一处斜体都承担以下几种特定功能之一:

  • 直接对照:训练与推理,逻辑与物理。
  • 以物理、数学或逻辑定律表述的不可能性:“延迟低于 10 ms 的系统不能使用远端云基础设施——物理定律不允许。”
  • 将词语本身作为讨论对象:“术语梯度指的是由偏导数组成的向量。”
  • 作品标题:《计算机体系结构:量化研究方法》。
  • 核心论点的点睛句:用一个斜体句子概括某一节的主导见解,例如,数据就是源代码。

以斜体显示的词语都在承担上述某一种功能。未使用斜体的词语不带有隐含的强调意味。

提示框的视觉标识与其功能相匹配

提示框不是装饰。每种类型都对应特定的内容,因此,在读者开始阅读之前,其视觉标识就已表明框内包含什么。

提示框 内容
定义 关键术语的正式定义,包括其意义、与最相近概念的区别,以及一个常见误区
示例 历史案例或具体场景,按背景、洞见和系统层面的经验组织
系统视角 丰富周边论述的分析性观察或数学上的细微之处
简算 逐步展开的计算示例,使用本书中的常量在文中直接计算数值;中间表格和方程就是计算过程本身
理解检查 用于检验对前一节内容理解程度的自测问题
实战案例 有记录的工程事件,其失效模式有来源依据,按背景、失效、后果和教训组织
灯塔案例 通过特征概况(参数量、FLOPs、主导约束)加以刻画的典型工作负载,作为贯穿多个章节的固定案例研究
原则 本书确立的基本原则或不变量,供后续章节引用
定理 由方程支持的形式化结果或界限,明确陈述其成立条件,并用于后续定量分析
关键要点 以总结形式呈现一章中最重要的四至七项结果
学习目标 读者完成本章学习后应能解释或应用的技能与概念
后续内容 衔接刚结束的章节与即将开始的章节,指出下一章将要解决的未决问题

当提示框包含表格、图或方程时,这些内容属于该提示框教学单元的一部分,而非装饰。灯塔案例的特征概况就是对它的刻画。简算框中的中间表格就是具体展开的计算过程。将这些内容割裂开来阅读,会破坏教学脉络。相比之下,独立的参考表格位于段落之间,带有编号,供读者通过交叉引用回查。两种形式都合理;视觉标识(提示框或独立呈现)会告诉读者当前看到的是哪一种。

无论读者选择哪条路径,本书都旨在将正文与各章之外的配套资源联系起来。

学习平台

本书是一个更广泛学习生态系统的组成部分。完整正文、交互式笔记本、授课幻灯片、练习、动手实验,以及每章的补充材料,均可在 mlsysbook.ai 免费获取。

开源教材

本书是开源的。完整正文、插图和构建系统均可在 mlsysbook.ai/git 获取,我邀请每一位读者参与贡献。这种开放性是有意为之的。如果人工智能工程要成为一门共同的学科,而非一系列孤立的实践,其基础文献就必须人人可得。机器学习系统这一领域由来自全球产业界、学术界和开源社区的实践者共同塑造。涵盖这一领域的教材应当体现这种广泛性,并向所有人开放,不受地理位置或所属机构的限制。

读者的贡献,无论是修正错误、建议更清晰的解释、添加完整求解示例,还是提出新内容,都切实改善了每一章。议题和拉取请求为这种协作提供了机制。本书之所以不断进步,正是因为读者参与了它的建设。

先修要求

读者应具备两项基础:

  • 编程:熟练使用 Python,包括函数、类,以及使用 NumPy 进行基本数据处理。
  • 数学:熟悉本科水平的线性代数、基础微积分和概率论。

另外两个领域的知识有所帮助,但不是必需条件:

  • 计算机系统:熟悉内存层次结构和基本计算机体系结构,有助于深入理解优化与硬件章节。
  • 机器学习基础:预先接触过监督学习概念可以提供有益的背景,但第二部分会从基本原理出发建立必要的基础。

本书之外

本书建立单节点基础,并在分布式执行、生产运维和治理影响端到端系统的地方介绍这些内容。更高级的多节点拓扑、覆盖整个机群的集合通信算法,以及集群韧性,则延伸至大规模分布式系统领域。完成本书的学习,将使读者具备探索这一更广阔工程领域的基础。

在课程中使用本书

本书源于哈佛大学的 CS249r 课程和 TinyML edX 专业证书项目。TinyML 课程在资源约束最严格的场景中教授机器学习系统:微控制器以毫瓦级功耗运行,内存仅有千字节级。相关工作表明,支配嵌入式设备的物理约束(内存带宽、计算密度和每次运算的能耗),同样支配着数据中心 GPU。物理规律适用于各种规模;变化的只有数值。 这一认识塑造了本书:在最小规模上掌握系统基础,能够帮助工程师应对各种规模的系统。

在课程教学中,本书旨在支持一个学期的教学安排,覆盖完整的机器学习系统栈。教师也可以选择个别部分,用于较短的教学模块:

  • 第一至第二部分构成半学期的入门课程,介绍机器学习系统基础,以及此类系统的构建和训练方式。
  • 第三至第四部分构成半学期的应用课程,介绍如何优化、部署和运行此类系统。

对于概论课程或高管培训项目,仅阅读四个部分的导言,就能获得对支配机器学习系统的定量原则的精炼概览。

授课幻灯片、作业和教师资源可在 mlsysbook.ai 获取。

Back to top
← 中文书架