Skip to content

原文:第 1 章 说明:忠实翻译原网页内容,并补入与经典文献、业界系统的对照。术语首次出现给出英文锚点。

第 1 章 机器学习系统:问题、约束与垂直整合

本章在体系中的位置

这是整门课的地基。它不教你任何具体技术,而是回答一个前置问题:为什么会有「机器学习系统」这门学科? 学完你应该带走两样东西——一种跨层思考的习惯,和一张后面所有章节的地图。后面每章(GPU 架构、CUDA、编译器、分布式训练、推理系统)都是这张地图上的一格。

现代人工智能不仅是建模层面的突破,它还是一个横跨数学、软件、硬件与物理规律的全新大规模优化问题。我们要构建的智能不是孤立的,它必须经由一套系统来实现——这套系统要在严格的物理限制下执行、存储、搬运海量的结构化计算。所以,机器学习系统(Machine Learning Systems)本质上是一个跨层(cross-layer)、端到端(end-to-end)的优化问题

最大的改进机会往往在算法层面——在那里,计算的结构本身可以被重塑。但每一个机会都受制于系统软件,更受制于硬件和底层的物理定律。

这一章做两件事:

  • 第一部分通过一串精心设计的问题,揭开机器学习系统难在哪儿:工作负载演化、高维结构、张量主导、访存层级、通信瓶颈、物理扩展极限。
  • 第二部分绘制这门学科的结构地图——从 GPU 架构、编程模型,到编译器、分布式训练、推理系统、模型优化与数据生命周期——让后面每个主题都作为「垂直整合系统」的一块拼图来理解。

第一部分 关键问题:机器学习系统为什么难?

这一章不从定义开始,而从问题开始。

第一部分的目的不是教你技巧,而是训练一种思维方式。机器学习系统不是一堆拿来背的工具,它是一种在演化的工作负载物理约束之下推理计算的方式。如果你没有先内化这个问题的心智结构,后面每个技术主题都会显得零散、偶然。

所以我们从一串精心构造的问题出发。每个问题揭开问题更深的一层,每个答案揭示一个不能忽略的约束。只有认真走完这些提问,我们才能理解:垂直整合不是可选项,而是必然。


1.1 为什么计算机系统设计很难?

我们从一个看似简单的问题开始:为什么设计计算机系统很难?

乍一看答案显而易见。现代计算系统极其复杂——一块 GPU 里有数百亿个晶体管,一个数据中心可能有成千上万块这样的设备,软件栈横跨操作系统、驱动、编译器、运行时与分布式协调层。复杂性当然可以解释困难。

复杂性本身并不足以解释

自然界里许多系统同样极其复杂,却异常稳定:一个生物体很复杂,一个行星系统也很复杂。复杂本身,解释不了为什么设计计算机系统从根本上就是难的。更深层的问题不在规模,而在不确定性(uncertainty)

要看清这一点,必须把时间考虑进来。

一款现代处理器或加速器,从架构构思到部署通常要 两到三年。在这段时间里,工作负载一直在演化:算法在改进,新的模型架构在涌现,整个范式都可能转向。某一年上市的新硬件,其实是在多年以前、基于可能早已失效的假设设计的。

这造成了设计与部署之间的根本不对称

当我们设计一个系统时,我们不是为今天的工作负载设计的——我们是为一个未来才存在的工作负载设计的。

这个时间差,才是系统设计困难的真正来源。

如果系统为错误的工作负载做了优化,其低效绝不是边际性的。访存层级、互连拓扑、算术单元、数值格式、甚至功耗分配,全都被工作负载假设塑造。假设一旦失效,架构就和现实脱节。

于是我们到达这门学科的第一条基本原则:

第一性原理

好的系统设计,始于预测未来的工作负载。

这不是哲学修辞,而是一个结构性约束——每一个架构决策,都内嵌了对「未来什么计算会占主导」的隐式预测。

如果人工智能越来越定义未来的工作负载,那么理解机器学习系统就必须从一个更深的问句开始:智能的计算本质是什么?


1.2 智能的工作负载是什么?

如果系统设计依赖预测未来工作负载,那我们必须面对一个更根本的问题:智能的计算本质是什么?

要回答它,先暂时放下实现细节,只看结构。人工智能系统处理的是原始数据:图像、音频信号、文本序列、传感器读数,以及日益增多的多模态组合。现代 AI 模型的原始输入是极高维的:一张中等分辨率的图有上百万像素;一段短音频每秒有上千个时间采样;语言模型能处理含数千 token 的序列,训练时则要见到数万亿个 token。

乍看,你可能会得出「智能就是处理海量高维数据」的结论。但这个结论不完整。

考虑一个简单观察:原始数据虽然高维,但其中有意义的结构似乎高度受限。所有可能图像的集合浩瀚无边,自然图像却只占据其中一小块流形(manifold);所有可能词串的集合大得惊人,语法和语义通顺的句子却只形成一个很小的结构化子集。物理系统的传感器数据同理——底层动力学定律限制了可行状态。

