J'ai installé Keras avec le backend Tensorflow et CUDA. J'aimerais parfois forcer Keras à utiliser le processeur. Cela peut-il être fait sans l'installation d'un Tensorflow séparé pour CPU uniquement dans un environnement virtuel? Si c'est le cas, comment? Si le backend était Theano, les drapeaux pourraient être définis, mais je n’ai pas entendu parler de drapeaux Tensorflow accessibles via Keras.
Si vous voulez forcer Keras à utiliser le processeur
import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""
avant que Keras/Tensorflow soit importé.
Exécutez votre script en tant que
$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py
Voir également
Une façon assez 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
, nous indiquons si nous souhaitons exécuter notre code avec le GPU ou le CPU en définissant de manière rigide le nombre de GPU et de processeurs autorisés à la session Tensorflow. accès. Les variables num_GPU
et num_CPU
définissent cette valeur. num_cores
définit ensuite le nombre de cœurs de processeur disponibles pour une utilisation via intra_op_parallelism_threads
et inter_op_parallelism_threads
.
La variable intra_op_parallelism_threads
indique le nombre de threads qu'une opération parallèle dans un seul nœud du graphe de calcul est autorisée à utiliser (intra). Tandis que la variable inter_ops_parallelism_threads
définit le nombre de threads accessibles pour les opérations parallèles sur les nœuds du graphe de calcul (inter).
allow_soft_placement
permet d'exécuter des opérations sur la CPU si l'un des critères suivants est rempli:
il n'y a pas d'implémentation GPU pour l'opération
il n'y a pas de périphérique GPU connu ou enregistré
il est nécessaire de co-localiser avec d'autres entrées de la CPU
Tout cela 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 de tout code que j'utilise.
Remarque: Ceci nécessite l'installation de tensorflow-gpu
et cuda
/cudnn
car l'option d'utiliser un GPU est donnée.
Refs:
Cela a fonctionné pour moi (win10), placez-vous avant d'importer des keras:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
Importez simplement tensortflow et utilisez keras, c'est aussi simple que cela.
import tensorflow as tf
# your code here
with tf.device('/gpu:0'):
model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)
Selon keras tutorial , vous pouvez simplement utiliser la même portée tf.device
que dans tensorflow standard:
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
Je viens de passer un peu de temps à comprendre. La réponse de Thoma n'est pas complète. Supposons que votre programme est test.py
, vous voulez utiliser gpu0 pour exécuter ce programme et laisser les autres gpus libres.
Vous devriez écrire CUDA_VISIBLE_DEVICES=0 python test.py
Notez que c'est DEVICES
pas DEVICE