2017-10-16 41 views
1

我最近注意到一件奇怪的事情,Tensorflow似乎在用常量初始化变量时使用了太多的内存。有人能帮我理解下面的例子吗?当使用常量初始化时,Tensorflow使用太多的内存

$ python -m memory_profiler test.py 
[0 1 2 3 4 5 6 7 8 9] 
Filename: test.py 

Line # Mem usage Increment Line Contents 
================================================ 
4 144.531 MiB 0.000 MiB @profile 
5        def go(): 
6 907.312 MiB 762.781 MiB a = np.arange(100000000) 
7 910.980 MiB 3.668 MiB s = tf.Session() 
8 1674.133 MiB 763.152 MiB b = tf.Variable(a) 
9 3963.000 MiB 2288.867 MiB s.run(tf.variables_initializer([b])) 
10 3963.145 MiB 0.145 MiB print(s.run(b)[:10]) 
+0

我不关注。你在谈论什么'常量'?哪个内存增量错了? – hpaulj

+0

a是一个大小为100000000的常数numpy数组,我创建一个tensorflow变量b并将其设置为a,并调用variables_initializer()来初始化b。 a本身是762 MB,b也是,我不明白的是TF最终如何使用4GB内存。 –

+0

'a'是一个大型数组(关于它没有任何'常数')。 'b'是一个'tf'对象,显然是复制'a's'数据。第9行也添加了该数据的3个“副本” - 或者至少可以创建3个相似大小的对象。我不知道它是'initializer'步骤还是'run'步骤;也许都是。 – hpaulj

回答

2
  • 你必须存放在数组numpy的900MB。 (a)相当于tf.Variable(tf.constant(a))。为了创建该常数,Python客户端追加900MB常数图形对象在Python运行时
  • Session.run触发TF_ExtendGraph该图表TensorFlow C运行时传送,另一个900MB
  • 会话中运行时TensorFlow btf.Variable对象分配900MB

这使得3600MB的内存分配。为了节省内存,你可以这样做,而不是

a_holder = tf.placeholder(np.float32) 
b = tf.Variable(a_holder) 
sess.run(b.initializer, feed_dict={a_holder: np.arange(100000000)}) 

TLDR;避免创建大的常量。

+0

非常感谢!事实上,我只是阅读了你在一个稍微相关的GitHub问题中提供的同样的解决方法,无论如何,这个答案提供了比该评论更多的洞察力,再加上我相信未来人们更容易找到同样的问题。谢谢! –