Ricerca…


Usa Graph.finalize () per catturare i nodi che vengono aggiunti al grafico

La modalità più comune di utilizzare TensorFlow prevede innanzitutto la creazione di un grafico del flusso di dati degli operatori TensorFlow (come tf.constant() e tf.matmul() , quindi l' esecuzione dei passaggi chiamando il metodo tf.Session.run() in un ciclo (ad es. ciclo di allenamento).

Una fonte comune di perdite di memoria è il punto in cui il ciclo di allenamento contiene chiamate che aggiungono nodi al grafico e queste vengono eseguite in ogni iterazione, facendo crescere il grafico. Questi possono essere ovvi (ad esempio una chiamata a un operatore TensorFlow come tf.square() ), implicita (ad esempio una chiamata a una funzione della libreria TensorFlow che crea operatori come tf.train.Saver() ) o sottile (ad esempio una chiamata a un operatore sovraccarico su un tf.Tensor e un array NumPy, che chiama implicitamente tf.convert_to_tensor() e aggiunge un nuovo tf.constant() al grafico).

Il metodo tf.Graph.finalize() può aiutare a catturare le perdite in questo modo: contrassegna un grafico come di sola lettura e solleva un'eccezione se qualcosa viene aggiunto al grafico. Per esempio:

loss = ...
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    sess.graph.finalize()  # Graph is read-only after this statement.

    for _ in range(1000000):
        sess.run(train_op)
        loss_sq = tf.square(loss)  # Exception will be thrown here.
        sess.run(loss_sq)

In questo caso, l'operatore sovraccarico * tenta di aggiungere nuovi nodi al grafico:

loss = ...
# ...
with tf.Session() as sess:
    # ...
    sess.graph.finalize()  # Graph is read-only after this statement.
    # ...
    dbl_loss = loss * 2.0  # Exception will be thrown here.

Utilizzare l'allocatore tcmalloc

Per migliorare le prestazioni di allocazione della memoria, molti utenti di TensorFlow utilizzano spesso tcmalloc anziché l'implementazione malloc() predefinita, poiché tcmalloc subisce meno dalla frammentazione durante l'allocazione e la deallocazione di oggetti di grandi dimensioni (come molti tensori). Alcuni programmi TensorFlow ad alta intensità di memoria sono noti per filtrare lo spazio degli indirizzi heap (liberando tutti i singoli oggetti che usano) con il malloc() predefinito, ma sono stati eseguiti tcmalloc dopo il passaggio a tcmalloc . Inoltre, tcmalloc include un profiler di heap , che consente di rintracciare eventuali perdite rimanenti.

L'installazione di tcmalloc dipenderà dal tuo sistema operativo, ma i seguenti lavori su Ubuntu 14.04 (fidato) (dove script.py è il nome del tuo programma TensorFlow Python):

$ sudo apt-get install google-perftools4
$ LD_PRELOAD=/usr/lib/libtcmalloc.so.4 python script.py ...

Come notato sopra, il semplice passaggio a tcmalloc può risolvere molte perdite apparenti. Tuttavia, se l'utilizzo della memoria è ancora in crescita, è possibile utilizzare il profiler heap come segue:

$ LD_PRELOAD=/usr/lib/libtcmalloc.so.4 HEAPPROFILE=/tmp/profile python script.py ...

Dopo aver eseguito il comando precedente, il programma scriverà periodicamente i profili sul filesystem. La sequenza di profili sarà denominata:

  • /tmp/profile.0000.heap
  • /tmp/profile.0001.heap
  • /tmp/profile.0002.heap
  • ...

Puoi leggere i profili utilizzando lo strumento google-pprof , che (ad esempio, su Ubuntu 14.04) può essere installato come parte del pacchetto google-perftools . Ad esempio, per guardare la terza istantanea raccolta sopra:

$ google-pprof --gv `which python` /tmp/profile.0002.heap

Eseguendo il comando precedente apparirà una finestra GraphViz, che mostra le informazioni del profilo come un grafico diretto.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow