训练性能工程¶
性能优化不是把单项指标拉满,而是在保持数值语义、收敛与可靠性的前提下,提高端到端有效训练产出。
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 证明它不在关键路径,就停止继续调这个参数。