用于在 GPU 上监视 CUDA 活动的类***实用程序

Posted

技术标签:

【中文标题】用于在 GPU 上监视 CUDA 活动的类***实用程序【英文标题】:A top-like utility for monitoring CUDA activity on a GPU 【发布时间】:2012-01-03 15:50:44 【问题描述】:

我正在尝试监控使用 CUDA 和 MPI 的进程,有什么办法可以做到这一点,比如命令“top”,但也可以监控 GPU?

【问题讨论】:

"nvidia-smi pmon -i 0" 可以监控nvidia GPU 0上运行的所有进程 【参考方案1】:

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

nvidia-smi -l 1

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

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

watch -n0.1 nvidia-smi

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

【讨论】:

每0.1秒查询一次卡片?这会导致卡上的负载吗?此外,使用 watch,您每 0.1 秒启动一个新进程。 @MickT 有什么大不了的吗?由于 Nvidia-smi 有这个构建循环! “watch”命令与 nvidia-smi -l 有很大不同吗? 可能是,我看到低端卡有奇怪的锁定,我认为这是因为太多用户在卡上运行 nvidia-smi。我认为使用“nvidia-smi -l”是一种更好的方法,因为您不必每次都分叉一个新进程。此外,每 0.1 秒检查一次卡是多余的,当我尝试调试问题时,我会每秒检查一次,否则我每 5 分钟检查一次以监控性能。我希望这会有所帮助! :) @Gulzar 是的。 您可以长时间运行nvidia-smi -lms 500(每 500 毫秒) - 例如一周 - 没有任何使用 watch 时可能遇到的问题。【参考方案2】:

我发现gpustat 非常有用。可以使用pip install gpustat 进行安装,并打印进程或用户的使用明细。

【讨论】:

在您输入watch gpustat -cp 后,您可以连续看到统计数据,但颜色消失了。你如何解决这个问题? @Alleo @AbhimanyuAryan 使用watch -c。 @Roman Orac,谢谢,当我在 python 中导入 _curses 时遇到一些错误时,这也适用于我在 redhat 8 上。 watch -c gpustat -cp --color watch -n 0.5 -c gpustat -cp --color gpustat 现在有一个--watch 选项:gpustat -cp --watch【参考方案3】:

我不知道有什么可以结合这些信息,但您可以使用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 %

【讨论】:

我认为如果你添加一个 -l ,你可以让它持续更新,有效地监控 GPU 和内存利用率。 如果我运行它时 GPU utilizacion 只是显示 N/A 怎么办?? @natorro 看起来 nVidia 放弃了对某些显卡的支持。检查此链接forums.nvidia.com/index.php?showtopic=205165 我更喜欢watch -n 0.5 nvidia-smi,这样可以避免用输出填充终端 nvidia-smi pmon -i 0【参考方案4】:

使用watch nvidia-smi即可,默认2s间隔输出消息。

例如,如下图:

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

【讨论】:

【参考方案5】:

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

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

如需更多帮助,请关注

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

【讨论】:

nvidia-smi --help-query-compute-app 输入参数的组合无效。请运行nvidia-smi -h 寻求帮助。 使用--help-query-compute-apps【参考方案6】:

您可以尝试nvtop,它类似于广泛使用的htop 工具,但适用于NVIDIA GPU。这是nvtop 的截图。

【讨论】:

非常整洁!多谢!它也可以在最新的 ubuntu (20.04) 中使用,这对我来说很容易做到 sudo apt install nvtop 并完成!【参考方案7】:

从here 下载并安装最新的稳定 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 卡。

【讨论】:

【参考方案8】:

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

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

【讨论】:

你也可以在没有sudo的情况下获取所有用户GPU占用的计算程序的PID,如下:nvidia-smi --query-compute-apps=pid --format=csv,noheader 有时nvidia-smi 不会列出所有进程,因此您最终会得到未列出的进程使用的内存。这是我可以跟踪和终止这些进程的主要方式。 @grisaitis 小心,我不认为ps 给出的pmem 考虑了GPU 的总内存,而是考虑了CPU 的总内存,因为ps 不是“Nvidia GPU”意识到 没有完全“过滤消耗 GPU 的进程。”。他们只能更改设置...但我不知道更好的选择... 现在您可以监控运行(实际计算、更改设置甚至监控)GPU 的任何进程的 CPU 性能。我想这不是原始问题中所问的。我认为问题只是关于“计算”部分......【参考方案9】:

最近,我写了一个名为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 带有树视图屏幕和环境屏幕:


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

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

device = Device(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_utilization': device.memory_utilization(),
            'device/gpu_utilization': device.gpu_utilization(),

            'host/cpu_percent': host.cpu_percent(),
            'host/memory_percent': host.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
        ,
        global_step
    )

更多详情请见https://github.com/XuehaiPan/nvitop。

注意nvitop 是根据 GPLv3 许可 发布的。请随意将其用作您自己项目的包或依赖项。但是,如果您想添加或修改nvitop 的某些功能,或者将nvitop 的某些源代码复制到自己的代码中,则源代码也应在 GPLv3 许可下发布。

【讨论】:

界面不错,好东西!感谢分享。 安装 nvitop 后收到错误:_curses.error: curs_set() returned ERR【参考方案10】:

这可能不太优雅,但你可以试试

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

我也试过@Edric的方法,效果不错,但我更喜欢nvidia-smi的原始布局。

【讨论】:

或者你可以直接使用nvidia-smi -l 2。或者为了防止重复控制台输出,watch -n 2 'nvidia-smi'【参考方案11】:

您可以使用监控程序glances 及其GPU monitoring 插件:

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

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

【讨论】:

【参考方案12】:

在 Linux Mint 中,很可能是 Ubuntu,您可以尝试“nvidia-smi --loop=1”

【讨论】:

【参考方案13】:

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

lsof /dev/nvidia*

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

【讨论】:

【参考方案14】:

我在 Windows 机器中创建了一个包含以下代码的批处理文件,以每秒进行监控。它对我有用。

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

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

【讨论】:

【参考方案15】:

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

temperature_gpugpu="TITAN X (Pascal)[0]" 41
utilization_gpugpu="TITAN X (Pascal)[0]" 0
utilization_memorygpu="TITAN X (Pascal)[0]" 0
memory_totalgpu="TITAN X (Pascal)[0]" 12189
memory_freegpu="TITAN X (Pascal)[0]" 12189
memory_usedgpu="TITAN X (Pascal)[0]" 0
temperature_gpugpu="TITAN X (Pascal)[1]" 78
utilization_gpugpu="TITAN X (Pascal)[1]" 95
utilization_memorygpu="TITAN X (Pascal)[1]" 59
memory_totalgpu="TITAN X (Pascal)[1]" 12189
memory_freegpu="TITAN X (Pascal)[1]" 1738
memory_usedgpu="TITAN X (Pascal)[1]" 10451

【讨论】:

【参考方案16】:

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

【讨论】:

以上是关于用于在 GPU 上监视 CUDA 活动的类***实用程序的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CUDA GPU 只需要 8 个活动 warp?

集成 gpu + 外部设备上的 cuda

CUDA:如何在 GPU 上直接使用推力::sort_by_key? [复制]

CUDA:关于活动扭曲(活动块)以及如何选择块大小的问题

如何在 Windows 中使用 CUDA 的协作组功能

cuda和cudnn安装过程