Tensorflow:即使在关闭会话时内存泄漏?

Posted

技术标签:

【中文标题】Tensorflow:即使在关闭会话时内存泄漏?【英文标题】:Tensorflow : Memory leak even while closing Session? 【发布时间】:2016-06-12 05:37:21 【问题描述】:

当我意识到,即使我在 for 循环中关闭当前会话,我的程序也会大大减慢,并且由于正在构建操作而导致内存泄漏,我只是在尝试一些四元数神经网络的东西。这是我的代码:

for step in xrange(0,200):#num_epochs * train_size // BATCH_SIZE):
338 
339         with tf.Session() as sess:
340 
341             offset = (BATCH_SIZE) % train_size
342             #print "Offset : %d" % offset
343 
344             batch_data = []
345             batch_labels = []
346             batch_data.append(qtrain[0][offset:(offset + BATCH_SIZE)])
347             batch_labels.append(qtrain_labels[0][offset:(offset + BATCH_SIZE)]
352             retour = sess.run(test, feed_dict=x: batch_data)
357 
358             test2 = feedForwardStep(retour, W_to_output,b_output)
367             #sess.close()

问题似乎来自test2 = feedForward(..)。我需要在执行一次retour 后声明这些操作,因为retour 不能是占位符(我需要遍历它)。没有这条线,程序运行得非常好,速度很快,而且没有内存泄漏。我不明白为什么即使我关闭会话,TensorFlow 似乎也试图“保存”test2...

【问题讨论】:

【参考方案1】:

TL;DR: 关闭会话并不会释放 Python 程序中的 tf.Graph 数据结构,如果循环的每次迭代都将节点添加到图表中,那么您就会有泄漏.

由于您的函数 feedForwardStep 创建了新的 TensorFlow 操作,并且您在 for 循环中调用它,那么您的代码中存在泄漏——尽管是一个微妙的泄漏。

除非您另行指定(使用 with tf.Graph().as_default(): 块),否则所有 TensorFlow 操作都将添加到全局默认图中。这意味着每次调用tf.constant()tf.matmul()tf.Variable() 等都会将对象添加到全局数据结构中。有两种方法可以避免这种情况:

    构建您的程序,以便您构建一次图形,然后使用 tf.placeholder() 操作在每次迭代中输入不同的值。您在问题中提到这可能是不可能的。

    在每个 for 循环中显式创建一个新图。如果图的结构取决于当前迭代中可用的数据,这可能是必要的。你可以这样做:

    for step in xrange(200):
        with tf.Graph().as_default(), tf.Session() as sess:
            # Remainder of loop body goes here.
    

    请注意,在此版本中,您不能使用先前迭代中的 TensorOperation 对象。 (例如,从您的代码 sn-p 中并不清楚test 的来源。)

【讨论】:

谢谢!我会尝试你的第二个命题,测试是我可以在 for 循环之外定义的一个操作(正如你在 1 点中所建议的那样)。 不幸的是,我得到了一个不错的“会话图是空的。在调用 run() 之前向图中添加操作”使用 tf.Graph.as_default() 此解决方案不适用于 tensorflow 1.4,另请参阅此错误报告:github.com/tensorflow/tensorflow/issues/10408

以上是关于Tensorflow:即使在关闭会话时内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

VS 继续调试会话意味着内存泄漏,关闭应用程序后?

如何使用 django 保持 tensorflow 会话在内存中运行

Tensorflow.js 中的内存泄漏:如何清理未使用的张量?

Android内存泄漏的预防

关闭会话后运行 TensorFlow 模型测试数据

Flutter - 关闭小部件时 BLoC 流实例会导致内存泄漏吗?