最近的工作总是和 GPU 绕不开,有一个资源效能方向的工作要提升 GPU 的“利用率”,本周是期望 GPU 能够不仅仅用起来,而且有效的用起来、用满。
我们的监控系统中有一个 GPU 利用率的指标,调研之后发现,这个有点“玄幻”,这个不是 GPU 利用率,或者说,现在没有一个合适的指标能表征 GPU 利用率。
英伟达官方 GPU 利用率定义
依据这个公示,如果一个 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 的情况,那将是最准确的。