J'essaie de surveiller un processus qui utilise cuda et MPI, y a-t-il un moyen de le faire, quelque chose comme la commande "top" mais qui surveille aussi le GPU?
J'essaie de surveiller un processus qui utilise cuda et MPI, y a-t-il un moyen de le faire, quelque chose comme la commande "top" mais qui surveille aussi le GPU?
Réponses:
Je trouve gpustat très utile. In peut être installé avec pip install gpustat
et imprime la répartition de l'utilisation par processus ou utilisateurs.
watch gpustat -cp
vous pouvez voir les statistiques en continu mais les couleurs ont disparu. Comment résolvez-vous cela? @Alleo
watch -c
. @Roman Orac, Merci, cela a également fonctionné pour moi sur redhat 8 lorsque j'obtenais une erreur en raison de l'importation de _curses en python.
watch -c gpustat -cp --color
watch -n 0.5 -c gpustat -cp --color
--watch
option:gpustat -cp --watch
nvidia-smi -l 1
Cela va boucler et appeler la vue à chaque seconde.
Si vous ne souhaitez pas conserver les traces passées de l'appel en boucle dans l'historique de la console, vous pouvez également faire:
watch -n0.1 nvidia-smi
Où 0,1 est l'intervalle de temps, en secondes.
Je ne suis au courant de rien qui combine ces informations, mais vous pouvez utiliser l' nvidia-smi
outil pour obtenir les données brutes, comme ceci (merci à @jmsu pour le conseil sur -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
, ce qui évite de remplir votre terminal de sortie
Téléchargez et installez le dernier pilote CUDA stable (4.2) à partir d' ici . Sous Linux, nVidia-smi 295.41 vous donne exactement ce que vous voulez. utiliser 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: dans les derniers pilotes NVIDIA, cette prise en charge est limitée aux cartes Tesla.
Une autre approche de surveillance utile consiste à utiliser des ps
processus filtrés qui consomment vos GPU. J'utilise beaucoup celui-ci:
ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `lsof -n -w -t /dev/nvidia*`
Cela montrera tous les processus utilisant le GPU nvidia et quelques statistiques à leur sujet. lsof ...
récupère une liste de tous les processus utilisant un GPU nvidia appartenant à l'utilisateur actuel et ps -p ...
affiche les ps
résultats pour ces processus. ps f
montre une mise en forme agréable pour les relations / hiérarchies de processus enfant / parent, et -o
spécifie une mise en forme personnalisée. Celui-ci est similaire à ce que vous faites, ps u
mais ajoute l'ID du groupe de processus et supprime certains autres champs.
L'un des avantages de cela nvidia-smi
est qu'il affichera les fourchettes de processus ainsi que les principaux processus qui utilisent le GPU.
Un inconvénient, cependant, est qu'il est limité aux processus appartenant à l'utilisateur qui exécute la commande. Pour l'ouvrir à tous les processus appartenant à n'importe quel utilisateur, j'ajoute un sudo
avant le lsof
.
Enfin, je le combine avec watch
pour obtenir une mise à jour continue. Donc, au final, ça ressemble à:
watch -n 0.1 'ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `sudo lsof -n -w -t /dev/nvidia*`'
Qui a une sortie comme:
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
comme ceci:nvidia-smi --query-compute-apps=pid --format=csv,noheader
nvidia-smi
ne répertorie pas tous les processus, vous vous retrouvez donc avec votre mémoire utilisée par des processus qui n'y figurent pas. C'est la principale façon dont je peux suivre et tuer ces processus.
pmem
donné par ps
prenne en compte la mémoire totale du GPU mais celle du CPU car ps
n'est pas conscient de "Nvidia GPU"
Ce n'est peut-être pas élégant, mais vous pouvez essayer
while true; do sleep 2; nvidia-smi; done
J'ai également essayé la méthode de @Edric, qui fonctionne, mais je préfère la mise en page originale de nvidia-smi
.
nvidia-smi -l 2
. Ou pour empêcher la sortie répétée de la console,watch -n 2 'nvidia-smi'
Si vous souhaitez simplement trouver le processus qui s'exécute sur gpu, vous pouvez simplement utiliser la commande suivante:
lsof /dev/nvidia*
Pour moi nvidia-smi
et watch -n 1 nvidia-smi
suffisent dans la plupart des cas. Parfois nvidia-smi
, aucun processus ne s'affiche mais la mémoire gpu est épuisée, je dois donc utiliser la commande ci-dessus pour trouver les processus.
Il existe Prometheus GPU Metrics Exporter (PGME) qui exploite le binaire nvidai-smi. Vous pouvez essayer ceci. Une fois l'exportateur en cours d'exécution, vous pouvez y accéder via http: // localhost: 9101 / metrics . Pour deux GPU, l'exemple de résultat ressemble à ceci:
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
vous pouvez utiliser nvidia-smi pmon -i 0
pour surveiller chaque processus dans le GPU 0. y compris le mode de calcul, l'utilisation sm, l'utilisation de la mémoire, l'utilisation de l'encodeur, l'utilisation du décodeur.
Vous pouvez utiliser le programme de surveillance glances avec son plug-in de surveillance GPU :
sudo apt-get install -y python-pip; sudo pip install glances[gpu]
sudo glances
Il surveille également le processeur, les E / S disque, l'espace disque, le réseau et quelques autres choses:
J'ai créé un fichier de commandes avec le code suivant dans une machine Windows pour surveiller chaque seconde. Ça marche pour moi.
:loop
cls
"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"
timeout /T 1
goto loop
nvidia-smi exe se trouve généralement dans «C: \ Program Files \ NVIDIA Corporation» si vous souhaitez exécuter la commande une seule fois.