跳转至

nvitop命令查看GPU使用情况

一、引言

在使用NVIDIA GPU训练网络模型时,许多用户习惯通过nvidia-smi命令查看GPU的使用情况,以便选择空闲的GPU进行训练。然而,nvitop是一款功能更全面、展示更直观的NVIDIA GPU实时监控工具,它集成了GPU利用率、显存占比、卡号使用者、CPU利用率、进程使用时间、命令行等多种信息,并通过差异化颜色和个性化展示,让用户能够更高效地管理GPU资源。

nvitop 的优势:

相比传统的 nvidia-smi命令,nvitop在GPU设备资源和性能监控方面具有以下全方位优势:

  1. 直观的可视化展示

    • 使用美观的颜色和进度条实时显示每块GPU卡的GPU和CPU内存占用率及利用率。
    • 以直观的方式展示GPU的使用者、使用时间、使用命令行以及GPU和CPU的占用率记录。
  2. 丰富的监控功能

    • 提供树状视图、环境变量查看、进程过滤和进程指标检测等功能。
    • 能够追踪单个进程在GPU和CPU上的内存和利用率历史记录,并通过柱状图直观展示。
  3. 强大的自定义能力

    • 提供API接口,用户可以基于此搭建自定义的监控工具,满足个性化需求。

推荐使用:

nvitop 的安装过程非常简单,使用它可以让管理服务器的工作变得更加高效。强烈推荐大家使用nvitop,让 GPU资源管理事半功倍。

完整API说明文档请查看官方手册:https://nvitop.readthedocs.io

二、特性

监控信息丰富且展示直观,显示比nvidia-smi更全面的资源监控信息,和更直观的表现形式监控模式。可以作为资源监控器一直运行,而不是只能单独查看一次结果。

  • 支持条形图和历史图
  • 监控信息排序 & 监控信息过滤
  • 可通过键盘向进程发送信号
  • GPU进程及其父进程的树视图屏幕享受
  • 提供环境变量屏幕,帮助信息屏幕,并支持鼠标点击的交互式操作

三、部署安装

因为nvitop采用纯Python编写,所以推荐采用pip命令进行安装,官方安装说明文档中提供了几种安装方式如下:

  • 使用pip3进行安装
1
2
pip3 install --upgrade nvitop
pip3 install nvitop -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 使用conda进行安装
1
conda install -c conda-forge nvitop
  • 从Github拉取最新版本进行安装
1
pip3 install git+https://github.com/XuehaiPan/nvitop.git#egg=nvitop
  • clone项目并手动安装
1
2
3
git clone --depth=1 https://github.com/XuehaiPan/nvitop.git
cd nvitop
pip3 install .

「注意」 如果在安装后遇到nvitop: command not found错误,请检查你是否将Python控制台脚本路径(例如,${HOME}/.local/bin)添加到您的PATH环境变量中。或者,你可以直接使用python3 -m nvitop命令

四、常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# Monitor mode (when the display mode is omitted, `NVITOP_MONITOR_MODE` will be used)
$ nvitop  # or use `python3 -m nvitop`
# Automatically configure the display mode according to the terminal size
$ nvitop -m auto     # shortcut: `a` key
# Arbitrarily display as `full` mode
$ nvitop -m full     # shortcut: `f` key
# Arbitrarily display as `compact` mode
$ nvitop -m compact  # shortcut: `c` key
# Specify query devices (by integer indices)
$ nvitop -o 0 1  # only show <GPU 0> and <GPU 1>
# Only show devices in `CUDA_VISIBLE_DEVICES` (by integer indices or UUID strings)
$ nvitop -ov
# Only show GPU processes with the compute context (type: 'C' or 'C+G')
$ nvitop -c
# Use ASCII characters only
$ nvitop -U  # useful for terminals without Unicode support
# For light terminals
$ nvitop --light
# For spectrum-like bar charts (requires the terminal supports 256-color)
$ nvitop --colorful

五、显示信息含义

nvitop-dashboard

5.1 顶部信息栏

  • 当前时间:显示当前的系统时间
  • 提示信息:提示可以按 h 键获取帮助或按 q 键退出
  • nvitop 版本:NVITOP 1.5.0
  • 驱动版本:Driver Version: 550.54.14
  • CUDA 驱动版本: 最高能支持到的CUDA版本:CUDA Driver Version: 12.0

