云镜收藏

稍后阅读

清单保存在当前浏览器,方便下次回来继续阅读。

清单还是空的

在笔记卡片或正文页点击“加入稍后阅读”即可收藏。

卷7 · 工程实战手册

7.3 分布式训练入门:DDP、FSDP 与 DeepSpeed

约 4 分钟阅读
全书目录

展开本章目录与同卷章节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. 自测题

  1. 数据并行和模型并行分别解决什么轴?(吞吐/容量)
  2. DDP 数学上等价于什么?前提是什么?(大 batch 单卡;数据切分正确+梯度同步)
  3. ZeRO 三级各切什么?FSDP 对应哪级?(优化器状态/加梯度/加参数;full_shard=ZeRO-3)
  4. offload 交换的是什么?(显存 ↔ CPU/NVMe 带宽与速度)
  5. 学生”几乎不需要分布式”的原因?(LoRA/QLoRA 甜点让单卡装得下——2.10 的结论在工程侧兑现)
  6. 案例场景:双卡 DDP 训练两小时发现 loss 曲线和单卡一模一样但耗时没降——第一嫌疑?(DataLoader 没 DistributedSampler,每卡吃全量数据)

8. 动手作业

  1. 在 Kaggle 双 T4 上用 torchrun 跑你的 CIFAR 脚本(免费体验分布式),验证加速比(T4 走 PCIe,预期 ~1.8×);
  2. 读 LLaMA-Factory 的 deepspeed/f fsdp 配置示例,把每个字段映射到本章概念(写注释版配置);
  3. 挑战:用 FSDP(full_shard) 在双卡上全参训一个 1B 小模型——体验”装不下”到”装下了”的过程。

9. 延伸资源

  • PyTorch FSDP 官方教程——概念与 API 双合格
  • DeepSpeed 文档 ZeRO 页——配置字典
  • 《Megatron-LM》论文选读——3D 并行的源头(知道即可)