oberster Befehl für GPUs, die CUDA verwenden

127

Ich versuche, einen Prozess zu überwachen, der Cuda und MPI verwendet. Gibt es eine Möglichkeit, dies zu tun, etwa den Befehl "top", der aber auch die GPU überwacht?

natorro
quelle
2
Es gibt auch nvtop github.com/Syllo/nvtop
konvas
"nvidia-smi pmon -i 0" kann alle Prozesse überwachen, die auf nvidia GPU 0 ausgeführt werden
changqi.xia

Antworten:

81

Ich finde gpustat sehr nützlich. In kann mit installiert pip install gpustatwerden und druckt eine Aufschlüsselung der Nutzung durch Prozesse oder Benutzer.

Geben Sie hier die Bildbeschreibung ein

Alleo
quelle
4
Nachdem Sie gesetzt haben watch gpustat -cp, können Sie Statistiken kontinuierlich sehen, aber die Farben sind weg. Wie behebt man das? @Alleo
AbhimanyuAryan
1
@ AbhimanyuAryan verwenden watch -c. @ Roman Orac, danke, das hat auch bei Redhat 8 funktioniert, als ich beim Importieren von _curses in Python einen Fehler bekam.
Bobak Hashemi
3
watch -c gpustat -cp --color
Lee Netherton
1
watch -n 0.5 -c gpustat -cp --color
Gabriel Romon
3
gpustat hat jetzt eine --watchOption:gpustat -cp --watch
Jayelm
138

Gehen Sie folgendermaßen vor, um in Echtzeit einen Einblick in die verwendeten Ressourcen zu erhalten:

nvidia-smi -l 1

Dadurch wird die Ansicht jede Sekunde wiederholt und aufgerufen.

Wenn Sie vergangene Spuren des geloopten Anrufs im Konsolenverlauf nicht beibehalten möchten, können Sie außerdem Folgendes tun:

watch -n0.1 nvidia-smi

Wobei 0,1 das Zeitintervall in Sekunden ist.

Geben Sie hier die Bildbeschreibung ein

Guillaume Chevalier
quelle
2
Alle 0,1 Sekunden die Karte abfragen? Wird das die Karte belasten? Außerdem starten Sie mit watch alle 0,1 Sekunden einen neuen Prozess.
Mick T
@ MickT Ist es eine große Sache? Wie die Nvidia-smi haben diese Gebäudeschleife! Unterscheidet sich der Befehl "watch" stark vom Befehl nvidia-smi -l?
Mohammad Javad
Es könnte sein, dass ich gesehen habe, dass Karten der unteren Preisklasse seltsame Abstürze haben, und ich denke, das liegt daran, dass zu viele Benutzer nvidia-smi auf den Karten ausgeführt haben. Ich denke, die Verwendung von 'nvidia-smi -l' ist ein besserer Weg, da Sie nicht jedes Mal einen neuen Prozess forken. Außerdem ist es übertrieben, die Karte alle 0,1 Sekunden zu überprüfen. Ich würde jede Sekunde tun, wenn ich versuche, ein Problem zu debuggen, andernfalls mache ich alle 5 Minuten, um die Leistung zu überwachen. Ich hoffe das hilft! :)
Mick T
@ Gulzar ja, das ist es.
TrostAft
83

