大模型训练平台设计¶
面试方向:AI Infra / MLOps / 大模型预训练方向 考察重点:分布式训练、故障恢复、资源调度
1. 大模型训练的工程挑战¶
Text Only
训练一个70B参数模型:
- 数据: 15T tokens(数PB原始文本)
- 算力: 2048×H100, 训练数月
- 显存: 单卡80GB, 模型参数+优化器状态+激活值 >> 80GB
- 投入: 数亿元人民币
- 失败代价: 任何节点故障都可能浪费数天训练进度
→ 这是一个极端的分布式系统工程问题
2. 完整训练平台架构¶
Text Only
┌────────────── 数据层 ──────────────────────────┐
│ │
│ 原始数据(Common Crawl/网页/书籍/代码) │
│ → 数据清洗流水线(Spark/Dataflow): │
│ 去重(MinHash) → 质量过滤(分类器) → 毒性过滤 │
│ → 语言识别 → 领域分类 → Tokenize │
│ → 训练数据集(分片存储在HDFS/S3) │
│ → 数据加载器(WebDataset/Mosaic StreamingDataset) │
│ │
└──────────────────┬──────────────────────────────┘
↓
┌────────────── 训练层 ──────────────────────────┐
│ │
│ 分布式训练框架: │
│ ┌─────────────────────────────────────────┐ │
│ │ 数据并行(DP): 每卡完整模型, 不同数据 │ │
│ │ 张量并行(TP): 模型切分到同机多卡 │ │
│ │ 流水线并行(PP): 模型层切分到不同机器 │ │
│ │ 序列并行(SP): 长序列切分到多卡 │ │
│ │ 专家并行(EP): MoE模型专家分布到不同卡 │ │
│ │ │ │
│ │ 组合策略(3D并行): │ │
│ │ TP=4(机内) × PP=8(跨机) × DP=64 │ │
│ │ = 2048 GPU │ │
│ └─────────────────────────────────────────┘ │
│ │
│ 框架选择: │
│ - Megatron-LM(NVIDIA): 性能最优, 大厂首选 │
│ - DeepSpeed(Microsoft): ZeRO优化, 易用性好 │
│ - FSDP(PyTorch原生): 与PyTorch生态深度集成 │
│ - Megatron-DeepSpeed: Megatron+DeepSpeed混合 │
│ │
└──────────────────┬──────────────────────────────┘
↓
┌────────────── 调度层 ──────────────────────────┐
│ │
│ GPU集群管理: │
│ - K8s + 自研GPU调度器(考虑拓扑感知) │
│ - SLURM(HPC传统方案, 学术界/部分大厂) │
│ │
│ 任务调度: │
│ - 抢占式调度(高优任务可抢占低优) │
│ - 弹性训练(节点故障自动缩减/恢复) │
│ - 网络拓扑感知(TP在NVLink内, PP在IB网络) │
│ │
└──────────────────┬──────────────────────────────┘
↓
┌────────────── 可靠性层 ────────────────────────┐
│ │
│ Checkpoint: │
│ - 定期保存(每1000步或每小时) │
│ - 异步写入(不阻塞训练) │
│ - 分布式存储(每张卡保存自己的分片) │
│ │
│ 故障检测与恢复: │
│ - GPU健康监控(DCGM指标) │
│ - NCCL通信超时检测 │
│ - 自动故障恢复: │
│ 节点故障 → 检测(30s) → 替换节点(5min) │
│ → 加载checkpoint → 恢复训练(10min) │
│ → 总停机时间: 约15-20min/次 │
│ │
└──────────────────┬──────────────────────────────┘
↓
┌────────────── 实验管理层 ──────────────────────┐
│ │
│ W&B / MLflow: │
│ - 训练曲线(Loss/LR/梯度范数) │
│ - 超参记录 │
│ - 评估指标(定期在验证集上eval) │
│ - 模型版本管理 │
│ │
└────────────────────────────────────────────────┘
3. 分布式并行策略(面试核心)¶
3.1 为什么需要并行¶
Text Only
70B模型显存需求:
参数: 70B × 2B(FP16) = 140GB
梯度: 70B × 2B = 140GB
优化器状态: 70B × 8B(Adam: FP32参数+FP32动量+FP32方差+FP32梯度) = 560GB
激活值: 随batch size变化, 通常100-500GB
─────────────────────────────────
总计: 940GB-1340GB >> 单卡80GB
→ 必须切分到多张GPU
3.2 三大并行策略对比¶
| 策略 | 切分什么 | 通信量 | 适用场景 |
|---|---|---|---|
| 数据并行(DP) | 数据batch切分,每卡全量模型 | AllReduce梯度(大) | 模型放得下单卡 |
| 张量并行(TP) | 模型的每一层切分到多卡 | AllReduce中间激活(频繁) | 机内多卡(NVLink) |
| 流水线并行(PP) | 模型按层切分到不同机器 | 前向/反向传递激活(小) | 跨机(IB网络) |
3.3 DeepSpeed ZeRO(面试高频)¶
Text Only
ZeRO-1: 切分优化器状态
每卡只存1/N的优化器状态 → 显存节省4x(N=GPU数)
ZeRO-2: 切分优化器状态 + 梯度
每卡只存1/N的梯度 → 在ZeRO-1基础上进一步节省
ZeRO-3: 切分优化器状态 + 梯度 + 参数
每卡只存1/N的参数 → 最大节省
代价: 前向/反向时需要AllGather收集参数(通信开销增加)
实践选择:
- 模型放得下单卡 → DP + ZeRO-1 (通信最小)
- 模型放不下但很大 → 3D并行(TP + PP + ZeRO-1 DP)
- 微调场景 → ZeRO-3 + Offload(参数卸载到CPU)
3.4 混合精度训练¶
Text Only
混合精度(AMP)原理:
- 前向传播: FP16(快, 省显存)
- Loss计算: FP32(防下溢)
- 反向传播: FP16(快)
- 参数更新: FP32主副本(精度保证)
BF16 vs FP16:
FP16: 指数5位, 尾数10位 → 范围小(6.5e4), 精度高
BF16: 指数8位, 尾数7位 → 范围大(3.4e38), 精度低
→ BF16训练更稳定(不易溢出), 现代GPU(A100+)首选
FP8(H100+):
E4M3: 训练前向 → 更多精度
E5M2: 训练反向 → 更大范围
→ 相比BF16进一步2x加速(H100 Transformer Engine)
4. 故障恢复设计(面试重点追问)¶
2000+GPU集群,单GPU年故障率约5-10%:
Text Only
MTBF计算(Mean Time Between Failures):
单GPU MTBF: ~2000小时
2000 GPU集群 MTBF: 2000/2000 = 1小时
→ 平均每小时会有一次GPU相关故障!
4.1 Checkpoint策略¶
Text Only
策略对比:
┌────────────────┬──────────────┬──────────────┬────────────────┐
│ 策略 │ 保存时间 │ 恢复时间 │ 存储量/次 │
├────────────────┼──────────────┼──────────────┼────────────────┤
│ 全量同步保存 │ 10-30min │ 10-30min │ 模型全量 │
│ (阻塞训练) │ (训练停止) │ │ (70B→1.3TB) │
├────────────────┼──────────────┼──────────────┼────────────────┤
│ 异步保存 │ 不阻塞训练 │ 10-30min │ 同上 │
│ (后台写入) │ 有一致性问题 │ │ │
├────────────────┼──────────────┼──────────────┼────────────────┤
│ 分布式分片保存 │ 3-5min │ 5-10min │ 每卡保存自己 │
│ (推荐) │ │ │ 的分片(小) │
├────────────────┼──────────────┼──────────────┼────────────────┤
│ 内存冗余 │ 0(无IO) │ 秒级 │ 备份到邻居GPU │
│ (最前沿) │ │ │ 的显存/内存 │
└────────────────┴──────────────┴──────────────┴────────────────┘
4.2 弹性训练¶
Text Only
场景: 训练中某个节点挂了
传统方案:
检测故障(1min) → 手动替换节点 → 重启所有进程 → 加载checkpoint → 恢复
停机时间: 30min-2h
弹性训练方案(Torch Elastic / DeepSpeed Elastic):
检测故障(30s) → 自动从进程组中移除故障节点
→ 剩余节点重新组网(重新划分DP组)
→ 加载最近checkpoint → 以N-1个节点继续训练
→ 新节点加入后,再扩展回N个节点
停机时间: 5-15min
5. 性能估算¶
Text Only
训练70B模型, 15T tokens:
计算量(FLOPs):
C ≈ 6 × N × D = 6 × 70B × 15T = 6.3e24 FLOPs
训练时间:
2048 × H100(每卡990 TFLOPS BF16):
集群理论算力: 2048 × 990e12 = 2.03e18 FLOPS
MFU(模型算力利用率)约45%: 有效算力 = 0.91e18 FLOPS
训练时间: 6.3e24 / 0.91e18 / 3600 / 24 ≈ 80天
成本:
2048 × H100 × ¥50/GPU·小时 × 80天 × 24小时 ≈ ¥1.97亿
+ 网络/存储/电力/冷却 → 总投入约¥2.5-3亿
MFU(Model FLOPs Utilization)的意义:
理论峰值 → bubble损失(PP空闲) → 通信overhead → 显存管理
业界水平: 40-55%是优秀, <30%需要优化
6. 面试高频追问¶
Q: TP和PP应该怎么组合?
Text Only
原则:
TP(张量并行) → 放在机内(NVLink 900GB/s带宽)
因为TP每个前向/反向步都需要AllReduce,对带宽要求极高
PP(流水线并行) → 放在跨机(InfiniBand 200-400Gb/s)
因为PP只在层间传递激活值,通信量较小
DP(数据并行) → 最外层,跨机
因为DP只在梯度同步时通信(AllReduce)
示例(2048 GPU):
8 GPU/机 → TP=4(机内), PP=8(跨机), DP=64(最外层)
4 × 8 × 64 = 2048 ✓
Q: 训练中Loss突然飙升(spike)怎么办?
Text Only
诊断步骤:
1. 检查数据: 是否遇到了异常数据batch(重复/乱码/极长序列)
2. 检查梯度: 梯度范数是否异常大 → 梯度裁剪阈值是否合适
3. 检查学习率: 是否在学习率调度的关键节点
4. 检查硬件: GPU ECC错误? 通信故障导致参数不一致?
处理:
- 轻度spike(自动恢复): 记录但继续训练
- 严重spike(不恢复): 回滚到上一个健康checkpoint
- 频繁spike: 降低学习率/增大batch size/调整梯度裁剪
Q: 数据并行中梯度同步的具体实现?
Text Only
AllReduce的Ring实现:
N张GPU排成环: GPU-0 → GPU-1 → ... → GPU-N-1 → GPU-0
阶段1(Scatter-Reduce): 每步发送1/N的梯度给下一个节点
N-1步后,每个节点有1/N梯度的完整聚合结果
阶段2(AllGather): 每步把完整的1/N广播给下一个节点
N-1步后,所有节点拥有完整的聚合梯度
通信量: 2 × (N-1)/N × 梯度大小 ≈ 2 × 梯度大小(N大时)
不随GPU数量增长! → 扩展性好
最后更新:2026年2月