Prevedere i requisiti di memoria della CPU e della GPU dell'allenamento DNN


10

Supponiamo che io abbia un'architettura di modello di deep learning, nonché una dimensione mini-batch scelta. Come posso derivare da questi i requisiti di memoria previsti per l'addestramento di quel modello?

Ad esempio, si consideri un modello (non ricorrente) con input di dimensione 1000, 4 layer nascosti completamente connessi di dimensione 100 e un layer di output aggiuntivo di dimensione 10. La dimensione mini-batch è di 256 esempi. Come si determina il footprint di memoria approssimativa (RAM) del processo di training sulla CPU e sulla GPU? Se fa qualche differenza, supponiamo che il modello sia addestrato su una GPU con TensorFlow (usando quindi cuDNN).

Risposte:


3

La risposta di @ik_vision descrive come stimare lo spazio di memoria necessario per memorizzare i pesi, ma è anche necessario memorizzare le attivazioni intermedie, e specialmente per le reti convoluzionali che lavorano con dati 3D, questa è la parte principale della memoria necessaria.

Per analizzare il tuo esempio:

  1. L'input richiede 1000 elementi
  2. Dopo i livelli 1-4, hai 100 elementi, 400 in totale
    1. Dopo il livello finale hai 10 elementi

In totale per 1 campione sono necessari 1410 elementi per il passaggio in avanti. Ad eccezione dell'input, sono necessarie anche informazioni sul gradiente per ciascuna di esse per il passaggio all'indietro, ovvero 410 in più, per un totale di 1820 elementi per campione . Moltiplicare per la dimensione del lotto per ottenere 465 920.

Ho detto "elementi", perché la dimensione richiesta per elemento dipende dal tipo di dati utilizzato. Per una precisione singola float32è di 4B e la memoria totale necessaria per archiviare i BLOB di dati sarà di circa 1,8 MB.


1

Vedo due opzioni:

  1. La rete viene caricata dal disco
  2. La rete viene creata al volo

In entrambi i casi la dimensione della memoria nella GPU deve essere moltiplicata per la dimensione Batch poiché la maggior parte della rete viene copiata per ciascun campione.

Regola empirica se caricata dal disco: se il DNN richiede X MB sul disco, la rete sarà 2X nella memoria GPU per la dimensione batch 1.

La rete viene creata al volo per la dimensione batch 1: conta il parametro e moltiplica per 4 byte (float32 bit): conta manualmente il numero del parametro: fc1: 1000x100 (pesi) + 100 (bias) fc2: 100x100 (pesi) + 100 (bias) fc3: 100x100 (pesi) + 100 (bias) fc4: 100x100 (pesi) + 100 (bias) output: 100x10 (pesi) + 10 (bias)

Contando il numero di Parameter usando Keras: model.count_params ()


3
Per quanto ne so, ciò fornisce i requisiti di memoria per la memorizzazione dei pesi stessi , ma ignora qualsiasi memoria dedicata alla memorizzazione di tutto ciò che è strettamente necessario per l'allenamento , come i gradienti. È necessario memorizzare i gradienti, ad esempio per implementare lo slancio. mi sto perdendo?
Whaa,

1
@Whaa questo è corretto, per un allenamento normale hai bisogno di memoria per memorizzare i pesi, le attivazioni nel passaggio in avanti e i gradienti nel passaggio di propagazione posteriore (3 volte la memoria anche senza impulso).
mjul

@mjul i miei esperimenti mostrano una stima di ik_vision 4.5x. Capisco la logica alla base del 3x ma non sono sicuro del perché in pratica stia utilizzando 4.5x. Devono esserci altri overhead di Keras / TF ??
Wes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.