Tensorflow:即使在关闭会话时也会发生内存泄漏?
Tensorflow : Memory leak even while closing Session?
当我意识到,即使我在 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 似乎也在尝试 "save" test2
...
TL;DR: 关闭会话不会释放 Python 程序中的 tf.Graph
数据结构,如果循环的每次迭代都添加图表的节点,你会有一个泄漏。
由于您的函数 feedForwardStep
创建了新的 TensorFlow 操作,并且您在 for
循环中调用了它,因此 是 您的代码中的漏洞 —尽管很微妙。
除非您另外指定(使用 with tf.Graph().as_default():
块),否则所有 TensorFlow 操作都将添加到全局默认图形中。这意味着每次调用 tf.constant()
、tf.matmul()
、tf.Variable()
等都会将对象添加到全局数据结构中。有两种方法可以避免这种情况:
构建您的程序,以便构建一次图形,然后使用 tf.placeholder()
ops 在每次迭代中输入不同的值。您在问题中提到这可能是不可能的。
在每个 for 循环中显式创建一个新图。如果图形的结构取决于当前迭代中可用的数据,这可能是必要的。您可以按如下方式执行此操作:
for step in xrange(200):
with tf.Graph().as_default(), tf.Session() as sess:
# Remainder of loop body goes here.
请注意,在此版本中,您不能使用之前迭代中的 Tensor
或 Operation
对象。 (例如,从您的代码片段中不清楚 test
来自哪里。)
当我意识到,即使我在 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 似乎也在尝试 "save" test2
...
TL;DR: 关闭会话不会释放 Python 程序中的 tf.Graph
数据结构,如果循环的每次迭代都添加图表的节点,你会有一个泄漏。
由于您的函数 feedForwardStep
创建了新的 TensorFlow 操作,并且您在 for
循环中调用了它,因此 是 您的代码中的漏洞 —尽管很微妙。
除非您另外指定(使用 with tf.Graph().as_default():
块),否则所有 TensorFlow 操作都将添加到全局默认图形中。这意味着每次调用 tf.constant()
、tf.matmul()
、tf.Variable()
等都会将对象添加到全局数据结构中。有两种方法可以避免这种情况:
构建您的程序,以便构建一次图形,然后使用
tf.placeholder()
ops 在每次迭代中输入不同的值。您在问题中提到这可能是不可能的。在每个 for 循环中显式创建一个新图。如果图形的结构取决于当前迭代中可用的数据,这可能是必要的。您可以按如下方式执行此操作:
for step in xrange(200): with tf.Graph().as_default(), tf.Session() as sess: # Remainder of loop body goes here.
请注意,在此版本中,您不能使用之前迭代中的
Tensor
或Operation
对象。 (例如,从您的代码片段中不清楚test
来自哪里。)