大模型训练中的数据并行、模型并行、流水线并行分别适用于什么场景?ZeRO 是什么
P1 · llm_training
📊 考点:distributed-training
🏷 标签:data-parallel, model-parallel, pipeline-parallel, zero
1️⃣ 考察意图
面试官想考察你对分布式训练核心范式的理解深度,而非背诵定义。这道题是典型的“概念+工程取舍”混合型,刁钻点在于:多数人只会背数据并行、模型并行、流水线并行的定义,但说不清各自在什么显存/带宽/计算约束下选型,以及ZeRO如何打破传统并行范式的显存墙。答好了能展示你从单卡到千卡集群的规模化训练实战经验,以及对显存优化(参数、梯度、优化器状态)的底层认知。
2️⃣ 标准答
数据并行(Data Parallelism)
- 适用场景:模型能塞进单卡显存(如GPT-2 1.5B在A100 80G上),但需要加速训练。每卡复制完整模型,分片数据,通过AllReduce同步梯度。
- 工程取舍:通信开销随卡数线性增长。当模型变大,单卡显存装不下时,数据并行直接失效——这是它的天花板。
- 实际坑:梯度同步的AllReduce带宽瓶颈。解法:使用NCCL的Ring AllReduce(带宽与卡数无关,仅与单卡带宽相关),或启用梯度累积(gradient accumulation)减少通信频率。
模型并行(Model Parallelism / Tensor Parallelism)
- 适用场景:单卡显存装不下整个模型(如GPT-3 175B),将单个transformer层的权重切分到多卡。每卡只存一部分参数,计算时跨卡通信。
- 工程取舍:通信极其密集——每层前向/反向都需要AllReduce(如Megatron-LM的列并行+行并行)。通信量正比于hidden_size,而非batch_size。适合高带宽(NVLink/NVSwitch)环境,不适合以太网集群。
- 实际坑:切分粒度太细导致通信开销超过计算收益。经验值:单卡显存不足时优先用TP,但TP size通常不超过8(受限于GPU间带宽)。
流水线并行(Pipeline Parallelism)
- 适用场景:模型层数极深(如100+层),将模型按层切分为多个stage,每个stage分配到不同设备。通过微批次(micro-batch)流水线提高吞吐。
- 工程取舍:引入气泡(bubble)问题——流水线启动和排空阶段的空闲。GPipe用均匀微批次减少气泡(气泡比 = (p-1)/m,p为stage数,m为微批次数),PipeDream用1F1B调度进一步压缩气泡。
- 实际坑:stage间负载不均导致某stage成为瓶颈。解法:用profiling工具(如PyTorch Profiler)分析每层计算时间,手动或自动(如Alpa)调整stage划分。
ZeRO(零冗余优化器)
- 本质:不是并行范式,而是显存优化策略。传统数据并行中每卡存完整优化器状态(如Adam的momentum+variance,占参数量的8倍)、梯度(4倍)、参数(4倍)。ZeRO通过分片消除冗余。
- 三个级别:ZeRO-1:分片优化器状态(显存节省4倍,通信量不变)
- ZeRO-2:分片优化器状态+梯度(显存节省8倍,通信量增加梯度同步)
- ZeRO-3:分片优化器状态+梯度+参数(显存节省16倍,但前向/反向需AllGather参数,通信量翻倍) 工程取舍:ZeRO-3显存最省,但通信开销最大。实际中ZeRO-2最常用(如DeepSpeed默认配置),因为梯度同步原本就需要AllReduce,ZeRO-2只是把通信从AllReduce改为ReduceScatter+AllGather,通信量不变。实际坑:ZeRO-3在CPU offload时,参数AllGather的延迟会严重拖慢训练。解法:启用overlap(计算与通信重叠),或改用ZeRO-2+CPU offload优化器状态。
混合使用(3D并行)
- 实际大模型训练(如GPT-3 175B)用数据并行+张量并行+流水线并行+ZeRO的组合。典型配置:DP=64, TP=8, PP=4,ZeRO-2优化器状态分片。每张卡显存占用从纯DP的350GB降到约40GB。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从三个并行范式加ZeRO优化四个层面回答。数据并行适合模型能装进单卡、需要加速的场景,但受显存上限限制;模型并行(张量并行)解决单层太大装不下的问题,但通信密集;流水线并行解决层数太深的问题,但引入气泡。ZeRO不是并行范式,而是通过分片优化器状态、梯度、参数消除冗余,让数据并行能训练更大模型。总结一句:实际训练是数据并行+张量并行+流水线并行+ZeRO的组合拳,根据显存、带宽、计算量做取舍。”
4️⃣ 高频追问 & 应对
追问 1:ZeRO-3 和模型并行(张量并行)有什么区别?什么时候该用哪个?
ZeRO-3是参数分片,每卡只存一部分参数,计算时通过AllGather收集完整参数,计算完丢弃;张量并行是参数复制+计算切分,每层计算需要跨卡通信合并结果。ZeRO-3通信量正比于参数大小,张量并行通信量正比于hidden_size。选型原则:如果单卡显存能装下单层参数(如GPT-3 96层,每层约1.8GB),优先ZeRO-3;如果单层参数都装不下(如MoE模型专家层极大),必须用张量并行。实际中常组合:张量并行处理单层,ZeRO-3处理跨层。
追问 2:流水线并行中,如何选择stage数量和微批次大小?
stage数量p受限于模型层数和GPU数量,通常p=4
8。微批次数m由气泡比公式决定:气泡比=(p-1)/m,希望<10%则m≥10p。但m增大也会增加显存(需保存更多中间激活)。经验值:p=4时m=3264,p=8时m=64~128。用GPipe的均匀调度或PipeDream的1F1B调度,后者显存更优。实际用profiling工具跑小规模实验,找到吞吐峰值。
追问 3:ZeRO-2 和 ZeRO-3 在通信上的具体差异是什么?
ZeRO-2:梯度同步从AllReduce改为ReduceScatter(分片梯度)+ AllGather(收集完整梯度),通信量不变(2倍参数大小)。ZeRO-3:前向/反向每层都需要AllGather参数(通信量2倍参数大小),反向还需要ReduceScatter梯度(通信量1倍参数大小),总通信量3倍参数大小,比ZeRO-2多50%。所以ZeRO-3适合计算密集、通信带宽高的场景(如NVLink),不适合低带宽集群。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“数据并行就是多卡训练,模型并行就是模型太大放不下” → ✅ 必须区分数据并行是复制模型、分片数据;模型并行是分片模型、复制数据。还要指出数据并行受显存上限限制,模型并行受通信带宽限制。
- ❌ 说“ZeRO就是显存优化,用就对了” → ✅ 必须指出ZeRO的三个级别及其通信开销差异,以及ZeRO-3在低带宽环境可能反而更慢。还要说明ZeRO不是并行范式,而是对数据并行的改进。
- ❌ 说“流水线并行就是按层切分,没有缺点” → ✅ 必须指出气泡问题和负载不均问题,以及GPipe和PipeDream的调度差异。还要说明微批次大小对显存和气泡的trade-off。
6️⃣ 简历呼应
- 如果你有分布式训练项目:从实际配置切入,比如“我在训练7B模型时,用DeepSpeed ZeRO-2+数据并行,8卡A100,显存从80G降到32G,吞吐提升2倍”。展示你踩过通信瓶颈和显存OOM的坑。
- 如果你只做过单卡训练:用类比迁移,比如“单卡训练像一个人搬砖,数据并行是多人搬同一堆砖,模型并行是每人搬一块大砖的不同部分”。然后补充你读过Megatron-LM和DeepSpeed论文,理解ZeRO原理。
- 如果你是校招无项目:聚焦论文复现,比如“我复现了GPT-2 1.5B训练,用PyTorch DDP实现数据并行,对比了ZeRO-2和ZeRO-3的显存和吞吐差异”。展示你对分布式训练理论的理解和动手能力。
7️⃣ 延伸阅读
- Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism(NVIDIA)
- ZeRO: Memory Optimizations Toward Training Trillion Parameter Models(DeepSpeed)
- GPipe: Efficient Training of Large Neural Networks using Pipeline Parallelism(Google)
- PipeDream: Generalized Pipeline Parallelism for DNN Training(Microsoft)
- PyTorch Distributed Training官方文档(torch.distributed + torch.distributed.elastic)