分布式训练
问题
大模型训练为什么需要分布式?数据并行和模型并行有什么区别?
答案
一、为什么需要分布式训练
单张 GPU 无法满足大模型训练需求:
| 模型 | 参数量 | FP16 显存(仅模型) | 训练显存(含梯度+优化器) |
|---|---|---|---|
| 7B | 7B | 14 GB | ~56 GB |
| 70B | 70B | 140 GB | ~560 GB |
| 405B | 405B | 810 GB | ~3.2 TB |
训练需要存储的内容:模型参数 + 梯度 + 优化器状态(Adam 需要 2 份额外参数)。
二、并行策略
数据并行(DP)
每个 GPU 持有完整模型,数据分片:
GPU 0: 完整模型 + 数据 batch 0 → 梯度 0 ─┐
GPU 1: 完整模型 + 数据 batch 1 → 梯度 1 ─┼→ AllReduce → 同步更新
GPU 2: 完整模型 + 数据 batch 2 → 梯度 2 ─┘
张量并行(TP)
将单个层的计算分割到多个 GPU:
线性层 Y = XW,W 按列切分:
GPU 0: Y₀ = X × W₀
GPU 1: Y₁ = X × W₁
然后拼接 Y = [Y₀, Y₁]
流水线并行(PP)
将模型的不同层放到不同 GPU:
GPU 0: Layer 0-7 → 输出 →
GPU 1: Layer 8-15 → 输出 →
GPU 2: Layer 16-23 → 输出 →
GPU 3: Layer 24-31 → 最终输出
三、主流框架
| 框架 | 维护方 | 特点 |
|---|---|---|
| DeepSpeed | Microsoft | ZeRO 优化器,功能最全 |
| FSDP | PyTorch | PyTorch 原生,使用简单 |
| Megatron-LM | NVIDIA | 张量/流水线并行,超大模型 |
DeepSpeed ZeRO
ZeRO(Zero Redundancy Optimizer)分三个阶段减少显存冗余:
| Stage | 分片内容 | 显存节省 |
|---|---|---|
| ZeRO-1 | 优化器状态 | 4x |
| ZeRO-2 | + 梯度 | 8x |
| ZeRO-3 | + 模型参数 | N_gpu × |
四、3D 并行
大型训练通常组合使用多种并行策略:
例如 Llama 3 405B 训练使用 16K GPU:
- 张量并行 = 8(同一节点 8 GPU)
- 流水线并行 = 16(跨节点 16 段)
- 数据并行 = 128(128 份数据)
常见面试问题
Q1: 数据并行和模型并行的区别?
答案:
- 数据并行:每个 GPU 有完整模型,数据分片。适合模型能放进单卡的情况
- 模型并行:模型切分到多个 GPU,数据不分片。适合模型太大无法放入单卡
- 实践中常组合使用
Q2: DeepSpeed ZeRO-3 和 FSDP 有什么区别?
答案:
- 二者原理相似:都是将参数、梯度、优化器状态分片到多个 GPU
- DeepSpeed ZeRO-3:功能更多(offload 到 CPU/NVMe、更灵活的配置)
- FSDP:PyTorch 原生,API 更简洁,不需要额外配置文件
- 新项目推荐 FSDP(更轻量),需要 offload 等高级功能时用 DeepSpeed