Estoy tratando de monitorear un proceso que usa cuda y MPI, ¿hay alguna forma de que pueda hacer esto, algo como el comando "top" pero que también monitorea la GPU?
Estoy tratando de monitorear un proceso que usa cuda y MPI, ¿hay alguna forma de que pueda hacer esto, algo como el comando "top" pero que también monitorea la GPU?
Respuestas:
Encuentro gpustat muy útil. Se puede instalar con pip install gpustat
e imprime un desglose del uso por procesos o usuarios.
watch gpustat -cp
, puede ver las estadísticas continuamente, pero los colores se han ido. ¿Cómo arreglas eso? @Alleo
watch -c
. @Roman Orac, Gracias, esto también funcionó para mí en redhat 8 cuando recibí un error debido a la importación de _curses en Python.
watch -c gpustat -cp --color
watch -n 0.5 -c gpustat -cp --color
--watch
opción:gpustat -cp --watch
nvidia-smi -l 1
Esto hará un bucle y llamará a la vista cada segundo.
Si no desea mantener rastros anteriores de la llamada en bucle en el historial de la consola, también puede hacer:
watch -n0.1 nvidia-smi
Donde 0.1 es el intervalo de tiempo, en segundos.
No tengo conocimiento de nada que combine esta información, pero puede usar la nvidia-smi
herramienta para obtener los datos sin procesar, así (gracias a @jmsu por el consejo sobre -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
, que evita llenar su terminal con salida
Descargue e instale el controlador CUDA estable más reciente (4.2) desde aquí . En Linux, nVidia-smi 295.41 le ofrece justo lo que desea. utilizar 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 |
+-----------------------------------------------------------------------------+
EDITAR: En los últimos controladores de NVIDIA, este soporte se limita a las tarjetas Tesla.
Otro enfoque de monitoreo útil es utilizar ps
procesos filtrados que consumen sus GPU. Yo uso mucho este:
ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `lsof -n -w -t /dev/nvidia*`
Eso mostrará todos los procesos que utilizan la GPU de nvidia y algunas estadísticas sobre ellos. lsof ...
recupera una lista de todos los procesos que utilizan una GPU nvidia propiedad del usuario actual y ps -p ...
muestra los ps
resultados de esos procesos. ps f
muestra un formato agradable para las relaciones / jerarquías de procesos hijo / padre, y -o
especifica un formato personalizado. Eso es similar a simplemente hacerps u
pero agrega el ID del grupo de procesos y elimina algunos otros campos.
Una ventaja de esto sobre nvidia-smi
es que mostrará las bifurcaciones de proceso, así como los procesos principales que usan la GPU.
Sin embargo, una desventaja es que se limita a los procesos propiedad del usuario que ejecuta el comando. Para abrirlo a todos los procesos propiedad de cualquier usuario, agrego un sudo
antes dellsof
.
Por último, lo combino con watch
para obtener una actualización continua. Entonces, al final, se ve así:
watch -n 0.1 'ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `sudo lsof -n -w -t /dev/nvidia*`'
Que tiene salida como:
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
así:nvidia-smi --query-compute-apps=pid --format=csv,noheader
nvidia-smi
, no enumera todos los procesos, por lo que termina con su memoria utilizada por procesos que no figuran allí. Esta es la forma principal en la que puedo rastrear y eliminar esos procesos.
pmem
dado por ps
tenga en cuenta la memoria total de la GPU sino la de la CPU porque ps
no es compatible con "Nvidia GPU"
Puede que esto no sea elegante, pero puedes intentarlo
while true; do sleep 2; nvidia-smi; done
También probé el método de @Edric, que funciona, pero prefiero el diseño original de nvidia-smi
.
nvidia-smi -l 2
. O para evitar la salida repetida de la consola,watch -n 2 'nvidia-smi'
Si solo desea encontrar el proceso que se está ejecutando en gpu, simplemente puede usar el siguiente comando:
lsof /dev/nvidia*
Para mí nvidia-smi
ya watch -n 1 nvidia-smi
son suficientes en la mayoría de los casos. A veces nvidia-smi
no muestra ningún proceso, pero la memoria de la gpu está agotada, así que necesito usar el comando anterior para encontrar los procesos.
Existe Prometheus GPU Metrics Exporter (PGME) que aprovecha el binario nvidai-smi. Puedes probar esto. Una vez que tenga el exportador en ejecución, puede acceder a él a través de http: // localhost: 9101 / metrics . Para dos GPU, el resultado de la muestra se ve así:
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
puede usar nvidia-smi pmon -i 0
para monitorear todos los procesos en GPU 0. incluido el modo de cómputo, uso de sm, uso de memoria, uso del codificador, uso del decodificador.
Puede utilizar las miradas del programa de monitoreo con su complemento de monitoreo de GPU :
sudo apt-get install -y python-pip; sudo pip install glances[gpu]
sudo glances
También supervisa la CPU, la E / S del disco, el espacio en disco, la red y algunas otras cosas:
Creé un archivo por lotes con el siguiente código en una máquina con Windows para monitorear cada segundo. Esto funciona para mi.
:loop
cls
"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"
timeout /T 1
goto loop
nvidia-smi exe generalmente se encuentra en "C: \ Archivos de programa \ NVIDIA Corporation" si desea ejecutar el comando solo una vez.