用于在 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
、%MEM
、TIME
和COMMAND
字段,比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-smi
和 watch -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 活动的类***实用程序的主要内容,如果未能解决你的问题,请参考以下文章