10. 训练速度(MFU/HFU)怎么理解和评估?

整理 MFU/HFU 的定义、计算方法与训练效率评估方式。

简单回答

MFU(Model FLOPS Utilization)是模型训练的有效算力利用率,表示实际用于模型计算的算力占 GPU 峰值算力的百分比。HFU(Hardware FLOPS Utilization)类似,但分子包含了 Gradient Checkpointing 带来的额外重算量。评估 MFU 的意义在于判断训练是否高效——MFU 低说明有大量时间花在通信、数据 IO、bubble 等非计算操作上,是优化的方向。A100 集群上大模型训练的 MFU 通常在 30%~60% 之间,优秀的系统能到 50% 以上。

详细解答

FLOPS 的理论计算

首先要能算出一个训练步的理论 FLOPS 数。对于一个 Transformer 模型,每个训练 token 的 FLOPS 可以近似估算为:

其中 是模型参数量(不含 Embedding 层),系数 6 来自:前向传播 (矩阵乘法每个参数约 2 次浮点运算),反向传播 (前向的 2 倍)。这是一个广泛使用的近似公式,实际值会因注意力计算的 项而略有不同。

更精确的公式需要考虑序列长度 和 Attention 的二次项:

其中 是层数, 是 hidden size, 是序列长度。当 很长时,Attention 的 项不可忽视。

MFU 的计算

以 A100 SXM 80GB 为例,BF16 矩阵乘法峰值算力是 312 TFLOPS。对于一个 7B 参数模型,

如果 64 张 A100 的训练速度是 100k tokens/s:

这个数字意味着真实算力利用率只有理论峰值的 21%,有很大优化空间。

HFU 和 MFU 的区别

如果开了 Gradient Checkpointing,反向传播前需要重新做一次前向,实际计算量比 更大,约为 (多了一次前向的 )。

HFU 反映的是"硬件实际完成的浮点运算"有多少比例被利用。MFU 反映的是"有效的模型计算"(不含重算)有多少比例。一个训练系统 HFU 高但 MFU 低,意味着花了大量计算在 Gradient Checkpointing 的重算上。

影响 MFU 的因素

通信开销:数据并行的 AllReduce、ZeRO-3 的 AllGather,这些通信时间 GPU 在等待,不在算模型,直接拉低 MFU。

流水线 Bubble:PP 并行的 bubble 比例()决定了流水线中有多少时间 GPU 是空闲的。

数据 IO:如果数据加载跟不上 GPU 计算速度,GPU 会等数据,MFU 下降。这在数据量大、预处理复杂时容易出现。

Kernel 效率:GPU 算子(CUDA kernel)本身的效率,不同精度、不同 batch size、不同 seq length 下,矩阵乘法的利用率不同。FlashAttention 显著提升了 Attention 计算的 kernel 效率。

显存带宽瓶颈:某些操作(比如 LayerNorm、Embedding Lookup)是"访存密集型"而非"计算密集型",即使理论 FLOPS 不多,也会因为频繁读写显存而拖慢整体速度。

如何提升 MFU

  • 优化通信和计算的 overlap,让 AllReduce 在计算反向传播时同步进行
  • 调整 micro-batch size 减少 pipeline bubble
  • 使用 FlashAttention 提升 Attention kernel 效率
  • 合理设置 batch size,让矩阵乘法的形状对 Tensor Core 友好(通常要求维度是 8 或 16 的倍数)
  • 监控数据 IO,确认 DataLoader 不是瓶颈

面试时可以这样答

MFU 是训练效率的核心指标,定义是"实际有效算力 / GPU 峰值算力"。计算方法是拿实际的 tokens/s,乘以每个 token 的理论 FLOPS(约 是参数量),再除以 GPU 总峰值算力。

A100 集群大模型训练的 MFU 通常在 30%~60% 之间,超过 50% 算是比较好了。低 MFU 说明有大量时间花在非计算操作上:通信等待、pipeline bubble、数据 IO、或者 kernel 效率低。

HFU 和 MFU 的区别是分子不同——HFU 算上了 Gradient Checkpointing 的重算,所以 HFU > MFU,但 HFU 高不一定代表"有效计算"多,可能只是 checkpointing 的额外重算多。

实际提升 MFU 的手段:通信和计算 overlap(DDP 的 gradient overlap 默认开启)、用 FlashAttention 提升 Attention kernel 效率、调整 batch size 让矩阵乘法形状对 Tensor Core 友好、减少 pipeline bubble。

常见追问

  1. 公式中 的系数 6 是怎么来的?为什么是 2+4?
  2. 当序列很长时,Attention 的 FLOPS 占比越来越高, 的近似还准确吗?
  3. 有哪些工具可以直接测量或监控 MFU?