为什么一台机器不够 · 内存墙与并行
一个 671B 模型约 1.3TB 权重,没有单卡装得下 —— 连服务它都不行。这一章从这条第一性原理出发,讲清四种并行(data / tensor / pipeline / expert)各切什么、各自的代价与适用。这套基石训练与推理共享,本章走 serving 侧用法。前置:Ch1。
这是系统设计路书的第 2 章,约 2 小时,纯 Mode A。它是第二站「分布式基石」的第一章,要把上一章那句「单卡装不下」从一个口号,砸成一条你能自己推演的第一性原理。
上一章你拿到了整个领域的地图,知道了 AI 系统设计撞上的第一堵墙就是「单卡装不下模型」。这一章我们就站在这堵墙前面,把它彻底拆开:一个前沿模型到底有多大、为什么连一张最强的卡都装不下、以及装不下之后工程师手里有哪四种把它切开的办法。读完你会第一次真正理解,分布式这两个字不是一个高大上的形容词,而是被物理逼出来的唯一出路,这也是后面整整一站「分布式基石」的地基。
本章五节:
- 从「单卡装不下」这堵墙说起(10 min)
- 内存墙:一个模型到底有多大 + MoE 的陷阱(25 min)
- 装不下就切:四种并行各切一个维度(40 min)
- 它们是正交的轴,可以叠加(25 min)
- 训练与推理共享这套基石(20 min)
0. 从「单卡装不下」这堵墙说起
上一章结尾,我把 AI 系统设计的第一堵墙写成一句话:模型不够强就买更大的机器,这条直觉撞上了「单卡装不下」的物理墙,逼出了分布式这条新轴。当时那只是一句一笔带过的结论,这一章我要把它砸实。因为它是后面所有内容的地基:你只有真的理解了为什么一台机器不够,才会明白后面那些听起来很玄的词(张量并行、集合通信、prefill 与 decode 分离)到底各自在解决什么问题,而不是把它们当成一堆需要硬背的名词。
先说清这一章和基础路书的分工,免得你觉得在重复。基础路书教过你 GPU 大概是什么、显存是放数据的地方、带宽和延迟是两类不同的约束。这一章不重讲这些,它从那里往上走一层,只问一个具体的问题:当一个模型大到一张卡的显存装不下、当它的计算量大到一张卡算不完,工程上到底会发生什么、又有哪些应对的刀法。这是你从「单机视角的一堆零件」迈向「多机视角的一个系统」的第一步,也是你真正开始理解分布式的起点。
1. 内存墙 · 一个模型到底有多大
1.1 算一笔账:参数 × 每个参数几个字节
你可能觉得「模型很大」不过是「文件大一点」,大不了多等一会儿加载。我们来算一笔账,你就会发现事情完全不是这个量级。一个模型有多大,第一性地由两个数决定:它有多少个参数,以及每个参数用几个字节来存;参数你可以先粗暴地理解成模型里一个个可调的数字,前沿大模型动辄几千亿个。拿这条路书反复会用到的 DeepSeek-V3 当例子,它有六千七百一十亿个参数,每个参数如果用最常见的 BF16 格式存就要占两个字节,六千七百一十亿乘以二约等于一点三四万亿字节,也就是约 1.34TB。这是什么概念?DeepSeek-V3 当年训练用的卡,是英伟达 H100 的中国特供版 H800,单卡显存 80GB;1.34TB 除以 80GB 约等于十七,你得把十七张这种卡的显存全部加起来,才勉强放得下这个模型的权重,而且这还只是权重,没算上真正跑起来需要的其他东西。
这里要补一个诚实的细节,它顺便给你埋下后面第九章的伏笔。DeepSeek-V3 实际上不是用 BF16 存的,它原生就用一种叫 FP8 的格式,每个参数只占一个字节,所以它真实的权重大小约是 671GB,差不多是上面那个数的一半。但你注意,即便砍掉一半,671GB 除以单卡 80GB 还是约等于九,还是要九张卡才装得下。所以不管用哪种精度,结论都一样,而且这个结论你要刻进脑子:一个前沿模型的权重,是单卡显存的将近十倍到二十倍。至于为什么能用 FP8 这种低精度来存权重还不出大问题,是第九章「精度即吞吐」要讲的事,这里你只需先记住:它把这笔账砍掉了一半,却仍然远远装不下一张卡。
把这个数量级看清楚,你才会明白「装不下」这三个字的分量:它不是装得有点紧、优化一下就好,而是差了整整一个数量级,单卡连把这个模型完整加载进来都做不到,更别说让它跑起来算东西。
一个前沿模型的权重,是单卡显存的将近十倍到二十倍 —— 单卡连加载它都做不到。这,就是内存墙。
这条第一性原理直接推出一个结论,而这个结论是这条路书后面一大半内容的源头:既然一张卡装不下,你就必须把模型本身切开,分散到很多张卡上,让它们协同起来当成一台「逻辑上的大机器」来用。这就是分布式最朴素的含义,它不是某种为了追求性能的高级优化,而是被物理逼出来的、唯一的出路。这堵内存墙,正是上一章那次「模型不够强就买更大机器」撞墙的物理本质;一个模型一旦大到过百亿、千亿参数,分布式就从一个可选项,变成了你绕不开的前提;换句话说,从这一刻起,你脑子里那台「服务模型的机器」就不再是一台,而是一群卡协同组成的集群。
你可能会立刻反问:卡不是越来越大了吗?没错,到 2026 年,英伟达量产的最强卡(Blackwell Ultra)单卡显存已经做到 288GB,是 H800 的三倍多。但模型长得更快:DeepSeek 在 2026 年 4 月开源的新旗舰 V4,参数已经冲到约一万六千亿,是 V3 的两倍还多。所以这堵内存墙不是被填平了,而是被推得更高,卡每涨一代、模型就涨得更狠。本章接下来仍然用披露最完整的 V3 当解剖样本(它的技术报告把每个工程细节都摊开了,是最好的教学案例),但你心里要清楚:前沿的绝对数字只会比这更大,而背后的道理一模一样。
1.2 MoE 的陷阱:激活 37B,不等于只装 37B
讲到 DeepSeek-V3 这种模型,有一个特别常见、也特别坑的误解,我必须现在就帮你拆掉,否则你后面会一直算错账。你大概会听到这样一句话:V3 虽然有 6710 亿参数,但每处理一个 token 只激活其中约 370 亿;于是一个很自然的推论冒出来,那我是不是只要装得下这 370 亿就够了?答案是不行,而且这个误解的代价很大,原因藏在 MoE 这种结构的工作方式里。MoE 的全称是混合专家,意思是模型里有很多个专家子网络,每处理一个 token,一个路由器只挑其中几个专家来算,这就是「只激活 370 亿」的由来;但关键在于,每个 token 挑的专家是不一样的,这个 token 走 3 号和 17 号,下一个 token 可能走 88 号和 200 号,你事先根本不知道哪些专家会被用到,所以你必须把全部 6710 亿参数、所有专家,同时都准备在显存里待命。
所以「激活 370 亿」省下来的,是每个 token 的计算量,不是你要准备的显存。换句话说,MoE 让模型变聪明、变省算力,却没有让它变得容易装,要装的还是完整的 6710 亿。这是 MoE 在系统层面最容易被搞错的一点,请把它单独记住:激活多少,决定你算得多快;参数总量,决定你装得下还是装不下。这是两件完全不同的事,也正是为什么前面那笔账,要按 6710 亿、而不是 370 亿来算。
2. 装不下就切 · 四种并行各切一个维度
2.1 先看清:一个模型上有哪些地方能下刀
既然装不下就得切,那就得先看清楚,一个模型这种东西到底能从哪里切。切一个神经网络,不像切蛋糕随便一刀下去,它有几个结构上天然的关节,每个关节对应一种完全不同的切法、付完全不同的代价,所以先在脑子里建一个简化的图像。把一个 Transformer 想象成一摞叠起来的层,数据(一批 token)从最底下那层进去,一层层往上流,从最顶上那层出来,而每一层的内部都是几个很大的矩阵乘法。这个图像里就藏着三个能下刀的地方:你可以切流进去的数据,可以切每一层的内部,也可以切层与层之间、把这摞层拦腰分段;如果这个模型还是 MoE 的,它还多一个能切的地方,就是那些并列的专家。这四个下刀点,正好对应工业界的四种并行,下面这张图先让你一眼看清它们各切哪里,然后我们一把刀一把刀地看。
2.2 数据并行:复制整个模型,切的是数据
第一种叫数据并行,它的做法最直观:把一整个模型完完整整复制好几份,每张卡放一份,然后把一大批要处理的数据分成几小份,每张卡用自己那份模型去算自己那小份数据,最后把结果汇总。打个比方,这就像同一份考卷印很多份、发给很多个老师,每个老师改一摞卷子,最后把分数合起来。它的代价也很明显:因为每张卡都得放下一整个模型,所以它根本解决不了我们刚才那个「单卡装不下」的问题,它要求的恰恰是「单卡装得下」。数据并行解决的是另一个问题:不够快;复制几份一起算,吞吐就上去了。记住这个伏笔,后面讲推理服务时,数据并行会以「多开几个一模一样的模型副本来分摊请求」的面貌再次出现。
2.3 张量并行:切的是层内
第二种叫张量并行,它才是真正能把「装不下的那一层」切开的刀。它的做法是,把单独一层里那个巨大的矩阵乘法,横着竖着切成几块,分给几张卡各算一块,算完再把碎块拼回完整的结果。打个比方,一道几千位乘几千位的巨型乘法,几个人各负责算一部分,最后并排拼成完整答案。它的威力是能让一层不必整个塞进一张卡;它的代价是通信极其密集,因为每算完一层都要立刻把各张卡的碎块合并一次,而这种合并要在卡之间高速搬数据。所以张量并行几乎只在卡间互联极快的场景(同一台机器内部、走 NVLink)才划算,一旦跨机器就会被通信拖垮。这把刀是 2019 年 Megatron-LM 这篇工作立起来的标准做法。
2.4 流水线并行:切的是层间
第三种叫流水线并行,它换了个方向下刀:不切层的内部,而是把那一摞层拦腰分成几段,每张卡管一段,数据像在工厂流水线上一样,从第一段流到第二段再流到第三段。打个比方,这就是一条流水线,一个工件依次经过几个工位,每个工位只做自己那道工序。它的好处是切起来干净,卡之间只在段的接缝处传一次数据,通信压力比张量并行小得多;它的代价有个专门的名字叫流水线气泡,意思是流水线刚开始灌入和最后排空的时候,总有些工位在干等没活干,这段空转就是浪费。这把刀是 2018 年 GPipe 立的。再记一个伏笔:流水线并行在追求高吞吐的训练里很受欢迎,但在追求单个请求低延迟的推理服务里不太招人喜欢,因为气泡会拖慢每一个请求,这一点第四、第六章会回来细说。
2.5 专家并行:切的是 MoE 专家
第四种叫专家并行,它是 MoE 模型专属的一把刀。前面说过 MoE 有很多并列的专家,专家并行就是把这些专家分散到不同的卡上,每张卡只放一部分;当一个 token 需要某个专家时,就把它路由到那个专家所在的卡上去算,算完再送回来。打个比方,一栋大楼里有很多间专科诊室分布在不同楼层,病人按需挂号、去对应的诊室就诊,看完再回到原来的流程。它的代价是一种很特别的通信:token 要被打散送到四面八方的卡、再收集回来,这种「人人对人人」的交换模式,后面会专门讲(它叫 all-to-all,是下一章的主角之一)。这把刀的源头是 2020 年的 GShard 和 2021 年的 Switch Transformer;DeepSeek-V3 把它推到了一个极致的规模,你会在第六章看到它用多达 320 张卡来铺开专家。
把四把刀放在一起看,你就看清了一件事:它们各切一个正交的维度,数据、层内、层间、专家,互不重叠。这里面真正能解决「模型装不下」的,是张量、流水线、专家这三把切模型本身的刀;而数据并行切的是数据、解决的是吞吐,它反而要求你先得装得下。这意味着工程师拿到一个具体的模型和一批具体的卡时,要做的从来不是从四把刀里挑一把,而是想清楚怎么把它们组合起来用,而这正是下一节的主题。
3. 它们是正交的轴 · 可以叠加
上一节末尾我说这四把刀不是四选一,这点值得专门讲透,因为它是初学者最容易误解的地方。你很可能下意识地觉得「那我到底该用哪一种并行」,好像必须在它们之间挑一个;不是的,正因为它们各切一个独立的维度,所以可以同时叠加使用。业界把同时叠加数据、张量、流水线三种并行的做法叫 3D 并行,再加上 MoE 的专家并行就是 4D。这不是炫技,而是必须:一个模型大到一定程度,单靠任何一把刀都不够,光切层内跨不出一台机器,光切层间气泡太多,你必须把它们叠起来,在不同的层级用不同的刀。
我们用 DeepSeek-V3 训练时的真实配置当锚,你立刻就懂了。它在 2048 张 H800 上,同时叠了三把刀:16 路流水线并行、64 路专家并行,外加一种叫 ZeRO-1 的数据并行。但最值得玩味的,是它刻意没用的那把刀:张量并行。它在技术报告里专门说明,自己是「在不使用代价高昂的张量并行的情况下」训完这个模型的。为什么刻意不用?因为张量并行每算一层都要通信,是四把刀里通信代价最贵的;DeepSeek 把显存抠到了足够省,省到不需要靠张量并行来腾地方,于是干脆把这把最贵的刀省掉了。
这个「刻意不用张量并行」的选择,教给你一个比任何定义都重要的判断:并行不是越多越好,每多加一把刀,都要付出一份通信的代价。真正的系统工程,是在「把模型装得下」和「不让卡之间的通信爆炸」这两个目标之间反复找平衡。而这恰恰把我们引向了下一章:既然每一把切模型的刀,切完之后都要让卡与卡之间搬数据、再合并,那么这个搬数据、再合并的动作,也就是通信,往往才是真正决定性能的那个瓶颈。
顺带把刚才提到的 ZeRO 说清楚一句,免得它一直悬着。ZeRO 是数据并行的一个内存优化版本:普通的数据并行让每张卡都存一份完整的优化器状态和梯度,非常浪费,而 ZeRO 把这些东西也分片到各张卡上,谁用到再去取。它分好几级,DeepSeek 用的 ZeRO-1 是最轻的一级,只分片优化器状态,更激进的 ZeRO-2、ZeRO-3 会连梯度和参数也一起分,分得越彻底越省显存,但代价是每次用到被分走的那部分时都得先去别的卡取回来、通信也就越多,这又是一次「省显存」和「省通信」之间的权衡。这属于训练侧的精细组装,我们点到为止,真正深入是预训练路书(#5)的活。
4. 训练与推理共享这套基石 · 但 serving 有自己的用法
读到这里你可能注意到,我一直在训练和推理之间来回跳:一会儿说 DeepSeek 训练时怎么切,一会儿又提推理服务会怎么用。这是故意的,现在到了把这层关系挑明的时候。这一整套并行,是训练和推理共享的同一块地基,道理很简单:「单卡装不下」这条物理约束,对训练和对服务是一模一样的,你训练这个 6710 亿的模型要先把它切开装下,你服务这个模型同样要先把它切开装下。所以并行不是训练专属的技术,它是任何想碰大模型的系统都必须先站稳的地基,这也是为什么这一章被放在「分布式基石」这一站:它撑着这条路书后面的推理服务,也撑着别的路书里讲的训练。
但训练和推理站在这块共享地基上,侧重很不一样。在推理服务里,数据并行会变成「多开几个完整的模型副本来分摊海量请求」,用来把吞吐撑上去;而一个单卡装不下的模型,则要靠张量并行、专家并行在「一个副本的内部」把它切开,先装下再说;流水线并行在这里就不那么受待见了,因为它的气泡会拖慢单个请求的延迟,而推理服务常常对延迟很敏感。还有一个你现在就该装进脑子的点:在推理服务里,要塞进显存的不只有模型权重,每一个正在进行的对话都会在显存里留下一块叫 KV cache 的东西,它随对话变长而不断增大,常常和权重一起争抢显存。所以「显存够不够」这笔账,在服务场景下是「权重 + KV cache + 一些激活」三笔一起算的,而 KV cache 正是第四章要专门拆开讲的主角,这里先埋下一个伏笔。
同一套并行,训练侧追求的是「几周训练不崩、吞吐拉满」,服务侧追求的是「每个请求低延迟、同时吞吐够高」;目标不同,刀法的选择就不同。
把边界划清楚,你才知道每个问题该去哪本书找答案。这条路书走的是这套并行在服务侧的用法;训练侧那些更精细的专属组装,比如 DeepSeek 怎么用一种叫 DualPipe 的方法把通信巧妙地藏进计算、ZeRO 更激进的分片、连续训练几周怎么做容错,属于预训练路书(#5)。而 MoE 这种结构本身为什么更省、它的路由算法怎么设计,属于模型设计路书(#4);这一章自始至终,只把模型当成一个「要切开来服务的对象」,不碰它内部的算法。
综合 · 你现在能推理「为什么要多机、怎么切」
回头看你这一章拿到了什么。你拿到了分布式最硬的那个起点:一个前沿模型的权重,是单卡显存的将近十到二十倍,单卡连加载都做不到,所以必须切到多机,这就是内存墙;你还顺手拆掉了一个大坑,MoE 激活得少不代表装得少,激活决定你算得多快,参数总量决定你装不装得下。你还拿到了切模型的四把刀,而且知道它们各切一个正交的维度:数据并行复制整模型、只切数据、解决吞吐;张量并行切层内、能装下一层但通信最密;流水线并行切层间、通信轻但有气泡;专家并行切 MoE 专家、用一种特别的全交换通信。你更知道它们不是四选一,而是像 DeepSeek-V3 那样叠起来用,而每加一把刀都要付一份通信的代价。
学完这一章,你应该能拿起一个具体的模型和一批卡,推理出它装不装得下单卡、装不下又该往哪个维度去切;但你还回答不了一个更尖锐的问题:切开之后,这些卡到底是怎么把数据搬来搬去、再合并成正确结果的?那个搬数据的动作,你已经在本章反复撞见,张量并行要合并碎块、专家并行要路由 token,但还没真正拆开看过它的真面目。这就是你该合上书、喝口水,然后翻开下一章的地方。
本章关键术语
本章引入的 canonical 术语,点进术语表看更完整的解释:
- 内存墙 memory wall 模型权重远超单卡显存(前沿模型是单卡的十几倍)这一物理约束,是「必须分布式」的根因
- 数据并行 data parallelism 复制整个模型到多卡、切分数据各算各的;不解决「装不下」,解决吞吐;serving 里表现为多 replica
- 张量并行 tensor parallelism 把单层内部的矩阵乘法切到多卡协同;能装下一层,但通信最密,只在节点内高速互联划算
- 流水线并行 pipeline parallelism 把层堆分成段、每卡一段、micro-batch 流水;通信轻,但有「气泡」空转,低延迟 serving 不爱用
- 专家并行 expert parallelism MoE 专属:把专家分散到多卡,token 路由到所在卡;代价是 all-to-all 全交换通信
- MoE 混合专家 很多专家子网络、每 token 只激活几个;激活量决定算力,参数总量决定显存,两者不可混淆
- ZeRO 数据并行的内存优化:把优化器状态、梯度、参数分片到各卡(ZeRO-1/2/3 逐级);属训练侧组装,深入见 #5
参考文献
Mode A · 引用出处(正文 inline,集中列在此)
- Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism(Shoeybi et al., NVIDIA, 2019)· 张量并行的奠基工作
- GPipe: Efficient Training of Giant Neural Networks(Huang et al., Google, 2018)· 流水线并行 + micro-batch + 「气泡」框架
- ZeRO: Memory Optimizations Toward Training Trillion Parameter Models(Rajbhandari et al., Microsoft DeepSpeed, 2019)· 数据并行的分片内存优化(ZeRO-1/2/3)
- GShard(Lepikhin et al., Google, 2020)+ Switch Transformer(Fedus et al., Google, 2021)· 专家并行 / MoE 分片的源头
- DeepSeek-V3 Technical Report(DeepSeek, 2024-12)· 第 3.2 节 真实并行配置(PP16 × EP64 × ZeRO-1 DP,刻意无 TP)· 671B / 37B 激活 / 2048×H800 / 原生 FP8
- NVIDIA H100 产品页· 单卡 80GB HBM3 的硬件依据(H800 为同显存的中国特供版)
深 dive 资源(可选 · 想往下走再看)
- How to Train Really Large Models on Many GPUs(Lilian Weng, 2021)· 各种并行策略的系统综述,适合在本章之后补全细节
- PipeDream: Generalized Pipeline Parallelism for DNN Training(Narayanan et al., SOSP 2019)· 异步流水线(1F1B 调度),与 GPipe 的同步流水线对照
- Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer(Shazeer et al., 2017)· MoE 这一结构本身的源头
说明:本章及本路书大部分章节没有 Mode B 视频站。AI 系统设计领域目前缺少合格的、人讲解的系统化教学长视频,深入的会议论文(SOSP / OSDI)与课程(CMU 15-442 / MIT 6.824)在各章末按需列出,由 Mode A 原创讲解扛主线。
下一章
下一章 Ch3 还在第二站,我们去看本章一直回避的那个动作:通信。模型被切开之后,卡与卡之间必须把数据搬来搬去、再合并成正确的结果,张量并行要合并碎块、专家并行要路由 token,靠的都是一组叫集合通信的原语。我们会看清 all-reduce、all-to-all 这些原语各自做什么、哪种并行用哪一个,以及节点内的 NVLink 和节点间的 InfiniBand 之间那道差了一个数量级的带宽鸿沟,是怎么从根上塑造了一切上层设计的。