你开了一家叫「小灶台」的餐厅,手里有一本祖传菜谱(也就是大模型),生意好到客人(训练数据)排队排到门外。一个厨师(GPU)颠勺再快也忙不过来,你打算多请人。问题是:怎么分工才最有效率? 你有三种扩店思路:开几家分店,每家都拿同一本菜谱各自招待客人,这是「数据并行」;把一道佛跳墙拆成几份,让几位大厨在同一口锅里各管一摊,最后拼成一盘,这是「张量并行」;按上菜流程把后厨分成洗菜、切菜、炒菜、装盘几道工序接力,这是「流水线并行」。真正的大模型训练,往往三种方式一起用——这就是「混合并行」。 可组合方式千千万,选错方案,同样 100 张卡,效率可能差好几倍。本文就用「开餐厅」的故事,把这三种并行讲透,再说清楚不同模型规模下怎么组合最划算。
对 AI 从业者来说,掌握混合并行选型意味着你能在集群规模有限的情况下,把训练吞吐压榨到极限,这是大模型工程师和训练框架开发者的核心硬技能。
可视化演示
动态演示混合并行策略选择指南的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
混合并行策略选择指南:三种并行 三种并行策略适用场景分析 模型规模与并行策略匹配 核心机制可视化 混合并行策略选择指南整体架构与关键组件
并行全景图
「小灶台」生意爆满,你准备扩店。摆在面前的无非三条路:开分店让每个店都有一份菜谱、把一道菜拆开让几位厨师合炒、按工序把后厨排成流水线。这三条路对应大模型训练里的数据并行、张量并行、流水线并行。注意,它们不是互斥的,而是三个可以任意叠加的维度。
那到底怎么选?核心判断标准是「瓶颈在哪」。如果模型不大但数据海量,瓶颈在数据处理速度,开分店最划算;如果单个层大得一张卡都放不下,瓶颈在显存,就得合炒;如果模型特别深,层数上百,瓶颈在整条计算链太长,就用流水线。餐厅老板的第一课:别一上来就三路全开,先看哪块最卡。
理想情况下,多请一位厨师,出菜速度就翻一倍。但现实是厨师之间要喊话、要递菜、要等位,这些开销会吃掉一部分收益。于是我们有这样一个基准公式:
理解了这张全景图,你就能明白:并行选型的本质,是在「多请人」和「多沟通」之间找平衡。接下来我们逐个看三种并行各自的擅长与代价。
- 理想吞吐指集群每秒能处理的样本数,是衡量训练速度的核心指标。
- GPU 卡数参与训练的所有显卡数量,相当于你请的厨师总数。
- 单卡吞吐一张卡每秒能处理的样本数,对应一位厨师的出菜速度。
- 相乘表示理想情况下吞吐随卡数线性增长——多一个厨师就多一份力。
数据并行
开分店的逻辑很简单:同样的菜谱复制三份,三家店同时营业,每家用不同的客人订单做菜。对应到训练里,就是把模型权重复制到 N 张卡上,把训练数据切成 N 份,每张卡各算各的。这是最直觉、也最常见的并行方式。
但分店有个隐藏成本:每天打烊后,三家店的店长必须碰头,把自己今天的火候心得(梯度)汇总成一份新菜谱(更新权重)。这个「碰头」的频率是每个训练步都要做一次的,谁也逃不掉。数据并行最怕的就是模型太大——菜谱越厚,碰头时要交换的内容就越多。
这引出了数据并行最重要的通信量公式:每步梯度同步的通信量大约等于两倍的模型体积。
所以数据并行最适合「模型不大但数据极多」的场景。如果你的模型已经大到一张卡装不下,单纯开分店是行不通的——因为根本没有一张卡能放下整本菜谱。这时候,就需要请几位大厨合炒一道菜了。
- 通信总量所有参与数据并行的卡同步一次梯度需要的总字节数。
- 两倍系数梯度同步要做一次「发出去、收回来」的乒乓操作,所以是两倍。
- 参数量模型里有多少个可训练参数,菜谱的「厚度」。
- 每个梯度 4 字节一般梯度用 32 位浮点数存储,正好 4 个字节。
张量并行
佛跳墙这道菜太复杂,一位厨师连锅都端不动。你的解决办法是:让四位厨师围着同一口锅,一个管鲍鱼、一个管鱼翅、一个管花胶、一个管高汤,炖完再把四个人的成果拼成一盘端出去。张量并行就是这个思路:把神经网络的一层矩阵运算拆成几块,分给多张卡一起算。
张量并行切的是「一层内部」,而不是层与层之间。比如一个庞大的矩阵乘法,按行或按列切成 n 块,每张卡只算自己那一块,算完后再拼接。它最大的价值是解决「单层太大」——当隐藏层维度大到单卡显存放不下时,只有它能救场。
但合炒的代价极其昂贵:每做完一层运算,四张卡都要互相传一次半成品数据。层数越多,喊话次数越多。它的核心公式是拼接:
张量并行对通信带宽的要求极高,所以它通常只在同一台机器内使用——机器内部有 NVLink 这种高速通道,喊话几乎不费时间。一旦跨了机器,网络带宽立刻成为瓶颈。如果你的集群是机器之间用千兆网连的,TP 的度数要慎重。
- 完整输出这一层网络最终要拿出去给下一层用的结果,也就是那盘佛跳墙。
- 拼接操作把分片按顺序拼起来,是张量并行里最常见的收尾动作。
- 各卡分片每张卡负责计算的局部结果,对应每位厨师管的那部分食材。
- 分片数量n 越大,每卡负担越轻,但拼盘时的通信次数也越多。
流水线并行
如果餐厅的菜特别多工序——洗菜、切菜、炒菜、装盘——与其让每个厨师从头到尾做一道菜,不如按工序把后厨分成四段,每人专攻一段,菜一道接一道地往后传。流水线并行就是按神经网络的层来切:前几层放第一张卡,中间几层放第二张卡,以此类推。
流水线最大的优势是省显存——每张卡只需要存自己那一段的权重和中间结果,不用背下整个模型。但同时它有个著名的毛病:气泡。想象一下,第一道菜还在洗菜师傅手里,切菜师傅已经闲下来了,只能干等。这种「上游没传完、下游没事干」的空闲时间,就是气泡。
想要气泡变小,方法是一次多送几道菜进门——把一个大 batch 拆成很多个小 batch(micro-batch)连续送进流水线。气泡占比的公式如下:
流水线并行适合层数特别深的大模型,它把显存压力摊到了多张卡上。但要注意:流水线的级数不是越多越好。P=8 时气泡占比明显高于 P=2,把 1024 层拆成 64 段并不一定比拆成 16 段快——级数越多,传菜排队的时间反而越长。
- 气泡占比整个训练时间里 GPU 闲着什么也不干的比例。
- 流水线级数把模型切成几段,就有几级流水线,对应后厨几个工序。
- 小批量数量一个大步里拆出多少个小 batch 依次送进流水线。
- 近似相等因为还有其他调度开销,公式给的是约等于,不是严格等于。
组合搭配
现实中的大模型训练,极少只用一种并行。就像大型餐饮集团既开分店、又在大厨房里合炒、还把后厨排成流水线一样,三种策略是在三个不同维度上叠加的:数据并行切数据、张量并行切层内、流水线并行切层间。它们互不冲突,它们的关系是相乘的。
组合时有一条铁律:所有维度的并行度相乘必须等于总卡数。如果你有 64 张卡,想用 4 路数据并行、2 路张量并行、那么流水线并行度就是 64 ÷ (4 × 2) = 8。这条公式是所有并行方案设计的起点。
实际组合时还有个经验法则:通信最频繁的维度放最近的地方。张量并行每层都要通信,所以优先放在同一台机器内部;流水线并行每个 micro-batch 通信一次,可以跨机器;数据并行每个训练步才通信一次,最适合放在最远的网络层级。先定通信拓扑,再分配并行度,顺序一定不能反。
- 总卡数集群里参与训练的 GPU 总数,等于你请的厨师总数。
- 数据并行度模型被复制了几份,同时吃几份不同的数据。
- 张量并行度每一层被切成几块。
- 流水线并行度模型被切成几段接力。
规模选型
有了上面的工具,我们来看看不同规模的「餐厅」该怎么配置人手。
小模型(10 亿参数以下):一本菜谱一个厨师就能端得动,单卡训练即可,完全不需要并行。非要上并行反而会引入通信开销,越搞越慢。中等模型(7B~13B 参数):单卡 80G 显存勉强能放下,这时优先用数据并行或 FSDP(一种把优化器状态也切分的数据并行变体),因为通信只在梯度同步时发生一次,性价比最高。
大模型(70B 参数级):单卡肯定装不下完整权重,需要张量并行 + 流水线并行先解决显存,再把多份副本做数据并行扩大吞吐。这就是经典的 3D 并行。千亿参数以上:三路全开已是标配,通常 TP=8、PP=8~16、DP 按剩余卡数填。显存估算有一个经验公式:
选型的结论可以浓缩成一句话:小模型用 DP,中模型用 FSDP,大模型上 TP+PP,超大模型三路全开。重要的不是记住某个具体配置,而是掌握「先算显存、再看通信、最后定维度」的决策顺序。
- 单卡显存需求粗略预估一张卡训练时需要多少显存。
- 经验系数 16把参数、梯度、Adam 优化器状态、激活值等全算进去的估计值。
- 模型总参数量模型里所有参数的总数,比如 70B 就是 700 亿。
- 约等于实际值随批次大小、序列长度浮动,只用来做选型量级判断。
链路瓶颈
再好的分工方案,也可能被「传菜通道」卡死。餐厅里传菜的小窗口只有巴掌大,厨师们就算手脚再快,菜堵在窗口一样白搭。分布式训练里,这个窗口就是网络带宽。三种并行对带宽的胃口完全不同:TP 每层都要吃带宽,PP 每个 micro-batch 吃一次,DP 每个训练步才吃一次。
另一个隐形瓶颈是负载不均。流水线里如果切菜工序比炒菜慢一倍,炒菜师傅就得隔三差五地闲下来;张量并行里如果某块矩阵比其他块大,算得快的卡就得等慢的卡。因此设计并行时,要尽量让每一段计算量大致相等,否则「木桶效应」会拖垮整体。
判断系统是否被通信拖累,可以用一个效率公式——计算时间占总算时间的比例:
排查瓶颈时,先用 profiler(性能分析工具)看每张卡的 GPU 利用率:如果利用率长期低于 80%,要么是通信在等,要么是负载不均。然后对照网络拓扑图检查 TP 是否跨了机器、PP 的每个 stage 是否均衡。大多数训练变慢的问题,到最后都出在这两个环节,而不是模型代码本身。
- 并行效率接近 1 说明大部分时间在干活,接近 0 说明大部分时间在等通信。
- 计算时间GPU 真正做矩阵乘法、激活函数这些计算的耗时。
- 通信时间数据在卡与卡之间传输的耗时。
- 求和关系一个训练步的总时间 = 计算 + 通信,两者是串行叠加的。
AI 应用场景
千亿参数大模型训练集群规划
阶段:分布式训练资源配置
解决的问题:训练 700 亿参数的模型时,如果只用单一并行策略,要么显存溢出、要么通信成为瓶颈、要么 GPU 利用率极低。AI 工程师需要根据集群规模设计 DP×TP×PP 三维组合,让每张卡既装得下权重,又尽量减少通信等待。
具体案例:某公司拿到 128 张 A100 训练 70B 模型,工程师先算单卡显存需求,决定 TP=8(8 卡合炒一层,吃满机内 NVLink),PP=4(切成 4 段跨机流水线),DP=4(4 份副本并行吃数据),得到 8×4×4=128,再配合 micro-batch=16,最终 GPU 利用率从纯 DP 方案的 35% 提升到 82%。
大模型推理加速中的张量并行
阶段:模型推理部署
解决的问题:70B 模型推理时单卡装不下,且单卡推理延迟过高。张量并行可以把权重分片到多张卡上并行计算,大幅降低单次推理延迟。因为推理时 batch 通常较小,数据并行对吞吐的提升有限,张量并行才是关键。
具体案例:某团队部署 Llama-70B 在线服务,用 4 卡张量并行把显存压力从单卡 140GB 摊到每卡 35GB,同时把首 token 延迟从 2.1 秒降到 0.6 秒。由于 TP 通信频繁,这 4 张卡必须放在同一台机器内,用 NVLink 互联。
中小团队微调开源模型
阶段:模型微调训练
解决的问题:中小团队只有 8 张消费级显卡,想微调 7B~13B 模型。全参微调显存不够,纯数据并行又受限于单卡容量。FSDP(全分片数据并行)把优化器状态和梯度也切片分到各卡,让每卡显存需求大幅下降。
具体案例:某创业团队用 8 张 24G 显卡微调 7B 模型,FSDP 开启后每卡显存占用从 52GB 降到 21GB,配合梯度检查点技术,成功跑起全参微调,吞吐量是 naive DP 方案的 3 倍以上。
Python 演示
# -*- coding: utf-8 -*-"""并行策略推荐器: 给定模型参数量与GPU数量, 推荐DP/TP/PP组合."""import math def est_mem_gb(num_params_b: float, tp: int, pp: int) -> float: """经验估算每卡显存(GB): 权重被 tp*pp 切分, 数据并行不省显存.""" bytes_per_param = 16 # 参数+梯度+优化器状态+激活的粗略合计 total_bytes = num_params_b * 1e9 * bytes_per_param return total_bytes / (tp * pp) / 1e9 def comm_score(tp: int, pp: int, dp: int) -> float: """通信代价经验分: 张量并行最高, 流水线其次, 数据并行最低.""" return tp * 10.0 + pp * 3.0 + dp * 0.5 def recommend(num_params_b: float, num_gpus: int, gpu_mem_gb: float = 80.0): """枚举合法组合, 选通信代价最低且每卡显存不超限的方案.""" best = None for tp in (1, 2, 4, 8): for pp in (1, 2, 4, 8): if tp * pp > num_gpus or num_gpus % (tp * pp) != 0: continue dp = num_gpus // (tp * pp) if est_mem_gb(num_params_b, tp, pp) > gpu_mem_gb: continue score = comm_score(tp, pp, dp) if best is None or score < best[0]: best = (score, dp, tp, pp) if best is None: raise ValueError("当前集群装不下该模型, 请增大TP/PP或换大显存卡") return {"dp": best[1], "tp": best[2], "pp": best[3]} def main(): cases = [ ("7B 模型, 8 张 80G 卡", 7, 8), ("13B 模型, 16 张 80G 卡", 13, 16), ("70B 模型, 64 张 80G 卡", 70, 64), ("175B 模型, 256 张 80G 卡", 175, 256), ] for name, b, gpu in cases: cfg = recommend(b, gpu) print(f"{name}: DP={cfg['dp']} x TP={cfg['tp']} x PP={cfg['pp']}") if __name__ == "__main__": main()
est_mem_gb(num_params_b, tp, pp)用 16 字节/参数的经验公式估算每卡显存,TP 和 PP 会切分权重,DP 不切,所以只除以 tp×pp。comm_score(tp, pp, dp)给三种并行赋不同的通信权重:TP 通信最频繁所以权重 10,PP 其次权重 3,DP 最低权重 0.5,方便排序。num_gpus % (tp * pp) != 0: continue确保 DP 的副本数是整数,不存在「半张卡」的情况。dp = num_gpus // (tp * pp)卡数先被 TP 和 PP 瓜分,剩下的就是数据并行度,直接对应用餐厅比喻里「分店数量」。
常见误区
误区我有 32 张卡,那就把模型切成 32 份,流水线并行度拉满,每张卡只存一点点,不是又省显存又省时间吗?
正解并行度越高,通信次数和排队等待也越多。流水线从 4 级加到 8 级,气泡占比明显上升;张量并行度加一倍,通信量也翻倍。训练速度不是由单卡负担决定的,而是由「计算 + 通信」的总时间决定的。32 张卡全做流水线,可能比 4 路数据并行还慢。
为何常见:人的直觉是「人多力量大」,容易忽略人多之后的协调成本。就像餐厅请 30 个厨师全挤在一个传菜窗口前,只会互相堵路。
误区TP 和 PP 都是把模型拆开放到多张卡上,那随便选一个不就行了?反正都是在省显存。
正解两者切的维度完全不同。TP 切在层内,把一层矩阵拆成多块,通信每层都要发生,极其频繁,只能放在机内高速互联;PP 切在层间,通信每个 micro-batch 才发生一次,可以跨机器。70B 模型通常两者都用:机内用 TP 解决单层太大,机间用 PP 解决模型太深。
为何常见:只看「把模型拆开」这个表象,没有意识到通信频率的量级差异是几十比一,导致把 TP 放到了跨机网络上,训练直接卡死。
误区我的单卡显存能放下整个模型,那就不需要任何并行,直接单卡训练多省事。
正解显存够不等于效率高。单卡训练时,数据吞吐上限就是一张卡的上限。如果你的数据量巨大、训练时间以周计,即使显存够也应该用数据并行来翻倍吞吐——每张卡都有一份完整权重,但每步处理的样本是单卡的 N 倍。显存只是约束之一,吞吐才是目标。
为何常见:把「能不能放下」当成了「要不要并行」的唯一标准,忽略了并行除了省显存还能加速这一核心价值。
误区数据并行不就是每家分店各做各的菜吗?互相之间应该完全独立,零通信吧。
正解完全错误。数据并行每训练一步,所有副本都必须做一次梯度同步——把各自的梯度汇总、平均、再更新出统一的新权重。通信量等于两倍模型参数量 × 4 字节:70B 模型每一步要同步约 560GB 数据。模型越大,数据并行的通信成本越高,这也是大模型常把模型本身也切分(FSDP)的原因。
为何常见:把「并行」的直觉理解成「分头行动」,没意识到训练必须保持全局权重一致,而一致性需要通信来保证。
误区反正都能跑,先随便设个 DP=2、TP=2、PP=2 看看效果,不行再调。
正解并行维度一旦定错,性能损失是数量级的,而且很多坑很难事后排查。比如 TP 跨了机器,通信慢到训练几乎停滞;PP 的 stage 切分不均衡,负载倾斜让整体利用率暴跌。正确做法是先分析通信拓扑:确认机内卡数、机间带宽、单卡显存,再按「同机 TP、跨机 PP、最远 DP」的原则设计网格,最后用 profiler 验证。
为何常见:把选型当成了可随意试错的黑盒,忽略了并行方案有明确的物理约束和设计原则,随意试错往往浪费时间还不自知。
面试题
Q1. 数据并行(DP)的核心做法是什么?
- A.把模型权重切分到多张卡
- B.复制权重并切分数据← 正确答案
- C.按层拆开分段接力训练
- D.只用一个 GPU 重复训练
答案:B。数据并行是每家分店拿同一本菜谱、招待不同客人:权重复制多份,数据切分给各卡。A 是张量并行的特征,C 是流水线并行的特征,D 根本不是并行。
Q2. 张量并行(TP)主要解决什么问题?
- A.单层太大放不进一张卡← 正确答案
- B.训练数据样本数量太少
- C.网络带宽完全用不完
- D.显存绰绰有余的场景
答案:A。TP 把一层矩阵运算切成多块分给多卡,专治「单层超大」。它通信频繁,只适合机内高速互联。B、C、D 都与 TP 的适用场景相反。
Q3. 流水线并行中的「气泡」是指什么?
- A.显卡风扇散热不良的现象
- B.上游未传完导致 GPU 空闲等待← 正确答案
- C.网络传输时产生的数据丢包
- D.优化器更新时的显存溢出
答案:B。流水线里前一段还没算完,后一段的 GPU 只能闲着等,这段空闲就是气泡,类似传菜时切菜师傅等洗菜师傅。气泡占比 ≈ (P-1)/(P+M-1),增大 micro-batch 数 M 可以压缩气泡。
Q4. 已知集群有 32 张卡,设置 DP=4、PP=2,则 TP 应为多少?
- A.2
- B.4← 正确答案
- C.8
- D.16
答案:B。三个维度的并行度必须相乘等于总卡数:N_gpu = DP × TP × PP。所以 TP = 32 ÷ (4 × 2) = 4。这是混合并行选型最基本的口算题。
Q5. 为什么 TP 通常优先放在同一台机器内?
- A.因为 TP 通信频繁且单次量大← 正确答案
- B.因为 TP 完全不需要通信
- C.因为 TP 会占用大量显存
- D.因为 TP 只看数据不传参数
答案:A。TP 切在层内,每层计算完都要做一次拼盘(拼接分片),通信频率数倍于 PP 和 DP,必须走 NVLink 这类机内高速通道。跨机器的弱网带宽扛不住这种通信密度。
Q6. 千亿参数模型在数百张卡上训练,通常推荐哪种组合?
- A.DP×TP×PP 三维混合并行← 正确答案
- B.纯数据并行不切分层
- C.纯流水线并行不切层内
- D.纯张量并行全模型切分
答案:A。千亿模型既层数深又单层大,单靠一种并行顾此失彼。标准做法是机内 TP 解决单层显存、机间 PP 解决模型深度、整体 DP 扩展吞吐,三路相乘填满所有卡(如 TP=8、PP=8、DP=4)。
Q7. 增大 micro-batch 数量对流水线训练的作用是什么?
- A.降低气泡占比提升 GPU 利用率← 正确答案
- B.增加每张卡的显存占用压力
- C.完全消除所有通信等待开销
- D.强制每一层权重复制多份
答案:A。micro-batch 越多,流水线里排队等待的「菜」越多,气泡占比 (P-1)/(P+M-1) 越小。但它只是缓解气泡,不可能为零;且过多 micro-batch 会增加调度开销和激活显存,需要平衡。
Q8. 下列哪些方法可以有效减少流水线气泡?
- A.增加 micro-batch 数量← 正确答案
- B.加深流水线的 stage 数
- C.采用 1F1B 异步调度方式← 正确答案
- D.每个 stage 之间刻意停顿
答案:AC。增大 M 让气泡占比变小,1F1B(一个前向一个后向交替调度)让各 stage 忙起来。加深 stage 数 P 反而会增大气泡;刻意停顿更是雪上加霜。
Q9. 下列哪些说法符合混合并行的基本认知?
- A.并行总卡数等于 DP×TP×PP← 正确答案
- B.TP 对通信带宽要求最高← 正确答案
- C.DP 每个训练步都需同步梯度← 正确答案
- D.PP 在 stage 之间零通信
答案:ABC。三个维度相乘等于总卡数是铁律;TP 每层都通信所以带宽要求最高;DP 每步都要 all-reduce 梯度。PP 并非零通信,它每个 micro-batch 都要传中间激活值给下一 stage。
Q10. 进行混合并行选型时,需要重点权衡哪些因素?
- A.模型参数量与单卡显存容量← 正确答案
- B.集群内网卡带宽与拓扑结构← 正确答案
- C.训练框架对组合的支持程度← 正确答案
- D.只选名字听起来顺口的策略
答案:ABC。选型本质是权衡三件事:显存装不装得下(决定 TP/PP 度数)、通信快不快(决定维度摆放位置)、框架支不支持(决定方案能否落地)。D 显然是错误的选型方式。