2016年6月的一篇git问题(https://github.com/tensorflow/tensorflow/issues/1727)指出存在以下问题:
目前GPUDevice中的内存分配器属于ProcessState,它本质上是一个全局单例。使用GPU的第一个会话初始化它,并在进程关闭时释放自己。
因此,唯一的解决方法是在计算后使用进程并关闭它们。
示例代码:
import tensorflow as tf
import multiprocessing
import numpy as np
def run_tensorflow():
n_input = 10000
n_classes = 1000
def multilayer_perceptron(x, weight):
layer_1 = tf.matmul(x, weight)
return layer_1
weights = tf.Variable(tf.random_normal([n_input, n_classes]))
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes])
pred = multilayer_perceptron(x, weights)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(100):
batch_x = np.random.rand(10, 10000)
batch_y = np.random.rand(10, 1000)
sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y})
print "finished doing stuff with tensorflow!"
if __name__ == "__main__":
p = multiprocessing.Process(target=run_tensorflow)
p.start()
p.join()
raw_input()
run_tensorflow()
raw_input()
如果你在创建的进程中调用函数run_tensorflow()
并关闭该进程(选项1),则会释放内存。如果仅运行run_tensorflow()
(选项2),则在函数调用后不会释放内存。
with
将Session作为上下文)也应该可以工作,不是吗? - etarionwith ... sess:
并尝试过sess.close()
。GPU内存并没有被清除,清除默认图并重新构建它似乎并不起作用。也就是说,即使在模型之间放置10秒的暂停,我也看不到nvidia-smi
上GPU内存被清除。这并不一定意味着tensorflow在幕后没有正确处理事情,只是保持其内存分配不变。但我在验证这种推理时遇到了麻烦。 - David Parksnvidia-smi
不能正确报告可供 TensorFlow 使用的内存量。当 TensorFlow 计算释放内存时,它仍会显示为被外部工具所占用,但此内存可供 TensorFlow 中的其他计算使用。 - Yaroslav Bulatov