NVIDIA GPU “利用率”和“饱和度”

最近的工作总是和 GPU 绕不开,有一个资源效能方向的工作要提升 GPU 的“利用率”,本周是期望 GPU 能够不仅仅用起来,而且有效的用起来、用满。

我们的监控系统中有一个 GPU 利用率的指标,调研之后发现,这个有点“玄幻”,这个不是 GPU 利用率,或者说,现在没有一个合适的指标能表征 GPU 利用率。

英伟达官方 GPU 利用率定义

GPUUtilrate

依据这个公示,如果一个 GPU,有 10 个 SM,并且只有一个 SM 在工作那么利用率是 = 1/10*100% = 10%。
然而通过nvidia-smi工具可以看到,获取的 GPU 利用率是 100%,非常奇怪,和上面的逻辑对不上。

nvidia-smi 中的 GPU 利用率

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

__global__ void simple_kernel() {
while (true) {}
}

int main() {
simple_kernel<<<1, 1>>>();
cudaDeviceSynchronize();
}

此代码片段将在单个流多处理器 (SM) 上启动指定的内核(线程)。根据常规理解,GPU的“利用率”应该计算为1 / num_sm * 100%。例如:

  • 如果 GPU 上有 10 个 SM,则“GPU 利用率”应为 10%。
  • 如果 GPU 上有 20 个 SM,则“GPU 利用率”应为 5%。
    然而,据观察,nvidia-smi 可能会报告”GPU-Util” 100%,如以下示例输出所示:
1
2
3
4
5
6
7
8
9
10
$nvidia-smi
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla V100-SXM2... Off | 00000000:1A:00.0 Off | 0 |
| N/A 42C P0 67W / 300W | 2602MiB / 32510MiB | 100% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

GPU-Util 误导

nvidia-smi命令行工具基于 NVIDIA 管理库 (NVML);nvidia-smi输出的结果中的确有GPU-Util,但是这里的定义是什么呢?

1
2
3
4
5
6
7
8
9
10
// https://github.com/NVIDIA/go-nvml/blob/v0.12.0-1/gen/nvml/nvml.h#L210

/**
* Utilization information for a device.
* Each sample period may be between 1 second and 1/6 second, depending on the product being queried.
*/
typedef struct nvmlUtilization_st {
unsigned int gpu; //!< Percent of time over the past sample period during which one or more kernels was executing on the GPU
unsigned int memory; //!< Percent of time over the past sample period during which global (device) memory was being read or written
} nvmlUtilization_t;

根据NVML的定义,“利用率”是指 在过去的样本期间内发生某些活动的时间百分比。具体来说:

  • GPU 利用率:这表示一个或多个内核在 GPU 上执行的时间百分比。
  • 内存利用率:这表示读取或写入全局(设备)内存的时间百分比。

含义:NVML定义的“利用”概念可以不符合我们的共同理解。它仅测量给定采样周期内设备使用的时间部分,而不考虑该时间内使用的流式多处理器 (SM) 的数量。通常,我们将“利用率”视为正在使用的 GPU 处理器的部分。

所以,这个数据并不能代表 GPU 是不是用满了,更好的指标应该是 SM 利用率,可能更合适。或者进一步说,每个 GPU 用在推理、训练的场景都不一样,我们应该使用业务的 SLO 指标来驱动 GPU 资源的使用情况建设,如果能够进行压测评估GPU 的情况,那将是最准确的。