1. ホーム
  2. python

[解決済み] TensorFlowでのメモリリーク

2022-02-07 06:05:04

質問

TensorFlowでメモリリークが発生しました。参考にしたのは Tensorflow : セッションを閉じてもメモリリーク? という回答があり、そのアドバイスに従ったところ、問題が解決したようです。しかし、それはここでは動作しません。

メモリリークを再現するために、簡単な例を作ってみました。まず、この関数(ここで手に入れたものです。 Pythonで現在のCPUとRAMの使用率を取得するには? ) を使って、Python プロセスのメモリ使用量をチェックします。

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)

すると、呼び出すたびに build_model 関数を使用すると、メモリの使用量が増えます。

ここでは build_model 関数でメモリリークが発生しています。

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 

私は、ブロックの使用は with tf.Graph().as_default(), tf.Session() as sess: とし、次に セッションを閉じる 呼び出し tf.reset_default_graph は、TensorFlowが使用するすべてのメモリをクリアすることになります。どうやらそうではないようです。

メモリリークは以下のように再現できます。

memory()
build_model()
memory()
build_model()
memory()

これの出力は、(私のコンピュータの場合):

memory use: 0.1794891357421875
memory use: 0.184417724609375
memory use: 0.18923568725585938

明らかに、TensorFlowによって使用されたすべてのメモリが、その後解放されていないことがわかります。なぜでしょうか?

の呼び出しを100回繰り返し、メモリの使用量をプロットしてみました。 build_model そして、これが私の得たものです。

メモリリークがあることを示すことになると思うのですが。

解決方法は?

この問題はTensorflowのバージョン0.11に起因していました。今日現在、Tensorflow 0.12がリリースされ、このバグは解決されています。新しいバージョンにアップグレードすれば、期待通りに動作するはずです。を呼び出すことを忘れないでください。 tf.contrib.keras.backend.clear_session() を最後に追加してください。