¿Por qué el valor de `tf.constant ()` se almacena varias veces en la memoria en TensorFlow?

Leí que (en TensorFlow):

el valor de un tf.constant() se almacena varias veces en la memoria.

¿Por qué el valor de un tf.constant() almacena varias veces en la memoria?

Porque los datos para un tensor constante están incrustados en la definición del gráfico. Esto significa que estos datos se almacenan tanto en el cliente, que mantiene la definición del gráfico, como en el tiempo de ejecución, que asigna su propia memoria para todos los tensores.

IE, prueba

 a = tf.constant([1,2]) tf.get_default_graph().as_graph_def() 

Verás

  dtype: DT_INT32 tensor_shape { dim { size: 2 } } tensor_content: "\001\000\000\000\002\000\000\000" } 

El campo tensor_content es el contenido sin procesar, igual que np.array([1,2], dtype=np.int32).tobytes() .

Ahora, para ver la asignación de tiempo de ejecución, puede ejecutar con la export TF_CPP_MIN_LOG_LEVEL=1 .

Si evalúas algo usando a verás algo como esto.

 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 } } } 

Esto significa que el tiempo de ejecución solicitó asignar 8 bytes, y TF asignó en realidad 256 bytes. (las opciones sobre la cantidad de datos a asignar realmente son algo arbitrarias en este momento – bfc_allocator.cc )

Tener constantes incrustadas en el gráfico facilita hacer algunas optimizaciones basadas en gráficos, como el plegado constante . Pero esto también significa que las constantes grandes son ineficientes. Además, el uso de constantes grandes es una causa común de exceder el límite de 2 GB para el tamaño del gráfico.

Se refieren al hecho de que al inicializar la constante, una copia de la constante se almacena como una matriz numpy y otra copia se almacena en tensorflow. Las dos copias existen mientras se está inicializando la constante.