Eu tenho um problema estranho com minhas máquinas:
Com o tempo, o desempenho cai constantemente.
Estou usando o TensorFlow para treinar uma rede neural usando a GPU. Meus dados são arrays float32 xz-compactados que residem em uma unidade de disco giratório em uma máquina e em um SSD em outra máquina. Existem cerca de 400.000 arquivos de dados. Os arquivos de dados são lidos continuamente em encadeamentos em segundo plano e colocados em uma fila, que pode ter, no máximo, 1.000 itens.
No tópico de treinamento, os itens são exibidos na frente da fila e passados para o treinamento em lotes de 200.
Após a reinicialização, o desempenho começa com aproximadamente 4 segundos por lote.
Após várias horas de treinamento, o desempenho cai para até 16 segundos por lote.
Eu planejei o treinamento um pouco em detalhes, e no começo é algo como:
- 0,05s aguardando a leitura dos dados de treinamento
- 3.8s para processar um lote na GPU
- 0,3s para gravar dados de resumo.
Após o treinamento, os horários são altamente variáveis:
- 0,5 e 4s para ler dados
- 9 a 20 s para processar um lote
- 0,3s para gravar dados de resumo
Deve-se notar que durante o processamento em lote, eu monitorei a saída do nvidia-smi com um intervalo razoavelmente alto e parece que a utilização da GPU dura no máximo 1 segundo.
Esse mau desempenho persiste em várias invocações do processo de treinamento e após o logout e login. A reinicialização da máquina traz os tempos de volta ao original.
Desde esta pergunta, eu adquiri outro GPU (um GTX 1080) e montei um sistema quase idêntico. A desaceleração acontece na nova máquina também.
Coisas que tentei
Eu verifiquei o uso da CPU, e no máximo 1 CPU é utilizada, e é sempre utilizada em 100%, a maior parte do tempo é a utilização de threads no kernel.
Eu verifiquei o uso da memória e são 10 GB (de 11 GB). Isso é um pouco apertado, mas o sistema não inicia a troca (swap permanece em 30MB).
Eu verifiquei o uso do disco e, além do meu código fazendo a leitura dos dados, parece não haver nada estranho acontecendo.
Verifiquei a temperatura da GPU com nvidia-smi e ela sempre fica abaixo de 60 ° C.
Verifiquei a temperatura da CPU e da placa-mãe, e eles sempre ficam abaixo de 65 ° C.
Estou ficando sem ideias sobre qual poderia ser o problema. Alguma idéia?
Especificações
Sistema 1:
- Intel (R) Core (TM) i7 930 @ 2,80 GHz, 4 núcleos com Hyperthreading
- 11 GB de RAM
- NVIDIA GeForce GTX 960 com 4 GB VRAM
- Ubuntu 16.04.1 LTS Server, arquitetura amd64
- Driver NVIDIA proprietário, versão 361.42
- Versão do kernel 4.4.0-31-generic
- Python 3.5.2
- TensorFlow 0.9.0
Sistema 2:
- Intel (R) Core (TM) i7 930 @ 2,80 GHz, 4 núcleos com Hyperthreading
- 11 GB de RAM
- NVIDIA GeForce GTX 1080 com VRAM de 8 GB
- Ubuntu 16.04.1 LTS Server, arquitetura amd64
- Driver NVIDIA proprietário, versão 367.35
- Versão do kernel 4.4.0-31-generic
- Python 3.5.2
- TensorFlow 0.9.0
Atualizar
Depois de mais alguns testes, parece que a lentidão é volátil. Às vezes, os lotes são processados 10x mais devagar do que na melhor das hipóteses, mas voltam ao normal novamente.
I performed an strace on the process. The summary is this:
strace: Process 7351 attached
strace: Process 7351 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
95.40 0.674470 437 1545 126 futex
4.37 0.030860 2572 12 munmap
0.23 0.001627 814 2 madvise
0.00 0.000000 0 13 write
0.00 0.000000 0 10 mmap
0.00 0.000000 0 1 access
------ ----------- ----------- --------- --------- ----------------
100.00 0.706957 1583 126 total
Isso, no entanto, parece muito semelhante quando tudo parece estar funcionando normalmente.
Em detalhes, enviei um arquivo strace aqui:
link
Tanto quanto eu posso dizer, quase todos os syscalls são chamadas de futex. Eu não tenho certeza do que aprender com isso.