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 :

Speicherverlust mit TensorFlow

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

InformationsquelleAutor Syzygy | 2017-06-02
Schreibe einen Kommentar