【发布时间】:2012-01-03 15:50:44
【问题描述】:
我正在尝试监控使用 CUDA 和 MPI 的进程,有什么办法可以做到这一点,比如命令“top”,但也可以监控 GPU?
【问题讨论】:
-
"nvidia-smi pmon -i 0" 可以监控nvidia GPU 0上运行的所有进程
标签: cuda process-monitoring resource-monitor
我正在尝试监控使用 CUDA 和 MPI 的进程,有什么办法可以做到这一点,比如命令“top”,但也可以监控 GPU?
【问题讨论】:
标签: cuda process-monitoring resource-monitor
【讨论】:
nvidia-smi -lms 500(每 500 毫秒) - 例如一周 - 没有任何使用 watch 时可能遇到的问题。
我发现gpustat 非常有用。可以使用pip install gpustat 进行安装,并打印进程或用户的使用明细。
【讨论】:
watch gpustat -cp 后,您可以连续看到统计数据,但颜色消失了。你如何解决这个问题? @Alleo
watch -c。 @Roman Orac,谢谢,当我在 python 中导入 _curses 时遇到一些错误时,这也适用于我在 redhat 8 上。
watch -c gpustat -cp --color
watch -n 0.5 -c gpustat -cp --color
--watch 选项:gpustat -cp --watch
我不知道有什么可以结合这些信息,但您可以使用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 %
【讨论】:
watch -n 0.5 nvidia-smi,这样可以避免用输出填充终端
使用参数“--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
您可以尝试nvtop,它类似于广泛使用的htop 工具,但适用于NVIDIA GPU。这是nvtop 的截图。
【讨论】:
sudo apt install nvtop 并完成!
从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 卡。
【讨论】:
另一种有用的监控方法是使用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 不会列出所有进程,因此您最终会得到未列出的进程使用的内存。这是我可以跟踪和终止这些进程的主要方式。
ps 给出的pmem 考虑了GPU 的总内存,而是考虑了CPU 的总内存,因为ps 不是“Nvidia GPU”意识到
最近,我写了一个名为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 许可下发布。
【讨论】:
这可能不太优雅,但你可以试试
while true; do sleep 2; nvidia-smi; done
我也试过@Edric的方法,效果不错,但我更喜欢nvidia-smi的原始布局。
【讨论】:
nvidia-smi -l 2。或者为了防止重复控制台输出,watch -n 2 'nvidia-smi'
您可以使用监控程序glances 及其GPU monitoring 插件:
sudo apt-get install -y python-pip; sudo pip install glances[gpu]
sudo glances
它还监控 CPU、磁盘 IO、磁盘空间、网络和其他一些东西:
【讨论】:
在 Linux Mint 中,很可能是 Ubuntu,您可以尝试“nvidia-smi --loop=1”
【讨论】:
如果你只是想找到在gpu上运行的进程,你可以简单地使用以下命令:
lsof /dev/nvidia*
在大多数情况下,nvidia-smi 和 watch -n 1 nvidia-smi 对我来说已经足够了。有时nvidia-smi显示没有进程但gpu内存已用完,所以我需要使用上面的命令来查找进程。
【讨论】:
我在 Windows 机器中创建了一个包含以下代码的批处理文件,以每秒进行监控。它对我有用。
:loop
cls
"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"
timeout /T 1
goto loop
如果您只想运行一次命令,nvidia-smi exe 通常位于“C:\Program Files\NVIDIA Corporation”。
【讨论】:
Prometheus GPU Metrics Exporter (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
【讨论】:
您可以使用nvidia-smi pmon -i 0 监控 GPU 0 中的每个进程。
包括计算模式、sm使用、内存使用、编码器使用、解码器使用。
【讨论】: