¿Se puede obligar a Keras con el backend de Tensorflow a usar CPU o GPU a voluntad?

96

Tengo Keras instalado con el backend de Tensorflow y CUDA. A veces me gustaría obligar a Keras a usar la CPU a pedido. ¿Se puede hacer esto sin instalar un Tensorflow solo para CPU en un entorno virtual? ¿Si es así, cómo? Si el backend fuera Theano, las banderas podrían establecerse, pero no he oído hablar de las banderas de Tensorflow accesibles a través de Keras.

mikal94305
fuente

Respuestas:

102

Si quieres forzar a Keras a usar la CPU

Camino 1

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

antes de que se importe Keras / Tensorflow.

Camino 2

Ejecute su script como

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Ver también

  1. https://github.com/keras-team/keras/issues/152
  2. https://github.com/fchollet/keras/issues/4613
Martín Thoma
fuente
19
No funcionó para mí (Keras 2, Windows) - tuve que configurar os.environ['CUDA_VISIBLE_DEVICES'] = '-1'como en una respuesta a continuación
desertnaut
3
¿A qué tema se refiere el número 152? Un enlace estaría bien.
Martin R.
No veo ninguna referencia CUDA_DEVICE_ORDER=PCI_BUS_IDen el número 152
Deshielo
Estoy en una terminal ipython3 y lo configuré import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , ¿cómo puedo "deshacer" esto? Me gustaría que Keras volviera a usar la GPU.
Gabriel C
1
@Gabriel C: lo deshaces borrando esas líneas.
Martin Thoma
68

Una forma bastante separable de hacer esto es usar

import tensorflow as tf
from keras import backend as K

num_cores = 4

if GPU:
    num_GPU = 1
    num_CPU = 1
if CPU:
    num_CPU = 1
    num_GPU = 0

config = tf.ConfigProto(intra_op_parallelism_threads=num_cores,
                        inter_op_parallelism_threads=num_cores, 
                        allow_soft_placement=True,
                        device_count = {'CPU' : num_CPU,
                                        'GPU' : num_GPU}
                       )

session = tf.Session(config=config)
K.set_session(session)

Aquí, con booleans GPUy CPU, indicamos si nos gustaría ejecutar nuestro código con la GPU o la CPU definiendo rígidamente la cantidad de GPU y CPU a las que se permite acceder a la sesión de Tensorflow. Las variables num_GPUy num_CPUdefinen este valor. num_coresluego establece el número de núcleos de CPU disponibles para su uso mediante intra_op_parallelism_threadsyinter_op_parallelism_threads .

La intra_op_parallelism_threadsvariable dicta el número de subprocesos que se permite utilizar (intra) una operación paralela en un solo nodo en el gráfico de cálculo. Mientras que la inter_ops_parallelism_threadsvariable define el número de subprocesos accesibles para operaciones paralelas a través de los nodos del gráfico de cálculo (inter).

allow_soft_placement permite que se ejecuten operaciones en la CPU si se cumple alguno de los siguientes criterios:

  1. no hay implementación de GPU para la operación

  2. no hay dispositivos GPU conocidos o registrados

  3. existe la necesidad de coubicar con otras entradas de la CPU

Todo esto se ejecuta en el constructor de mi clase antes que cualquier otra operación, y es completamente separable de cualquier modelo u otro código que utilice.

Nota: Esto requiere tensorflow-gpuy cuda/cudnn para ser instalado porque se da la opción de usar una GPU.

Refs:

RACKGNOME
fuente
1
Esta es una buena solución, ya que simplemente definir "CUDA_VISIBLE_DEVICES" provoca CUDA_ERROR_NO_DEVICE seguido de muchos diagnósticos antes de continuar con la ejecución en la CPU. Aunque ... ¡ambos métodos funcionan!
jsfa11
1
Esta es la única solución consistente que me funciona. Sigue volviendo a eso.
Authman Apatira
1
¿Puede explicar qué significan los otros parámetros? como allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN
son las inter/ se intra_op_parallelism_threadsrefieren a las operaciones de CPU o GPU?
bluesummers
1
@bluesummers Pertenecen a la paralelización de CPU
RACKGNOME
57

Esto funcionó para mí (win10), coloque antes de importar keras:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Neuroléptico
fuente
que hace esto
kRazzy R
4
Con Win, obliga a TF a usar la CPU e ignorar cualquier GPU. No tuve suerte con 0 o en blanco, pero -1 pareció hacer el truco.
Neuraleptic
1
Trabajó en Win10 x64 para mí. Tampoco tuve suerte en ganar 0 o en blanco y solo -1 funcionó.
Cypher
4
Funcionó para mí en Ubuntu
TripleS
Tengo dos GPU en mi máquina, la configuración de 'CUDA_VISIBLE_DEVICES' = 0/1 se refiere a la identificación física de las GPU disponibles. Establecerlo en -1 usa CPU.
Prashanth Muthurajaiah
30

Simplemente importe tensortflow y use keras, es así de fácil.

import tensorflow as tf
# your code here
with tf.device('/gpu:0'):
    model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)
harshlal028
fuente
2
La mejor respuesta aquí
xssChauhan
5
Cuando configuré tf.device('/cpu:0'), aún podía ver que la memoria se asignaba a Python más tarde con nvidia-smi.
CMCDragonkai
@CMCDragonkai ¿Resolverlo o no ^ _ ^?
lhdgriver
4
No parece funcionar para mí tampoco, todavía usa gpu cuando lo configuro para usar cpu
liyuan
¿No debería ejecutarse también la definición y compilación del modelo bajo el mismo with?
matt525252
22

Según el tutorial de Keras , simplemente puede usar el mismo tf.devicealcance que en tensorflow regular:

with tf.device('/gpu:0'):
    x = tf.placeholder(tf.float32, shape=(None, 20, 64))
    y = LSTM(32)(x)  # all ops in the LSTM layer will live on GPU:0

with tf.device('/cpu:0'):
    x = tf.placeholder(tf.float32, shape=(None, 20, 64))
    y = LSTM(32)(x)  # all ops in the LSTM layer will live on CPU:0
sygi
fuente
2
¿Cómo se puede hacer esto dentro de Keras con Tensorflow como backend, en lugar de usar Tensorflow para llamar capas de Keras?
mikal94305
No entiendo tu pregunta. El código interno withpuede ser cualquier código de Keras.
sygi
1
¿Cómo se puede hacer esto con un modelo entrenado cargado desde el disco? Actualmente estoy entrenando en gpu pero quiero verificar después en la CPU
ghostbust555
No creo que estos modelos sean intercambiables.
sygi
3
Pude cambiar el entrenamiento de gpu a cpu en medio del entrenamiento usando el método mencionado anteriormente donde guardo el modelo en el medio con model.save y luego lo recargo con un tf.device diferente usando keras.models.load_model. Lo mismo se aplica si desea entrenar y luego predecir en un dispositivo diferente.
TheLoneNut
3

Pasé un tiempo resolviéndolo. La respuesta de Thoma no es completa. Digamos que su programa es test.py, desea usar gpu0 para ejecutar este programa y mantener otros gpus libres.

Deberías escribir CUDA_VISIBLE_DEVICES=0 python test.py

Note que DEVICESno esDEVICE

DDz
fuente
0

Para las personas que trabajan en PyCharm y para forzar la CPU, puede agregar la siguiente línea en la configuración Ejecutar / Depurar, en Variables de entorno:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
aprendiz
fuente