我试图监控一个使用CUDA和MPI的进程,有没有办法我可以做到这一点,像命令“顶部”,但也监控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, 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 License和Apache-2.0 License的双重授权。请随意将其作为您自己项目的依赖项使用。详见版权声明。
其他回答
最近,我写了一个名为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, 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 License和Apache-2.0 License的双重授权。请随意将其作为您自己项目的依赖项使用。详见版权声明。
要获得使用资源的实时洞察,请执行:
Nvidia-smi -l
这将在每一秒循环并调用视图。
如果你不想在控制台历史记录中保留循环调用的过去痕迹,你也可以这样做:
观看-n0.1 nvidia-smi
其中0.1是时间间隔,单位为秒。
使用参数"——query-compute-apps="
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv
如需进一步帮助,请关注
nvidia-smi --help-query-compute-app
另一种有用的监控方法是对消耗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 -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
您可以尝试nvtop,它类似于广泛使用的htop工具,但用于NVIDIA gpu。下面是nvtop的截图。