这引出了机器学习的核心假设:

智能,就是在高维空间中发现紧凑结构(compact structure)。

为了探究这个假设的计算后果,我们把它形式化。

假设观察到数据向量 很大;再假设数据的基本结构近似落在某个 维低维子空间内,。设矩阵 的列构成该子空间的一组基。

我们的目标是用基向量的线性组合来近似每个数据向量

其中 是系数向量。

这个近似问题最自然的表述是最小化平方重建误差

这里必须精确。目标函数对 是二次的,令梯度为零即可得到极小点。对 求导:

令梯度为零,就得到正规方程(normal equations)

这个条件有清晰的几何解释:残差 必须与 张成的子空间正交。展开方程:

整理后得到

的列线性无关,则 可逆,解为

代回,重建向量变为

而矩阵

正是到 列空间上的投影算子(projection operator)。于是,在这个线性框架里,「学习一个表示」就化简为「学习一个投影」。

停下来想想

上面这串推导,本质就是一个最小二乘投影。它和你在大一学过的线性回归同源——只是这次「被拟合」的不是直线,而是一个子空间。如果你能意识到「表示学习 ≈ 学一个投影」,你就在用系统的眼光看问题了。

到目前为止,我们假设子空间 固定。但实践中,表示学习需要选一个 ,让它最好地捕获整个数据集 的结构。

因此我们考虑全局优化问题:

并对 施加合适的约束。为严格起见,施加正交约束 ——这简化分析,并保证 张成一个 维标准正交子空间。

在此约束下投影简化为 ,重建误差变为

展开这个表达式:

对所有样本求和并除以

第一项与 无关。因此,最小化重建误差等价于最大化

现在引入经验协方差矩阵

注意到

于是表示学习问题化简为

为解这个带约束的优化问题,考虑对称矩阵 的特征分解:

其中 是对角阵,特征值为 包含对应的标准正交特征向量。

可以证明(直接代入,或引用 Rayleigh–Ritz 定理):当 的列取为最大的 个特征值对应的特征向量时,迹 最大。

因此,最优表示子空间由前 个主成分张成。

这就是主成分分析(PCA)。

这组推导的目的不是考古,而是结构性的。即使在这种最简单的线性设定里,「学习结构」也化简为一小撮计算原语:矩阵乘法、协方差累积、正交投影、特征值分解。而其中每一个,都建立在大规模张量收缩(tensor contraction)之上。

现代深度神经网络远超线性 PCA:它们引入非线性激活、层次化组合、注意力机制,以及梯度下降优化。但若仔细审视内部计算,一个惊人的事实浮现——绝大多数算术运算,仍然是对高维张量施行的线性变换

数学形式变了,计算骨架没变。

所以:如果智能 = 在高维数据中发现紧凑结构,如果发现这种结构在计算上化简为反复的线性变换,那么现代机器学习系统的工作负载必然由张量运算主导

至此我们回答了第一个基本问题:我们到底在算什么? 一个新问题自然浮现——如果张量运算主导工作负载,那什么运算主导成本?


1.3 如果智能是线性代数,主导运算是什么?

上一节我们确立了:即便最简单的表示学习表述也会化简为投影与特征值问题;而现代神经网络虽是非线性结构,在计算上却由对高维张量的线性变换主导。

现在把这个论断磨得更锋利。如果智能的计算骨架是线性变换,那我们得问:实践中,是哪个具体操作在主导这些变换?

为回答它,我们检查一个现代大规模模型——比如 transformer——的内部结构。

一个 transformer 层由两大部分组成。第一是注意力机制(attention):输入 token 被线性投影到 query、key、value 空间;token 间的相似度用点积计算,得到注意力矩阵;该矩阵再乘上 value 向量,得到聚合表示。第二部分是前馈网络(feed-forward network):通常由两个大线性层夹一个非线性激活组成。

这些步骤每一步都涉及稠密矩阵乘法

考虑一批输入 token,记为矩阵 ,其中 是批大小、 是序列长度、 是隐藏维度。权重矩阵 通过下式变换激活:

这是矩阵乘法。注意力里 query 与 key 的投影:

注意力分数:

还是矩阵乘法。softmax 归一化之后,组合 value:

又是矩阵乘法。前馈网络再施两次规模相近的稠密变换。

于是,单个 transformer 层里绝大多数的算术运算,都是稠密矩阵乘法。当这样的层堆叠几十层、模型宽度 涨到几千上万时,算术负担变得极其巨大。

这时候你可能会忍不住说:既然矩阵乘法主导,那把矩阵乘法优化好不就行了?

这个直觉需要仔细检验。要理解真正的工作负载,不仅要量化算术,还要量化内存占用

参数规模与内存现实

考虑一个中等规模的 transformer 配置。设隐藏维度 、24 层、词表大小 5 万、序列长度 1024、批大小 8。按今天的标准,这些数字毫不极端——甚至可以说寒酸。

