Я намагаюсь відстежувати процес, який використовує cuda та MPI, чи можна це зробити, щось на зразок команди "top", але це також контролює GPU?
Я намагаюсь відстежувати процес, який використовує cuda та MPI, чи можна це зробити, щось на зразок команди "top", але це також контролює GPU?
Відповіді:
Я вважаю gpustat дуже корисним. In може бути встановлений за допомогою pip install gpustat
та друкує розбиття використання процесами чи користувачами.
watch gpustat -cp
ви можете постійно бачити статистику, але кольорів більше немає. Як це виправити? @Alleo
watch -c
. @ Роман Орач, Дякую, це також працювало для мене на redhat 8, коли я отримував помилку через імпорт _curses у python.
watch -c gpustat -cp --color
watch -n 0.5 -c gpustat -cp --color
--watch
можливість:gpustat -cp --watch
nvidia-smi -l 1
Це буде циклічно і викликати перегляд щосекунди.
Якщо ви не хочете зберігати минулі сліди циклічного виклику в історії консолі, ви також можете зробити:
watch -n0.1 nvidia-smi
Де 0,1 - інтервал часу, в секундах.
Мені нічого не відомо, що поєднує цю інформацію, але ви можете скористатися 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 %
watch -n 0.5 nvidia-smi
, що уникає заповнення вашого терміналу результатом
Завантажте та встановіть останній стабільний драйвер CUDA (4.2) звідси . У Linux 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 |
+-----------------------------------------------------------------------------+
EDIT: В останніх драйверах NVIDIA ця підтримка обмежена картами Tesla.
Іншим корисним підходом до моніторингу є використання ps
відфільтрованих процесів, які споживають ваші графічні процесори. Я цим дуже користуюся:
ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `lsof -n -w -t /dev/nvidia*`
Це покаже всі процеси, що використовують GPU nvidia, та деякі статистичні дані про них. lsof ...
отримує список усіх процесів за допомогою GPU nvidia, що належить поточному користувачеві, та ps -p ...
показує ps
результати для цих процесів. ps f
показує приємне форматування стосунків / ієрархій процесу батько / батько та -o
визначає спеціальне форматування. Це схоже на те, що робити, ps u
але додає ідентифікатор групи процесів і видаляє деякі інші поля.
Однією з переваг цього nvidia-smi
є те, що він покаже вилки процесів, а також основні процеси, які використовують графічний процесор.
Однак один недолік - це обмеження процесів, що належать користувачеві, який виконує команду. Щоб відкрити його для всіх процесів, що належать будь-якому користувачеві, я додаю sudo
до lsof
.
Нарешті, я комбіную його з тим, 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
так:nvidia-smi --query-compute-apps=pid --format=csv,noheader
nvidia-smi
не перераховано всі процеси, тому ви закінчуєте свою пам'ять, яку використовують процеси, які не перераховані там. Це головний спосіб я відстежувати і вбивати ці процеси.
pmem
дані ps
враховують загальну пам’ять GPU, але пам'ять процесора, тому що ps
не відомо про «Nvidia GPU»
Це може бути не елегантно, але ви можете спробувати
while true; do sleep 2; nvidia-smi; done
Я також спробував метод @Edric, який працює, але я вважаю за краще оригінальний макет nvidia-smi
.
nvidia-smi -l 2
. Або для запобігання повторного виходу консолі,watch -n 2 'nvidia-smi'
Якщо ви просто хочете знайти процес, який працює на gpu, ви можете просто скористатися такою командою:
lsof /dev/nvidia*
Для мене nvidia-smi
і watch -n 1 nvidia-smi
цього в більшості випадків вистачає. Іноді nvidia-smi
не показує жодного процесу, але пам'ять gpu використовується, тому мені потрібно скористатися вищевказаною командою, щоб знайти процеси.
Є Prometheus GPU Metrics Exporter (PGME), який використовує бінарний файл nvidai-smi. Ви можете спробувати це. Після запуску експортера ви можете отримати доступ до нього за допомогою http: // localhost: 9101 / metrics . Для двох графічних процесорів зразок результату виглядає приблизно так:
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
ви можете використовувати nvidia-smi pmon -i 0
для моніторингу кожного процесу в GPU 0. включаючи обчислювальний режим, використання sm, використання пам'яті, використання кодера, використання декодера.
Ви можете використовувати погляди програми моніторингу з його плагіном моніторингу GPU :
sudo apt-get install -y python-pip; sudo pip install glances[gpu]
sudo glances
Він також контролює процесор, IO диска, дисковий простір, мережу та деякі інші речі:
Я створив пакетний файл із наступним кодом у машині Windows, щоб контролювати кожну секунду. Це працює для мене.
:loop
cls
"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"
timeout /T 1
goto loop
nvidia-smi exe зазвичай знаходиться в "C: \ Program Files \ NVIDIA Corporation", якщо ви хочете виконати команду лише один раз.