Tensorflow asigna memoria GPU cuando se usa tf.device (‘/ cpu: 0’)

Información del sistema : 1.1.0, GPU, Windows, Python 3.5, el código se ejecuta en consolas ipython.

Estoy intentando ejecutar dos sesiones diferentes de Tensorflow, una en la GPU (que hace un trabajo por lotes) y otra en la CPU que uso para pruebas rápidas mientras que la otra funciona.

El problema es que cuando engendro la segunda sesión especificando with tf.device('/cpu:0') la sesión intenta asignar memoria de GPU y bloquea mi otra sesión.

Mi código:

 import os os.environ["CUDA_VISIBLE_DEVICES"] = "" import time import tensorflow as tf with tf.device('/cpu:0'): with tf.Session() as sess: # Here 6 GBs of GPU RAM are allocated. time.sleep(5) 

¿Cómo fuerzo a Tensorflow a ignorar la GPU?

ACTUALIZAR:

Como sugerí en un comentario de @Nicolas, eché un vistazo a esta respuesta y corrí

 import os os.environ["CUDA_VISIBLE_DEVICES"] = "" import tensorflow as tf from tensorflow.python.client import device_lib print(device_lib.list_local_devices()) 

que imprime:

 [name: "/cpu:0" device_type: "CPU" memory_limit: 268435456 locality { } incarnation: 2215045474989189346 , name: "/gpu:0" device_type: "GPU" memory_limit: 6787871540 locality { bus_id: 1 } incarnation: 13663872143510826785 physical_device_desc: "device: 0, name: GeForce GTX 1080, pci bus id: 0000:02:00.0" ] 

Me parece que incluso si le digo explícitamente al script que ignore los dispositivos CUDA, todavía los encuentra y los usa. ¿Podría ser esto un error de TF 1.1?

Resulta que la configuración de CUDA_VISIBLE_DEVICES en la cadena vacía no enmascara los dispositivos CUDA visibles para el script.

De la documentación de CUDA_VISIBLE_DEVICES (énfasis agregado por mí):

Solo los dispositivos cuyo índice está presente en la secuencia son visibles para las aplicaciones CUDA y se enumeran en el orden de la secuencia. Si uno de los índices no es válido, solo las aplicaciones CUDA pueden ver los dispositivos cuyo índice precede al índice no válido . Por ejemplo, la configuración de CUDA_VISIBLE_DEVICES en 2,1 hace que el dispositivo 0 sea invisible y el dispositivo 2 se enumere antes que el dispositivo 1. La configuración de CUDA_VISIBLE_DEVICES en 0,2, -1,1 hace que los dispositivos 0 y 2 sean visibles y el dispositivo 1 sea invisible .

Parece que la cadena vacía solía ser manejada como “no existen dispositivos válidos” pero cambió de significado, ya que no se menciona en la documentación.

Cambiar el código a os.environ["CUDA_VISIBLE_DEVICES"] = "-1" soluciona el problema. Corriendo

 import os os.environ["CUDA_VISIBLE_DEVICES"]="-1" import tensorflow as tf from tensorflow.python.client import device_lib print(device_lib.list_local_devices()) 

ahora imprime

 [name: "/cpu:0" device_type: "CPU" memory_limit: 268435456 locality { } incarnation: 14097726166554667970 ] 

e instanciar una tf.Session ya no tf.Session memoria de la GPU.

¿Te importaría probar una de estas opciones de configuración?

 config = tf.ConfigProto() config.gpu_options.allow_growth = True # or config.gpu_options.per_process_gpu_memory_fraction = 0.0 with tf.Session(config=config) as sess: ... 

Según la documentación , debería ayudarlo a administrar la memoria de su GPU para esta sesión en particular y así su segunda sesión debería poder ejecutarse en la GPU.

EDITAR: de acuerdo con esta respuesta también debe intentar esto:

 import os os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"]="-1"