一个类似于顶部的实用程序,用于监控GPU上的CUDA活动

我正在尝试监视一个使用CUDA和MPI的进程,是否有任何方法可以做到这一点,比如命令"top"但它也能监控GPU ?

273225 次浏览

我不知道任何结合这些信息的东西,但你可以使用nvidia-smi工具来获得原始数据,就像这样(感谢@jmsu关于-l的提示):

$ nvidia-smi -q -g 0 -d UTILIZATION -l


==============NVSMI LOG==============


Timestamp                       : Tue Nov 22 11:50:05 2011


Driver Version                  : 275.19


Attached GPUs                   : 2


GPU 0:1:0
Utilization
Gpu                     : 0 %
Memory                  : 0 %

在这里下载并安装最新的稳定CUDA驱动程序(4.2)。在linux上,nVidia-smi 295.41给你你想要的。使用nvidia-smi:

[root@localhost release]# nvidia-smi
Wed Sep 26 23:16:16 2012
+------------------------------------------------------+
| NVIDIA-SMI 3.295.41   Driver Version: 295.41         |
|-------------------------------+----------------------+----------------------+
| Nb.  Name                     | Bus Id        Disp.  | Volatile ECC SB / DB |
| Fan   Temp   Power Usage /Cap | Memory Usage         | GPU Util. Compute M. |
|===============================+======================+======================|
| 0.  Tesla C2050               | 0000:05:00.0  On     |         0          0 |
|  30%   62 C  P0    N/A /  N/A |   3%   70MB / 2687MB |   44%     Default    |
|-------------------------------+----------------------+----------------------|
| Compute processes:                                               GPU Memory |
|  GPU  PID     Process name                                       Usage      |
|=============================================================================|
|  0.  7336     ./align                                                 61MB  |
+-----------------------------------------------------------------------------+

编辑:在最新的NVIDIA驱动程序中,此支持仅限于特斯拉卡。

这可能不够优雅,但你可以尝试一下

while true; do sleep 2; nvidia-smi; done

我还尝试了@Edric的方法,它可以工作,但我更喜欢nvidia-smi的原始布局。

要获得使用资源的实时洞察,请执行:

nvidia-smi -l 1

这将在每一秒循环并调用视图。

如果你不想在控制台历史记录中保留循环调用的过去痕迹,你也可以这样做:

watch -n0.1 nvidia-smi

其中0.1是时间间隔,单位为秒。

enter image description here

另一种有用的监控方法是对消耗gpu的进程使用ps过滤。我经常用这个:

ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `lsof -n -w -t /dev/nvidia*`

这将显示所有nvidia gpu利用进程和一些统计数据。lsof ...检索当前用户拥有的使用nvidia GPU的所有进程的列表,并且ps -p ...显示这些进程的ps结果。ps f为子/父进程关系/层次结构显示了良好的格式,而-o指定了自定义格式。这个类似于ps u,但添加了进程组ID并删除了一些其他字段。

它相对于nvidia-smi的一个优点是,它将显示使用GPU的进程分叉以及主进程。

但是,它的一个缺点是它仅限于执行该命令的用户拥有的进程。为了将其开放给任何用户拥有的所有进程,我在lsof. 0之前添加了sudo

最后,我将它与watch结合起来以获得持续更新。所以,在最后,它看起来像:

watch -n 0.1 'ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `sudo lsof -n -w -t /dev/nvidia*`'

它的输出如下:

