如何自定义nvidia-smi的输出以显示PID和用户名?

30

nvidia-smi 的输出显示了正在 GPU 上运行的进程 ID 列表:

Thu May 10 09:05:07 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111                Driver Version: 384.111                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:0A:00.0 Off |                  N/A |
| 61%   74C    P2   195W / 250W |   5409MiB / 11172MiB |    100%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      5973      C   ...master_JPG/build/tools/program_pytho.bin  4862MiB |
|    0     46324      C   python                                       537MiB |
+-----------------------------------------------------------------------------+

如何显示与每个进程相关联的用户名?

这将显示单个PID的用户名:

ps -u -p $pid

然而,我也想知道这些PID的名称。它已经显示出来了。 - talonmies
@talonmies 不是。我想要这些PIDS的用户名称。请查看我的答案获取更多信息。 - Dang Manh Truong
1
这个问题中涉及到了一些相关的主题:https://dev59.com/b2sy5IYBdhLWcg3w8CbJ。 - Robert Crovella
@RobertCrovella 这有什么用处?它如何回答这个问题?在我看来,有太多与此无关的内容。 - Charlie Parker
这解决了我的问题:https://dev59.com/w1UL5IYBdhLWcg3wf4F0#75403918 - Charlie Parker
显示剩余2条评论
7个回答

30
我写了一个脚本,可以对nvidia-smi的输出进行处理并添加更多信息:https://github.com/peci1/nvidia-htop。这是一个Python脚本,它解析GPU进程列表和PID,通过运行它们在ps中获取更多信息,并用加强版清单替换nvidia-smi的进程列表。
使用示例:
$ nvidia-smi | nvidia-htop.py -l
Mon May 21 15:06:35 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.25                 Driver Version: 390.25                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:04:00.0 Off |                  N/A |
| 53%   75C    P2   174W / 250W |  10807MiB / 11178MiB |     97%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 00000000:05:00.0 Off |                  N/A |
| 66%   82C    P2   220W / 250W |  10783MiB / 11178MiB |    100%      Default |
+-------------------------------+----------------------+----------------------+
|   2  GeForce GTX 108...  Off  | 00000000:08:00.0 Off |                  N/A |
| 45%   67C    P2    85W / 250W |  10793MiB / 11178MiB |     51%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
|  GPU   PID     USER    GPU MEM  %MEM  %CPU  COMMAND                                                                                               |
|    0  1032 anonymou   10781MiB   308   3.7  python train_image_classifier.py --train_dir=/mnt/xxxxxxxx/xxxxxxxx/xxxxxxxx/xxxxxxx/xxxxxxxxxxxxxxx  |
|    1 11021 cannotte   10765MiB   114   1.5  python3 ./train.py --flagfile /xxxxxxxx/xxxxxxxx/xxxxxxxx/xxxxxxxxx/xx/xxxxxxxxxxxxxxx                |
|    2 25544 nevermin   10775MiB   108   2.0  python -m xxxxxxxxxxxxxxxxxxxxxxxxxxxxx                                                               |
+-----------------------------------------------------------------------------+

当我尝试这个时,底部的输出似乎没有正确对齐,特别是当“COMMAND”列中的路径非常长时。 - Dang Manh Truong
@DangManhTruong 你可以在 GitHub 上提出一个问题,同时附上终端输出吗? - Martin Pecka
如何获取每个进程的GPU利用率? - debonair
@debonair 我不确定这是否可能... 至少 nvidia-smi 不提供这样的信息。 - Martin Pecka
这解决了我的问题:https://dev59.com/w1UL5IYBdhLWcg3wf4F0#75403918 - Charlie Parker

30

我使用 nvidia-smi -q -x 命令,该命令输出符合 XML 格式的 nvidia-smi 信息。


ps -up `nvidia-smi -q -x | grep pid | sed -e 's/<pid>//g' -e 's/<\/pid>//g' -e 's/^[[:space:]]*//'`

