分布式训练并行策略详解:DP/TP/PP/SP 如何选择
训练大模型,单机远远不够。本文全面解析四种并行策略,帮你选择最优方案。
一、为什么需要并行?
单机限制
显存限制:
- 单卡显存:40-80GB(主流)
- 70B 模型 FP16:140GB+
- 结论:单卡放不下
- 训练时间过长
- 无法在合理时间完成
并行目标
二、四种并行策略
1. 数据并行(DP)
原理:
- 模型完整复制多份
- 数据分片到各卡
- 梯度同步更新
- 实现简单
- 通信量小(只传梯度)
- 适合中小模型
- 每卡需放下完整模型
- 显存效率低
- 模型 < 单卡显存
- 卡数较少(< 8)
python
# PyTorch DDP 示例
model = torch.nn.parallel.DistributedDataParallel(model)2. 张量并行(TP)
原理:
- 单层内切分矩阵
- 每卡计算部分
- 结果合并
- 突破单卡显存限制
- 适合超大层
- 通信量大(每层都通信)
- 实现复杂
- 需要高速互联
- 超大模型(70B+)
- 卡间带宽高(NVLink)
- 行切分(Row Parallel)
- 列切分(Column Parallel)
3. 流水线并行(PP)
原理:
- 按层切分模型
- 每卡负责部分层
- 数据像流水线传递
- 显存效率高
- 适合超深网络
- 可跨机器
- Pipeline Bubble(气泡)
- 通信频繁
- 实现复杂
- 超深网络(100+ 层)
- 多机训练
- 1F1B 调度(减少 bubble)
- 微批次(Micro-batch)
4. 序列并行(SP)
原理:
- 沿序列维度切分
- 每卡处理部分序列
- 针对 Attention 优化
- 降低显存(Attention 是 O(n²))
- 适合长序列
- 只适用于特定层
- 实现复杂
- 长序列场景
- 配合 TP 使用
三、混合并行策略
为什么需要混合?
单一并行的局限:
- DP:受限于单卡显存
- TP:通信开销大
- PP:Bubble 问题
- SP:适用范围有限
- 组合优势
- 灵活适配
- 最优效率
常见组合
2D 并行(DP+TP):
- 适用:8-64 卡
- 配置:DP=4, TP=2
- 场景:中等模型
- 适用:64-512 卡
- 配置:DP=8, TP=4, PP=2
- 场景:大模型
- 适用:512+ 卡
- 场景:超大模型 + 长序列
配置示例
训练 70B 模型(64 卡):
总卡数:64
DP=8, TP=4, PP=2
每卡显存需求:
- 模型参数:70B / (8×4×2) = 1.1B
- 显存占用:约 10GB
- 加上激活、梯度:约 30GB
- A100 80GB:✅ 足够四、框架实现
DeepSpeed
支持: ZeRO + 3D 并行
配置:
json
{
"train_micro_batch_size_per_gpu": 4,
"gradient_accumulation_steps": 4,
"zero_optimization": {
"stage": 3,
"offload_optimizer": {
"device": "cpu"
}
},
"tensor_parallel": {
"tp_size": 4
},
"pipeline": {
"enabled": true,
"num_stages": 2
}
}Megatron-LM
支持: TP+PP+DP
启动:
bash
python train.py \
--tensor-model-parallel-size 4 \
--pipeline-model-parallel-size 2 \
--num-layers 24 \
--hidden-size 1024PyTorch FSDP
支持: 类似 ZeRO-3
代码:
python
from torch.distributed.fsdp import FullyShardedDataParallel
model = FSDP(model, sharding_strategy=FULL_SHARD)五、性能优化
1. 通信优化
梯度压缩:
- 减少通信量
- 精度损失可控
- 计算与通信并行
- 隐藏通信延迟
- 同机优先 TP
- 跨机优先 DP/PP
2. 显存优化
激活重计算:
- 牺牲计算换显存
- 显存减少 60-70%
- ZeRO-1:优化器分片
- ZeRO-2:梯度分片
- ZeRO-3:参数分片
3. 负载均衡
问题: 层大小不均导致负载不均衡
解决:
- 均衡切分
- 动态调度
- 虚拟流水线
六、选型指南
决策树
模型能放下单卡?
├─ 是 → DP 即可
└─ 否 →
需要跨机器?
├─ 是 → DP+PP(主)+TP(辅)
└─ 否 →
卡间带宽高?
├─ 是 → DP+TP
└─ 否 → DP+PP推荐配置
| 模型规模 | 推荐方案 | 卡数 |
|---|---|---|
| 7B 以下 | DP | 1-8 |
| 7B-70B | DP+TP | 8-64 |
| 70B+ | DP+TP+PP | 64-512 |
| 100B+ + 长序列 | DP+TP+PP+SP | 512+ |
避坑指南
❌ 盲目增加 TP - 通信开销可能超过收益 ✅ 先测试再扩展 - 从小规模验证
❌ 忽视网络拓扑 - 跨机 TP 效率低 ✅ 同机 TP,跨机 DP/PP
❌ 过度并行 - 管理复杂度高 ✅ 够用就好,逐步优化
总结
并行策略选择是系统工程:
核心原则: 简单优先,逐步复杂化。
*有问题欢迎交流讨论!*