Sto cercando di monitorare un processo che utilizza cuda e MPI, c'è un modo per farlo, qualcosa come il comando "top" ma che monitora anche la GPU?
Sto cercando di monitorare un processo che utilizza cuda e MPI, c'è un modo per farlo, qualcosa come il comando "top" ma che monitora anche la GPU?
Risposte:
Trovo gpustat molto utile. In può essere installato con pip install gpustat
e stampa la ripartizione dell'utilizzo per processi o utenti.
watch gpustat -cp
puoi vedere le statistiche continuamente ma i colori sono spariti. Come lo risolvi? @Alleo
watch -c
. @Roman Orac, grazie, questo ha funzionato anche per me su Redhat 8 quando ho ricevuto qualche errore a causa dell'importazione di _curses in Python.
watch -c gpustat -cp --color
watch -n 0.5 -c gpustat -cp --color
--watch
un'opzione:gpustat -cp --watch
nvidia-smi -l 1
Questo eseguirà un ciclo e chiamerà la visualizzazione ogni secondo.
Se non desideri conservare le tracce passate della chiamata in loop nella cronologia della console, puoi anche fare:
watch -n0.1 nvidia-smi
Dove 0,1 è l'intervallo di tempo, in secondi.
Non sono a conoscenza di nulla che combini queste informazioni, ma puoi usare lo nvidia-smi
strumento per ottenere i dati grezzi, in questo modo (grazie a @jmsu per il suggerimento su -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
, che evita di riempire il tuo terminale con l'output
Scarica e installa l'ultimo driver CUDA stabile (4.2) da qui . Su Linux, nVidia-smi 295.41 ti dà proprio quello che vuoi. utilizzare 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 |
+-----------------------------------------------------------------------------+
MODIFICA: negli ultimi driver NVIDIA, questo supporto è limitato alle schede Tesla.
Un altro approccio di monitoraggio utile consiste nell'utilizzare ps
filtri sui processi che consumano le tue GPU. Lo uso molto:
ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `lsof -n -w -t /dev/nvidia*`
Questo mostrerà tutti i processi che utilizzano la GPU NVIDIA e alcune statistiche su di essi. lsof ...
recupera un elenco di tutti i processi utilizzando una GPU nvidia di proprietà dell'utente corrente e ps -p ...
mostra i ps
risultati per tali processi. ps f
mostra una bella formattazione per le relazioni / gerarchie del processo figlio / padre e -o
specifica una formattazione personalizzata. Quello è simile al solo fareps u
ma aggiunge l'ID del gruppo di processi e rimuove alcuni altri campi.
Un vantaggio di tutto questo nvidia-smi
è che mostrerà i fork di processo così come i processi principali che utilizzano la GPU.
Uno svantaggio, tuttavia, è che è limitato ai processi di proprietà dell'utente che esegue il comando. Per aprirlo a tutti i processi di proprietà di qualsiasi utente, aggiungo un sudo
prima dilsof
.
Infine, lo combino con watch
per ottenere un aggiornamento continuo. Quindi, alla fine, sembra:
watch -n 0.1 'ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `sudo lsof -n -w -t /dev/nvidia*`'
Che ha output come:
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
questo:nvidia-smi --query-compute-apps=pid --format=csv,noheader
nvidia-smi
non elenca tutti i processi, quindi si finisce con la memoria utilizzata da processi non elencati lì. Questo è il modo principale in cui posso tracciare e terminare quei processi.
pmem
dato da ps
tenga conto della memoria totale della GPU ma di quella della CPU perché ps
non è "Nvidia GPU" a conoscenza
Potrebbe non essere elegante, ma puoi provare
while true; do sleep 2; nvidia-smi; done
Ho anche provato il metodo di @Edric, che funziona, ma preferisco il layout originale di nvidia-smi
.
nvidia-smi -l 2
. O per evitare ripetuti output della console,watch -n 2 'nvidia-smi'
Se vuoi solo trovare il processo in esecuzione su gpu, puoi semplicemente usare il seguente comando:
lsof /dev/nvidia*
Per me nvidia-smi
e watch -n 1 nvidia-smi
sono sufficienti nella maggior parte dei casi. A volte nvidia-smi
non mostra alcun processo ma la memoria della gpu è esaurita, quindi è necessario utilizzare il comando precedente per trovare i processi.
C'è Prometheus GPU Metrics Exporter (PGME) che sfrutta il binario nvidai-smi. Puoi provarlo. Una volta che l'esportatore è in esecuzione, puoi accedervi tramite http: // localhost: 9101 / metrics . Per due GPU, il risultato di esempio è simile al seguente:
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
è possibile utilizzare nvidia-smi pmon -i 0
per monitorare ogni processo nella GPU 0. inclusa la modalità di calcolo, l'utilizzo di sm, l'utilizzo della memoria, l'utilizzo del codificatore, l'utilizzo del decodificatore.
È possibile utilizzare gli sguardi del programma di monitoraggio con il plug-in di monitoraggio della GPU :
sudo apt-get install -y python-pip; sudo pip install glances[gpu]
sudo glances
Monitora anche la CPU, l'IO del disco, lo spazio su disco, la rete e alcune altre cose:
Ho creato un file batch con il seguente codice in una macchina Windows per monitorare ogni secondo. Per me funziona.
:loop
cls
"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"
timeout /T 1
goto loop
nvidia-smi exe si trova in genere in "C: \ Programmi \ NVIDIA Corporation" se si desidera eseguire il comando una sola volta.