一句话定义
MFU(Model FLOPs Utilization,模型浮点算力利用率)指的是:一段时间里,模型计算真正消耗掉的浮点运算量,占这段时间内硬件理论峰值算力的比例。
换句话说——你花钱买的那张卡的算力,有几成是真的用在模型上了。
打个比方
芯片厂商标的峰值 FLOPS,就像高速公路上的限速牌:路修出来就是让你跑 120 的。MFU 是你这趟全程的平均时速,占限速的多少。堵车(通信等待)、收费站(同步点)、前面压着一辆大车(访存瓶颈),都会把平均速度拉下来。限速没变,但你确实没跑起来。
分子的算法其实不复杂:训练一步的浮点运算量,业界常用 6 × 参数量 × token 数来估算(前向约 2ND,反向约 4ND,N 是参数量,D 是 token 数)。分母是峰值 FLOPS 乘以实际耗时。两者一除,就是 MFU。
损耗都去哪儿了
- 通信等待:多卡之间同步梯度,算力在等网络。
- 流水线气泡:流水并行把模型切段,队头和队尾互相干等。
- 访存瓶颈:很多算子不是算不快,是数据搬运跟不上,属于 memory-bound。
- 重计算:为了省显存把前向再算一遍,同一份算力花了两遍。
- 负载不均、变长序列、尾延迟。
和相邻概念的区别
| 概念 | 口径 | 回答的问题 |
|---|---|---|
| MFU | 分母是硬件理论峰值 FLOPS | 模型计算用掉了理论算力的几成 |
| HFU(Hardware FLOPs Utilization) | 分母同样是峰值,但分子算上重计算等额外 FLOPs | 硬件到底忙了多少 |
| GPU-Util(nvidia-smi 里那个) | 时间占比 | 有多少时间在跑 kernel,哪怕空转 |
| 扩展效率 | 单卡吞吐对比多卡吞吐 | 加卡之后吞吐涨了几成 |
注意 MFU ≤ HFU:重计算让硬件多干活,HFU 会好看一点。而 GPU-Util 打满 100% 时,MFU 依然可能只有三成——前者只说明"没闲着",不说明"干得有效率"。
对从业者的意义
训练成本大致等于总计算量除以 MFU。同样一份活,假设 MFU 从三成提到四成五,用时就能少掉约三分之一,卡时和电费一起省。所以调并行策略、micro-batch、算子融合、梯度累积、序列打包,本质上都是在抢这个百分比。
对不太碰底层的人也有用:听到"我们有多少 P 算力"时,多问一句"实测算力利用率多少",往往比看峰值更能看清真实产能。具体数值随模型结构、并行方案、集群网络而变,以官方文档和实测为准。