1
太好了!当我尝试为此设置别名时,Bash会尝试将PID作为命令执行。你有关于如何设置别名的技巧吗? - jay
@JayStanley,我绝不是Unix专家,所以这可能不是最好的解决方案,但是FWIW,我发现我可以将其导出到变量中,例如export FOO="ps -up nvidia-smi -q -x | grep pid | sed -e 's/<pid>//g' -e 's/</pid>//g' -e 's/^[[:space:]]*//'",然后在命令行中简单地输入$FOO...如果这是一个不好的解决方案,我很想听听更多了解Unix的人的意见。 - RMurphy
使用函数将其别名为 nvidia_smi_users() {ps -up \nvidia-smi -q -x | grep pid | sed -e 's/<pid>//g' -e 's/</pid>//g' -e 's/^[[:space:]]*//'` ;}`。 - helperFunction
我喜欢做这个:nvidia-smi; ps -up nvidia-smi -q -x | grep pid | sed -e 's/<pid>//g' -e 's/</pid>//g' -e 's/^[[:space:]]*//'`` - Charlie Parker
这解决了我的问题:https://dev59.com/w1UL5IYBdhLWcg3wf4F0#75403918 - Charlie Parker

3
这是我能想到的最好的方案:
nvidia-smi
ps -up `nvidia-smi |tail -n +16 | head -n -1 | sed 's/\s\s*/ /g' | cut -d' ' -f3` 

示例输出:

Thu May 10 15:23:08 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111                Driver Version: 384.111                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:0A:00.0 Off |                  N/A |
| 41%   59C    P2   251W / 250W |   5409MiB / 11172MiB |    100%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1606      C   ...master_JPG/build/tools/program.bin       4862MiB |
|    0     15314      C   python                                       537MiB |
+-----------------------------------------------------------------------------+
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user111+  1606  134  4.8 32980224 789164 pts/19 Rl+ 15:23   0:08 /home/user111
user2     15314  0.4 10.0 17936788 1647040 pts/16 Sl+ 10:41   1:20 python server_

脚本的简要说明:

  • Tailhead用于删除冗余行

  • Sed用于去除空格(此后,每列只会被一个空格分隔)

  • Cut用于提取相关列

输出是一个PID列表,每个PID占据1行。我们只需要使用ps -up来显示相关信息

更新:更好的解决方案:

ps -up `nvidia-smi |tee /dev/stderr |tail -n +16 | head -n -1 | sed 's/\s\s*/ /g' | cut -d' ' -f3`

这样一来,只需要调用一次nvidia-smi。 另请参见:

如何将bash命令输出到标准输出并同时管道到另一个命令?

更新2:我已经将这个脚本上传到Github,供那些需要详细GPU信息的人使用。

https://github.com/ManhTruongDang/check-gpu


如何获取每个进程的GPU利用率? - debonair
..哦,应该是\s+。 - Ziqian Xie
我收到了“错误:用户名不存在”的错误。@junwon的解决方案对我有效! - Mudit Verma

2

之前的解决方案无法解决问题,所以我在此发布我的解决方案。 我使用的NVIDIA-SMI版本是440.44,但我认为这并不重要。

nvidia-smi | tee /dev/stderr | awk '/ C / {print $3}' | xargs -r ps -up

一点解释:
  • tee:避免两次调用nvidia-smi
  • awk:抓取计算进程(类型C)的PID列
  • xargs -r-r 检查输入是否为空,以避免ps -up产生不良错误信息
如果您想在.bash_profile.bashrc中将其设置为别名:
alias nvidia-smi2='nvidia-smi | tee /dev/stderr | awk "/ C / {print \$3}" | xargs -r ps -up'

区别在于必须在$3之前进行转义。

1

正如Robert的评论所建议的那样,这个答案https://dev59.com/b2sy5IYBdhLWcg3w8CbJ#51406093建议使用gpustat,我发现这非常有帮助

首先安装gpustats:
pip install gpustat

然后你可以运行 (更多细节:https://github.com/wookayin/gpustat#usage

gpustat -up
[0] NVIDIA GeForce GTX 1080 Ti | 90'C,  73 % |  6821 / 11178 MB | user1/732124(6817M)
[1] NVIDIA GeForce GTX 1080 Ti | 63'C,   0 % |  7966 / 11178 MB | user2/268172(1287M) user3/735496(6675M)
[2] NVIDIA GeForce GTX 1080 Ti | 66'C,  13 % |  2578 / 11178 MB | user2/268478(1287M) user2/725391(1287M)
[3] NVIDIA GeForce GTX 1080 Ti | 58'C,   0 % |  1291 / 11178 MB | user2/726058(1287M)

Command 'gpustat' not found, but can be installed with: apt install gpustat Please ask your administrator. - Charlie Parker

1

Jay Stanley,我可以使用 xargs 别名 Junwon Lee 的命令,如下:

alias gpu_user_usage="nvidia-smi -q -x | grep pid | sed -e 's/<pid>//g' -e 's/<\/pid>//g' -e 's/^[[:space:]]*//' | xargs ps -up"

由于声誉限制,我无法发表评论...


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接