Keras avec le backend Tensorflow peut-il être forcé d'utiliser CPU ou GPU à volonté?
J'ai installé Keras avec le backend Tensorflow et CUDA. Je voudrais parfois à la demande forcer Keras à utiliser CPU. Cela peut-il être fait sans dire installer un TensorFlow CPU uniquement séparé dans un environnement virtuel? Si oui, comment? Si le backend était Theano, les drapeaux pourraient être définis, mais je n'ai pas entendu parler des drapeaux Tensorflow accessibles via Keras.
6 réponses
Si vous voulez forcer Keras à utiliser CPU
Façon 1
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""
Avant l'importation de Keras / Tensorflow.
Façon 2
Exécutez votre script comme
$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py
Voir aussi
Une façon plutôt gracieuse et séparable de le faire est d'utiliser
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)
Ici avec booleans
GPU
et CPU
vous pouvez spécifier si vous souhaitez utiliser un GPU ou un GPU lors de l'exécution de votre code. Notez que je le fais en spécifiant qu'il y a 0 périphériques GPU quand je veux simplement utiliser le CPU. En prime, via cette méthode, vous pouvez spécifier le nombre de GPU et de processeurs à utiliser aussi! En outre, via num_cores
Vous pouvez définir le nombre de cœurs de PROCESSEUR à utiliser.
Tout ceci est exécuté dans le constructeur de ma classe, avant toute autre opération, et est complètement séparable de tout modèle, ou autre code que j'utilise.
La seule chose à noter est que vous aurez besoin de tensorflow-gpu
et cuda
/cudnn
installé parce que vous donnez toujours la possibilité d'utiliser un GPU.
Cela a fonctionné pour moi (win10), placez avant d'importer keras:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Selon le tutoriel keras , Vous pouvez simplement utiliser la même portée tf.device
que dans TensorFlow régulier:
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
Il suffit D'importer tensortflow et d'utiliser keras, c'est aussi simple que ça.
import tensorflow as tf
# your code here
with tf.device('/gpu:0'):
model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)
Je viens de passer un peu de temps à comprendre.
La réponse de Thoma n'est pas complète.
Dites que votre programme est test.py
, vous voulez utiliser gpu0 pour exécuter ce programme, et garder les autres GPU libres.
Vous devriez écrire CUDA_VISIBLE_DEVICES=0 python test.py
Avis c'est DEVICES
pas DEVICE