python - TensorFlow 的内存泄漏

标签 python memory memory-leaks tensorflow keras

我在使用 TensorFlow 时出现内存泄漏。我引用了Tensorflow : Memory leak even while closing Session?为了解决我的问题,我遵循了答案的建议,这似乎已经解决了问题。但是,它在这里不起作用。

为了重现内存泄漏,我创建了一个简单的示例。首先,我使用这个函数(我在这里得到:How to get current CPU and RAM usage in Python?)来检查 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 

我会认为使用 block with tf.Graph().as_default(), tf.Session() as sess: 然后 关闭 session 调用 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 使用的所有内存在之后都没有被释放。为什么?

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

Memory use over 100 iterations

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

最佳答案

问题是由于 Tensorflow 版本 0.11 造成的。截至今天,Tensorflow 0.12 已经发布,并且该错误已解决。升级到较新的版本,它应该可以按预期工作。最后不要忘记调用 tf.contrib.keras.backend.clear_session()

关于python - TensorFlow 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44327803/

相关文章:

c++ - 在没有额外内存的情况下移动数组中的一系列元素?

Java - Full GC(垃圾收集器)在短时间内发生大量,导致性能下降

python - 如何从 stdin 读取输入并强制执行编码?

python - 我的生成系统不起作用,我不知道为什么

java - 线程中出现异常 "main"java.lang.OutOfMemoryError : Java heap space with BASE64Decoder

我可以用自己的内存分配一个字符指针吗?

swift - 从文件句柄读取数据在 Linux 上泄漏内存

python - 将 python 嵌入到我的应用程序中时出现内存泄漏

python - 如何克服 SVM 内存需求

python - 嵌套树 DataFrame reshape