2. 基础概念

在诊断大模型训练瓶颈之前,必须先建立一套统一的“度量语言”。同一块 GPU、同一份代码,在不同口径下可能得出完全相反的结论:有人看到“利用率 95%”就认为已经压满,有人却指出 MFU 只有 38%,仍有大量优化空间。原因在于这些指标衡量的是不同层面的东西——硬件是否忙碌、算力是否真正用于有效计算、数据供给是否跟得上。本节把吞吐量、延迟、利用率、MFU、HFU 这几个核心指标的定义、计算方法和相互关系讲清楚,为后续的瓶颈定位提供判据。

一、吞吐量与延迟:一对相互制约的指标

吞吐量(Throughput)指单位时间内系统完成的有效工作量。在大模型训练中,最常用的口径是 tokens/s(每秒处理的 token 数)或 samples/s(每秒处理的样本数)。它衡量的是“整体产能”,直接决定一次训练要跑多久、要花多少钱。

延迟(Latency)指完成一个最小工作单元所花费的时间。训练场景下常见口径包括:单步迭代时间(step time,单位 ms/step)、单次前向时间、单次反向时间、以及端到端的首 token 时间。延迟衡量的是“响应速度”,它决定了流水线能否被填满、通信能否被掩盖。

两者的关系可以用一个直观公式表达:

吞吐量 ≈ 全局批大小 × 序列长度 / 单步迭代时间
tokens/s ≈ (global_batch_size × seq_len) / step_time(s)

这个公式揭示了一个关键事实:吞吐量不是独立变量,它由批大小和单步时间共同决定。增大批大小通常能提升吞吐量,但会占用更多显存、可能影响收敛;缩短单步时间则依赖计算、通信、数据加载的整体优化。因此,看到吞吐量低时,第一步不是盲目调参,而是拆解:是批大小受限,还是单步时间过长?

二、利用率:硬件到底有多忙

利用率(Utilization)通常指在采样窗口内,硬件单元处于活跃状态的时间占比。GPU 场景下常见的有 SM 利用率、显存带宽利用率、Tensor Core 活跃度等。它回答的问题是:“这块硬件有没有闲着?”

但利用率有一个致命陷阱:忙碌不等于高效。一个 SM 可能一直在执行访存指令、分支判断或小算子,利用率显示 90% 以上,但真正的矩阵乘算力却远未跑满。这就是为什么仅看 nvidia-smi 的 GPU-Util 容易误判——它反映的是“有没有 kernel 在跑”,而不是“算力有没有被有效利用”。

排障提示:当 GPU-Util 很高但吞吐量上不去时,优先怀疑访存瓶颈、算子碎片化或通信等待,而不是继续加批大小。

三、MFU 与 HFU:算力效率的黄金标尺

MFU(Model FLOPs Utilization,模型浮点运算利用率)定义为:模型实际需要的浮点运算量除以硬件理论峰值算力与时间的乘积。它衡量的是“有效模型计算占硬件理论峰值的比例”。

HFU(Hardware FLOPs Utilization,硬件浮点运算利用率)则把重计算(activation recomputation)等额外计算也算进去,衡量的是“硬件实际执行的全部浮点运算占理论峰值的比例”。

两者的计算公式如下:

MFU = (模型理论 FLOPs / 单步时间) / 硬件峰值 FLOPS
HFU = (硬件实际执行 FLOPs / 单步时间) / 硬件峰值 FLOPS

其中:
模型理论 FLOPs ≈ 6 × N × tokens   (N 为参数量,前向 2N + 反向 4N)
若开启重计算,实际 FLOPs 会高于理论值,此时 HFU > MFU

