训练系统设计面试题
Q1: 设计一个支持千亿参数模型的训练系统
答:
架构:
┌─────────────────────────────────────────┐
│ 训练调度器 │
├─────────────────────────────────────────┤
│ 数据加载层 │ 模型层 │ 优化器层 │
│ 分布式数据 │ 3D并行 │ ZeRO │
│ 预处理pipeline │ TP+PP+DP │ Offload │
└─────────────────────────────────────────┘并行策略(Megatron-LM风格):
- 张量并行(TP):节点内(NVLINK带宽高)
- 流水线并行(PP):跨节点
- 数据并行(DP):复制整个pipeline
容错:
- Checkpoint每N步保存
- 节点故障自动恢复
- 梯度累积保证有效batch size
监控:
- Loss曲线 + 梯度范数
- GPU利用率 + 显存
- 吞吐量(tokens/s)
Q2: 混合精度训练的要点?
FP16训练三大组件:
1. FP32 master weights(保证更新精度)
2. Loss scaling(防止小梯度下溢)
3. FP16计算(加速+省显存)
PyTorch实现:
scaler = GradScaler()
with autocast():
loss = model(input)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()Q3: 如何处理超大规模数据加载?
方案:
1. 数据预处理pipeline(离线Tokenization+Pack)
2. 内存映射文件(mmap)避免反复IO
3. 预取(prefetch) + 多进程加载
4. 分布式文件系统(HDFS/S3)
5. 数据分片 + 每个GPU只加载自己的分片Q4: 梯度累积的原理?
答: 用小batch模拟大batch:
effective_batch = per_gpu_batch × num_gpus × grad_accum_steps
每grad_accum_steps步才更新一次参数
梯度在accumulation_steps间累加这样在显存受限时也能使用大batch训练。