使用TensorFlow进行内存泄漏

Syz*_*ygy 14 python memory memory-leaks keras tensorflow

我有TensorFlow的内存泄漏.我提到Tensorflow:即使在关闭Session时内存泄漏?为了解决我的问题,我按照答案的建议,似乎解决了这个问题.但它在这里不起作用.

为了重新创建内存泄漏,我创建了一个简单的例子.首先,我使用这个函数(我在这里:如何在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)
Run Code Online (Sandbox Code Playgroud)

然后,每次调用该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 
Run Code Online (Sandbox Code Playgroud)

我原本以为使用块with tf.Graph().as_default(), tf.Session() as sess:然后关闭会话调用tf.reset_default_graph将清除TensorFlow使用的所有内存.显然它没有.

内存泄漏可以重新创建如下:

memory()
build_model()
memory()
build_model()
memory()
Run Code Online (Sandbox Code Playgroud)

这个的输出是(对于我的电脑):

memory use: 0.1794891357421875
memory use: 0.184417724609375
memory use: 0.18923568725585938
Run Code Online (Sandbox Code Playgroud)

很明显,我们可以看到TensorFlow使用的所有内存都没有被释放.为什么?

我在100次迭代调用中绘制了内存的使用build_model,这就是我得到的:

内存使用超过100次迭代

我认为这表明存在内存泄漏.

Syz*_*ygy 4

该问题是由于 Tensorflow 版本 0.11 引起的。截至今天,Tensorflow 0.12 已发布,该错误已解决。升级到较新的版本,它应该按预期工作。tf.contrib.keras.backend.clear_session()最后别忘了打电话。

  • 新版本中问题仍然存在:/sf/ask/3758101581/ (3认同)