web-dev-qa-db-fra.com

Keras avec le backend Tensorflow peut-il être contraint d’utiliser un processeur ou un processeur graphique à volonté?

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.

83
mikal94305

Si vous voulez forcer Keras à utiliser le processeur

Voie 1

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

avant que Keras/Tensorflow soit importé.

Voie 2

Exécutez votre script en tant que

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Voir également

  1. https://github.com/keras-team/keras/issues/152
  2. https://github.com/fchollet/keras/issues/461
89
Martin Thoma

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 booleansGPU 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:

  1. il n'y a pas d'implémentation GPU pour l'opération

  2. il n'y a pas de périphérique GPU connu ou enregistré

  3. 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:

63
RACKGNOME

Cela a fonctionné pour moi (win10), placez-vous avant d'importer des keras:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
40
Neuraleptic

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)
21
harshlal028

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
20
sygi

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

3
DDz