一个类似top的实用程序,用于监视GPU上的CUDA活动

253

我想要监控一个使用CUDA和MPI的进程,有没有办法做到这一点,类似于命令“top”但同时监控GPU?


3
还有一个工具叫做nvtop,网址是https://github.com/Syllo/nvtop。 - konvas
1
"nvidia-smi pmon -i 0" 可以监控在 nvidia GPU 0 上运行的所有进程。 - changqi.xia
17个回答

319

要实时了解资源使用情况,请执行以下操作:

nvidia-smi -l 1

这将循环调用并每秒查看视图。

如果您不想在控制台历史记录中保留循环调用的过去痕迹,也可以执行以下操作:

watch -n0.1 nvidia-smi

其中0.1是时间间隔(以秒为单位)。

输入图像描述


5
每0.1秒查询一次这张卡片?这会对卡片造成负担吗?另外,使用watch命令会在每0.1秒启动一个新的进程。 - Mick T
1
你可以长时间运行 nvidia-smi -lms 500(每500毫秒)-例如一周-而不会遇到使用 watch 时可能面临的任何问题。 - n1k31t4
每0.1秒更新一次,也就是每100毫秒更新一次,对于计算机来说已经很长时间了。我怀疑这样做无论如何都不会对性能产生影响。 - Jacob Waters
谢谢,我该怎么退出? - Peyman
nvidia-smi -l 会一直打印表格。使用 watch nvidia-smi 可以在同一位置显示它。 - Mircea
显示剩余4条评论

168
我认为gpustat非常有用。它可以通过pip install gpustat进行安装,并打印出进程或用户使用情况的细分信息。

在这里输入图片描述


6
在运行 watch gpustat -cp 后,您可以持续查看状态,但是颜色会消失。您该如何解决这个问题?@Alleo - abhimanyuaryan
2
@AbhimanyuAryan 使用 watch -c 命令。@Roman Orac,谢谢,当我在 Python 中导入 _curses 时遇到一些错误时,这个方法也适用于我在 Redhat 8 上的情况。 - CasualScience
11
观察GPU状态的命令是:watch -c gpustat -cp --color - Lee Netherton
2
watch -n 0.5 -c gpustat -cp --color - Gabriel Romon
27
gpustat现在有一个--watch选项:gpustat -cp --watch - jayelm
显示剩余2条评论

89
我不知道有任何结合此信息的工具,但是你可以使用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 %

4
如果你在其后面加上一个“-l”,就能让它连续更新,有效监控GPU和内存的使用情况。 - jmsu
6
如果我运行时GPU利用率显示为N/A,怎么办? - natorro
3
看起来 nVidia 放弃了一些显卡的支持。请查看此链接:http://forums.nvidia.com/index.php?showtopic=205165 - jmsu
36
我更喜欢使用 watch -n 0.5 nvidia-smi,这样可以避免终端输出过多的内容。 - ali_m
nvidia-smi pmon -i 0 - changqi.xia

64

最近,我编写了一个名为nvitop的监控工具,它是交互式的 NVIDIA-GPU 进程查看器。

Screenshot Monitor

该工具使用纯 Python 编写,易于安装。

从 PyPI 安装:

pip3 install --upgrade nvitop

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

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

作为资源监视器运行:

nvitop -m

nvitop会展示GPU状态,类似于nvidia-smi,但会额外增加漂亮的柱状图和历史图表。

对于进程,它将使用psutil收集进程信息并显示USER%CPU%MEMTIMECOMMAND字段,这比nvidia-smi更详细。此外,在监视模式下,它对用户输入做出响应。您可以在GPU上中断杀死进程。

nvitop带有树形视图屏幕和环境屏幕:

树形视图

环境


此外,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

注意nvitop的许可证为GPLv3许可证Apache-2.0许可证的双重授权。欢迎将其用作自己项目的依赖项。有关详细信息,请参见版权声明


界面很好,东西不错!感谢分享。 - Pramit
安装 nvitop 后我收到了一个错误:_curses.error: curs_set() 返回 ERR。 - Mello
2
注意:如果使用nvitop作为依赖项,即使只是导入该库,您的项目也需要“同时”遵守GPL许可证(如果发布)。https://opensource.stackexchange.com/questions/6033/can-a-non-gpl-python-program-use-gpl-python-module - Jongwook Choi
1
感谢您提醒许可问题。我已更新源文件的许可证。 - Xuehai Pan
自从nvtop和gpustat以来最好的东西! - Chan Kha Vu
我们可以将统计数据保存到文件中以供以后检查吗? - KansaiRobot

41

只需使用watch nvidia-smi命令,它将默认以2秒的间隔输出消息。

例如,如下图所示:

进入图片描述

您也可以使用watch -n 5 nvidia-smi命令(-n 5表示每5秒输出一次)。


29
你可以尝试nvtop,它类似于广泛使用的htop工具,但适用于NVIDIA GPU。这是一个正在运行中的nvtop截图。

Screenshot of nvtop in action


2
非常整洁!非常感谢!它也可以在最新的Ubuntu(20.04)中使用,对我来说只需执行sudo apt install nvtop就完成了! - Hossein

25

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

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

如需进一步帮助,请遵循所包含的帮助。

nvidia-smi --help-query-compute-apps

nvidia-smi --help-query-compute-app 无效的输入参数组合。请运行 nvidia-smi -h 获取帮助。 - user894319twitter
使用 --help-query-compute-apps - Alexey

19

另一种有用的监控方法是使用过滤掉消耗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 前添加了 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

2
您还可以像这样获取占用所有用户GPU的计算程序的PID,而无需使用sudonvidia-smi --query-compute-apps=pid --format=csv,noheader - Lenar Hoyt
1
有时nvidia-smi不会列出所有进程,因此您最终会发现您的内存被未在列表中列出的进程所使用。这是我追踪和终止这些进程的主要方式。 - rand
2
@grisaitis 注意,我认为ps给出的pmem并不考虑GPU的总内存,而是CPU的内存,因为ps不具备“Nvidia GPU”意识。 - SebMa
并不完全是“过滤使用GPU的进程”。他们只能更改设置...但我不知道更好的选择... - user894319twitter
现在你监控任何操作(实际计算、更改设置甚至监视)GPU 的进程的 CPU 性能。我猜这不是原始问题所要求的。我认为问题只涉及“计算”部分... - user894319twitter

19

这里下载并安装最新的稳定版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驱动程序中,此支持仅限于Tesla卡。


7
这可能不是很优雅,但你可以尝试。
while true; do sleep 2; nvidia-smi; done

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

15
你可以直接执行 nvidia-smi -l 2 命令。或者为了避免重复的控制台输出,可以执行 watch -n 2 'nvidia-smi' 命令。 - william_grisaitis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接