Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用常量初始化时,Tensorflow使用太多内存_Python_Numpy_Memory Management_Tensorflow - Fatal编程技术网

Python 使用常量初始化时,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

最近我注意到一件奇怪的事情,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])
  • 您有900MB存储在numpy阵列中
  • 变量(a)等价于变量(常数(a))。为了创建这个常量,Python客户端在Python运行时向Graph对象追加900MB常量
  • Session.run触发TF_ExtendGraph,它将图形传输到另一个900MB的TensorFlow C运行时
  • 会话为TensorFlow运行时中的
    b
    tf.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;避免创建大常量。

我不这么认为。你在说什么常数?哪一个内存增量是错误的?a是一个大小为100000000的常量numpy数组,我正在创建一个tensorflow变量b并将其设置为等于a,然后调用变量\初始化器()初始化b。a本身是762MB,b也是,我不明白TF是如何使用4GB内存的。
a
是一个大数组(它没有“常量”)
b
是一个
tf
对象,它显然复制了
a的
数据。第9行还添加了该数据的3个“副本”——或者至少生成3个大小相似的对象。我不知道是
初始值设定项
步骤还是
运行
步骤实现了这一点;可能两者都有。我明白了,关键是它为什么会这样做,以及如何减少内存消耗?你知道
会话.run
在做什么吗?你能解释一下吗?如果
a
更小,我希望内存使用会更少。非常感谢!事实上,我刚刚阅读了您在一个稍微相关的GitHub问题中提供的解决方法,无论如何,这个答案比那个评论提供了更多的见解,而且我相信,对于将来搜索相同问题的人来说,它更容易访问。谢谢