跳转至

训练性能工程

性能优化不是把单项指标拉满,而是在保持数值语义、收敛与可靠性的前提下,提高端到端有效训练产出。

Step time 分解

\[ T_{step} \approx T_{input}+T_{forward}+T_{backward}+T_{comm}+T_{optim}+T_{checkpoint}-T_{overlap} \]

先用 profiler 时间线确认真实重叠,不能把各阶段简单相加后假设没有并发。

gantt
    title 训练 step 示例(示意)
    dateFormat  X
    axisFormat %L
    section GPU
    Forward          :0, 28
    Backward         :28, 72
    Optimizer        :72, 84
    section Network
    Grad all-reduce  :45, 76
    section Input
    Prefetch next    :4, 42

关键指标

指标 说明 注意事项
samples/s 或 tokens/s 端到端训练吞吐 必须附模型、序列长度、global batch 与精度
step time P50/P95 速度与抖动 P95 高常提示 I/O、网络或邻居干扰
scaling efficiency 多卡相对单卡的扩展效率 单卡基线也要足够优化
MFU 实际模型计算相对硬件峰值的比例 计算口径和峰值精度必须一致
data wait ratio GPU 等待数据的比例 结合 CPU、存储与队列观察
communication ratio collective 占关键路径比例 区分通信本身和同步等待

线性扩展效率的一种简单定义:

\[ E_N=\frac{Throughput_N}{N\times Throughput_1} \]

优化阶梯

1. 先保证工作负载可比

固定模型 commit、框架/驱动、精度、序列长度分布、global batch、数据与随机策略。否则“提升”可能来自工作量减少。

2. 消除输入气泡

  • profile DataLoader、解码、tokenization 和 collate。
  • 调整 worker、prefetch、persistent worker、pinned memory。
  • 缓存热数据,打包小文件,确认 NUMA 和 CPU 限额。
  • 不要无限加 worker;进程竞争和存储拥塞会反向恶化。

3. 提高计算效率

  • 使用合适的混合精度,并验证数值稳定。
  • 让矩阵维度和 batch 更适合高效 kernel。
  • 尝试算子融合、编译或 CUDA Graph,记录动态形状限制。
  • 减少 CPU-GPU 同步、大量小 kernel 和重复布局转换。

4. 降低显存压力

  • activation checkpointing:用额外计算换激活显存。
  • FSDP/ZeRO:用通信和复杂性换模型状态显存。
  • 梯度累积:用更多 micro step 换更小 micro batch。
  • 合适的低精度状态与优化器:验证收敛及兼容性。

5. 通信与计算重叠

  • 调整 DDP bucket,观察 collective 是否更早出现。
  • 检查某些 rank 是否因慢数据/慢 kernel 让所有 rank 等待。
  • 合并小 collective,但避免推迟到关键路径尾部。
  • 根据拓扑安排 process group,先在 nccl-tests 验证底层。

Straggler:平均值掩盖的敌人

同步训练的 step time 由最慢 rank 决定。定位时比较各 rank:

  • batch/sequence 实际 token 数;
  • data wait、forward、backward、collective 发起时刻;
  • GPU 时钟、温度、ECC/Xid、PCIe/NVLink 错误;
  • CPU throttling、page fault、存储延迟;
  • 节点上其他 workload 的网络与 I/O 竞争。

Checkpoint 不只是“保存模型”

定义清楚:

  • 一致性点在哪里,是否会阻塞所有 rank;
  • 分片格式能否在不同 world size 下恢复;
  • 写入是否先落临时路径再原子发布;
  • 保留、清理与损坏校验如何做;
  • RPO(最多重算多少 step)和 RTO(多久恢复)是否满足目标。

checkpoint 太频繁损失吞吐,太稀疏放大失败重算成本。合适周期应结合故障率、保存时长和训练 step 成本计算,而不是固定照抄。

一次可信的 benchmark 报告

至少包含:硬件与拓扑、软件版本、模型与参数量、序列长度分布、global/micro batch、精度、并行配置、warmup、采样窗口、P50/P95、显存、功耗、错误/重试,以及原始命令。

止损规则

每项优化先写假设和成功指标;如果 profiler 证明它不在关键路径,就停止继续调这个参数。

延伸阅读