Python 使用常量初始化时,Tensorflow使用太多内存
最近我注意到一件奇怪的事情,Tensorflow在初始化常量变量时似乎占用了太多内存。有人能帮我理解下面的例子吗Python 使用常量初始化时,Tensorflow使用太多内存,python,numpy,memory-management,tensorflow,Python,Numpy,Memory Management,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
$ 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])
- 您有900MB存储在numpy阵列中
- 变量(a)等价于变量(常数(a))。为了创建这个常量,Python客户端在Python运行时向Graph对象追加900MB常量
- Session.run触发TF_ExtendGraph,它将图形传输到另一个900MB的TensorFlow C运行时
- 会话为TensorFlow运行时中的
b
对象分配900MBtf.Variable
a_holder = tf.placeholder(np.float32)
b = tf.Variable(a_holder)
sess.run(b.initializer, feed_dict={a_holder: np.arange(100000000)})
TLDR;避免创建大常量。我不这么认为。你在说什么常数?哪一个内存增量是错误的?a是一个大小为100000000的常量numpy数组,我正在创建一个tensorflow变量b并将其设置为等于a,然后调用变量\初始化器()初始化b。a本身是762MB,b也是,我不明白TF是如何使用4GB内存的。
a
是一个大数组(它没有“常量”)b
是一个tf
对象,它显然复制了a的
数据。第9行还添加了该数据的3个“副本”——或者至少生成3个大小相似的对象。我不知道是初始值设定项
步骤还是运行
步骤实现了这一点;可能两者都有。我明白了,关键是它为什么会这样做,以及如何减少内存消耗?你知道会话.run
在做什么吗?你能解释一下吗?如果a
更小,我希望内存使用会更少。非常感谢!事实上,我刚刚阅读了您在一个稍微相关的GitHub问题中提供的解决方法,无论如何,这个答案比那个评论提供了更多的见解,而且我相信,对于将来搜索相同问题的人来说,它更容易访问。谢谢