Keras con backend Tensorflow può essere costretto a utilizzare CPU o GPU a piacimento?


96

Ho installato Keras con il backend Tensorflow e CUDA. A volte vorrei forzare su richiesta Keras a usare la CPU. È possibile farlo senza dover installare un Tensorflow separato solo per CPU in un ambiente virtuale? Se é cosi, come? Se il backend fosse Theano, le bandiere potrebbero essere impostate, ma non ho sentito parlare di bandiere Tensorflow accessibili tramite Keras.

Risposte:


102

Se vuoi forzare Keras a usare CPU

Modo 1

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

prima che Keras / Tensorflow venga importato.

Modo 2

Esegui lo script come

$ CUDA_VISIBLE_DEVICES="" ./your_keras_code.py

Guarda anche

  1. https://github.com/keras-team/keras/issues/152
  2. https://github.com/fchollet/keras/issues/4613

19
Non ha funzionato per me (Keras 2, Windows) - ho dovuto impostare os.environ['CUDA_VISIBLE_DEVICES'] = '-1'come nella risposta di seguito
desertnaut

3
A quale problema si riferisce il numero 152? Un collegamento sarebbe carino.
Martin R.

Non vedo alcun riferimento al CUDA_DEVICE_ORDER=PCI_BUS_IDnumero 152
Thawn

Sono in un terminale ipython3 e ho impostato import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"] = "" , ora come faccio a "annullarlo"? Vorrei che Keras usasse di nuovo la GPU.
Gabriel C

1
@ Gabriel C: lo annulli cancellando quelle righe.
Martin Thoma

68

Un modo piuttosto separabile per farlo è usare

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)

Qui, con booleans GPUe CPU, indichiamo se vorremmo eseguire il nostro codice con la GPU o la CPU definendo rigidamente il numero di GPU e CPU a cui la sessione Tensorflow è autorizzata ad accedere. Le variabili num_GPUe num_CPUdefiniscono questo valore. num_coresquindi imposta il numero di core CPU disponibili per l'utilizzo tramite intra_op_parallelism_threadse inter_op_parallelism_threads.

La intra_op_parallelism_threadsvariabile determina il numero di thread che un'operazione parallela in un singolo nodo nel grafo di calcolo può utilizzare (intra). Mentre la inter_ops_parallelism_threadsvariabile definisce il numero di thread accessibili per operazioni parallele tra i nodi del grafo di calcolo (inter).

allow_soft_placement consente di eseguire operazioni sulla CPU se viene soddisfatto uno dei seguenti criteri:

  1. non vi è alcuna implementazione GPU per l'operazione

  2. non ci sono dispositivi GPU conosciuti o registrati

  3. è necessario co-localizzarsi con altri input dalla CPU

Tutto questo viene eseguito nel costruttore della mia classe prima di qualsiasi altra operazione ed è completamente separabile da qualsiasi modello o altro codice che utilizzo.

Nota: questo richiede tensorflow-gpue cuda/ cudnnper essere installato perché è data l'opzione di utilizzare una GPU.

Rif:


1
Questa è una bella soluzione in quanto la semplice definizione di "CUDA_VISIBLE_DEVICES" causa CUDA_ERROR_NO_DEVICE seguito da molte diagnostiche prima di continuare con l'esecuzione sulla CPU. Tuttavia ... entrambi i metodi funzionano!
jsfa11

1
Questa è l'unica soluzione coerente che funziona per me. Continua a tornarci.
Authman Apatira

1
Puoi spiegare cosa significano gli altri parametri? come allow_soft_placement, intra_op_parallelism_threads,inter_op_parallelism_threads
Nagabhushan SN

sono i inter/ si intra_op_parallelism_threadsriferiscono alle operazioni della CPU o della GPU?
bluesummers

1
@bluesummers Riguardano la parallelizzazione della CPU
RACKGNOME

57

Questo ha funzionato per me (win10), posto prima di importare keras:

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

cosa fa questo?
kRazzy R

4
Con Win, forza TF a utilizzare la CPU e ignorare qualsiasi GPU. Non ho avuto fortuna con 0 o vuoto, ma -1 sembrava fare il trucco.
Neuraleptic

1
Ha funzionato su Win10 x64 per me. Inoltre non ho avuto fortuna a vincere 0 o vuoto e solo -1 ha funzionato.
Cypher

4
Ha funzionato per me su Ubuntu
TripleS

Ho due GPU nella mia macchina, l'impostazione di "CUDA_VISIBLE_DEVICES" = 0/1 si riferisce all'ID fisico delle GPU disponibili. Impostandolo a -1 usa la CPU.
Prashanth Muthurajaiah

30

Basta importare tensortflow e utilizzare keras, è così facile.

import tensorflow as tf
# your code here
with tf.device('/gpu:0'):
    model.fit(X, y, epochs=20, batch_size=128, callbacks=callbacks_list)

2
La migliore risposta qui
xssChauhan

5
Quando ho impostato tf.device('/cpu:0'), potrei ancora vedere la memoria assegnata a Python in seguito con nvidia-smi.
CMCDragonkai

@CMCDragonkai Risolvilo o no ^ _ ^?
lhdgriver

4
Non sembra funzionare neanche per me, usa ancora la gpu quando l'ho impostato per usare la cpu
liyuan

Non dovrebbe essere anche la definizione del modello e la compilazione eseguita sotto lo stesso with?
matt525252

22

Come per il tutorial di keras , puoi semplicemente usare lo stesso tf.deviceambito del normale tensorflow:

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

2
Come è possibile farlo all'interno di Keras con Tensorflow come backend, invece di usare Tensorflow per chiamare i layer di Keras?
mikal94305

Non capisco la tua domanda. Il codice all'interno withpuò essere qualsiasi codice Keras.
Sygi

1
Come è possibile farlo con un modello addestrato caricato da disco? Attualmente mi sto allenando su gpu ma voglio verificare successivamente su CPU
ghostbust555

Non credo che questi modelli siano intercambiabili.
sygi

3
Sono stato in grado di passare l'addestramento da gpu a cpu nel bel mezzo dell'addestramento utilizzando il metodo sopra menzionato in cui salvo il modello in mezzo con model.save, quindi lo ricarico con un tf.device diverso usando keras.models.load_model. Lo stesso vale se vuoi allenarti e poi prevedere su un dispositivo diverso.
TheLoneNut

3

Ho solo passato un po 'di tempo a capirlo. La risposta di Thoma non è completa. Supponi che il tuo programma lo siatest.py , vuoi usare gpu0 per eseguire questo programma e mantenere libere altre GPU.

Dovresti scrivere CUDA_VISIBLE_DEVICES=0 python test.py

Notare che DEVICESnon lo èDEVICE


0

Per le persone che lavorano su PyCharm e per forzare la CPU, è possibile aggiungere la seguente riga nella configurazione Esegui / Debug, sotto Variabili d'ambiente:

<OTHER_ENVIRONMENT_VARIABLES>;CUDA_VISIBLE_DEVICES=-1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.