前言
本书面向的读者
本书面向所有希望理解机器学习系统究竟如何运行的读者,内容涵盖定义神经网络的数学原理、执行神经网络的硬件,以及使其高效运行的工程决策。
大多数读者不会成为机器学习硬件架构师或编译器工程师。然而,每一位构建、训练、优化或部署模型的实践者,都会做出依赖于对代码底层系统的理解的决策。本书为首次接触机器学习系统的本科生、希望夯实基础的在职工程师,以及需要推理分析性能与部署问题的研究人员提供系统基础。
为什么需要一本系统教材
1968 年,在德国加米施举行的一次北约会议,推动了软件工程作为一门独立学科的确立。当时,人们担忧软件系统已变得过于复杂,无法再依靠临时拼凑的编程方式来开发 (Naur and Randell 1969)。可靠的软件需要自身的原则、方法和严谨性。数十年后,Hennessy 和 Patterson 将定量分析置于计算机体系结构教育的核心,系统化地阐述了工程师如何测量、预测和优化处理器性能 (Hennessy and Patterson 2017)。这两个例子都说明,共同的方法如何使复杂的工程工作变得系统化且可以传授。
机器学习正面临自身的加米施时刻。
过去十年,机器学习研究一直由以模型为中心的思维主导,重点是发现新的算法和架构。这一重点固然重要,但模型并不等于系统。一个在研究笔记本中表现良好的神经网络,如果无法满足延迟约束、其数据流水线无法处理所需的数据量,或其能源成本超过了自身的经济价值,就毫无用处。可用模型与生产系统之间的差距,不仅仅是实现上的差距,更是基础工程原则上的差距。
本书将机器学习系统工程视为一门以定量界限、模型和设计原则为基础的学科,而非 Kubernetes、PyTorch 和 CUDA 等工具的集合。正如土木工程师依靠基础物理学和结构原理,人工智能工程师也必须明确每一种系统模型背后的支配原则:
- 机器学习系统铁律:将系统分解为数据移动、计算和开销,并通过关键路径处理它们之间的重叠。
- 数据引力:大规模数据和受限网络所产生的部署位置压力。
- 能耗核算:单次事件的成本与事件次数决定了数据移动或计算何者占主导。
- 阿姆达尔定律:流水线中的串行部分比例限制了整个系统的加速比。
计算机科学研究什么是可计算的。机器学习研究什么是可学习的。人工智能工程则研究,在真实硬件和真实数据的物理条件下,什么是可构建的。
我撰写本书,是希望帮助建立这一基础,并为人工智能系统做出如同 Hennessy and Patterson (2017) 为计算机体系结构所做的贡献:以测量取代直觉,以工程取代技艺。目标是在实现之前先教授系统层面的推理,将数据、算法和硬件视为一个相互耦合的优化问题,而非彼此分离的孤岛。
想象一盒乐高积木。同样的拼接组件可以搭建宇宙飞船、城堡,乃至整座城市。套装在变,积木不变。机器学习系统也是如此。用于图像分类的卷积网络、用于语言生成的 Transformer,以及用于机器人技术的强化学习智能体,是截然不同的应用,但其底层都有相同的构建模块:计算图、内存层次结构、数据流水线、优化循环,以及延迟、吞吐量和能耗之间的权衡。掌握这些构建模块,就能理解陌生的系统。
因此,本书教授的是持久适用的原则,而非当下的工具。不到十年,主流框架就从 Theano 转向 TensorFlow,再转向 PyTorch。硬件也从改作他用的图形处理器,演进为专门设计的张量加速器,而且每年都有新架构出现。任何教授当下工具的教材,都将在下一版问世之前过时。构建模块则会经久不衰。
本书涵盖的内容
本书以单个计算节点为中心:一台配备一至八个加速器的主机,通常具有通过互连连接的独立设备内存。在有助于阐明节点级设计的地方,本书也会介绍多加速器训练和生产运维;对大规模机群的系统论述则不在本书范围内。
全书内容分为四个部分,各自在系统论述中承担不同的作用:
- 第一部分:机器学习系统基础介绍指导每个机器学习项目的术语、思维模型和端到端工作流程,内容从机器学习系统区别于传统软件的特征,一直到为其提供数据的数据工程流水线。
- 第二部分:开发与训练通过深度学习计算、神经网络架构、框架和训练过程,将数学基础与实际运行的系统联系起来。
- 第三部分:优化与加速讨论数据效率、模型压缩、硬件加速,以及严格衡量进展所需的基准测试方法。
- 第四部分:部署与运维涵盖服务基础设施、运维实践,以及面向必须在生产环境中保持公平、透明和可信的系统的负责任工程。
这四个部分沿着机器学习系统栈展开。该系统栈参照经典计算机系统栈,采用分层抽象。每一层向上层提供抽象,并使用下层提供的功能:从底部的硬件,经由框架、模型、训练和模型服务,一直到顶部的运维和应用。数据作为贯穿各层的互连要素流经所有层,类似于计算机体系结构中的数据总线。
全书各章的页边图都会突出显示该章涉及的层,反复提供系统栈的定位图。
系统栈旁的数据条并非仅作装饰。其均匀的着色反映了数据在每章所讨论问题中的核心程度,这是独立于各层着色深浅的另一个维度。各层与数据条之间的连线表明,在该章的语境下,哪些层与数据交互。以下三章展示了观察视角如何变化。
在 硬件加速 中,较深的着色集中在系统栈底部,而数据条的颜色很浅:该章讨论的是芯片,而非数据。在 模型训练 中,中间各层较为突出,数据条的着色深浅适中,反映出训练虽然消耗数据,但本质上关注的是优化。在 负责任工程 中,顶部各层占主导,数据条的着色深浅适中,因为即使训练数据与应用之间隔着若干层,训练数据中的偏差仍会表现为应用中的偏差。同一个系统栈讲述了三个不同的故事,而数据是一个独立维度。
页边还会在某种关系最容易通过视觉理解的位置,提供小型图示说明。 这些图示不是供后文引用的编号插图, 而是阅读辅助工具。阶梯图直观呈现数量级差距,趋势草图展示 变化方向,Roofline 缩略图定位瓶颈所处的区域,而主导项条形图 展示哪个项决定了总量。当小型图示采用对数刻度时,会在图内 明确标注。
每一部分都建立在前一部分的基础上。建议初入该领域的读者按顺序阅读,而以下定制路径则支持特定的职业目标:
建议阅读路径
具有不同背景和目标的读者,可以选择适合自己的阅读路径:
体例约定
本书采用少量排版约定,标明各段文字所起的作用。
粗体标记首次定义
正文中以粗体显示的术语,表示该术语在本卷中的首次正式引入。每个术语仅在一处采用这种处理。后续出现时不再加粗;此时,该术语已成为本章后续论述所使用的基本词汇。
每个机器学习系统都肩负双重使命:必须同时应对统计不确定性和物理约束。
粗体是一项约定:请记住这个术语,因为它还会反复出现。书末对应的索引条目会在 definition 子条目下指向定义所在的位置,便于读者回查。关键技术术语也收录于术语表中。
粗体还承担另一种结构性作用:用作提示框内条目或总结性列表项开头的功能标签,例如建议、权衡或结果。在这种情况下,粗体用于组织内容,而非标记首次定义。
斜体承担特定的修辞功能
斜体不用于一般性强调。本书中的每一处斜体都承担以下几种特定功能之一:
- 直接对照:训练与推理,逻辑与物理。
- 以物理、数学或逻辑定律表述的不可能性:“延迟低于 10 ms 的系统不能使用远端云基础设施——物理定律不允许。”
- 将词语本身作为讨论对象:“术语梯度指的是由偏导数组成的向量。”
- 作品标题:《计算机体系结构:量化研究方法》。
- 核心论点的点睛句:用一个斜体句子概括某一节的主导见解,例如,数据就是源代码。
以斜体显示的词语都在承担上述某一种功能。未使用斜体的词语不带有隐含的强调意味。
提示框的视觉标识与其功能相匹配
提示框不是装饰。每种类型都对应特定的内容,因此,在读者开始阅读之前,其视觉标识就已表明框内包含什么。
| 提示框 | 内容 |
|---|---|
| 定义 | 关键术语的正式定义,包括其意义、与最相近概念的区别,以及一个常见误区 |
| 示例 | 历史案例或具体场景,按背景、洞见和系统层面的经验组织 |
| 系统视角 | 丰富周边论述的分析性观察或数学上的细微之处 |
| 简算 | 逐步展开的计算示例,使用本书中的常量在文中直接计算数值;中间表格和方程就是计算过程本身 |
| 理解检查 | 用于检验对前一节内容理解程度的自测问题 |
| 实战案例 | 有记录的工程事件,其失效模式有来源依据,按背景、失效、后果和教训组织 |
| 灯塔案例 | 通过特征概况(参数量、FLOPs、主导约束)加以刻画的典型工作负载,作为贯穿多个章节的固定案例研究 |
| 原则 | 本书确立的基本原则或不变量,供后续章节引用 |
| 定理 | 由方程支持的形式化结果或界限,明确陈述其成立条件,并用于后续定量分析 |
| 关键要点 | 以总结形式呈现一章中最重要的四至七项结果 |
| 学习目标 | 读者完成本章学习后应能解释或应用的技能与概念 |
| 后续内容 | 衔接刚结束的章节与即将开始的章节,指出下一章将要解决的未决问题 |
当提示框包含表格、图或方程时,这些内容属于该提示框教学单元的一部分,而非装饰。灯塔案例的特征概况就是对它的刻画。简算框中的中间表格就是具体展开的计算过程。将这些内容割裂开来阅读,会破坏教学脉络。相比之下,独立的参考表格位于段落之间,带有编号,供读者通过交叉引用回查。两种形式都合理;视觉标识(提示框或独立呈现)会告诉读者当前看到的是哪一种。
无论读者选择哪条路径,本书都旨在将正文与各章之外的配套资源联系起来。
学习平台
本书是一个更广泛学习生态系统的组成部分。完整正文、交互式笔记本、授课幻灯片、练习、动手实验,以及每章的补充材料,均可在 mlsysbook.ai 免费获取。
开源教材
本书是开源的。完整正文、插图和构建系统均可在 mlsysbook.ai/git 获取,我邀请每一位读者参与贡献。这种开放性是有意为之的。如果人工智能工程要成为一门共同的学科,而非一系列孤立的实践,其基础文献就必须人人可得。机器学习系统这一领域由来自全球产业界、学术界和开源社区的实践者共同塑造。涵盖这一领域的教材应当体现这种广泛性,并向所有人开放,不受地理位置或所属机构的限制。
读者的贡献,无论是修正错误、建议更清晰的解释、添加完整求解示例,还是提出新内容,都切实改善了每一章。议题和拉取请求为这种协作提供了机制。本书之所以不断进步,正是因为读者参与了它的建设。
先修要求
读者应具备两项基础:
- 编程:熟练使用 Python,包括函数、类,以及使用 NumPy 进行基本数据处理。
- 数学:熟悉本科水平的线性代数、基础微积分和概率论。
另外两个领域的知识有所帮助,但不是必需条件:
- 计算机系统:熟悉内存层次结构和基本计算机体系结构,有助于深入理解优化与硬件章节。
- 机器学习基础:预先接触过监督学习概念可以提供有益的背景,但第二部分会从基本原理出发建立必要的基础。
本书之外
本书建立单节点基础,并在分布式执行、生产运维和治理影响端到端系统的地方介绍这些内容。更高级的多节点拓扑、覆盖整个机群的集合通信算法,以及集群韧性,则延伸至大规模分布式系统领域。完成本书的学习,将使读者具备探索这一更广阔工程领域的基础。
在课程中使用本书
本书源于哈佛大学的 CS249r 课程和 TinyML edX 专业证书项目。TinyML 课程在资源约束最严格的场景中教授机器学习系统:微控制器以毫瓦级功耗运行,内存仅有千字节级。相关工作表明,支配嵌入式设备的物理约束(内存带宽、计算密度和每次运算的能耗),同样支配着数据中心 GPU。物理规律适用于各种规模;变化的只有数值。 这一认识塑造了本书:在最小规模上掌握系统基础,能够帮助工程师应对各种规模的系统。
在课程教学中,本书旨在支持一个学期的教学安排,覆盖完整的机器学习系统栈。教师也可以选择个别部分,用于较短的教学模块:
- 第一至第二部分构成半学期的入门课程,介绍机器学习系统基础,以及此类系统的构建和训练方式。
- 第三至第四部分构成半学期的应用课程,介绍如何优化、部署和运行此类系统。
对于概论课程或高管培训项目,仅阅读四个部分的导言,就能获得对支配机器学习系统的定量原则的精炼概览。
授课幻灯片、作业和教师资源可在 mlsysbook.ai 获取。