在 9.2 到 9.4 节中,我们分别拆解了数据并行(DP)、张量并行(TP)和流水线并行(PP)的单打独斗能力,也在 9.5 节看到了 ZeRO 如何在显存层面做减法。但进入百亿乃至千亿参数俱乐部的今天(如 GPT-3 175B、Llama 3 405B、GPT-4 级模型),任何单一并行策略都会撞上天花板:
- 纯 DP:模型权重本身放不进单卡显存,再多 GPU 也无济于事;
- 纯 TP:切分粒度过细会导致通信量爆炸,且 NVLink 域内的卡数有限(通常 8 卡为一台服务器节点),无法无限横向扩展;
- 纯 PP:层数切得太碎会引入严重的流水线气泡(Pipeline Bubble),同时单节点内如果只用 PP,无法利用多卡聚合算力加速单层计算。
因此,工业界的训练框架(如 NVIDIA Megatron-LM、DeepSpeed、Colossal-AI)不约而同地选择了组合战:把 DP、TP、PP 像乐高积木一样叠在一起,形成所谓的 3D 并行(3D Parallelism)。它不是三种技术的简单拼接,而是一套需要考虑硬件拓扑、通信组划分和显存预算的系统性工程。
一、3D 并行的核心逻辑:各管一摊,互补短板
3D 并行的本质思想是:在不同维度上解决不同瓶颈。
| 并行维度 | 切分对象 | 解决的瓶颈 | 通信特点 | 典型硬件亲和性 |
|---------|---------|-----------|---------|--------------|
| TP(张量并行) | 层内参数与激活值(如 Attention 的 Q/K/V 头、FFN 的中间维度) | 单层模型太大,单卡显存放不下 | 通信频繁、带宽极高、每次前向/反向都需 AllReduce/AllGather | 节点内 NVLink(带宽 600–900 GB/s) |
| PP(流水线并行) | 层与层之间(按 Transformer Block 纵向切片) | 模型层数太深,纵向堆叠后单卡放不下 | 通信量中等,主要是相邻 stage 间的点对点(P2P)发送激活值/梯度 | 节点间或机架间,InfiniBand/RoCE(带宽 100–400 Gbps) |
| DP(数据并行) | 训练数据的全局 Batch | 单卡算力不够,需要扩展全局吞吐 | 通信频率较低,每次迭代末执行一次梯度 AllReduce | 跨节点或跨机架,对延迟容忍度相对最高 |
一句话总结:TP 负责把一层摊开;PP 负责把多层串起来;DP 负责把多条数据并行灌入。三者正交,理论上互不干扰。
二、通信组的拓扑设计:谁和谁是一伙的?
在 3D 并行中,所有 GPU 被组织成一个三维网格。假设你有 N 张 GPU,通常会按以下方式划分:
总 GPU 数 = TP 大小 × PP 大小 × DP 大小
例如,一个常见的千亿模型训练集群配置:
- TP = 8(单节点内 8 张 GPU 通过 NVLink 全互联)
- PP = 16(跨 16 个节点做流水线纵向切分)
- DP = 16(再复制 16 份流水线,处理不同数据子集)
- 总计 = 8 × 16 × 16 = 2048 张 GPU
在这个网格中,每张 GPU(一个 rank)同时属于三个互不重叠的通信组(Communicator Group):
- TP 组:与同节点内的 7 张卡高频同步权重切片;
- PP 组:与上下游 Stage 的卡点对点传输激活值和梯度;
- DP 组:与执行相同层、但处理不同数据的卡做梯度 AllReduce。
硬件亲和性原则(这是调参核心):
- TP 必须绑在节点内。因为 TP 每次层内计算后都要马上 AllReduce,一旦跨节点走 IB 网络,延迟会让训练直接“卡死”。
- PP 优先绑在同一机架或相邻机架。PP 的通信量是激活值(activation),体积与序列长度、批大小相关,走 IB 可以接受,但跨机架 hop 太多会拖慢流水。
- DP 可以跨得最远。DP 的梯度 AllReduce 虽然数据量大,但发生频率最低(每个 micro-batch 或全局 batch 结束才做一次),且可用 Bucket AllReduce 做延迟隐藏。
三、数据流实战:一个 Global Batch 的 3D 之旅
让我们把一次训练迭代放大,看看数据如何在 2048 张卡上流动:
- DP 维度:全局 Batch 被切成 16 份,每份交给一条 PP 流水线(16 条流水线并行工作)。
- PP 维度:每条流水线内部,数据被再切成若干 micro-batches(例如 24 个 micro-batches)。这些 micro-batches 像活塞一样灌入 16 个 PP Stage,前向传播依次向下游传递,反向传播再依次向上游回传。
- TP 维度:在每一个 PP Stage 内部,该 Stage 负责的 Transformer Block 被横向切成 8 份,由节点内 8 张卡联合计算。每次 Attention 和 FFN 计算后,8 张卡做一次 AllReduce 拼接中间结果。
- ZeRO 叠加(可选):在 DP 组内,还可以开启 ZeRO-1/2/3(9.5 节),进一步把 Optimizer States、梯度和权重切片分散到不同节点上,把显存压榨到极致。
反向传播时的梯度归路:
- TP 组内先聚合层内梯度(AllReduce);
- 然后沿着 PP 组向上游传递梯度(P2P);
- 最后 DP 组内对所有 micro-batch 的梯度做全局 AllReduce,更新各自持有的权重切片。
四、为什么不是简单相加?3D 并行的互补效应
单独看每一种并行都有其硬伤,但组合后会产生化学效应:
- TP 缓解了 PP 的算力浪费:如果没有 TP,每个 PP Stage 只能跑在一张卡上,而单卡算力可能只有 40% 被利用(因为显存被巨大权重占满,batch 加不上去)。引入 TP 后,每层由 8 张卡一起算,单卡显存压力骤降,每个 Stage 可以塞入更大的 micro-batch,从而提升算术强度,让 Tensor Core 吃饱。
- PP 缓解了 TP 的扩展瓶颈:TP 受限于 NVLink 域(通常 8 卡),模型再深就只能靠 PP 纵向堆叠,理论上可以无限深(只要网络够)。
- DP 提供了线性扩展吞吐的能力:在 TP 和 PP 把模型“塞下”之后,DP 复制整个流水线组,纯粹通过加机器来提升每秒处理的样本数(throughput)。
显存占用的粗略估算:
在 3D 并行下,单卡显存压力 ≈ 模型总参数 × 精度字节数 / (TP × PP) + 激活值 / TP + ZeRO 优化后的冗余开销。对于一个 175B 的模型,如果不使用 3D 并行,FP16 权重就需要 350 GB,没有任何单卡装得下;而在 TP=8、PP=16、ZeRO-1 的组合下,单卡仅需承载约 1.3B 参数的权重切片,再加上激活和优化器状态,完全落入 80 GB A100 的射程。
五、工程落地的真实挑战
3D 并行在理论上很美好,但在千卡集群上跑稳,需要直面以下工程痛点:
1. PP 气泡与 DP 全局 Batch 的博弈
PP 的气泡率(Bubble Ratio)≈ (PP 阶段数 - 1) / micro-batch 数量。为了降低气泡,你需要增加 micro-batch 数量,但这会推高全局 batch size(= DP × PP × micro-batch)。过大的 batch size 需要配合学习率 warm-up 和线性缩放规则,否则收敛会出问题。实践中,往往需要在 收敛稳定性 和 硬件利用率 之间反复调参。
2. 通信死锁与 NCCL 组管理
三个维度的通信组同时存在,NCCL(NVIDIA 集合通信库)组的初始化顺序、显存池分配和 CUDA Stream 同步极易出 bug。一个常见陷阱:TP 的 AllReduce 和 PP 的 P2P 如果在同一个 Stream 上撞车,会导致节点级死锁。Megatron-LM 中为此设计了独立的通信流(communication stream)做重叠(overlap)。
3. Checkpoint 的碎片化
保存 checkpoint 时,每个 rank 只存自己那一小块权重。一个完整的模型 checkpoint 会散落在所有节点的存储上,文件数量 = 总 GPU 数。如果直接存到共享存储(如 NFS),元数据风暴能把存储打挂。工业界通常采用分层存储:先本地 SSD 落盘,再异步聚合到并行文件系统(Lustre/JuiceFS),或直接用高并发对象存储。
4. 故障隔离困难
2048 张卡中任何一张卡掉驱动、显存报错或 IB 网口闪断,整个训练任务都会失败。在 3D 并行下,因为 PP 的严格上下游依赖,故障定位比纯 DP 困难得多——你需要先判断是 TP 组内卡坏了、PP 链路断了,还是 DP 的梯度聚合超时。
六、配置选型:一个快速决策参考
对于不同规模的模型和集群,业界沉淀出一套经验公式(以 A100/H100 80GB 为例):
| 模型规模 | 推荐 3D 配置 | 总 GPU 数参考 | 备注 |
|---------|-------------|-------------|------|
| 7B–13B | TP=8, PP=1, DP=N | 8–64 卡 | 单层能装进单节点,无需 PP |
| 30B–70B | TP=8, PP=2–4, DP=N | 64–512 卡 | 需要 PP 纵向切分 |
| 175B–220B | TP=8, PP=12–16, DP=8–16 | 1024–2048 卡 | 经典 3D 并行主战场 |
| 405B+ | TP=8, PP=16+, DP=16+ | 4096–16384 卡 | 需结合 Sequence Parallelism、EP(Expert Parallelism)等扩展 |
经验法则:TP 尽量打满节点内卡数(8),PP 尽量控制在 16 以内(避免气泡过大),剩下的扩展需求全部交给 DP。
七、小结与衔接
3D 并行是大模型训练从“实验室百卡级”迈向“工业级千卡/万卡级”的必经桥梁。它用 TP 解决层内显存与算力问题,用 PP 解决层间深度问题,用 DP 解决数据吞吐与线性扩展问题,三者正交叠加,再配合 ZeRO 做显存兜底,构成了当前主流预训练框架的骨架。
然而,无论 DP、TP、PP 如何组合,其底层都依赖同一套集合通信原语——AllReduce、AllGather、ReduceScatter、P2P Send/Recv。这些操作在 NCCL 层面如何实现?带宽和延迟如何影响 3D 并行的实际效率?这正是 9.7 节要揭开的底层通信逻辑。理解这些原语,是你从“会配并行策略”进阶到“能调优集群性能”的关键一步。