Как настроить вывод nvidia-smi для отображения имени пользователя PID
Нормальный вывод nvidia-smi выглядит так:
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, на которых запущен процессор. Однако я также хочу знать названия PID. Могу ли я настроить вывод для отображения имени пользователя каждого PID? Я уже знаю, как показать имя пользователя индивидуального PID:
ps -u -p $pid
Пожалуйста, помогите мне. Большое спасибо.
ОБНОВЛЕНИЕ: я отправил решение, которое работало для меня ниже. Я также загрузил это на Github как простой скрипт для тех, кому нужна подробная информация о GPU:
7 ответов
Это лучшее, что я мог придумать:
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_
Краткое объяснение сценария:
Tail
а такжеhead
убрать лишние строкиSed
удалить пробелы (после этого каждый столбец будет разделен только 1 пробелом)Cut
извлечь соответствующие столбцы
Вывод представляет собой список 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:
Я сделал это с 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:]]*//'`
Я создал скрипт, который принимает вывод nvidia-smi и обогащает его дополнительной информацией: https://github.com/peci1/nvidia-htop.
Это скрипт Python, который анализирует список процессов графического процессора, анализирует 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 |
+-----------------------------------------------------------------------------+
Предыдущее решение не работает, поэтому я публикую здесь свое решение. Я использую версию NVIDIA-SMI 440.44, но я не думаю, что это имеет значение.
nvidia-smi | tee /dev/stderr | awk '/ C / {print $3}' | xargs -r ps -up
Небольшое объяснение:
tee
: избегайте вызова nvidia-smi дваждыawk
: захват столбцов PID вычислительного процесса (тип C)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
.
Джей Стэнли, я мог бы использовать псевдоним команды Джунвона Ли, используя xargs
следующее:
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"
(Я не мог комментировать из-за ограничений репутации...)
как предполагает комментарий Роберта, этот ответ /questions/28217837/komanda-top-dlya-graficheskih-protsessorov-ispolzuyuschih-cuda/28217844#28217844 предлагает использовать gpustat, который я нашел действительно полезным
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)
Учитывая мои требования, что я хочу отображать Pid, имя пользователя, идентификатор GPU и имя процесса/приложения, вот решение:
Отвечать:
(echo "GPU_ID PID UID APP" ; for GPU in 0 1 2 3 ; do for PID in $( nvidia-smi -q --id=${GPU} --display=PIDS | awk '/Process ID/{print $NF}') ; do echo -n "${GPU} ${PID} " ; ps -up ${PID} | awk 'NR-1 {print $1,$NF}' ; done ; done) | column -t