Skip to content

训练系统设计面试题


Q1: 设计一个支持千亿参数模型的训练系统

架构

┌─────────────────────────────────────────┐
│              训练调度器                    │
├─────────────────────────────────────────┤
│  数据加载层     │    模型层    │  优化器层  │
│  分布式数据     │    3D并行   │  ZeRO     │
│  预处理pipeline │  TP+PP+DP   │  Offload  │
└─────────────────────────────────────────┘

并行策略(Megatron-LM风格):

  1. 张量并行(TP):节点内(NVLINK带宽高)
  2. 流水线并行(PP):跨节点
  3. 数据并行(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训练。