MFU(Model FLOPs Utilization)是LLM推理性能的本质标尺,衡量硬件算力的有效利用率。2nd Forward FLOPs是决定推理上限的关键,占推理总耗时的90%以上。
MFU核心定义
MFU = 模型有效算力 / 硬件理论峰值算力
示例:昇腾910B FP16峰值320 TFLOPS,跑2B模型实际有效算力4 TFLOPS,MFU = 4/320 = 1.25%——硬件98%算力闲置。
关键误区:MFU ≠ 硬件利用率
| 指标 | 含义 | 与MFU区别 |
|---|
| 显存利用率 | 显存占用比例 | vLLM预分配KV Cache占满显存,但计算量极低,MFU可能仅1% |
| NPU/SM Core利用率 | 硬件核心繁忙程度 | Core可能在做数据搬运、访存等待,非有效计算,利用率90%而MFU<10% |
| MFU | 模型有效算力占比 | 唯一真实反映「硬件是否被模型喂饱」的指标 |
MFU计算公式
$$\text{MFU} = \frac{2 \times N \times \text{总输出tokens/s}}{\text{硬件理论峰值FLOPs/s}}$$
硬件FP16/BF16峰值算力
| 硬件 | 峰值算力 |
|---|
| 昇腾910B | 320 TFLOPS |
| NVIDIA A100 | 312 TFLOPS |
| NVIDIA H100 | 989 TFLOPS |
| 昇腾310B | 16 TFLOPS |
1st Forward vs 2nd Forward
| 维度 | 1st Forward(Prefill) | 2nd Forward(Decode) |
|---|
| 执行时机 | 处理Prompt,仅1次 | 每生成1个token执行1次 |
| 输入长度 | Prompt完整长度L | 单个token |
| 单次FLOPs | $2 \times N \times L$ | $2 \times N$ |
| 耗时占比 | <10% | >90% |
| 瓶颈类型 | 计算Bound | 小batch访存Bound,大batch计算Bound |
2nd Forward FLOPs推导:Decoder-only LLM的95%参数来自线性层,KV Cache让2nd Forward仅需计算当前token,有效FLOPs ≈ $2 \times N$。
MFU优化实践
vLLM配置示例
1
2
3
4
5
6
| python -m vllm.entrypoints.offline_inference \
--model /path/to/model \
--max-batch-size 128 \
--max-num-batched-tokens 65536 \
--gpu-memory-utilization 0.95 \
--log-stats
|
优化策略
| 策略 | 说明 |
|---|
| 拉高batch size | 提升单次2nd Forward计算密度,核心优化手段 |
| 开启continuous batching | 合并多请求的2nd Forward,访存瓶颈转计算瓶颈 |
| 配置KV Cache | 复用历史K/V,避免重复计算 |
MFU目标区间
| 模型规模 | 离线推理MFU目标 |
|---|
| 2B小模型 | 20%-30% |
| 70B大模型 | 40%+ |
常见误区
| 误区 | 事实 |
|---|
| 显存占满=MFU高 | 显存可能是KV Cache预分配,无对应计算量 |
| MFU越高越好 | 在线推理需平衡吞吐与时延,大batch会增时延 |
| 小模型和大模型MFU目标相同 | 小模型访存密集,天然MFU低;大模型计算密集,易达高MFU |
| Core利用率高=MFU高 | Core可能在数据搬运、无效调度,非有效计算 |
Comments