本页章节
把局部算法放回同一个真实模型,查看 完整训练 step 的时间与保存量实测。
TRAINING ENGINEERING / PERFORMANCE
性能分析:计算、搬运与等待各花多久
分析训练速度需要查看实际执行过程。把矩阵计算、内存搬运、启动开销、通信和数据等待分开计量,再沿实际执行时间线找关键路径。
同一矩阵乘,为什么 batch 不同就换了瓶颈?
FMA 在此按一次乘、一次加共 2 FLOPs 计。b 是输入/权重/输出每元素字节数,Qmin 假设三者各读或写一次,忽略已有输出、缓存驻留、重复搬运和中间 workspace。实际 HBM 流量可能更多,跨调用缓存复用也可能改变这个口径。
当 M 小,读取 W 的成本难以被多个 token 分摊;M 变大,权重可被更多输入位置复用,算术强度上升。Roofline 的斜线由带宽约束,平台由峰值算力约束;落在哪一边只是上限分析,实际 kernel 还受 tile、占用、布局和启动延迟影响。
固定权重,改变并行输入位置数
单个 GEMM 的计算与搬运下界
K=N=4096 · 不含 attention/通信| 工作量 | 最少流量 | F/Ppeak | Qmin/BW |
|---|
单位采用十进制:1 TFLOP/s=10¹² FLOP/s,1 TB/s=10¹² byte/s。图中的点表示当前算术强度下的理论吞吐上限;更高 M 可能更高效,也可能总耗时更长。字节数与峰值在此独立可调,实际精度变更需采用对应硬件峰值。
通信量少了,step time 为什么不一定下降?
暴露出来的等待才占关键路径
如果某段通信完全藏在 backward 后面,减少它不一定缩短 step;最后一个尚未完成的 bucket 却可能让所有卡等待。先看时间线的重叠关系,再谈累计通信耗时。
小包的延迟与大包的带宽
粗略通信模型是 t≈α+bytes/有效带宽,但 collective 的参与数、算法、拓扑和竞争会改变 α 与字节量。频繁小包可能被延迟主导,合大包又可能推迟重叠启动。
更快的 kernel 可能没有更快的训练
计算压缩后原来隐藏的 dataloader 或通信可能暴露;主机同步、日志、checkpoint I/O 都会让设备空等。总加速比应根据新的关键路径重新测量。
重算是在用时间换内存
activation checkpointing 增加前向重算,减少保存的激活;可能允许更大 microbatch 或减少分片通信,从而让端到端反而更快,也可能只是变慢但能跑。要看最终配置。
一个可核算的例子:假设一次 step 的 backward 40 ms,其中前 30 ms 可覆盖通信;通信总需 35 ms,则理想暴露尾部至少 5 ms。将通信从 35 降到 20 ms,最多省这 5 ms,而非 15 ms。若依赖顺序让通信晚启动,重叠会更少;其他时间线应按各自的依赖和重叠关系计算。
MFU、tokens/s 和利用率,分母不同
| 指标 | 必须声明的口径 | 常见误判 |
|---|---|---|
| tokens/s | 输入 token、有效监督 token 还是输出 token;单卡/全局;是否含等待、重算和 warmup。 | padding 更多也能让“处理 token”变高,但有效学习量未必增加。 |
| MFU | 有用模型 FLOPs ÷(设备数 × 对应精度峰值 × 时间);模型 FLOPs 估算是否包含 attention 与激活专家。 | 重算通常不算额外有用模型 FLOPs;忽略长序列 attention 会失真。不同论文的估算公式未必相同。 |
| HFU / 设备执行 FLOPs | 实际执行计算,可包括重算;需声明测量/估算方法与精度峰值。 | 多做重算可能提高执行量,并不意味着任务更高效。 |
| GPU utilization | 监控采样周期与设备忙碌定义。 | 设备忙碌时仍可能存在 Tensor Core 利用不足或通信等待,需要结合算子时间线分析。 |
| TTFT / ITL / tail latency | 请求长度、并发、排队、prefill/decode、p50/p95/p99 与服务目标。 | 大 batch 提高吞吐的同时,单请求等待可能变长。 |
从现象到一次能回答问题的实验
固定工作负载
形状、有效 token、精度、模型、并行、数据来源、batch、请求分布。
区分稳态与启动
编译、缓存、内存分配与初次加载单独报告;异步执行要用设备事件或正确同步计时。
识别关键路径
算子、HBM、CPU 输入、collective、流水线空泡、最慢 rank 与 checkpoint。
单因素改变
记录速度与质量/梯度一致性;多次测量并报告波动,保留完整配置。
融合可以减少中间张量的 HBM 往返与启动次数,但不一定减少数学 FLOPs。编译、静态 shape 和布局优化能减少调度/转换开销,却可能有编译成本与动态形状边界。固定某个 kernel 的加速和完整训练更快,应分开验证。
同一个目标,保存量和实际时间各变了多少?
项目的 lab:memory 独立验证分块 Attention、梯度缓存和全局裁剪。先核对结果,再分别测量耗时、自动微分保存张量所引用的存储,以及 profiler 算子记录。实验固定 PyTorch 2.9.0、CPU float64、一个计算线程。
# 已配置上一轮框架环境时,直接运行
npm run lab:memory
# 首次配置
python3.12 -m venv .venv-framework
.venv-framework/bin/python -m pip install -r scripts/framework-requirements.txt
| 读数 | 怎样得到 | 应怎样解释 |
|---|---|---|
| 梯度/输出误差 | 页面算法、独立完整矩阵 autograd、分块实现和双进程 Gloo 对照。 | 正确配置按容差通过;错误配置应复现预期差异。误差小不证明模型质量高。 |
| 未插桩耗时 | 预热 3 次,测量 12 次完整调用,报告中位数、最小、最大和原始样本。 | 耗时包含该 Python 实现的准备和调度;不含 profiler/hooks,重算误差诊断也另行执行。局部裁剪计时不含 Gloo 通信。 |
| 保存张量的存储引用峰值 | 用 saved_tensors_hooks 追踪同时被反向保存对象引用的唯一 storage,别名不重复计。 | 包含被保存的输入和参数;不包括未保存临时量、分配器保留内存或进程 RSS,不是 GPU 显存峰值。 |
| 逻辑元素与计算次数 | 按各算法声明的矩阵、统计量、块容量和编码行数计数。 | 说明算法成本来源;与实际存储引用读数分开报告。 |
| Profiler trace | 另跑一次 CPU profile,记录形状、算子 self time 和内存事件,导出 trace。 | 用于寻找开销来源,不能把插桩 trace 时间直接当作未插桩测量。 |
Attention 实测使用 N=64、d=16、块大小 16,比较密集 autograd 与自定义分块反向。梯度缓存实测使用 32 对样本、16→64→8 编码器、chunk=8 和 dropout=0.25;参考也采用同一分块随机轨迹。裁剪实际通信验证有两个 Gloo 进程,另测 4096 元素的本地归约算术。
输出目录 artifacts/memory-lab-<timestamp>/ 包含 report.json、全部配置参考、两个 rank 的裁剪结果、环境版本和五份 *-trace.json。本机 CPU 的 Python 分块实现可能更慢;它检验机制与成本,不代表 FlashAttention GPU kernel 的速度。
把该次测量与算法账本放在一起看
选择本机实验的 report.json,查看该次实际结果。
| 测量方案 | 耗时中位数 ms | 最小…最大 ms | 保存 storage 引用峰值 B |
|---|
该方案的逻辑配置与成本账本
| 操作 | Self CPU μs | 调用次数 | Self CPU 内存净变化 B |
|---|
Profiler 内存事件可为负数,表示释放。按 self time 查看开销时,还需在原 trace 中核对父子调用和重叠关系。文件由本地读取,表格展示不会重新运行训练。
适用范围与一手资料
Roofline 采用假设参数。lab:memory 实测固定 PyTorch 2.9.0 CPU float64;耗时排除 profiler/hooks,保存 storage 引用峰值区别于物理内存峰值。本地报告展示文件结果,裁剪计时不含通信。
公式与机制的原始依据 · 5 项
- NVIDIA · Matrix Multiplication Background User's GuideGEMM FLOPs、算术强度、带宽/算力与 tile 影响
- FlashAttention (2022)精确 attention、HBM/SRAM 数据搬运与内存复杂度
- Scaling Deep Contrastive Learning Batch Size under Memory Limited Setup (2021)全局表示梯度与分块编码器 VJP;正文于 2026-10-28 核对
- PyTorch 2.9 · ProfilerCPU activity、形状、内存事件和 trace 导出;2026-10-28 核对
- PyTorch 2.9 · Autograd mechanics本项目框架对照固定 PyTorch 2.9.0;冻结、计算图与 no-grad 的语义,2026-10-27 核对