← 返回书架人工智能 · 交互式 Wiki
模型工程/性能与瓶颈分析资料与边界
训练系统与性能进阶专题讲解

把局部算法放回同一个真实模型,查看 完整训练 step 的时间与保存量实测。

TRAINING ENGINEERING / PERFORMANCE

性能分析:计算、搬运与等待各花多久

分析训练速度需要查看实际执行过程。把矩阵计算、内存搬运、启动开销、通信和数据等待分开计量,再沿实际执行时间线找关键路径。

01 / ROOFLINE

同一矩阵乘,为什么 batch 不同就换了瓶颈?

AM×KWK×N=YM×N,F≈2MKN,Qmin⁡≈b(MK+KN+MN),I=F/Qmin⁡,Pattainable≤min⁡(Ppeak,BW⋅I),tideal≥max⁡ ⁣(FPpeak,Qmin⁡BW).\begin{aligned} A_{M\times K}W_{K\times N}&=Y_{M\times N},\\ F&\approx2MKN,\\ Q_{\min}&\approx b(MK+KN+MN),\\ I&=F/Q_{\min},\\ P_{\mathrm{attainable}}&\le\min(P_{\mathrm{peak}},\mathrm{BW}\cdot I),\\ t_{\mathrm{ideal}}&\ge\max\!\left(\frac{F}{P_{\mathrm{peak}}},\frac{Q_{\min}}{\mathrm{BW}}\right). \end{aligned}
F 的单位是 FLOPs,Q 是 bytes,I 是 FLOPs/byte;Ppeak 是 FLOP/s,BW 是 byte/s。计算时间与搬运时间各给一个下界,理想重叠时也不能快过较大者。

FMA 在此按一次乘、一次加共 2 FLOPs 计。b 是输入/权重/输出每元素字节数,Qmin 假设三者各读或写一次,忽略已有输出、缓存驻留、重复搬运和中间 workspace。实际 HBM 流量可能更多,跨调用缓存复用也可能改变这个口径。

当 M 小,读取 W 的成本难以被多个 token 分摊;M 变大,权重可被更多输入位置复用,算术强度上升。Roofline 的斜线由带宽约束,平台由峰值算力约束;落在哪一边只是上限分析,实际 kernel 还受 tile、占用、布局和启动延迟影响。

02 / COST MODEL

固定权重,改变并行输入位置数

单个 GEMM 的计算与搬运下界

K=N=4096 · 不含 attention/通信
算术强度 FLOPs/B
理想下界 ms
限制分支
工作量最少流量F/PpeakQmin/BW

单位采用十进制:1 TFLOP/s=10¹² FLOP/s,1 TB/s=10¹² byte/s。图中的点表示当前算术强度下的理论吞吐上限;更高 M 可能更高效,也可能总耗时更长。字节数与峰值在此独立可调,实际精度变更需采用对应硬件峰值。

03 / CRITICAL PATH

通信量少了,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。若依赖顺序让通信晚启动,重叠会更少;其他时间线应按各自的依赖和重叠关系计算。

04 / METRICS

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 提高吞吐的同时,单请求等待可能变长。
05 / CONTROLLED MEASUREMENT

从现象到一次能回答问题的实验

01 / FIX

固定工作负载

形状、有效 token、精度、模型、并行、数据来源、batch、请求分布。

02 / WARM UP

区分稳态与启动

编译、缓存、内存分配与初次加载单独报告;异步执行要用设备事件或正确同步计时。

03 / PROFILE

识别关键路径

算子、HBM、CPU 输入、collective、流水线空泡、最慢 rank 与 checkpoint。

04 / VERIFY

单因素改变

记录速度与质量/梯度一致性;多次测量并报告波动,保留完整配置。

融合可以减少中间张量的 HBM 往返与启动次数,但不一定减少数学 FLOPs。编译、静态 shape 和布局优化能减少调度/转换开销,却可能有编译成本与动态形状边界。固定某个 kernel 的加速和完整训练更快,应分开验证。

06 / MEASURE THE SAME GRADIENT

同一个目标,保存量和实际时间各变了多少?

项目的 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 的速度。

07 / READ A LOCAL REPORT

把该次测量与算法账本放在一起看

选择本机实验的 report.json,查看该次实际结果。

适用范围与一手资料

Roofline 采用假设参数。lab:memory 实测固定 PyTorch 2.9.0 CPU float64;耗时排除 profiler/hooks,保存 storage 引用峰值区别于物理内存峰值。本地报告展示文件结果,裁剪计时不含通信。

公式与机制的原始依据 · 5 项
知识目录
搜索知识库