英伟达官方的GPU利用率的定义如下:
G
P
U
U
t
i
l
r
a
t
e
=
n
u
m
b
e
r
o
f
a
c
t
i
v
e
S
M
n
u
m
b
e
r
o
f
t
o
t
a
l
S
M
×
100
%
GPU Util rate = \frac{number \ of \ active \ SM}{number \ of \ total \ SM} \times 100\%
GPUUtilrate=number of total SMnumber of active SM×100%
nvidia-smi
中的GPU利用率
#include <stdio.h>
__global__ void simple_kernel() {
while (true) {}
}
int main() {
simple_kernel<<<1, 1>>>();
cudaDeviceSynchronize();
}
上述代码片段将在单个流多处理器(SM)上启动指定的内核(线程)。根据常规理解,GPU的“利用率”应该计算为
1
n
u
m
_
s
m
\frac{1}{num\_sm}
num_sm1。但 nvidia-smi
却显示GPU利用率为100%:
根据NVML的定义,“利用率”是指在过去的样本期间内发生某些活动的时间百分比。具体来说:
- GPU利用率:这表示一个或多个内核在GPU上执行的时间百分比
NVML的定义完全不符合我们日常开发中的“利用率”理解。它仅测量给定采样周期内设备使用的时间部分,而不考虑该时间内使用的流式多处理器(SM)的数量。
通常,我们将“利用率”视为正在使用的GPU处理器的部分,用专业术语说就是“饱和度”:
资源具有无法服务的额外工作的程度
我们可以用 dcgm-exporter
来收集GPU的饱和度信息,这里引用Tim在路上的图片:
上图可以看到当GPU利用率为100%时,SM占用率非常低(<20%),浮点运算(FP32/FP16/TensorCore)也保持在非常低的百分比,这表明GPU还没有饱和,而这才是真实的GPU利用现状。