python - mac - Tensorflow asigna memoria GPU cuando usa tf.device(''/ cpu: 0'')
no matching distribution found for tensorflow (2)
Información del sistema : 1.1.0, GPU, Windows, Python 3.5, el código se ejecuta en las consolas ipython.
Estoy tratando de 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 la otra funciona.
El problema es que cuando with tf.device(''/cpu:0'')
la segunda sesión especificando with tf.device(''/cpu:0'')
la sesión intenta asignar memoria 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 obligo 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 explícitamente le digo al script que ignore cualquier dispositivo CUDA, aún los encuentra y los usa. ¿Podría ser esto un error de TF 1.1?
¿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 su memoria GPU para esta sesión en particular y, por lo tanto, su segunda sesión debería poder ejecutarse en GPU.
EDITAR: según esta respuesta , también debes probar esto:
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"]="-1"
Resulta que establecer CUDA_VISIBLE_DEVICES
en la cadena vacía no enmascara los dispositivos CUDA visibles para la secuencia de comandos.
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 los dispositivos cuyo índice precede al índice no válido son visibles para las aplicaciones CUDA . Por ejemplo, establecer CUDA_VISIBLE_DEVICES en 2,1 hace que el dispositivo 0 sea invisible y que el dispositivo 2 se enumere antes del dispositivo 1. Establecer 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 manejarse como "no existen dispositivos válidos", pero cambió el 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
]
y crear instancias de una tf.Session
ya no tf.Session
memoria de la GPU.