5.2 GPU信息区域

  • GPU:显示 GPU 的编号(如 0,1, 2, 3, 4)。
  • Fan (风扇速度):显示风扇的转速(如 30%,N/A 表示不可用或未启用)。
  • Temp (温度):显示每个 GPU 的当前温度(例如,37C,41C)。
  • Perf (性能状态):显示 GPU 的性能状态(如 P0 表示最大性能模式,P2 表示降级模式)。
  • Pwr: Usage/Cap (功率:使用量/容量):显示当前的功耗及最大容量(例如,202W / 700W )。
  • Memory-Usage (内存使用):显示 GPU 的内存使用情况和总内存(例如,39.35GiB / 79.65GiB)。
  • GPU-Util (GPU 利用率):显示 GPU 的使用率百分比(例如,25%,100%)。
  • Compute M. (计算模式):显示 GPU 的计算模式(如 Default)。
  • MEM / UTL:图形化显示内存和利用率的百分比条形图。

5.3 系统负载信息

  • Load Average (平均负载):显示系统在过去 1 分钟、5 分钟和 15 分钟内的平均负载(例如,2.96  2.97 2.86)。
  • CPU:显示 CPU 当前的使用率(例如,5.1%)。

5.4 图表区域

  • 内存使用情况:显示系统内存的使用量( 68.98 GiB (3.8%))。
  • 交换分区使用情况:显示交换分区的使用量( 0.0% )。
  • GPU 利用率时间图:显示 GPU 使用率随时间的变化。

5.5 进程信息区域

列出了使用 GPU 的所有进程及其详细信息:

  • GPU:显示每个进程使用的 GPU 编号。
  • PID:进程 ID。
  • USER:进程所有者的用户名。
  • GPU-MEM:进程使用的 GPU 内存量。
  • %SM:**流式多处理器 (Streaming Multiprocessor) 的使用率。
  • %CPU:**进程的 CPU 使用率。
  • %MEM:**进程的系统内存使用率。
  • TIME:进程的运行时间。
  • COMMAND:执行的命令或程序(如 python main.py、xorg 等)。

六、基于以下 API 监控 GPU 的脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import time
from nvitop import Device, GpuProcess, NA, colored

print(colored(time.strftime('%a %b %d %H:%M:%S %Y'), color='red', attrs=('bold',)))

devices = Device.cuda.all()  # or `Device.all()` to use NVML ordinal instead
separator = False
for device in devices:
    processes = device.processes()  # type: Dict[int, GpuProcess]

    print(colored(str(device), color='green', attrs=('bold',)))
    print(colored('  - Fan speed:       ', color='blue', attrs=('bold',)) + f'{device.fan_speed()}%')
    print(colored('  - Temperature:     ', color='blue', attrs=('bold',)) + f'{device.temperature()}C')
    print(colored('  - GPU utilization: ', color='blue', attrs=('bold',)) + f'{device.gpu_utilization()}%')
    print(colored('  - Total memory:    ', color='blue', attrs=('bold',)) + f'{device.memory_total_human()}')
    print(colored('  - Used memory:     ', color='blue', attrs=('bold',)) + f'{device.memory_used_human()}')
    print(colored('  - Free memory:     ', color='blue', attrs=('bold',)) + f'{device.memory_free_human()}')
    if len(processes) > 0:
        processes = GpuProcess.take_snapshots(processes.values(), failsafe=True)
        processes.sort(key=lambda process: (process.username, process.pid))

        print(colored(f'  - Processes ({len(processes)}):', color='blue', attrs=('bold',)))
        fmt = '    {pid:<5}  {username:<8} {cpu:>5}  {host_memory:>8} {time:>8}  {gpu_memory:>8}  {sm:>3}  {command:<}'.format
        print(colored(fmt(pid='PID', username='USERNAME',
                          cpu='CPU%', host_memory='HOST-MEM', time='TIME',
                          gpu_memory='GPU-MEM', sm='SM%',
                          command='COMMAND'),
                      attrs=('bold',)))
        for snapshot in processes:
            print(fmt(pid=snapshot.pid,
                      username=snapshot.username[:7] + ('+' if len(snapshot.username) > 8 else snapshot.username[7:8]),
                      cpu=snapshot.cpu_percent, host_memory=snapshot.host_memory_human,
                      time=snapshot.running_time_human,
                      gpu_memory=(snapshot.gpu_memory_human if snapshot.gpu_memory_human is not NA else 'WDDM:N/A'),
                      sm=snapshot.gpu_sm_utilization,
                      command=snapshot.command))
    else:
        print(colored('  - No Running Processes', attrs=('bold',)))

    if separator:
        print('-' * 120)
    separator = True

nvitop_monitor_gpu.py脚本运行结果如下:

nvitop-python-script

参考资料

  • Nvitop官方文档:https://github.com/XuehaiPan/nvitop
  • API使用手册:https://nvitop.readthedocs.io/

捐赠本站(Donate)

weixin_pay
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))