我读过(在TensorFlow中):
a的值tf.constant()多次存储在内存中。
tf.constant()
为什么将值tf.constant()多次存储在内存中?
因为恒定张量的数据已嵌入到图定义中。这意味着这些数据既存储在维护图定义的客户端中,又存储在运行时中,为所有张量分配其自己的内存。
IE浏览器,尝试
a = tf.constant([1,2]) tf.get_default_graph().as_graph_def()
你会看到的
dtype: DT_INT32 tensor_shape { dim { size: 2 } } tensor_content: "\001\000\000\000\002\000\000\000" }
该tensor_content场是原始内容,一样的np.array([1,2], dtype=np.int32).tobytes()。
tensor_content
np.array([1,2], dtype=np.int32).tobytes()
现在,要查看运行时分配,可以使用运行export TF_CPP_MIN_LOG_LEVEL=1。
export TF_CPP_MIN_LOG_LEVEL=1
如果您使用进行任何评估a,都会看到类似的内容
a
2017-02-24 16:13:58: I tensorflow/core/framework/log_memory.cc:35] __LOG_MEMORY__ MemoryLogTensorOutput { step_id: 1 kernel_name: "Const_1/_1" tensor { dtype: DT_INT32 shape { dim { size: 2 } } allocation_description { requested_bytes: 8 allocated_bytes: 256 allocator_name: "cuda_host_bfc" allocation_id: 1 ptr: 8605532160 } } }
这意味着运行时要求分配8个字节,而TF实际上分配了256个字节。(目前实际分配多少数据的选择有些随意-bfc_allocator.cc)
将常量嵌入图形中使进行基于图形的优化(如常量折叠)变得更加容易。但这也意味着大常数是无效的。同样,使用大常量是导致图形大小超过2GB限制的常见原因。