
为什么必须并行:两堵墙
单卡训练大模型撞两堵墙。显存墙:训练的显存占用远超权重本身——权重 + 梯度 + 优化器状态(Adam 的两份动量)合计约是参数量的 16 倍字节(FP16 混合精度下),70B 模型光这些就要 1TB 以上,任何单卡都装不下(本库显存账单篇的账在此放大)。算力墙:即便显存够(用 offload 硬挤),单卡的计算时间也长到不可接受——预训练动辄数周,单卡等于永无完工。分布式训练的解法是把「模型」与「数据」切开来摊——怎么切,就是三种并行的分工问题。
数据并行(DP):最简单的切法
数据并行的切法:模型完整复制到每张卡,每张卡处理不同的数据批次,反向传播后同步梯度(all-reduce 通信)再各自更新——每张卡上的模型保持一致。这是最简单也最先用的并行:实现几乎零成本(PyTorch DDP 一行配置),扩展性线性(卡数翻倍吞吐近似翻倍,通信开销允许范围内)。
它的局限也直接:每张卡都要装下完整模型——模型超过单卡显存,DP 就失效。ZeRO(零冗余优化器)是对 DP 的改造:把「每卡完整冗余」拆开——ZeRO-1 只分片优化器状态、ZeRO-2 加分片梯度、ZeRO-3 把权重本身也分片(每卡只存 1/N 的权重,用时临时聚合)。ZeRO-3 让 DP 能装下大模型,代价是通信量大增(每次前向都要临时聚合权重)——ZeRO 的分片级别是「显存压力 ↔ 通信开销」的旋钮。现代实践里,FSDP(PyTorch 的全分片数据并行)与 DeepSpeed ZeRO 是这一路线的标准实现。
张量并行(TP):把一层切开
模型大到 ZeRO-3 都装不下单卡(或单卡算一层都太慢)时,需要在层内切:张量并行把单个层的权重矩阵按列/行切开分到多卡——前向时各卡计算自己那部分矩阵乘,中间结果做一次通信(两次 all-reduce/all-gather)。TP 的特点是通信极其频繁(每一层的前向与反向都要通信),因此它对通信带宽极度敏感——TP 只适合放在高带宽的域内(NVLink 互联的同一台机器的 8 张卡),跨机器用 TP 会把时间耗在通信上。
流水线并行(PP):把层间切开
流水线并行按层切:模型的第 1–10 层在卡组 A、11–20 层在卡组 B——数据像工厂流水线一样流过各站。朴素 PP 的问题是流水线气泡(pipeline bubble):某张卡计算时其他卡在等(每站的输入依赖上一站的输出),GPU 利用率掉到 1/站数。微批次(micro-batch)是解药:把一个 batch 切成多个 micro-batch 交错填进流水线(1F1B 调度——前向与反向交错),气泡占比压到(站数−1)/(micro-batch 数)——micro-batch 越多气泡越小。PP 的通信量很小(只在站点边界传激活),适合放在低带宽的跨机器场景。
组合决策:多大模型配哪种并行
实际的百亿级以上训练都是混合并行(3D/4D 并行),组合的决策逻辑可以归纳为一张决策表。
| 模型规模 | 推荐组合 | 理由 |
|---|---|---|
| ≤ 7B | DP(FSDP/ZeRO-2)+ 梯度累积 | 单卡能装,数据并行扩吞吐即可 |
| 7B–70B | ZeRO-3/FSDP(节点内)+ DP | 权重分片装下,通信在 NVLink 域内可承受 |
| 70B+ | TP(节点内 8 卡)+ PP(跨节点)+ DP | 层内切进 NVLink 域、层间切跨节点、外圈再套数据并行 |
| MoE 巨兽 | 上述 + EP(专家并行) | 专家单独分片(本库 MoE 篇的专家并行) |
组合的调参原则:通信贵的并行(TP)放高带宽域,通信便宜的并行(PP、DP)放低带宽域——把「机内 vs 机间」的网络拓扑与并行方式的通信特性对齐,是分布式训练配置的核心思想。工程上不必手搓:DeepSpeed 与 Megatron-LM 系(含各家封装)把这些组合做成了配置项,理解本文的机制是为了看懂配置与诊断问题——训练慢了,先问「通信在哪个维度爆炸了」,答案通常在并行方式与网络拓扑的错配上。
分布式训练的实战细节:通信拓扑、失败模式与调试
分布式并行的实战难度不在概念在细节,三类实战问题值得展开。通信拓扑的匹配(正文的组合决策的落地):NVLink(机内高带宽)、PCIe(机内低配)、IB/RoCE(机间网络)——并行方式的通信模式要与拓扑匹配(TP 的 all-reduce 放 NVLink、PP 的点对点放 IB),配错的表现是「GPU 利用率忽高忽低、训练步时间被通信吃掉」——诊断工具(NCCL 的调试日志、profiler 的通信时间占比)能直接看到通信与计算的配比。失败模式的类型学:分布式训练的故障比单卡丰富——单卡硬件故障(整组重启)、通信超时(NCCL timeout——网络抖动或某卡掉速)、数值发散(某一卡的数值异常污染全局,本库断点篇的 loss spike)、以及「静默降速」(某张卡散热降频,全组等它——最隐蔽的性能问题)。调试的方法论:分布式 bug 的定位从「缩小范围」开始——单卡能不能跑(排除分布式问题)、两卡能不能跑(暴露通信问题)、逐步扩大到全量;NCCL_DEBUG 环境变量与每卡的日志分级是基本功。给实践者的心态建议:分布式训练的调试是「系统工程」而非「算法问题」——90% 的分布式故障是基础设施(网络、硬件、存储)而非代码;把基础设施的可观测性(每卡的状态监控、网络的带宽监控)建好,比熟悉任何框架的 API 都更能救命。分布式训练的入门路径也由此清晰:单卡调通 → DDP 扩展 → FSDP/ZeRO → 多机——每一级都稳定了再上一级,跳级的代价是调试地狱。
并行之外的省卡思路:梯度累积、激活 offload 与「单卡极限」
分布式并行(正文)之外,还有一条「不并行也把训练撑起来」的路线——用各种手段把训练压进有限硬件,适合「没有集群只有单卡」的场景。手段一:梯度累积(本库专篇)——小 batch 多次累积凑等效大 batch,显存换不了但把激活的峰值压低。手段二:梯度检查点(本库显存篇)——30% 时间换激活显存。手段三:优化器 offload(CPU 内存承接优化器状态——本库两板斧篇)。手段四:LoRA/QLoRA——把可训练参数压到 0.1%(本库专篇,单卡微调的主力方案)。手段五:8bit 优化器——优化器状态从 FP32 压到 INT8(本库量化篇的思路用在优化器上——paged optimizer 类实现,显存再省一半且性能损失可忽略)。单卡极限的账本(24G 消费卡):LoRA + QLoRA(4bit 基座)+ 梯度检查点 + 梯度累积 + 8bit 优化器的组合,可以微调 14B 模型、甚至「勉强」微调 30B(极小 batch、长训练时间)。这条路线的适用边界要诚实:单卡极限方案换来的是「能训」,代价是「训练时间数十倍于集群」与「单点故障无冗余」——它适合个人学习、原型验证、小数据集微调;正式的生产级训练(大数据、要迭代多轮)仍然需要多卡——单卡极限是学习的阶梯与验证的工具,不是生产的方案。
分布式训练的选型速查:框架与场景的匹配表
分布式训练的框架选择(正文的工程部分)给一张速查表。场景一:单机多卡的微调与中小训练——PyTorch FSDP 或 DeepSpeed ZeRO-2/3:与原生 PyTorch 集成最好、文档社区成熟,微调场景(配 LoRA)的首选。场景二:大规模预训练(多机多卡、数十亿以上)——Megatron-LM 系(含各家基于它的封装):3D 并行的工业级实现,预训练的性能极致,学习曲线陡。场景三:LoRA 微调的多卡扩展——peft + FSDP/accelerate 的组合:LoRA 参数小,多卡主要是数据并行(简单场景),单机多卡甚至单卡累积就够。场景四:MoE 训练——支持专家并行的框架分支(Megatron 的 MoE 实现或 DeepSpeed 的 MoE 支持):专家并行的支持度是 MoE 训练框架选型的核心指标。通用建议:从「框架的官方示例」起步(每个框架的示例即最佳实践的浓缩)、别混用框架(DeepSpeed 与 Megatron 的混用是配置地狱)、以及框架的能力要匹配团队的运维能力——Megatron 的性能极致需要集群运维能力兜底,小团队用 FSDP 的「够用」比用 Megatron 的「翻车」好。
并行训练的验证清单:扩容前先证明「并行是对的」
分布式并行的配置完成后、全量训练启动前,一份验证清单防止「并行配置错误烧掉一周算力」。验证五项。一:单卡基线——同数据同超参单卡跑 100 步,记录 loss 曲线(并行的正确性以此为基准)。二:梯度一致性——并行配置下跑同 100 步,loss 曲线应与单卡近似重合(数据并行的等价性验证;DP 下的明显偏差 = 梯度同步有问题)。三:吞吐线性度——卡数翻倍、吞吐应接近翻倍(线性度低于 70% = 通信或调度瓶颈,先修再训)。四:显存水位——每卡的显存占用均衡且留有余量(某卡独高 = 并行切分不均)。五:断点演练——从 checkpoint 恢复跑通 50 步(本库断点篇的「未经演练的 checkpoint 是薛定谔的保险」)。五项全绿再启动全量训练——验证清单的成本是半天,逃过的代价是一周。这个纪律同样适用于微调的多卡配置:任何「换了个并行方式」的变更,都值得先跑一遍五项验证。
小结
分布式训练解决显存与算力两堵墙:数据并行(整模型复制、分数据、同步梯度,最简单但受单卡显存限制;ZeRO/FSDP 用分片改造它)、张量并行(层内切,通信频繁、只配 NVLink 域内)、流水线并行(层间切、通信小、配跨节点,微批次压气泡)。组合决策按规模:7B 以下纯 DP、70B 级 ZeRO-3、百亿以上 TP+PP+DP 的 3D 混合并行,MoE 加 EP。核心思想是「通信贵的放高带宽域,便宜的放低带宽域」。下一篇算另一笔账:训练的显存到底被什么吃掉——参数、梯度、优化器状态与激活的完整账单。
读者留言
COMMENTS 暂无还没有留言,来说第一句?