举例说明:一块 A100 的 BF16 峰值约为 312 TFLOPS。若某模型单步处理 100 万 token、参数量 70 亿,则理论 FLOPs ≈ 6 × 7e9 × 1e6 = 4.2e16 FLOPs。若单步耗时 2 秒,则实际算力 = 4.2e16 / 2 = 2.1e16 FLOPS = 21000 TFLOPS,MFU = 21000 / 312 ≈ 67%。这是一个相当健康的水平;而如果 MFU 只有 15%,说明大量算力被浪费在等待、通信或低效算子上。

MFU 与 HFU 的差值本身也是重要信号:差值越大,说明重计算带来的额外开销越高,通常意味着显存压力大、不得不牺牲算力换显存。此时优化方向可能是激活值分片、更高效的注意力实现,而不是继续堆硬件。

四、指标关系与典型参考区间

下面这张图展示了从“硬件理论峰值”到“有效模型吞吐”的逐层损耗关系,以及各指标所处的位置。

从硬件峰值到有效吞吐的逐层损耗 硬件理论峰值 FLOPS A100 BF16 ≈ 312 TFLOPS | H100 BF16 ≈ 989 TFLOPS 100% HFU:硬件实际执行算力 含重计算、padding 等额外计算,反映硬件真实负载 ≈ 40–70% MFU:有效模型算力 扣除重计算等无效计算,衡量真实训练效率 ≈ 30–55% 有效吞吐量 tokens/s,最终业务指标 业务口径 通信/等待/调度损耗 重计算/padding 损耗 数据加载/气泡损耗 核心关系: 吞吐量 = 批大小 × 序列长度 / 单步时间 | MFU = 模型 FLOPs / (峰值 × 时间) | HFU ≥ MFU,差值反映重计算开销

结合工程经验,不同规模训练的 MFU 参考区间如下表所示。注意这些数值会随模型结构、并行策略、序列长度和硬件代际变化,仅作为判断“是否异常”的粗略标尺。

指标 定义 典型健康区间 偏低时的首要怀疑方向
吞吐量 单位时间有效 token 数 随规模而定,看趋势 批大小受限、单步时间过长
单步延迟 一次迭代耗时 稳定且可预测 通信未掩盖、数据加载阻塞
GPU 利用率 SM 活跃时间占比 > 85% 数据供给不足、kernel 间隙大
MFU 有效模型算力 / 峰值 30%–55% 通信开销、算子低效、气泡
HFU 实际执行算力 / 峰值 40%–70% 重计算过多、padding 浪费

五、案例与常见误区复盘

某团队在 8 卡 A100 上训练 13B 模型,观察到 GPU-Util 长期在 92% 以上,但吞吐量只有预期的一半。初步判断“硬件已压满”,准备扩容。进一步采集指标后发现:MFU 仅 18%,HFU 却达到 45%。这说明硬件确实在忙,但大量算力消耗在重计算上——由于显存不足,团队开启了全量激活重计算,前向被额外执行了一遍。真正的瓶颈是显存管理,而非算力不足。改用激活分片并调整并行策略后,MFU 提升到 41%,吞吐量翻倍,无需增加任何硬件。

这个案例集中体现了三个常见误区:

  • 把利用率等同于效率:GPU-Util 高只说明有 kernel 在跑,不代表算力被有效利用。必须结合 MFU/HFU 一起看。
  • 只看吞吐量不看延迟:吞吐量高但单步延迟波动大,往往意味着流水线气泡严重,长期看会拖累整体效率。
  • 混淆 MFU 与 HFU:两者差值大时,优化方向应是减少无效计算(重计算、padding),而不是继续提升硬件峰值利用率。
实操建议:建立监控面板时,至少同时采集 step_time、tokens/s、GPU-Util、MFU、HFU 五个指标,并标注并行策略与批大小配置。单看任何一个指标都容易得出片面结论。

掌握这些指标的定义与计算口径后,下一步就可以进入具体的瓶颈分类:当 MFU 偏低时,究竟是计算瓶颈、通信瓶颈、显存瓶颈还是数据瓶颈?这需要结合指标的时间序列特征和硬件计数器进一步定位。