卷7 · 工程实战手册
7.3 分布式训练入门:DDP、FSDP 与 DeepSpeed
展开本章目录与同卷章节
1. 为什么分布式,两条轴2. DDP:数据并行的标准件3. FSDP:装不下时的标准解(ZeRO 思想的 PyTorch 原生实现)4. DeepSpeed:另一个生态,多两件武器5. 选择决策树(贴墙上)6. 通信常识(看懂日志的最低限度)7. 自测题8. 动手作业9. 延伸资源同卷章节7.1 显存估算速查与 OOM 排查大全7.2 训练调试案例集:十大经典翻车与处置7.3 分布式训练入门:DDP、FSDP 与 DeepSpeed7.4 推理部署与成本估算:把模型变成可运营的服务7.5 数据 pipeline 工程:把数据当代码对待7.6 AI 协作守则:驾驭代码 agent 而不被其驾驭本章目标:建立分布式的”概念地图 + 选择决策树”——你大概率不会手写通信代码(LLaMA-Factory/vLLM 全封装了),但必须知道每个选项在交换什么、出问题时日志在说什么。学完标准:能给任何”模型×卡数”组合选对并行方案,看懂训练日志里的 NCCL/ZeRO 字样。
1. 为什么分布式,两条轴
- 吞吐轴(数据并行):模型装得下,但想更快/更大 batch → 多卡各跑各的数据,梯度同步;
- 容量轴(模型并行/分片):单卡装不下 → 把模型本体切开分到各卡。 两条轴组合出 2.4 §5 提过的”3D 并行”(数据/张量/流水线)。学生 90% 的场景只涉及第一条轴 + 轻度分片。
2. DDP:数据并行的标准件
机制:每张卡一份完整模型,数据切开(DistributedSampler 保证不重叠);前向反向各自算,反向时梯度 all-reduce(全卡求平均)后同步更新——数学上等价于大 batch 单卡。
使用(LLaMA-Factory 或原生 torchrun 都是一行启动):
torchrun --nproc_per_node=2 train.py # 原生
# LLaMA-Factory: bf16: true, 即自动 DDP
检查单(案例 9 的预防):① DistributedSampler + set_epoch(否则每卡数据重复且打乱不变);② 只在 rank0 做日志/保存/评估(if rank == 0);③ BN 换 SyncBN(CV 模型);④ batch size 是每卡大小,总 batch = 每卡 × 卡数(调 lr 记得按总 batch 折算)。
3. FSDP:装不下时的标准解(ZeRO 思想的 PyTorch 原生实现)
问题:7B 全参训练要 112GB(7.1 的账)——单卡 24G 怎么办?分片:不存完整副本,把参数/梯度/优化器状态切到各卡,前向/反向用到哪片就临时 all-gather 哪片,用完即释放。
ZeRO 三级(理解级):ZeRO-1 切优化器状态(省 4×)→ ZeRO-2 加切梯度 → ZeRO-3(=FSDP full shard)连参数也切。代价:通信量涨(换显存),速度损失 20–40%。
实操(LLaMA-Factory 配置几行):
fsdp: full_shard auto_wrap
fsdp_config:
fsdp_offload_params: false # true=再卸载到 CPU(更省更慢)
4. DeepSpeed:另一个生态,多两件武器
微软系框架,ZeRO 概念的发源地,配置化程度高:
deepspeed: examples/deepspeed/ds_z2_config.json # stage 1/2/3
比 FSDP 多两件:ZeRO-Offload/Infinity(把优化器状态/参数卸载到 CPU 内存甚至 NVMe——显存极限换算力,学生租双卡机器跑 13B 的救命选项)和 流水线并行的成熟实现。FSDP vs DeepSpeed 怎么选:PyTorch 生态内/图省事 → FSDP;需要 offload 或多机流水线 → DeepSpeed。两者你都不用”会写”,只要”会配”。
5. 选择决策树(贴墙上)
模型 + 训练状态单卡装得下?
├─ 是,想提速/大batch → DDP
└─ 否 → 4bit/LoRA 能装下吗?(先降精度,总是第一选项)
├─ 是 → LoRA/QLoRA(不需要分布式!)
└─ 否 → 单机多卡? → FSDP(full_shard) 或 DeepSpeed ZeRO-2/3
显存还差口气? → + offload(CPU/NVMe)
多机大模型 → 3D 并行(Megatron/DeepSpeed,导师的事)
学生的真相:LoRA/QLoRA 甜点区(2.10)让你几乎不需要分布式——租多卡纯为加速时用 DDP,偶尔全参小模型用 FSDP。知道概念是为了看懂配置和日志,不是为了手写。
6. 通信常识(看懂日志的最低限度)
- NCCL:NVIDIA 的集合通信库,日志里的
NCCL INFO报错多半是网络/拓扑问题(单机几分钟后卡住不动 → 查 NCCL 超时与防火墙); - all-reduce:梯度求和再广播,数据并行的通信主角——通信时间 ≈ 模型大小 ÷ 卡间带宽,所以卡间带宽(NVLink vs PCIe)直接决定多卡加速比;
- 梯度累积 ↔ 通信:累积期间不需要通信(本地算完再同步)——慢网络下的省钱技巧。
7. 自测题
- 数据并行和模型并行分别解决什么轴?(吞吐/容量)
- DDP 数学上等价于什么?前提是什么?(大 batch 单卡;数据切分正确+梯度同步)
- ZeRO 三级各切什么?FSDP 对应哪级?(优化器状态/加梯度/加参数;full_shard=ZeRO-3)
- offload 交换的是什么?(显存 ↔ CPU/NVMe 带宽与速度)
- 学生”几乎不需要分布式”的原因?(LoRA/QLoRA 甜点让单卡装得下——2.10 的结论在工程侧兑现)
- 案例场景:双卡 DDP 训练两小时发现 loss 曲线和单卡一模一样但耗时没降——第一嫌疑?(DataLoader 没 DistributedSampler,每卡吃全量数据)
8. 动手作业
- 在 Kaggle 双 T4 上用 torchrun 跑你的 CIFAR 脚本(免费体验分布式),验证加速比(T4 走 PCIe,预期 ~1.8×);
- 读 LLaMA-Factory 的 deepspeed/f fsdp 配置示例,把每个字段映射到本章概念(写注释版配置);
- 挑战:用 FSDP(full_shard) 在双卡上全参训一个 1B 小模型——体验”装不下”到”装下了”的过程。
9. 延伸资源
- PyTorch FSDP 官方教程——概念与 API 双合格
- DeepSpeed 文档 ZeRO 页——配置字典
- 《Megatron-LM》论文选读——3D 并行的源头(知道即可)
