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

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

【问题讨论】:

  • "nvidia-smi pmon -i 0" 可以监控nvidia GPU 0上运行的所有进程

标签: cuda process-monitoring resource-monitor


【解决方案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_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
              

              【讨论】:

                【解决方案16】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2020-07-02
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-07-23
                  • 1970-01-01
                  • 2020-03-05
                  • 2010-10-27
                  • 2021-03-23
                  相关资源
                  最近更新 更多