我最近注意到一个奇怪的事情,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 数组中。
  • tf.Variable(a) 等价于 tf.Variable(tf.constant(a))。为了创建这个常量,Python 客户端将 900MB 的常量附加到 Python 运行时
  • 中的 Graph 对象
  • Session.run 触发 TF_ExtendGraph 将图形传输到 TensorFlow C 运行时,另一个 900MB
  • session 为 b tf.Variable 对象在 TensorFlow 运行时

  • 这将分配 3600MB 的内存。为了节省内存,你可以这样做
    a_holder = tf.placeholder(np.float32)
    b = tf.Variable(a_holder)
    sess.run(b.initializer, feed_dict={a_holder: np.arange(100000000)})
    

    TLDR;避免创建大常量。

    关于python - 使用常量初始化时,Tensorflow 使用太多内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46774127/

    10-12 22:07