一尘不染

为什么`tf.constant()`的值在TensorFlow的内存中多次存储?

python

读过(在TensorFlow中):

a的值tf.constant()多次存储在内存中。

为什么将值tf.constant()多次存储在内存中?


阅读 223

收藏
2021-01-20

共1个答案

一尘不染

因为恒定张量的数据已嵌入到图定义中。这意味着这些数据既存储在维护图定义的客户端中,又存储在运行时中,为所有张量分配其自己的内存。

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()

现在,要查看运行时分配,可以使用运行export TF_CPP_MIN_LOG_LEVEL=1

如果您使用进行任何评估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限制的常见原因。

2021-01-20