Speicherverlust mit TensorFlow
Habe ich ein memory-leak mit TensorFlow. Ich refered zu Tensorflow : Memory leak auch während der Abschluss-Sitzung? zu Adresse mein Problem, und ich folgte den Ratschlägen der Antwort, das schien das problem gelöst haben. Aber es funktioniert hier nicht.
In Ordnung zu reproduzieren, ist das memory leak, die ich erstellt habe, ein einfaches Beispiel. Zunächst verwende ich diese Funktion (die ich hier bekam : Wie man die aktuelle CPU-und RAM-Verwendung in Python?) zu überprüfen Sie die Speicher-Nutzung der python-Prozess :
def memory():
import os
import psutil
pid = os.getpid()
py = psutil.Process(pid)
memoryUse = py.memory_info()[0]/2.**30 # memory use in GB...I think
print('memory use:', memoryUse)
Dann, jedes mal ich rufen Sie die build_model
Funktion, die Verwendung von Speicher erhöht.
Hier ist die build_model
Funktion, die ein Speicherleck hat :
def build_model():
'''Model'''
tf.reset_default_graph()
with tf.Graph().as_default(), tf.Session() as sess:
tf.contrib.keras.backend.set_session(sess)
labels = tf.placeholder(tf.float32, shape=(None, 1))
input = tf.placeholder(tf.float32, shape=(None, 1))
x = tf.contrib.keras.layers.Dense(30, activation='relu', name='dense1')(input)
x1 = tf.contrib.keras.layers.Dropout(0.5)(x)
x2 = tf.contrib.keras.layers.Dense(30, activation='relu', name='dense2')(x1)
y = tf.contrib.keras.layers.Dense(1, activation='sigmoid', name='dense3')(x2)
loss = tf.reduce_mean(tf.contrib.keras.losses.binary_crossentropy(labels, y))
train_step = tf.train.AdamOptimizer(0.004).minimize(loss)
#Initialize all variables
init_op = tf.global_variables_initializer()
sess.run(init_op)
sess.close()
tf.reset_default_graph()
return
Hätte ich gedacht, dass mit den block - with tf.Graph().as_default(), tf.Session() as sess:
und dann Schließung der Sitzung und aufrufen tf.reset_default_graph
würde alles löschen des Speichers durch TensorFlow. Anscheinend ist es nicht.
Den Speicherverlust kann neu erstellt werden, wie folgende :
memory()
build_model()
memory()
build_model()
memory()
Die Ausgabe ist (für meinen computer) :
memory use: 0.1794891357421875
memory use: 0.184417724609375
memory use: 0.18923568725585938
Offensichtlich können wir sehen, dass alle verwendeten Speichers TensorFlow ist nicht befreit danach. Warum?
I in Abhängigkeit der Nutzung von Speicher über 100 Iterationen der Aufruf build_model
, und das ist, was ich bekomme :
Ich denke, das geht zu zeigen, dass es ein memory leak.
- was ist die Fehlermeldung, die Sie erhalten ?
- Es gibt keine Fehlermeldung. Das Problem ist, dass die Speicher undicht ist jedes mal ich rufen Sie die Funktion
build_model
. - In der Grafik, was ist die X-Achse. Ist, dass wie bei der Ausführung dieses build_model für viele Iterationen?
- Ja genau. Es ist die Anzahl der Zeiten
build_model
genannt wurde. - Also, was passiert ist, es hält auch das hinzufügen von Speicher in jeder iteration. Und nicht frei, richtig?. Normalerweise TF laden alle Operationen in der Grafik und erst dann führen Sie Sie in einer Sitzung. Hier werden für jede iteration erstellen Sie eine neue Sitzung zu Recht?
- Ja, es hält mit mehr und mehr Speicher, ohne dass es anschließend wieder ein. Und ja, bei jeder iteration erstelle ich eine neue Sitzung und schließen Sie es dann. Ich nenne
tf.reset_default_graph
bei jeder iteration, die sollte Freisetzung verwendete Speicher von Tensorflow. - Sie haben nicht zu verwenden, sess.nahe() bei Verwendung der with-Anweisung. Und die einzige Sache, die Bewertung der ist-Variablen-Initialisierer Recht?
- Ja. Und ja du hast Recht ich nicht haben, um die Sitzung zu schließen.
- Lassen Sie uns weiterhin diese Diskussion im chat.
- Hast du eine Lösung für dieses problem? Ich habe das gleiche problem!!! @Syzygy
- Überprüfen Sie dies : github.com/tensorflow/tensorflow/issues/10408 in der Tat müssen Sie Tensorflow 1.12 und rufen Sie K. clear_session
Du musst angemeldet sein, um einen Kommentar abzugeben.
War das problem aufgrund Tensorflow version 0.11. Heute Tensorflow 0.12 raus ist und der Fehler behoben ist. Upgrade auf eine neuere version und es sollte funktionieren wie erwartet. Vergessen Sie nicht, rufen
tf.contrib.keras.backend.clear_session()
am Ende.tf.reset_default_graph
).Normalerweise das, was passiert ist, verwenden wir die Schleife außerhalb einer Sitzung. Ich denke, dass hier was passiert ist, zu jeder Zeit, die Sie hinzufügen, mehr und mehr Speicher-chunks, die beim ausführen dieser init_op = tf.global_variables_initializer().
Denn wenn die Schleife außerhalb der Sitzung es wird nur einmal initialisiert.
Was passiert hören ist, es ist immer das bekommen, initialisiert und behalten das im Gedächtnis.
Bearbeitung die Antwort da, noch haben Sie die Speicher-Problem
Die vielleicht die Grafik. Denn jedes mal, wenn Sie ein Diagramm erstellen, das wird halten Sie die Erinnerung.Versuchen Sie, entfernen Sie es und starten. Durch das entfernen wird es nehmen Sie Ihre alle Operationen als Standard-Diagramm. Ich glaube, Sie brauchen eine Art von Speicher-flush-Funktion außerhalb der tensorflow. denn jedes mal, wenn Sie dies ausführen, wird es stapeln sich ein Diagramm.
tf.global_variables_initializer()
ist nicht die Ursache des Problems. Sie können neu erstellen, die gleichen Speicher-Leck, auch wenn Sieinit_op = tf.global_variables_initializer()
undsess.run(init_op)
tf.reset_default_graph
schon, es ist in meiner Frage.Stand ich etwas ähnliches in TF 1.12 als gut.
Don ' T erstellen der Graphen und die Sitzung für jede iteration. Jedes mal, wenn das Diagramm erstellt wird und die Variablen initialisiert, Sie sind nicht die Neudefinition der alten Grafik, aber neue zu erstellen führt zu Speicherlecks. Ich war in der Lage, dieses Problem durch die Definition des Graphen einmal und dann vorbei an der Sitzung zu meinem iterative Logik.
Vom Wie nicht Programm Tensorflow
Finden Sie auch unter diese Super Antwort, besser zu verstehen.