来估一下参数量。单个 的稠密线性层含 个参数; 时约 400 万。而一个 transformer 层里有多个这样的矩阵:query/key/value 投影、输出投影、前馈网络的两个矩阵。加起来单层就有约 1000 万~2000 万参数。24 层,模型轻松超过 10 亿参数

若每个参数用 16 位浮点存储(每参数 2 字节),仅权重一项,10 亿参数就占约 2 GB 内存。

但权重不是唯一的内存需求。训练时还要存前向传播的激活,供反向传播算梯度。序列长度 1024、批大小 8 时,每层激活张量含

个元素——每层约 1600 万元素、每元素 2 字节 ≈ 每层 32 MB。24 层,仅前向激活就是几百 MB。

训练还不止于此:梯度要存;Adam 这类优化器还为每个参数维护额外状态(通常是一阶矩与二阶矩,且常用更高精度存储),这部分能再让内存需求翻倍或翻三倍。

把所有项加起来——参数、梯度、优化器状态、激活——即使一个「小」的十亿参数模型,总内存足迹也能逼近几十 GB

这是一个关键洞察:

记住这句话

主导运算也许是矩阵乘法,但主导约束可能是内存容量与带宽。算术运算是瞬时的;数据结构必须常驻。

算术 vs 数据搬移

回到算术。用朴素算法乘两个 矩阵需要 次乘加。看起来计算量很大——但现代加速器每秒能做数万亿次这样的运算。

如果算术是唯一的考量,扩模型只需要更快的算术单元就够了。

每一次乘加都需要两个操作数在本地就位。如果操作数躺在慢速的全局内存里,算术发生前必须先取回来;如果结果无法留在片上的快速内存,又得写回去。

所以矩阵乘法的成本,不止由算术运算次数决定,还取决于数据在访存层级间搬动的效率。理论算术复杂度并不能刻画这个成本。

要理解实际瓶颈,必须区分两类工作负载:

  • 计算受限(compute-bound):做算术的时间主导总运行时间;
  • 访存受限(memory-bound):取数和存数的时间主导。

矩阵乘法在正确分块(blocking/tiling)后算术强度(arithmetic intensity)很高——每个取进快内存的元素在被换出前能参与很多次算术,于是算术单元可以被喂饱。但大规模模型训练不是孤立的单次矩阵乘法,而是一串被中间张量串起来的算子序列。算子之间,数据可能要写回全局内存再读出来。分布式训练还引入设备间通信,进一步放大数据搬移成本。

于是:矩阵乘法主导算术,但数据搬移主导系统级成本。

这个观察把我们引向一个更微妙的问题:如果矩阵乘法在硬件上已被高度优化,如果算术如此充裕,那为什么降低数值精度并不能总是带来成比例的加速?答案藏在线性和非线性分量的不对称里,藏在中间数据搬移的成本里。但在回答它之前,我们必须先审视数据搬移本身的物理成本——这是下一节的主题。


1.4 如果矩阵乘法这么简单,AI 为什么还难?

到这里,论证似乎指向一个简单的结论:智能化简为反复的线性变换;线性变换化简为矩阵乘法;矩阵乘法是理解透彻、背后有数十年硬件优化的操作。因此加速智能应该「只要」把矩阵乘法跑得更快就行。

但这个推理藏了一个关键简化。

矩阵乘法写成数学式,是一个紧凑的符号表达式:

纸面上,这是一个优美且有限的表达式。但在硬件里,求和式的每一项都要求数据物理地出现在某个计算单元处。计算不能在抽象中发生,它必须在硅片上的某个位置发生,让电子穿过导线流动。

符号计算与物理执行的差别,正是困难浮现之处。

设我们真的在硬件上做一次矩阵乘法。两个稠密矩阵 ,朴素算法要 次乘加。只看算术,成本似乎巨大——但现代加速器每秒能做数万亿次乘加,算术单元并不稀缺。

可算术单元不孤立运作,它们需要操作数:每次乘法要取两个数,每次累加要存一个中间结果。如果这些数离计算单元很远,就必须被搬运。

为此必须理解访存层级(memory hierarchy)。现代加速器围绕一层层的存储构建:最上是寄存器(极快、极省电,但容量极小);稍下是片上 SRAM 结构(共享内存或 L1 缓存);再下是更大的片上缓存;芯片之外是高带宽内存(HBM),再之外是系统内存。每一层都在容量、延迟、能耗之间做权衡。

基本约束是:大的内存不可能同时快、便宜、省电。物理定律强制折中——把比特搬得越远,花的时间和能量越多。

体会一下这个效应的量级:从片外 DRAM 取一个字的能量,可以媲美几百次乘加;DRAM 的访问延迟是几百甚至上千个处理器周期,而寄存器只要几个周期。这个差距不是小常数因子,而是数量级的差距。

于是,尽管矩阵乘法理论上算术密集,它的实际性能关键取决于数据如何被搬动与复用。这引出性能分析的核心概念——算术强度(arithmetic intensity):每搬动一个字节的数据所执行的算术运算次数。算术强度高,每次取数的成本就被大量运算摊薄。

矩阵乘法在正确分块后可以达到很高的算术强度:一块矩阵 取进快内存,可以和 的多个块反复相乘,同一元素在被换出前参与多次乘加。

但大规模机器学习负载不是孤立的矩阵乘法,而是被中间张量串起的算子序列。每个线性层之间,激活要前传;训练时这些激活要为反向传播而存储;梯度要累积;优化器状态要更新;分布式场景下张量还要跨设备通信。即使每一个矩阵乘法都实现得很高效,周边的数据搬移仍可能主导。

更具体地:想象一次过 transformer 层的前向。输入激活乘权重矩阵得到新激活,过 softmax/GELU 这类非线性,再喂进下一个线性变换。如果中间结果在算子之间都写回全局内存,那么内存流量成本可能压过算术成本。

所以,系统设计的核心问题不只是「每秒能做多少次乘加」,更是「每秒必须搬多少个字节、能耗多少」。

学生第一次见到大模型,常盯着参数量,问需要多少次浮点运算。但系统设计师问的是另一个问题:有多少数据必须搬动,要搬多远?

古典计算机科学里,算法分析看的是计算复杂度——数操作次数、看渐近增长。但在大规模机器学习系统里,渐近算术复杂度不是唯一指标。再看一次两个 矩阵相乘:算术复杂度 ,存储需求 ,算术/存储之比随 增长。对很大的 ,这个比值很高——似乎应该是计算受限。

但真实系统常常变成通信受限(communication-bound)。 为什么?因为算术单元比内存带宽更容易扩张;因为把数据搬过芯片、板卡、机架,远比本地做算术昂贵;因为中间结果可能被不同算子、在不同内存位置生成和消费。当系统从单 GPU 扩展到多 GPU、再到整个集群,通信开销急剧增长。梯度同步所需的 all-reduce 等集合通信,其延迟与带宽需求可能盖过本地计算时间。

这个现象被一句常归功于 Ken Batcher 的话精准概括:

超级计算机,就是把计算受限问题变成 I/O 受限问题的设备。

这话既幽默又深刻。加速算术,就暴露出通信是主导成本;扩展并行度,同步与数据传输就成了新瓶颈。

就地(Staying Local)

面对现实,现代系统优化的大量工作围绕一条原则:stay local(就地)

就地意味着:数据一旦取进快内存,就尽量多复用再换出;把算子融合(fusing),避免把中间张量写回全局内存;把计算与数据传输重叠(overlap),隐藏延迟;在合适时降低数值精度,减小带宽需求。

这些策略不改变模型的数学,只改变数学在物理限制内被执行的效率。

现在可以回答本节的核心问题了:矩阵乘法作为抽象数学运算很简单;它在大规模下难,是因为主导性能的是数据搬移,而不是算术

但想通这点又引出新问题:如果主要瓶颈来自物理约束(能耗、延迟、带宽),那我们能否指望硬件持续扩展来缓解这些压力?要回答它,必须审视半导体技术的历史轨迹与物理极限。


1.5 硬件扩展能解决问题吗?

如果算术充裕而数据搬移昂贵,也许未来的硬件改进能解决失衡——更快的存储、更密的集成、新的制程工艺,让计算与通信重归平衡。

在几十年里,这种乐观是有根据的。半导体技术史就是持续非凡的性能增长史。要判断这种增长能否继续拯救低效的工作负载,必须考察硬件扩展的物理基础。