Mir ist nichts bekannt, das diese Informationen kombiniert, aber Sie können das nvidia-smiTool verwenden, um die Rohdaten wie folgt abzurufen (danke an @jmsu für den Tipp zu -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 %
Edric
quelle
4
Ich denke, wenn Sie ein -l hinzufügen, wird es kontinuierlich aktualisiert, um die GPU und die Speichernutzung effektiv zu überwachen.
JMSU
6
Was ist, wenn die GPU-Auslastung beim Ausführen nur N / A anzeigt?
Natorro
3
@natorro Es sieht so aus, als hätte nVidia die Unterstützung für einige Karten eingestellt. Überprüfen Sie diesen Link forums.nvidia.com/index.php?showtopic=205165
jmsu
29
Ich bevorzuge watch -n 0.5 nvidia-smi, was vermeidet, Ihr Terminal mit Ausgabe zu
füllen
nvidia-smi pmon -i 0
changqi.xia
19

Downloaden und installieren Sie neueste stabile CUDA - Treiber (4.2) von hier . Unter Linux bietet Ihnen nVidia-smi 295.41 genau das, was Sie wollen. Verwenden Sie 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  |
+-----------------------------------------------------------------------------+

BEARBEITEN: In den neuesten NVIDIA-Treibern ist diese Unterstützung auf Tesla-Karten beschränkt.

Lashgar
quelle
18

Verwenden Sie das Argument "--query-compute-apps ="

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

Für weitere Hilfe folgen Sie bitte

nvidia-smi --help-query-compute-app
Deepak
quelle
17

Verwenden watch nvidia-smiSie einfach , es wird die Nachricht standardmäßig im 2-Sekunden-Intervall ausgegeben.

Zum Beispiel wie im folgenden Bild:

Geben Sie hier die Bildbeschreibung ein

Sie können auch watch -n 5 nvidia-smi(-n 5 x 5s Intervall) verwenden.

Jayhello
quelle
16

Ein weiterer nützlicher Überwachungsansatz ist die Verwendung psgefilterter Prozesse, die Ihre GPUs verbrauchen. Ich benutze dieses oft:

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

Das zeigt alle nvidia GPU-nutzenden Prozesse und einige Statistiken darüber. lsof ...Ruft eine Liste aller Prozesse mit einer NVIDIA-GPU ab, die dem aktuellen Benutzer gehört, und ps -p ...zeigt die psErgebnisse für diese Prozesse an. ps fZeigt eine schöne Formatierung für untergeordnete / übergeordnete Prozessbeziehungen / -hierarchien an und -ogibt eine benutzerdefinierte Formatierung an. Dies ähnelt dem ps ueinfachen Vorgang, fügt jedoch die Prozessgruppen-ID hinzu und entfernt einige andere Felder.

Ein Vorteil davon nvidia-smiist, dass sowohl Prozessgabeln als auch Hauptprozesse angezeigt werden, die die GPU verwenden.

Ein Nachteil ist jedoch, dass es auf Prozesse beschränkt ist, die dem Benutzer gehören, der den Befehl ausführt. Um es für alle Prozesse zu öffnen, die einem Benutzer gehören, füge ich ein sudovor dem hinzu lsof.

Zuletzt kombiniere ich es mit watch, um ein kontinuierliches Update zu erhalten. Am Ende sieht es also so aus:

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

Welches hat Ausgabe wie:

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
Grisaitis
quelle
2
Sie können auch die PIDs von Rechenprogrammen abrufen, die die GPU aller Benutzer belegen, ohne sudodies zu tun :nvidia-smi --query-compute-apps=pid --format=csv,noheader
Lenar Hoyt
1
Manchmal werden nvidia-sminicht alle Prozesse aufgelistet, sodass Ihr Speicher von Prozessen verwendet wird, die dort nicht aufgeführt sind. Dies ist die Hauptmethode, mit der ich diese Prozesse verfolgen und beenden kann.
Rand
1
@grisaitis Carefull, ich denke nicht, dass das pmemgegeben von psberücksichtigt den Gesamtspeicher der GPU, sondern den der CPU, weil psnicht "Nvidia GPU" bewusst ist
SebMa
9

Sie können es versuchen nvtop, das dem weit verbreiteten htopTool ähnelt, jedoch für NVIDIA-GPUs. Hier ist ein Screenshot nvtopdavon in Aktion.

Screenshot von nvtop in Aktion

Rodrigo
quelle
3

Dies mag nicht elegant sein, aber Sie können es versuchen

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

Ich habe auch die Methode von @Edric ausprobiert, die funktioniert, aber ich bevorzuge das ursprüngliche Layout von nvidia-smi.

Skyuuka
quelle
12
Oder du kannst es einfach tun nvidia-smi -l 2. Oder um wiederholte Konsolenausgabe zu verhindern,watch -n 2 'nvidia-smi'
Grisaitis
3

Wenn Sie nur den Prozess suchen möchten, der auf GPU ausgeführt wird, können Sie einfach den folgenden Befehl verwenden:

lsof /dev/nvidia*

Für mich nvidia-smiund watch -n 1 nvidia-smisind in den meisten Fällen genug. Manchmal nvidia-smiwird kein Prozess angezeigt, aber der GPU-Speicher ist aufgebraucht, sodass ich den obigen Befehl verwenden muss, um die Prozesse zu finden.

JasonWayne
quelle
2

In Linux Mint und höchstwahrscheinlich in Ubuntu können Sie "nvidia-smi --loop = 1" ausprobieren.

Ebram
quelle
0

Es gibt Prometheus GPU Metrics Exporter (PGME) , der die nvidai-smi-Binärdatei nutzt. Sie können dies ausprobieren. Sobald der Exporter ausgeführt wird, können Sie über http: // localhost: 9101 /metrics darauf zugreifen . Für zwei GPUs sieht das Beispielergebnis folgendermaßen aus:

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
Abu Shoeb
quelle
0

Sie können nvidia-smi pmon -i 0jeden Prozess in GPU 0 überwachen, einschließlich Rechenmodus, SMS-Nutzung, Speichernutzung, Encoder-Nutzung und Decoder-Nutzung.

changqi.xia
quelle
0

Sie können die Monitoring - Programm verwenden Blicke mit seiner GPU Monitoring Plug-in:

  • Open Source
  • installieren: sudo apt-get install -y python-pip; sudo pip install glances[gpu]
  • starten: sudo glances

Geben Sie hier die Bildbeschreibung ein

Es überwacht auch die CPU, die Festplatten-E / A, den Speicherplatz, das Netzwerk und einige andere Dinge:

Geben Sie hier die Bildbeschreibung ein

Franck Dernoncourt
quelle
0

Ich habe eine Batchdatei mit dem folgenden Code auf einem Windows-Computer erstellt, um jede Sekunde zu überwachen. Für mich geht das.

:loop
cls
"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"
timeout /T 1
goto loop

nvidia-smi exe befindet sich normalerweise unter "C: \ Programme \ NVIDIA Corporation", wenn Sie den Befehl nur einmal ausführen möchten.

Karthik NG
quelle