2016-04-29 9 views
13

Ho eseguito la demo MNIST in TensorFlow con 2 livelli conv e un livello full-conect, ho ricevuto un messaggio che 'esaurito memeory cercando di allocare 2.59GiB' , ma mostra che la memoria totale è 4.69GiB, e la memoria libera è 3.22GiB, come può fermarsi con 2.59GiB? E con una rete più ampia, come posso gestire la memoria gpu? Mi interessa solo come utilizzare al meglio la memoria gpu e voglio sapere come è successo, non come pre-allocare la memoriaCome posso risolvere 'esaurito la memoria gpu' in TensorFlow

+0

Eventuali duplicati di [Come impedire tensorflow da assegnare la totalità di una memoria della GPU?] (Http: //stackoverflow.com/questions/34199233/how-to-prevent-tensorflow-from-allocating-the-totality-of-a-gpu-memory) –

+0

L'ho visto prima, ma si riferisce alla pre-allocazione della memoria gpu, non manca di memoria – Fangxin

risposta

7

Non si tratta di questo. prima di tutto puoi vedere quanta memoria ottiene quando viene eseguito monitorando la tua gpu. per esempio se hai una nvidia gpu puoi verificarla con il comando watch -n 1 nvidia-smi. Ma nella maggior parte dei casi se non hai impostato la frazione massima della memoria gpu, assegna quasi tutta la memoria libera. il tuo problema è la mancanza di memoria sufficiente per la tua gpu. le reti CNN sono totalmente pesanti. Quando stai cercando di alimentare la tua rete, NON farlo con tutti i tuoi dati. FARE questa procedura di alimentazione in lotti di piccole dimensioni.

+4

Ho una rete piuttosto grande (CNN + LSTM). I miei dati di input sono di dimensioni, batch_size = 5, (5x396x396) - è un volume 3D. Quindi una dimensione del lotto piuttosto piccola. Sono in esecuzione su una GTX 1070 con 8 GB di RAM, ma sto ancora esaurendo la memoria. Ci sono soluzioni alternative che conosci? Qualche tutorial che delinei soluzioni alternative? –

+0

Potrebbe non essere solo a causa delle dimensioni del batch. Stai usando una coda per creare batch di input (come 'tf.train.shuffle_batch')? In tal caso, verificare la capacità della coda. – Nandeesh

8

Ho riscontrato errori di memoria esauriti durante l'addestramento di una piccola CNN su una GTX 970. Attraverso un po 'di fortuna, ho scoperto che dire a TensorFlow di allocare memoria sulla GPU in base alle necessità (anziché in primo piano) risolveva tutti i miei problemi . Questo può essere realizzato utilizzando il seguente codice Python:

config = tf.ConfigProto() 
    config.gpu_options.allow_growth = True 
    sess = tf.Session(config = config) 

precedenza, tensorflow sarebbe pre-allocare ~ 90% della memoria GPU. Ma, per qualche motivo sconosciuto, questo in seguito avrebbe causato errori di memoria insufficienti quando avrei aumentato le dimensioni della rete. Utilizzando il codice precedente, non ho più errori OOM.

+0

Funziona sul mio script anche se sto usando keras – Hong

2

Per impostazione predefinita, TensorFlow esegue la mappatura di quasi tutte le memorie GPU di tutte le GPU (soggette a CUDA_VISIBLE_DEVICES) visibili al processo. Ciò viene fatto per utilizzare in modo più efficiente le risorse di memoria della GPU relativamente preziose sui dispositivi riducendo la frammentazione della memoria.

TensorFlow fornisce due opzioni di configurazione nella sessione per controllarlo.

Il primo è l'opzione allow_growth, che tenta di allocare memoria di sola GPU quanto basato su allocazioni runtime:

config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config, ...)

Il secondo metodo è l'opzione per_process_gpu_memory_fraction, che determina la frazione della quantità complessiva di memoria che ogni GPU visibile dovrebbe essere allocata. Ad esempio, si può dire tensorflow di destinare solo il 40% della memoria totale di ogni GPU:

config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.4 session = tf.Session(config=config, ...)