跳转到内容

MFU 与利用率

"训练快不快"需要一个统一的度量。MFU(Model FLOPs Utilization)是事实标准:实际训练吞吐 ÷ 理论峰值算力。它是集群效率的"第一指标"——但它有很多陷阱(数什么 FLOPs、什么算有效)。本章把 MFU 讲透:定义、典型值、低 MFU 的排查方法。

MFU=每秒的有效模型 FLOPs硬件峰值算力\text{MFU} = \frac{\text{每秒的有效模型 FLOPs}}{\text{硬件峰值算力}}

有效模型 FLOPs(transformer 训练的标准近似):

每 token FLOPs≈6N(N 是参数量;前向 2N + 反向 4N)\text{每 token FLOPs} \approx 6N \quad \text{(N 是参数量;前向 2N + 反向 4N)} MFU=6N×tokens/s全集群峰值算力\text{MFU} = \frac{6N \times \text{tokens/s}}{\text{全集群峰值算力}}

两个口径的陷阱:

  • HFU(Hardware FLOPs Utilization):按"实际执行的 FLOPs"算(含重计算、padding)——重计算会让 HFU 高但 MFU 低:每层重计算让实际执行 FLOPs ×1.33,但有效工作没变。比较用 MFU,不用 HFU
  • 峰值算力的精度:989 TFLOPS 是 H100 BF16 稠密;用 FP8 峰值(1979)或稀疏峰值(×2)作分母,MFU 数字直接翻倍——比较前先对齐分母

公开的大模型训练 MFU(同口径:BF16 稠密峰值、含通信不含重计算):

训练MFU说明
GPT-3 级(A100 时代)40–50%
Llama 3 405B(H100,公开数据)~40%(含检查点/中断后 ~38%)万卡集群的真实值
优化良好的千卡级训练50–60%
单卡/节点内小规模55–65%通信少
理论上限~70%+一阶模型的极限

两个经验数字:千卡级以内优化好能到 50–60%;万卡级 40% 上下(通信与容错的开销随规模涨)。MFU 30% 以下值得排查,25% 以下有问题。

MFU 低 = step 时间被浪费。按四段分解(见 profiling)定位:

症状原因解法
通信占比 >20%梯度同步没重叠 / TP 跨域重叠(按层同步)、TP 收回 NVLink 域
数据等待 >5%数据饥饿worker/pinned/预取(见数据加载)
计算 MFU 也低算子效率低融合、pad 维度、精度(见GEMM)
step time 方差大straggler/抖动锁频、隔离(见straggler)
气泡占比高PP 太深微批少减 PP / 加微批(见流水线并行)

先分解,再对症——没有分解的低 MFU 排查全是猜。

两个常被混淆的指标:

GPU 利用率(util %)MFU
含义有 kernel 在跑的时间比例有效 FLOPs ÷ 峰值
问题kernel 在跑 ≠ 在算有效工作—
例子跑逐元素算子:util 100%,MFU 0.06%(见 Roofline)
用途看断粮/空闲(数据饥饿)看算力效率

util 高不代表 MFU 高:util 100% 的逐元素负载 MFU 不到 1%。util 用来发现"空转"(数据饥饿、同步等待),MFU 用来度量"算力效率"——两个指标一起看。

  1. 重叠:梯度同步与计算重叠(通信隐藏)——万卡级的最大头
  2. 融合与精度:算子融合、BF16/FP8(见混合精度)
  3. batch 拉满:微批打满算力(算术强度,见 Roofline)
  4. 消气泡:PP 度与微批的平衡
  5. 消 straggler:锁频、隔离、基线
  6. 数据不断粮:worker/pinned/预取

每一步都有数字验证(MFU 前后对比)——提升路径是"测出来的",不是"配置出来的"。

  • MFU = 6N × tokens/s ÷ 峰值算力(N 是参数量,6 = 前向 2 + 反向 4);比较先对齐分母(精度/稠密度)。
  • HFU 含重计算会虚高,比较用 MFU;重计算让执行 FLOPs ×1.33 但有效工作不变。
  • 经验值:千卡内 50–60%,万卡 ~40%(Llama 3 实测);<30% 值得排查。
  • util(空转检测)与 MFU(算力效率)是两个指标:util 100% 的逐元素负载 MFU <1%。
  • 提升路径按收益排:重叠 > 融合精度 > batch 拉满 > 消气泡 > 消 straggler > 数据。
  • 先四段分解,再对症下药;每步用 MFU 前后对比验证。