性能指标与度量:吞吐量、算力利用率、显存带宽利用率、数据加载延迟、通信开销

做AI训练性能优化,说白了就是跟这几个数字打交道。我刚开始接触这行时,也以为只要看训练总时长就够了。后来被坑过几次才明白——没有细粒度的指标,你根本不知道瓶颈在哪。

今天咱们就把这五个核心指标掰开揉碎讲清楚。每个指标我都会结合实战经验,告诉你它到底在衡量什么,以及怎么用它来定位问题。

1. 吞吐量(Throughput)——最直观的“快慢尺”

吞吐量是大家最熟悉的指标。它衡量的是单位时间内模型能处理多少样本。

常见单位:

  • samples/s(每秒样本数)—— 最常用
  • tokens/s(每秒词元数)—— NLP模型常用
  • images/s(每秒图像数)—— CV模型常用

我个人习惯把吞吐量分成两个维度看:

单卡吞吐量 vs 集群吞吐量

单卡吞吐量反映单张GPU的极限性能,集群吞吐量则要考虑通信开销。我见过不少团队只看集群总吞吐量,结果单卡效率其实很低——说白了就是“虚胖”。

实战经验:我在优化一个LLM训练任务时,发现集群吞吐量看起来不错,但单卡吞吐量只有理论值的60%。后来一查,是数据加载线程数没调好,GPU经常在空等数据。嗯,这个后面会细说。

2. 算力利用率(MFU)——GPU在“认真干活”吗?

算力利用率,全称是 Model FLOPS Utilization。它衡量的是GPU实际算力输出占理论峰值算力的比例。

计算公式:

MFU = 实际达到的FLOPS / GPU理论峰值FLOPS × 100%

举个例子:A100的理论FP16算力是312 TFLOPS。如果你的训练任务实际只跑出了150 TFLOPS,那MFU就是48%。

我的经验阈值:

  • MFU > 50%:还不错,有优化空间但不大
  • MFU 30%~50%:需要重点优化,大概率有瓶颈
  • MFU < 30%:赶紧排查,GPU基本在“摸鱼”

为什么会这么低?我遇到过最常见的原因有三个:

  1. 小算子太多——频繁调用小kernel,启动开销占比过高
  2. 显存带宽瓶颈——数据搬运速度跟不上计算速度
  3. 通信等待——分布式训练时,GPU在等别的卡传数据

3. 显存带宽利用率——数据搬运的“高速公路”

算力利用率高不代表一切。你想想看,如果GPU算得飞快,但数据搬不过来,那算力再高也是白搭。

显存带宽利用率衡量的是GPU访问显存的实际速度占理论带宽的比例。

典型场景:

  • Transformer模型中的Attention计算——大量读写QKV矩阵
  • 卷积操作——频繁读取输入特征图
  • LayerNorm/BatchNorm——需要读写均值和方差

注意:带宽利用率高不一定好。我曾经遇到一个任务,带宽利用率达到95%,但算力利用率只有20%。这说明模型在大量搬运数据,但计算量很小——典型的“内存密集型”任务。这时候应该考虑算子融合,减少数据搬运次数。

怎么测?用NVIDIA的Nsight Systems或者ncu都可以。我个人习惯先看Memory Throughput这个指标,再结合Compute Throughput一起分析。

4. 数据加载延迟——GPU在等“外卖”吗?

这个指标经常被新手忽略。数据加载延迟,就是从硬盘读取数据到GPU显存的时间。

我把它分成三个阶段:

  1. 磁盘I/O——从SSD/HDD读到内存
  2. 数据预处理——解码、增强、归一化等
  3. 传输到GPU——从CPU内存拷贝到GPU显存

判断方法:看GPU利用率曲线。如果GPU利用率周期性掉到0%,大概率是数据加载跟不上。

我曾经踩过的坑:

有一次训练图像分类模型,GPU利用率只有40%。我查了三天,最后发现是数据增强太复杂,CPU预处理成了瓶颈。解决方案很简单——把数据增强改成GPU版本,或者用NVIDIA DALI库。利用率直接飙到85%。

优化建议:

  • 使用num_workers多进程加载(一般设为CPU核心数的2~4倍)
  • 开启pin_memory=True加速CPU→GPU传输
  • 考虑使用内存映射文件(mmap)减少磁盘I/O

5. 通信开销——分布式训练的“隐形杀手”

做分布式训练时,通信开销是绕不开的坎。它衡量的是GPU之间同步梯度/参数所花的时间。

关键指标:

指标 含义 理想值
通信占比 通信时间 / 总训练时间 < 20%
AllReduce延迟 一次梯度同步的耗时 越小越好
通信带宽利用率 实际带宽 / 理论带宽 > 80%

我遇到过的典型问题:

  • 通信拓扑不合理——8卡机器用了环形通信,其实树形更快
  • 梯度压缩没开——FP32梯度直接传,其实可以压缩到FP16
  • 通信和计算没重叠——GPU在等梯度传完才开始下一轮计算

一句话总结:通信开销的优化目标,就是让通信时间“藏”在计算时间里。说白了,就是让GPU在等数据的时候别闲着。

知识体系总览

下面这张图把这五个指标的关系串起来了。你可以把它当作性能分析的“地图”——从哪个指标入手,怎么一步步定位问题。

AI训练性能指标体系 吞吐量 samples/s | tokens/s 算力利用率 (MFU) 实际FLOPS / 理论峰值 显存带宽利用率 实际带宽 / 理论带宽 数据加载延迟 磁盘I/O → 预处理 → 传输 通信开销 AllReduce延迟 | 带宽利用率 核心思路:先看吞吐量 → 再查利用率 → 定位具体瓶颈 数据加载延迟和通信开销往往是“隐形杀手”

这五个指标不是孤立的。我习惯的排查顺序是:先看吞吐量有没有达到预期,如果没达到,再看算力利用率和带宽利用率。如果这两个都正常,那问题大概率出在数据加载或通信上。

嗯,今天就先聊到这。这些指标你可以在实际训练中多跑几次,慢慢就有感觉了。记住一句话:没有数据,就没有优化。

想要更多资料,联系可可