ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

27届大模型面试准备(十七):分布式训练全攻略——数据/流水/张量并行、DeepSpeed ZeRO、FSDP、Megatron

27届大模型面试准备(十七):分布式训练全攻略——数据/流水/张量并行、DeepSpeed ZeRO、FSDP、Megatron 27届大模型面试准备十七分布式训练全攻略——数据/流水/张量并行、DeepSpeed ZeRO、FSDP、Megatron前两篇讲完了推理怎么快A15和对齐怎么做A16这一篇回到最底层——怎么把一个数十亿到数万亿参数的模型真正训起来。单张卡装不下、算不动就必须分布式。覆盖三大并行策略数据/流水线/张量 显存优化ZeRO、激活重算、混合精度 三套主流框架DeepSpeed / FSDP / Megatron-LM的取舍。每节给原理 → 图解 → 代码片段 → 面试速答 高频追问。配合 A18LoRA/PEFT 省显存一起看刚好从大训练走到小微调。一、为什么必须分布式一张卡装不下一个模型一个 7B 模型仅权重FP16就约 14 GB训练时还要存优化器状态Adam 的 momentumvar 是参数的 2 倍 FP32≈4 倍参数量、梯度、激活值。粗略估算训练显存训练显存 ≈ 参数×2(FP16) 参数×4(优化器 FP32 状态) 参数×2(梯度) 激活 参数 × 8 激活 7B 模型: 7e9 × 8 Bytes ≈ 56 GB ← 单张 80G A100 也吃紧且还没算激活 175B 模型: 175e9 × 8 ≈ 1.4 TB ← 必须用成百上千张卡切分结论模型要么切参数模型并行要么切数据数据并行要么两者叠加。并行的总思路 ┌──────────────┬──────────────┬──────────────┐ │ 数据并行 DP │ 流水线并行 PP │ 张量并行 TP │ │ 复制模型,切样本│ 切层到不同卡 │ 单层内切矩阵 │ └──────────────┴──────────────┴──────────────┘ 组合 3D 并行(DP×PP×TP)二、数据并行Data Parallelism, DP最直觉每张卡持有完整模型副本喂不同的数据分片各自算梯度然后全规约all-reduce求平均再同步更新。GPU0: 模型副本 数据A ─┐ GPU1: 模型副本 数据B ─┤→ all-reduce(梯度) → 同步更新每卡的模型 GPU2: 模型副本 数据C ─┤ GPU3: 模型副本 数据D ─┘优点实现简单、通信量小只在每步同步梯度。缺点每张卡都要存完整模型 完整优化器状态显存不节省模型一大就爆。PyTorch 原生 DDPDistributedDataParallel最小骨架importtorch.distributedasdistfromtorch.nn.parallelimportDistributedDataParallelasDDPdist.init_process_group(nccl)# 初始化通信后端rankdist.get_rank();worlddist.get_world_size()samplerDistributedSampler(dataset,num_replicasworld,rankrank)loaderDataLoader(dataset,samplersampler,batch_size8)modelDDP(model.cuda(),device_ids[rank])forx,yinloader:lossmodel(x,y).lossloss.backward();optimizer.step();optimizer.zero_grad()面试速答DP 为什么不能省显存因为它复制的是整个模型 优化器状态每卡独立存一份参数没被切分只是数据被切分了。高频追问1. DP 和 DDP 区别DP 是单进程多线程、GIL 受限、已淘汰DDP 是多进程、NCCL 通信、主流。2. all-reduce 的通信瓶颈梯度总量 参数量×2 字节卡多时成瓶颈引出梯度压缩/通信计算重叠。三、流水线并行Pipeline Parallelism, PP按层切把模型的不同层分到不同卡上数据像流水线一样流过GPU0: 第 1~4 层 ──▶ GPU1: 第 5~8 层 ──▶ GPU2: 第 9~12 层 ──▶ GPU3: 第 13~16 层 输入 中间激活 中间激活 输出朴素实现有气泡bubbleGPU0 算完第一批要等后面全跑完才能接第二批算力空转。解决方案是微批次micro-batch 调度GPipe(前向全跑完再反向) 1F1B(一次前向一次反向交错) t: F0 F1 F2 F3 B3 B2 B1 B0 F0 F1 F2 F3 B3 B2 B1 B0 ← 仍有大气泡 1F1B 改进: F0 F1 F2 B0 F3 B1 ... 气泡明显缩小PyTorch 用torch.distributed.pipeline.sync.Pipe或手动rpc主流是结合 DeepSpeed/Megatron 的 1F1B 调度。面试速答PP 的气泡是什么、怎么消气泡是流水线空闲等待。用 micro-batch 把大 batch 拆小、用 1F1B一次前向接一次反向调度让各卡尽早开始反向填充空闲。四、张量并行Tensor Parallelism, TP层内切矩阵当单层都装不下一层如 175B 的某一层权重很大要在单层内部把权重矩阵切到多卡配合矩阵分块乘法。以 Megatron 的列式/行式切分为例Y X · [W1 W2] # 一个线性层权重按列切成两半 GPU0 算 X·W1 ┐ GPU1 算 X·W2 ┴─▶ all-reduce 拼接 → 下一层 对 GELU/Softmax 等用行式切分使激活不需要立即通信TP 通信极频繁每层都要 all-reduce所以必须放在同一节点内NVLink 高速互联跨节点用 TP 会慢死。面试速答TP 和 PP 怎么选TP 通信密、要高带宽域内同机 NVLinkPP 通信稀、可跨节点。实际训练常 PP 跨节点、TP 在节点内再加 DP 做数据切分 → 3D 并行。五、显存优化的三把斧ZeRO、重算、混合精度5.1 ZeROZero Redundancy OptimizerDeepSpeedDP 每张卡都存完整优化器状态是浪费。ZeRO 把优化器状态/梯度/参数分片到各卡用时再 gather阶段切分对象显存节省ZeRO-1优化器状态约 4×ZeRO-2 梯度约 8×ZeRO-3 参数接近线性与卡数成正比DeepSpeed 配置{zero_optimization:{stage:3,offload_optimizer:{device:cpu},// 把优化器状态卸载到 CPU进一步省显存overlap_comm:true}}5.2 激活重算Activation Recomputation / Gradient Checkpointing正常要存所有中间激活算梯度显存大。重算策略前向不存激活反向时重新算一遍。用约 30% 额外算力换数倍显存节省fromtorch.utils.checkpointimportcheckpointdefforward(self,x):returncheckpoint(self.block,x)# 反向时重算该 block 的激活5.3 混合精度AMP用 FP16/BF16 存激活和计算FP32 存主权重和梯度做更新既快又稳BF16 动态范围大不易溢出是训练首选。fromtorch.cuda.ampimportautocast,GradScalerwithautocast(dtypetorch.bfloat16):lossmodel(x).lossloss.backward();optimizer.step()六、三套框架怎么选框架核心能力适合场景一句话DeepSpeedZeRO 系列、CPU/NVMe offload、易用中大模型、显存紧张省显存王者单卡也能训大模型的功臣FSDPPyTorch 原生全分片类 ZeRO-3想用纯 PyTorch 生态DDP 的精神续作原生、轻量Megatron-LMTPPP 极致 3D 并行、超大规模千亿级以上、TPU/GPU 集群超大规模专用和 DeepSpeed 常组合FSDP 最小骨架fromtorch.distributed.fsdpimportFSDP,MixedPrecisionmodelFSDP(model,mixed_precisionMixedPrecision(param_dtypetorch.bfloat16),sharding_strategyFULL_SHARD)# 等价于 ZeRO-3面试速答DeepSpeed 和 FSDP 怎么选偏好纯 PyTorch、要轻量用 FSDP要 offload、ZeRO 调参自由度、丰富功能用 DeepSpeed超大模型常 Megatron(TP/PP) DeepSpeed(ZeRO) 组合。七、面试速答 高频追问清单汇总速答 TOP 81. 单卡装不下 → 必须并行显存 参数×8 激活。2. DP 切数据、PP 切层、TP 切矩阵。3. PP 气泡用 micro-batch 1F1B 消。4. TP 通信密放同机 NVLink 内。5. ZeRO 分片优化器/梯度/参数stage3 ≈ 线性省显存。6. 激活重算用算力换显存。7. BF16 训练优先动态范围大。8. 3D 并行 DP × PP × TP。追问清单- 3D 并行里通信量最大的是哪维如何排布到硬件拓扑- ZeRO-offload 把状态放 CPU通信瓶颈在哪- TP 的 all-reduce 为什么每层都要- 混合精度下主权重为何保持 FP32- 千亿模型的实际并行配置一般怎么定如 8 机 64 卡八、下一篇预告分布式训练讲完怎么把大模型训起来下一篇A18讲LoRA / QLoRA / PEPF 省显存微调全家桶——当你不想动全量参数、只想低成本适配下游任务时的标准做法。评论区告诉我你想先听哪个方向。
返回列表