верхняя команда для GPU с использованием CUDA

Я пытаюсь контролировать процесс, который использует cuda и MPI, есть ли способ сделать это, что-то вроде команды "top", но которая также контролирует GPU?

9 ответов


найти gpustat очень полезно. В может быть установлен с pip install gpustat, и печатает разбивку использования процессами или пользователями.

enter image description here


Я не знаю ничего, что объединяет эту информацию, но вы можете использовать nvidia-smi инструмент для получения необработанных данных, например (Спасибо @jmsu за подсказку on-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 %

чтобы получить представление в реальном времени об используемых ресурсах, сделайте:

nvidia-smi -l 1

это будет цикл и вызвать в каждую секунду.

если вы не хотите сохранять прошлые следы зацикленного вызова в истории консоли, вы также можете сделать:

watch -n0.1 nvidia-smi

где 0,1-временной интервал, в секундах.

enter image description 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  |
+-----------------------------------------------------------------------------+

EDIT: в последних драйверах NVIDIA эта поддержка ограничена картами Tesla.


еще один полезный подход к мониторингу-использовать ps фильтруется по процессам, которые потребляют ваши графические процессоры. Я использую это много:

ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `lsof -n -w -t /dev/nvidia*`

это покажет все процессы использования NVIDIA GPU и некоторые статистические данные о них. lsof ... получает список всех процессов, использующих графический процессор nvidia, принадлежащий текущему пользователю, и ps -p ... показывает ps результаты для этих процессов. ps f показывает хорошее форматирование для отношений/иерархий дочернего / родительского процесса и -o указывает a пользовательское форматирование. Это похоже на just doing ps u но добавляет идентификатор группы процессов и удаляет некоторые другие поля.

одно преимущество этого над nvidia-smi это то, что он будет показывать вилки процессов, а также основные процессы, которые используют GPU.

одним из недостатков, однако, является то, что он ограничен процессами, принадлежащими пользователю, который выполняет команду. Чтобы открыть его для всех процессов, принадлежащих любому пользователю, я добавляю sudo до lsof.

Наконец, I объедините его с 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

использовать аргумент " --query-compute-apps="

nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv

для дальнейшей помощи, пожалуйста, выполните

nvidia-smi --help-query-compute-app

Это может быть не элегантно, но вы можете попробовать

while true; do sleep 2; nvidia-smi; done

Я также попробовал метод @Edric, который работает, но я предпочитаю оригинальный макет nvidia-smi.


просто использовать watch nvidia-smi, Он выведет сообщение интервалом 2s по умолчанию.

например, как показано ниже:

enter image description here

вы также можете использовать watch -n 5 nvidia-smi (- N 5 на 5s интервал).


здесь экспортер метрик GPU Prometheus (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