Every 0.1s: ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `sudo lsof -n -w -t /dev/nvi...  Mon Jun  6 14:03:20 2016
USER      PGRP   PID %CPU %MEM  STARTED     TIME COMMAND
grisait+ 27294 50934  0.0  0.1   Jun 02 00:01:40 /opt/google/chrome/chrome --type=gpu-process --channel=50877.0.2015482623
grisait+ 27294 50941  0.0  0.0   Jun 02 00:00:00  \_ /opt/google/chrome/chrome --type=gpu-broker
grisait+ 53596 53596 36.6  1.1 13:47:06 00:05:57 python -u process_examples.py
grisait+ 53596 33428  6.9  0.5 14:02:09 00:00:04  \_ python -u process_examples.py
grisait+ 53596 33773  7.5  0.5 14:02:19 00:00:04  \_ python -u process_examples.py
grisait+ 53596 34174  5.0  0.5 14:02:30 00:00:02  \_ python -u process_examples.py
grisait+ 28205 28205  905  1.5 13:30:39 04:56:09 python -u train.py
grisait+ 28205 28387  5.8  0.4 13:30:49 00:01:53  \_ python -u train.py
grisait+ 28205 28388  5.3  0.4 13:30:49 00:01:45  \_ python -u train.py
grisait+ 28205 28389  4.5  0.4 13:30:49 00:01:29  \_ python -u train.py
grisait+ 28205 28390  4.5  0.4 13:30:49 00:01:28  \_ python -u train.py
grisait+ 28205 28391  4.8  0.4 13:30:49 00:01:34  \_ python -u train.py

使用参数"——query-compute-apps="

nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv

如需进一步帮助,请关注

nvidia-smi --help-query-compute-app

Prometheus GPU度量出口商(PGME)利用nvidai-smi二进制文件。你可以试试这个。一旦你运行了导出器,你就可以通过http://localhost:9101/metrics访问它。对于两个gpu,示例结果如下所示:

temperature_gpu{gpu="TITAN X (Pascal)[0]"} 41
utilization_gpu{gpu="TITAN X (Pascal)[0]"} 0
utilization_memory{gpu="TITAN X (Pascal)[0]"} 0
memory_total{gpu="TITAN X (Pascal)[0]"} 12189
memory_free{gpu="TITAN X (Pascal)[0]"} 12189
memory_used{gpu="TITAN X (Pascal)[0]"} 0
temperature_gpu{gpu="TITAN X (Pascal)[1]"} 78
utilization_gpu{gpu="TITAN X (Pascal)[1]"} 95
utilization_memory{gpu="TITAN X (Pascal)[1]"} 59
memory_total{gpu="TITAN X (Pascal)[1]"} 12189
memory_free{gpu="TITAN X (Pascal)[1]"} 1738
memory_used{gpu="TITAN X (Pascal)[1]"} 10451

只要使用watch nvidia-smi,默认情况下它将以2s间隔输出消息。

例如,如下图:

enter image description here

你也可以使用watch -n 5 nvidia-smi (-n 5 by 5s间隔)。

我发现gpustat非常有用。它可以用pip install gpustat安装,并按进程或用户打印使用情况。

enter image description here

你可以使用nvidia-smi pmon -i 0来监视GPU 0中的每个进程。 包括计算模式,sm使用,内存使用,编码器使用,解码器使用

你可以使用监控程序目光和它的GPU监控插件:

  • 开源
  • 要安装:sudo apt-get install -y python-pip; sudo pip install glances[gpu]
  • 要启动:sudo glances

enter image description here

它还监视CPU、磁盘IO、磁盘空间、网络和其他一些东西:

enter image description here

你可以尝试nvtop,它类似于广泛使用的htop工具,但用于NVIDIA gpu。下面是nvtop的截图。

截图of nvtop in action

我在一台windows机器上用下面的代码创建了一个批处理文件来监视每一秒。这对我很管用。

:loop
cls
"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"
timeout /T 1
goto loop

如果你只想运行一次命令,NVIDIA -smi exe通常位于“C:\Program Files\NVIDIA Corporation”。

如果你只是想找到运行在gpu上的进程,你可以简单地使用下面的命令:

lsof /dev/nvidia*

对我来说,在大多数情况下nvidia-smiwatch -n 1 nvidia-smi就足够了。有时nvidia-smi显示没有进程,但gpu内存已用完,所以我需要使用上面的命令来查找进程。

在Linux Mint和Ubuntu中,你可以尝试"nvidia-smi——loop=1"

最近,我写了一个名为nvitop的监控工具,即互动 NVIDIA-GPU进程查看器。

截图监视器

它是用纯Python编写的,易于安装。

从PyPI安装:

pip3 install --upgrade nvitop

从GitHub (推荐)安装最新版本:

pip3 install git+https://github.com/XuehaiPan/nvitop.git#egg=nvitop

作为资源监视器运行:

nvitop -m

nvitop将显示像nvidia-smi一样的GPU状态,但有额外的花式条和历史图。

对于流程,它将使用psutil来收集流程信息,并显示USER%CPU%MEMTIMECOMMAND字段,这比nvidia-smi详细得多。此外,它在监控模式下响应用户输入。你可以中断杀死你的gpu进程。

nvitop附带一个树视图屏幕和一个环境屏幕:

Tree-view

Environment


此外,nvitop可以集成到其他应用程序中。例如,集成到PyTorch训练代码:

import os
from nvitop.core import host, CudaDevice, HostProcess, GpuProcess
from torch.utils.tensorboard import SummaryWriter


device = CudaDevice(0)
this_process = GpuProcess(os.getpid(), device)
writer = SummaryWriter()
for epoch in range(n_epochs):


# some training code here
# ...


this_process.update_gpu_status()
writer.add_scalars(
'monitoring',
{
'device/memory_used': float(device.memory_used()) / (1 << 20),  # convert bytes to MiBs
'device/memory_percent': device.memory_percent(),
'device/memory_utilization': device.memory_utilization(),
'device/gpu_utilization': device.gpu_utilization(),


'host/cpu_percent': host.cpu_percent(),
'host/memory_percent': host.virtual_memory().percent,


'process/cpu_percent': this_process.cpu_percent(),
'process/memory_percent': this_process.memory_percent(),
'process/used_gpu_memory': float(this_process.gpu_memory()) / (1 << 20),  # convert bytes to MiBs
'process/gpu_sm_utilization': this_process.gpu_sm_utilization(),
'process/gpu_memory_utilization': this_process.gpu_memory_utilization(),
},
global_step
)

更多细节参见https://github.com/XuehaiPan/nvitop

请注意: nvitopGPLv3授权apache 2.0许可双重授权。请随意将其作为您自己项目的依赖项使用。详见版权声明

设备监控模式下运行nvidia-smi,例如:

$ nvidia-smi dmon -d 3 -s pcvumt
# gpu   pwr gtemp mtemp  mclk  pclk pviol tviol    sm   mem   enc   dec    fb  bar1 rxpci txpci
# Idx     W     C     C   MHz   MHz     %  bool     %     %     %     %    MB    MB  MB/s  MB/s
0   273    54     -  9501  2025     0     0   100    11     0     0 18943    75  5906   659
0   280    54     -  9501  2025     0     0   100    11     0     0 18943    75  7404   650
0   277    54     -  9501  2025     0     0   100    11     0     0 18943    75  7386   719
0   279    55     -  9501  2025     0     0    99    11     0     0 18945    75  6592   692
0   281    55     -  9501  2025     0     0    99    11     0     0 18945    75  7760   641
0   279    55     -  9501  2025     0     0    99    11     0     0 18945    75  7775   668
0   279    55     -  9501  2025     0     0   100    11     0     0 18947    75  7589   690
0   281    55     -  9501  2025     0     0    99    12     0     0 18947    75  7514   657
0   279    55     -  9501  2025     0     0   100    11     0     0 18947    75  6472   558
0   280    54     -  9501  2025     0     0   100    11     0     0 18947    75  7066   683


详细信息在man nvidia-smi中。