Por que os RNNs de treinamento não usam 100% da GPU?

8

Eu me pergunto por que o treinamento de RNNs normalmente não usa 100% da GPU.

Por exemplo, se eu executar esse benchmark RNN em um Maxwell Titan X no Ubuntu 14.04.4 LTS x64, a utilização da GPU será inferior a 90%:

insira a descrição da imagem aqui

O benchmark foi lançado usando o comando:

python rnn.py -n 'fastlstm' -l 1024 -s 30 -b 128

Como posso diagnosticar qual é o gargalo?

Franck Dernoncourt
fonte

Respostas:

5

Recebo essa mesma taxa de utilização quando treino modelos usando o Tensorflow. O motivo é bem claro no meu caso: estou escolhendo manualmente um lote aleatório de amostras e chamando a otimização para cada lote separadamente.

Isso significa que cada lote de dados está na memória principal, é copiado na memória da GPU onde está o restante do modelo, a propagação / atualização e a atualização / retrocesso são executadas na gpu, e a execução é devolvida ao meu código, onde eu pego outro lote e ligue para otimizar.

Existe uma maneira mais rápida de fazer isso se você passar algumas horas configurando o Tensorflow para fazer carregamento em lote em paralelo a partir de registros TF pré-preparados.

Sei que você pode ou não estar usando o tensorflow sob keras, mas, como minha experiência tende a produzir números de utilização muito semelhantes, estou tentando sugerir que existe um nexo de causalidade razoavelmente provável a partir dessas correlações. Se sua estrutura estiver carregando cada lote da memória principal na GPU sem a eficiência / complexidade adicional do carregamento assíncrono (com o qual a própria GPU pode lidar), esse seria um resultado esperado.

davidparks21
fonte
Essa também é minha suspeita, você sabe como monitorar o uso do barramento PCI Express no Linux com CLI ?
Franck Dernoncourt
Não posso dizer que já pensei em tentar monitorar isso, mas você me deixou curioso agora.
precisa
Eu sempre recebo cerca de 90% com keras também. Eu nunca verifiquei seu código-fonte, mas esperaria que uma estrutura como essa alimentasse lotes para a gpu em paralelo (pelo menos opcionalmente, se você pode pagar a memória ... por que não deveria?).
stmax
1
Keras é um invólucro em torno do Tensorflow ou Theano. Eu tenho apenas experiência no Tensorflow, portanto, falando dessa perspectiva, o processo necessário para ativar o carregamento assíncrono de dados exige que você pré-processe os dados em um formato binário específico do Tensorflow. Suponho que o Theano tenha uma maneira equivalente de fazer isso. A maioria dos modelos provavelmente começa com o carregamento da memória por lote (faça-o funcionar antes de otimizar a velocidade). E como o regulamento da Keras é "mantenha as coisas simples", pode não ser inesperado que eles adotem a abordagem mais direta / simples para apenas uma perda de ~ 10% em eficiência.
Davidparks21