Estou tentando monitorar um processo que usa cuda e MPI, há alguma maneira de fazer isso, algo como o comando "top", mas que monitora a GPU também?
Estou tentando monitorar um processo que usa cuda e MPI, há alguma maneira de fazer isso, algo como o comando "top", mas que monitora a GPU também?
Respostas:
Acho o gpustat muito útil. O In pode ser instalado com pip install gpustat
e imprime detalhamento de uso por processos ou usuários.
watch gpustat -cp
você pode ver as estatísticas continuamente, mas as cores sumiram. como você conserta aquilo? @Alleo
watch -c
. @Roman Orac, Obrigado, isso também funcionou para mim no redhat 8, quando estava recebendo alguns erros devido à importação de _curses em python.
watch -c gpustat -cp --color
watch -n 0.5 -c gpustat -cp --color
--watch
opção:gpustat -cp --watch
nvidia-smi -l 1
Isso fará um loop e chamará a visualização a cada segundo.
Se você não quiser manter os rastros anteriores da chamada em loop no histórico do console, também pode fazer:
watch -n0.1 nvidia-smi
Onde 0,1 é o intervalo de tempo, em segundos.
Não estou ciente de nada que combine essas informações, mas você pode usar a nvidia-smi
ferramenta para obter os dados brutos, assim (obrigado a @jmsu pela dica 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
, o que evita encher seu terminal com saída
Baixe e instale o driver CUDA estável mais recente (4.2) aqui . No Linux, o nVidia-smi 295.41 oferece exatamente o que você deseja. usar 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: Nos drivers NVIDIA mais recentes, esse suporte é limitado às placas Tesla.
Outra abordagem de monitoramento útil é usar os ps
processos filtrados que consomem suas GPUs. Eu uso muito este:
ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `lsof -n -w -t /dev/nvidia*`
Isso mostrará todos os processos que utilizam GPU da nvidia e algumas estatísticas sobre eles. lsof ...
recupera uma lista de todos os processos usando uma GPU nvidia de propriedade do usuário atual e ps -p ...
mostra os ps
resultados desses processos. ps f
mostra uma boa formatação para relacionamentos / hierarquias de processo pai / filho e -o
especifica uma formatação personalizada. Isso é semelhante a apenas fazer, ps u
mas adiciona o ID do grupo de processo e remove alguns outros campos.
Uma vantagem disso nvidia-smi
é que ele mostrará bifurcações de processo, bem como processos principais que usam a GPU.
Uma desvantagem, porém, é que ele está limitado aos processos pertencentes ao usuário que executa o comando. Para abri-lo para todos os processos pertencentes a qualquer usuário, adiciono um sudo
antes de lsof
.
Por último, eu o combino com watch
para obter uma atualização contínua. Então, no final, parece:
watch -n 0.1 'ps f -o user,pgrp,pid,pcpu,pmem,start,time,command -p `sudo lsof -n -w -t /dev/nvidia*`'
Que tem saída 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
seguinte:nvidia-smi --query-compute-apps=pid --format=csv,noheader
nvidia-smi
, não lista todos os processos, então você acaba com sua memória usada por processos não listados lá. Esta é a principal maneira de rastrear e eliminar esses processos.
pmem
dado por ps
leve em consideração a memória total da GPU, mas a da CPU porque ps
não é "Nvidia GPU" ciente
Isso pode não ser elegante, mas você pode tentar
while true; do sleep 2; nvidia-smi; done
Também tentei o método de @Edric, que funciona, mas prefiro o layout original do nvidia-smi
.
nvidia-smi -l 2
. Ou para evitar saídas repetidas do console,watch -n 2 'nvidia-smi'
Se você deseja apenas encontrar o processo que está sendo executado no gpu, pode simplesmente usar o seguinte comando:
lsof /dev/nvidia*
Para mim nvidia-smi
e watch -n 1 nvidia-smi
são suficientes na maioria dos casos. Às vezes nvidia-smi
não mostra nenhum processo, mas a memória gpu é usada, então eu preciso usar o comando acima para encontrar os processos.
Existe o Prometheus GPU Metrics Exporter (PGME) que utiliza o binário nvidai-smi. Você pode tentar isso. Depois de ter o exportador em execução, você pode acessá-lo via http: // localhost: 9101 / metrics . Para duas GPUs, o resultado da amostra é assim:
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
você pode usar nvidia-smi pmon -i 0
para monitorar todos os processos na GPU 0. incluindo modo de computação, uso de sm, uso de memória, uso do codificador, uso do decodificador.
Você pode usar os olhares do programa de monitoramento com seu plug-in de monitoramento de GPU :
sudo apt-get install -y python-pip; sudo pip install glances[gpu]
sudo glances
Ele também monitora a CPU, E / S do disco, espaço em disco, rede e algumas outras coisas:
Criei um arquivo em lote com o seguinte código em uma máquina Windows para monitorar a cada segundo. Funciona para mim.
:loop
cls
"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"
timeout /T 1
goto loop
O exe nvidia-smi geralmente está localizado em "C: \ Arquivos de programas \ NVIDIA Corporation" se você deseja executar o comando apenas uma vez.