使用TensorFlow进行内存泄漏

时间:2017-06-02 11:27:57

标签: 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 

我原以为使用块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使用的所有内存都没有被释放。为什么呢?

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

Memory use over 100 iterations

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

5 个答案:

答案 0 :(得分:2)

问题是由Tensorflow版本0.11引起的。截至今天,Tensorflow 0.12已经淘汰,错误已经解决。升级到更新版本,它应该按预期工作。不要忘记最后致电tf.contrib.keras.backend.clear_session()

答案 1 :(得分:2)

我有同样的问题。我正在训练的LSTM模型中,每个EPOCH的Tensorflow(v2.0.0)消耗约0.3GB。我发现tensorflow回调钩子是主要的罪魁祸首。我删除了tensorboard回调,之后效果很好

history = model.fit(
        train_x,
        train_y,
        epochs=EPOCHS,
        batch_size=BATCH_SIZE,
        validation_data=(test_x, test_y)
        ,callbacks=[tensorboard, checkpoint]
)

答案 2 :(得分:0)

通常情况是我们在会话之外使用循环。我想在这里发生的事情是每次在运行 init_op = tf.global_variables_initializer()时添加越来越多的内存块。 因为如果循环在会话之外,它将只被初始化一次。 听到的是它总是被初始化并将其保存在内存中。

编辑答案,因为您仍有内存问题

可能是图表。因为每次你将创建一个将保存内存的图形。尝试删除它并运行。删除它会将您的所有操作作为默认图形。我认为你需要在tensorflow之外使用某种内存刷新功能。因为每次运行时都会叠加图形。

答案 3 :(得分:0)

我在TF 1.12中也遇到了类似的问题。 不要为每次迭代创建图和会话。每次创建图并初始化变量时,您不是在重新定义旧图,而是创建新图导致内存泄漏。我可以通过定义一次图形然后将会话传递给我的迭代逻辑来解决这个问题。

来自How not program Tensorflow

  
      
  • 当您创建操作时,请注意,仅创建所需的操作。尝试使操作创建与操作执行保持不同
  •   
  • 尤其是如果您仅使用默认图形并在常规REPL或笔记本中交互运行,则图形中可能会出现很多废弃的操作。每次重新运行定义任何图形操作的笔记本单元时,您不仅在重新定义操作,还创建了新的操作。
  •   

此外,请参见this很好的答案,以更好地理解。

答案 4 :(得分:0)

此内存泄漏问题已在最新的稳定版本Tensorflow 1.15.0中得到解决。我运行了问题中的代码,发现几乎没有泄漏,如下所示。最新稳定版本的TF1.15和TF2.0在性能上有很多改进。

memory use: 0.4033699035644531
memory use: 0.4062042236328125
memory use: 0.4088172912597656

请检查colab gist here。谢谢!