Prevendo requisitos de memória de CPU e GPU do treinamento DNN

9

Digamos que eu tenha uma arquitetura de modelo de aprendizado profundo, bem como um tamanho de minilote escolhido. Como derivar desses requisitos de memória esperados para o treinamento desse modelo?

Como exemplo, considere um modelo (não recorrente) com entrada da dimensão 1000, 4 camadas ocultas totalmente conectadas da dimensão 100 e uma camada de saída adicional da dimensão 10. O tamanho do mini lote é de 256 exemplos. Como se determina a pegada de memória aproximada (RAM) do processo de treinamento na CPU e na GPU? Se isso fizer alguma diferença, vamos supor que o modelo seja treinado em uma GPU com TensorFlow (portanto, usando cuDNN).

Whaa
fonte

Respostas:

2

A resposta de @ik_vision descreve como estimar o espaço de memória necessário para armazenar os pesos, mas você também precisa armazenar as ativações intermediárias e, especialmente para redes convolucionais que trabalham com dados 3D, essa é a parte principal da memória necessária.

Para analisar seu exemplo:

  1. A entrada precisa de 1000 elementos
  2. Após as camadas 1 a 4, você tem 100 elementos, 400 no total
    1. Após a camada final, você tem 10 elementos

No total, para 1 amostra, você precisa de 1410 elementos para o passe para frente. Exceto pela entrada, você também precisa de informações de gradiente sobre cada uma delas para retroceder, ou seja, 410 a mais, totalizando 1820 elementos por amostra . Multiplique pelo tamanho do lote para obter 465 920.

Eu disse "elementos", porque o tamanho exigido por elemento depende do tipo de dados usado. Para precisão única float32, é 4B e a memória total necessária para armazenar os blobs de dados será de cerca de 1,8 MB.

Jan Kukacka
fonte
1

Eu vejo duas opções:

  1. A rede é carregada do disco
  2. A rede é criada em tempo real

Nos dois casos, o tamanho da memória na GPU precisa ser multiplicado pelo tamanho do lote, pois a maioria da rede é copiada para cada amostra.

Regra geral, se carregada do disco: se o DNN ocupar X MB no disco, a rede estará 2X na memória da GPU para o tamanho do lote 1.

A rede é criada dinamicamente para o tamanho do lote 1: conte o parâmetro e multiplique por 4 bytes (float32 bits): contando o número de parâmetros manualmente: fc1: 1000x100 (pesos) + 100 (preconceitos) fc2: 100x100 (pesos) + 100 (polarizações) fc3: 100x100 (pesos) + 100 (polarizações) fc4: 100x100 (pesos) + 100 (polarizações) saída: 100x10 (pesos) + 10 (polarizações)

Contando o número de Parâmetros usando Keras: model.count_params ()

ik_vision
fonte
3
Pelo que sei, isso fornece os requisitos de memória para o armazenamento dos pesos , mas ignora qualquer memória dedicada ao armazenamento de qualquer coisa necessária estritamente para o treinamento , como os gradientes. É necessário armazenar os gradientes, por exemplo, para implementar o momento. estou faltando?
Whaa 21/07
11
@O que está correto, para o treinamento normal, você precisa de memória para armazenar os pesos, as ativações no passe para frente e os gradientes no passe de propagação traseira (3x a memória, mesmo sem impulso).
Mjul 12/12/19
@mjul minhas experiências mostram a estimativa de 4,5x ik_vision. Entendo o raciocínio por trás do 3x, mas não sei por que, na prática, ele usa 4,5x. Deve haver outra sobrecarga de Keras / TF ??
Wes