O desempenho da máquina cai com o tempo até a reinicialização

3

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.

    
por fat-lobyte 07.06.2016 / 21:38

1 resposta

1

Por enquanto, meu problema parece ter sido atenuado.

Eu fiz isso instalando o pacote libgoogle-perftools-dev e iniciando cada execução com:

LD_PRELOAD="/usr/lib/libmalloc.so"

Isso garantiu um desempenho muito mais estável, e eu não tive uma desaceleração singular desde então.

Portanto, aparentemente, o alocador GLIBC está tendo dificuldade em coletar lixo por períodos prolongados.

Quanto ao motivo pelo qual meu problema pareceu persistir nas invocações: não sei. Há uma certa chance, que interpretei mal meus resultados e que os processos diminuíram de forma independente um do outro.

De qualquer forma, executando meu código por mais de uma semana com o novo alocador e não tendo uma única lentidão, eu chamaria esse problema de resolvido.

    
por 12.08.2016 / 11:00