半导体史上最广为人知的经验观察是摩尔定律(Moore's Law):芯片上能放的晶体管数量大约每 18~24 个月翻一番。许多年里,这种翻番确实转化为真实的性能提升。

但晶体管数量本身不决定性能。要理解性能,要看开关速度与功耗。晶体管开关时的动态功耗近似为

其中 是被充放电的电容, 是供电电压, 是开关频率。

在半导体缩放的早期世代,晶体管尺寸缩小带来几个同步的有利效应。第一,物理尺寸缩小降低电容 ——更小的晶体管需要更少电荷来翻转状态。第二,供电电压 可以按比例降低——电压降低使功耗二次方下降。第三,更短的沟道允许更高的开关频率

这种协同缩放被称为丹纳德缩放(Dennard scaling),其惊人结果是:功耗密度跨世代近似恒定。晶体管变小了,芯片可以跑得更快而不至于过热。

几十年来,这造就了一个强预期:未来的处理器会更密、更快。性能改进不是渐进的,而是复合的。

但这个缩放机制最终撞上了根本极限。当晶体管尺寸进入深纳米区间,先前可忽略的物理效应变得主导:漏电流显著增大——关断状态的晶体管不再像理想开路;继续降压变得困难,因为电压太低会缩小噪声裕度并加剧泄漏。

于是电压缩放停滞。一旦电压不能再随晶体管尺寸成比例下降,动态功耗方程就施加硬约束:提高频率 直接增加功耗。大约 2000 年代中期,处理器主频出现平台期。频率缩放——曾经性能提升的主要引擎——实际上结束了。 芯片无法在不超热极限的前提下显著跑得更快。这个时刻常被称为「功耗墙(power wall)」

频率缩放的终结迫使架构设计范式转向。既然单核频率提不上去,性能增益必须来自并行——不再造一个更快的核,而是造许多个中等速度的核。

这一转变影响深远。并行对能分解成大量独立操作的工作负载非常有效——稠密矩阵乘法正是如此,每个输出元素在操作数就位后都可以独立计算。于是频率缩放的终结,间接偏向了为吞吐而非单线程延迟优化的架构。而 GPU——早就为渲染工作负载演化出大规模并行执行——恰好站在风口上:它提供成百上千个能并行执行简单操作的算术单元。

但并行缩放带来了自己的约束。并行执行单元越多,对数据的需求越大:每个单元都要被喂操作数,每个结果都要被存储或转发。如果内存带宽不按比例扩展,执行单元就会在等数据时空转。

换句话说,功耗墙没有消除瓶颈,只是把瓶颈搬了个位置。频率缩放停滞后,内存与通信约束更明显;并行度提高后,通信成本增长更快。

硬件扩展的历史轨迹教给我们关键一课:硬件改进不是无界的,它受物理定律约束。一个瓶颈被移除,另一个会在别的层冒出来。

对机器学习系统的含义很清楚:我们不能只靠硬件缩放来解决算法设计或数据搬移的低效。我们必须从一开始就让系统顺应物理约束

这个认识自然引出下一个问题:如果频率缩放结束后并行成为主要策略,而 AI 工作负载高度可并行——那为什么是 GPU 脱颖而出?


1.6 为什么是 GPU 赢了?

我们刚看到:功耗墙终结了频率缩放,产业用增加并行度回应;性能不再从更快的时钟里挤,而是从更多的并发操作里挤。

但并行本身不决定架构的统治地位。许多架构都能并行。关键问题不只是有多少个核,而是架构是否与工作负载的结构对齐

传统 CPU 面向通用工作负载设计:复杂控制流、不规则访存、强单线程延迟要求。CPU 核里有精巧的分支预测、推测执行、乱序调度机制和大缓存层级来压低延迟。CPU 里大量硅片面积不是给算术单元的,而是给控制逻辑和内存系统的——它们优化的是不可预测的程序。

这种设计哲学对操作系统、数据库、编译器、普通软件应用极其有效:这些负载由控制决策、指针追逐、顺序依赖主导,最小化单线程延迟至关重要。

GPU 则在另一条假设下演化。图形负载是「把相似的操作施加到大量像素或顶点上」:计算规整,同一条指令常并行施加到许多数据元素上,控制流相对简单可预测。

于是 GPU 架构强调吞吐压倒延迟:不用少数复杂核,而用大量更简单的核组织成流式多处理器(streaming multiprocessor,SM);不重投推测执行和深层控制逻辑,而重投算术单元;不用复杂缓存去最小化访存延迟,而用大规模硬件多线程去隐藏延迟——一个线程等内存时,调度另一个线程顶上。这个模型假设有足够的独立工作,即使个别线程延迟,算术单元也不闲着。

现在回头看看 1.2、1.3 节分析的现代机器学习负载:稠密矩阵乘法高度规整,是跨大数组的反复乘加,并行度极高;正确分块后访存模式结构化可预测;利用局部性就能有高算术强度。

换句话说,深度学习的工作负载与 GPU 架构哲学的契合度,远比与 CPU 的高。 这种契合解释了 GPU 在机器学习中的初期成功。

但契合还不够,GPU 还为了 AI 负载而演化:模型变大后,硬件厂商引入专用张量核(tensor core),在混合精度下加速矩阵乘法;half precision、bfloat16 等数值格式被引入,降低内存带宽需求同时保持可接受的精度;高带宽内存(HBM)直接被集成进加速器封装,提供大张量运算所需的数据吞吐。架构因为工作负载的要求而调整。

重要的是要理解:GPU 赢,不只是因为原始浮点运算更快,而是因为它的设计哲学与主导工作负载的结构相匹配。为单线程延迟优化的架构,难以利用张量运算的并行性;为吞吐优化的架构,只要内存带宽与通信设施同步演化,就能随模型变大而有效扩展。

GPU 成为 AI 主导平台,揭示了一条更深的原则:架构的成功取决于与工作负载结构的对齐。 只要张量运算主导工作负载,为并行线性代数优化的架构就保持优势。但这不意味着 GPU 永远最优——它意味着架构必须持续适应智能不断演化的计算结构。

于是问题变得更微妙:即便 GPU 与张量负载对齐良好、即便过去十年它们突飞猛进,为什么单靠硬件改进仍然赶不上模型扩展的速度?


1.7 为什么硬件改进还不够?

我们已经确立:张量运算主导现代机器学习系统的工作负载,GPU 与这种结构对齐良好;频率缩放的终结导致大规模并行,GPU 架构也演化出支撑高吞吐线性代数的形态。

既然这么对齐,你可能预期硬件进步能自然承接模型规模和训练需求的扩展。但经验证据并非如此。

要理解原因,必须对比两条增长曲线:工作负载需求的增长单设备性能的增长

过去十年,训练顶尖模型所需的计算量增长了好几个数量级:模型规模从百万参数到十亿,到千亿,再到如今万亿级;序列长度在增长;数据集从十亿 token 扩张到万亿 token。这种增长不是渐进的,而是指数级的。

同一时期,单块 GPU 性能显著提升:制程进步、数值精度创新、张量核等架构增强、更大芯片面积,带来了可观的增益。例如单芯片推理性能十年间大约提升三个数量级

但若模型训练需求增长约七个数量级、单设备性能只增三个,就留下 四个数量级 的缺口。这个缺口不能靠等下一代硅片来填,必须靠跨设备扩展来填

这就是大规模分布式训练的起源。不再用一块加速器训练模型,而是把计算分布到成百上千块上:参数被切分、激活被拆分、梯度被聚合。all-reduce 这类集合通信原语成为核心操作,网络拓扑与带宽成为关键性能因素。

一旦分布式,一类新的约束就出现:单设备内,数据搬移受访存层级约束;跨设备间,数据搬移受互连带宽与延迟约束。设备越多,同步开销越大,通信模式越复杂——把张量搬过机架的成本可能接近甚至超过计算它们的成本。

所以横向扩展并没有消除瓶颈,只是转移了瓶颈。举个简单例子:假设模型参数用张量并行切分到多块 GPU 上。前向时,中间结果必须跨设备通信才能完成单层的计算;反向时梯度必须同步。这些都需要跨设备集合通信。如果通信带宽不足,算术单元就空转等数据——网络喂不动吞吐时,每块 GPU 的理论峰值性能就毫无意义

这个现象解释了为什么现代加速器系统越来越重视互连设计:NVLink、NVSwitch、高速 InfiniBand 织物(fabric),都是为了缩小本地计算与分布式协调之间的差距。然而即便有精巧的互连,通信仍受物理约束:信号以有限速度传播;带宽增加需要更多导线、能量或更复杂的编码;跨机架延迟无法低于物理极限。

结论不可避免:单设备硬件改进,即使显著,也赶不上指数级的工作负载增长。分布式计算成为必然,分布式计算把通信变成主导成本,而通信被物理约束封顶。 于是我们面对一个结构性的扩展缺口:

结构性的扩展缺口

算术充裕不保证智能可扩展。内存带宽与互连拓扑,成为一等公民级别的设计关切。

这个认识把我们引向一个更策略性的问题:如果硬件改进填不平扩展缺口,那该把力气花在哪,才能获得有意义的增益?


1.8 真正的优化机会在哪里?

有心的读者此刻会问一个实际问题:如果硬件缩放被物理定律封顶,如果分布式系统引入无法彻底消除的通信瓶颈,那我们该往哪里投入,才能获得有意义的性能改进?

答案需要分寸。

硬件创新仍然重要。 制程、封装、内存带宽、互连设计的改进持续带来增益——但它们是渐进式的:新制程节点可能降低一定百分比的能耗或提高密度;新互连带宽更高;新张量核设计改善特定操作吞吐。这些进步有价值,却都在物理约束内运行,很少单靠自身就产生系统级效率的数量级提升。

系统软件优化也扮演关键角色。 更好的内核调度、算子融合、更优的分块策略、更聪明的通信重叠,都能带来可观增益。编译器框架与运行时系统不断成熟,从现有硬件里榨出更好的性能。但软件优化终究受底层算法结构与硬件能力约束。

最大的杠杆往往在别处。

想想当模型本身的算法结构改变时会发生什么:

  • 数值精度从 32 位降到 16 位,内存足迹减半、有效带宽翻倍;
  • 再降到 8 位甚至更低且保持精度,数据搬移大幅缩小;
  • 引入稀疏性(sparsity),计算与存储同时减少;
  • 把权重矩阵分解成低秩分量,参数量下降;
  • 设计顺序依赖更少的架构,并行可扩展性更好。

这些改动不只是在优化执行,它们重塑工作负载:改变计算与通信的平衡,改变算术强度,减少内存流量,影响工作负载与硬件架构的对齐程度。这就是为什么算法层创新能带来不成比例的增益。

但算法自由不是绝对的。高度不规则稀疏模式的算法,在现有硬件上可能难以高效利用;需要顺序操作的算法可能闲置并行执行单元;精度降得太狠的数值格式,可能把模型质量拖出可接受范围。

所以:算法层提供最大的优化机会,却必须在系统软件与硬件划定的边界内运作。层与层之间的关系是不对称但互相依赖的——算法决定计算的结构与体量,软件决定计算如何被映射与调度,硬件决定执行的物理极限。算法层决策能放大或缓解硬件约束,硬件约束能促成或限制算法选择。

这种动态互动,就是垂直协同设计(vertical co-design)。它不是团队之间的简单协作,而是一个概念框架:每一层既是机会,也是约束。 算法层提供重塑工作负载结构的最大自由,软件层把结构翻译成可执行的计划,硬件层施加不可更改的物理极限。当各层被孤立优化时,低效出现;当它们被一起优化时,数量级改进成为可能。

这是机器学习系统的核心论点: 这门学科不只是写更快的代码,也不只是造更大的加速器,而是认识到——智能是一个必须跨层、端到端、在演化工作负载与物理限制下求解的大规模优化问题。

现在,我们可以正式界定这门学科涵盖什么了。


1.9 什么是机器学习系统?

走完工作负载结构、访存层级、物理扩展极限、架构对齐、分布式扩展与跨层优化,现在可以给出正式定义:

定义

机器学习系统(Machine Learning Systems),是在演化的工作负载与不可更改的物理约束之下,通过对算法、系统软件、硬件的跨层优化,来设计、实现、运行跨计算规模的智能系统的学科。

这个定义里有几个元素值得强调。

第一,它横跨计算规模。 支配数据中心级训练的同一套原则,也影响边缘推理系统——约束的量级不同,但性质不变。

第二,它强调跨层推理。 没有单层是充分的:没有系统意识的算法创新可能不切实际;没有工作负载对齐的硬件设计可能浪费;不理解内存与通信成本的软件抽象可能引入隐藏低效。

第三,它承认演化。 工作负载在变,架构在适应,软件栈在演化——这门学科必须保持动态。

至此,本章第一部分完成。我们从貌似简单的问题出发:发现了设计与部署之间的结构不对称,形式化了智能的高维本质,把张量运算识别为主导工作负载原语,审视了数据搬移的物理成本,分析了频率缩放的终结与并行的兴起,解释了 GPU 与 AI 负载的架构对齐,量化了扩展缺口及其分布式后果,最后阐述了垂直协同设计的核心论点。

现在,视角切换。在第二部分,我们将绘制机器学习系统的知识版图——既然理解了这门学科为什么存在,接下来看它包含什么、各组分如何关联。


第二部分 机器学习系统的知识版图

第一部分把机器学习系统当作一串结构性问题来逼近:识别出工作负载演化是系统设计困难之根;把智能形式化为高维空间中发现紧凑结构;证明张量运算主导算术;说明内存与通信(而非算术)主导性能;审视硬件扩展的物理极限;解释 GPU 为何与 AI 负载对齐;量化了倒逼分布式系统的扩展缺口;最后阐述垂直协同设计的核心论点。

建立这个基础后,我们切换视角。如果机器学习系统是在演化工作负载与物理约束下的跨层优化学科,那它的核心组件是什么?要跨层有效推理,必须掌握哪些主题?

第二部分不深入介绍技术,而是搭建一幅结构地图。我们引入的每个主题,都对应垂直整合栈中的某一层或某个接口。目的不是罗列,而是连贯。

从物理基座开始。


1.10 GPU 架构:物理基座

每个大规模机器学习系统最终都在硬件上执行。当今 AI 生态里,这块硬件通常是 GPU 或类 GPU 加速器。理解机器学习系统,就要理解这类加速器如何构造。

现代 GPU 是漫长架构演化的产物:最初是固定功能图形流水线;后来引入可编程性,让开发者表达任意并行计算;最终成为完全可编程的、为吞吐优化的众核处理器。这段演化不是偶然。如前面讨论的,频率缩放的终结把架构重心推向并行,GPU 顺应了这一转变:把数千个算术单元组织成流式多处理器,对多个数据元素执行同一条指令。

每个 SM 内部是专为融合乘加(FMA)优化的算术单元;为回应深度学习负载,专用张量核被引入,在混合精度下加速稠密矩阵乘法;访存层级被设计成在小而快的片上存储与大而高带宽的片外内存之间取平衡。NVLink、NVSwitch 等互连技术让多 GPU 协作成一个连贯系统;更大尺度上,InfiniBand 等网络织物把机架级加速器连进数据中心。

这些架构元素的存在都源于工作负载结构:张量核存在,因为矩阵乘法主导;高带宽内存存在,因为算术单元需要持续的数据供给;互连织物存在,因为分布式扩展不可避免。理解 GPU 架构因此不是可选项——它是所有上层优化的地基。

但硬件本身不执行模型,还得架起抽象与执行之间的桥。


1.11 CUDA 编程:衔接抽象与硬件

要有效使用 GPU,得会编程。这需要一个抽象:既暴露并行执行与访存层级,又不把开发者淹没。

CUDA 就是这样一个编程模型:它提供把并行内核(kernel)组织成线程(thread)、块(block)、网格(grid)的框架;暴露共享内存与同步原语;允许开发者显式管理主机与设备之间的数据拷贝。

但写高性能 CUDA 代码并不容易。程序员必须推演线程调度、内存合并(coalescing)、bank 冲突、寄存器使用。一个数学上正确的实现,若没利用局部性或引入不必要同步,性能可能惨不忍睹。

这种困难揭示了一个反复出现的主题:用顺应硬件约束的方式表达计算,不是 trivial 的事。 这个层面的手工优化能带来可观的增益,但需要专长与细致推演,而且难以随模型与硬件的演化而扩展。这促使了栈的下一层出现。


1.12 机器学习编译器:自动化优化

随着机器学习模型激增、硬件平台多样化,自动把高层模型描述映射到高效硬件执行的需求出现了。

机器学习编译器(ML compilers) 应对这一挑战:它们接受用 PyTorch、TensorFlow 等框架表达的模型,生成针对特定硬件优化的内核。早期编译器工作聚焦于把模型描述与调度决策分离——开发者不必为每个模型手写硬件特定代码,只需抽象地描述计算,让编译器处理分块、融合、内存布局。

后来,编译器技术引入自动化搜索:不再只依赖手工启发式,编译器开始用成本模型与实测数据探索优化空间。更近期,强化学习与大型语言模型被用于内核优化,为特定硬件搜索最大化性能的配置。编译器层因此是「算法结构在可执行形式里与硬件约束相遇」的地方——它把抽象计算翻译成物理高效的执行,体现了垂直整合的原则。

但即使内核优化到极致,单设备性能对顶尖模型仍不够。


1.13 并行训练:扩展智能

训练大模型需要在多设备间分布计算,这带来超出单设备优化的一整套新关切。

并行训练策略沿不同维度分解模型与数据:数据并行(data parallelism) 复制模型参数到各设备并切分输入批次;张量并行(tensor parallelism) 把大矩阵乘法切开分到多设备;流水线并行(pipeline parallelism) 把不同层分配到不同设备;更高级的策略如专家并行(expert parallelism) 把部分计算路由到专门子模块。

每种策略应对一种特定的扩展压力,但它们都要通信:梯度必须在副本间同步,激活必须在流水线阶段间传递,token 必须在专家间交换。all-reduce、all-to-all 等集合通信原语成为核心操作。这个层面的性能不只取决于算术吞吐,还取决于通信带宽与延迟——通信与计算重叠成为关键,网络拓扑影响效率。

并行训练,因此是第一部分识别出的通信瓶颈的直接正面交锋。

但训练只是生命周期的一半。


1.14 推理系统:服务智能

模型训练完,要服务真实用户或应用。推理(inference) 引入一组不同的约束。

训练优先吞吐与收敛;推理优先延迟、成本效率与响应性。生成式模型推理往往逐 token 进行,产生顺序依赖——key-value 缓存(KV cache)必须被高效存储与访问,批处理策略同时影响延迟与吞吐。推理可能发生在数据中心,也可能在边缘:边缘部署有严格的功耗与内存约束;云部署有服务水平目标(SLO)与多租户资源管理。

推理系统因此需要在实时约束下精细协调计算、内存管理与调度。而且,持续学习等新范式正在模糊训练与推理的边界——模型可能在部署期间根据新数据调整,引入新的系统级考量。推理系统把垂直栈延伸到真实世界的运行之中。


1.15 模型优化:重塑工作负载

前面论证过:算法重构提供最大的优化机会。模型优化(model optimization) 技术正是这一原则的体现。

降低数值精度减少内存足迹与带宽需求;剪枝(pruning) 移除冗余参数;低秩分解(low-rank factorization) 减小矩阵规模;知识蒸馏(knowledge distillation) 把大模型能力迁移给小模型。这些技术每一招都改变工作负载本身的结构——与其让硬件更快地执行同样的计算,不如减少或重构计算。

但这些改动必须与软硬件兼容:无结构的稀疏可能难以高效利用;极低精度可能损害精度。模型优化因此体现了机会与约束的互动。


1.16 数据工程与生命周期

模型用数据训练、用数据精炼、用数据评估。数据生命周期塑造工作负载特征。

大规模预训练需要海量数据集;继续预训练(continued pretraining)让模型适应特定领域;后训练与对齐(alignment)涉及精心整理的数据与人类反馈;检索增强(RAG)等推理期技术动态扩充模型输入。训练 token 与模型参数之比影响收敛效率与泛化;数据质量影响鲁棒性;数据存储与流式传输影响系统设计。数据工程是机器学习系统不可分割的一部分,而非边缘环节。


1.17 性能之外

性能必要但不充分。训练稳定性、用户数据隐私、对对抗操纵的安全性、公平性、环境可持续性,都在影响设计决策。

这些考量引入额外约束与权衡:加密可能增加计算开销;差分隐私(differential privacy)可能影响优化动态;能效可能影响硬件选型与数值精度。机器学习系统必须把这些关切整合进垂直栈。


1.18 结语:为什么机器学习系统值得学

回到核心主题作结。

机器学习系统值得学,不只是因为 AI 有经济重要性,更因为它代表数学结构、软件抽象、硬件架构与物理规律的交汇。它要求跨层批判性思考:理解工作负载演化如何塑造架构;认识到算术充裕不消除通信约束;设计顺应硬件现实、同时推动其极限的算法。

本章既建立了一种思维方式,也绘制了一幅学科地图。后面每一章,都是这幅地图上的深入一格。


延伸阅读