2016-01-17 12 views
16

Ho 3 GPU GTX Titan nella mia macchina. Corro l'esempio fornito in Cifar10 con cifar10_train.py ed ho ottenuto il seguente risultato:TensorFlow utilizza per impostazione predefinita tutte le GPU disponibili nella macchina?

I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 0 to device ordinal 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 1 to device ordinal 0 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0: Y N 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 1: N Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN, pci bus id: 0000:03:00.0) 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX TITAN, pci bus id: 0000:84:00.0) 

Sembra a me che tensorflow sta tentando di inizializzare stesso su due dispositivi (gpu0 e GPU1).

La mia domanda è perché lo fa solo su due dispositivi e c'è un modo per impedirlo? (Voglio solo che venga eseguito come se ci fosse una singola GPU)

+1

Trovato [un modo per forzare TF non occupare risorse di interi? (riguardo multi-gpu)] (https://groups.google.com/a/tensorflow.org/forum/#!searchin/discuss/gpu/discuss/QmMqfikKxlU/BC5P4XrDEgAJ) che porta a [CUDA_VISIBLE_DEVICES - Masking GPUs] (http : //acceleware.com/blog/cudavisibledevices-masking-gpus) –

+0

Ciò aiuta davvero. Ma perché TensorFlow dovrebbe inizializzarsi automaticamente per tutti i dispositivi sulla macchina? Tra una risposta e l'altra accetterò. – Zk1001

+0

TensorFlow è destinato alla "ricerca per la produzione". Sembra che l'impostazione predefinita per utilizzare tutta la potenza di calcolo soddisfi le aspettative di ottenere il suo lavoro fatto al più presto. Grande che può essere sintonizzato, in realtà. Ma hai menzionato 3 GPU e solo 2 mostrano nei tuoi log. Perché quel? –

risposta

19

See: Using GPUs

dispositivo manuale posizionamento

Se desiderate una particolare operazione per l'esecuzione su un dispositivo di vostra scelta invece di ciò che viene selezionato automaticamente per te, puoi usare con tf.device per creare un contesto di dispositivo in modo che tutte le operazioni all'interno di quel contesto abbiano la stessa assegnazione di dispositivo.

# Creates a graph. 
with tf.device('/cpu:0'): 
  a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') 
  b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') 
c = tf.matmul(a, b) 
# Creates a session with log_device_placement set to True. 
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
# Runs the op. 
print(sess.run(c)) 

Vedrete che ora a e b sono assegnati a cpu:0. Poiché un dispositivo non è stato esplicitamente specificato per l'operazione MatMul, il runtime TensorFlow ne sceglierà uno in base all'operazione e ai dispositivi disponibili (gpu: 0 in questo esempio) e copia automaticamente i tensori tra i dispositivi, se necessario.

Device mapping: 
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: Tesla K40c, pci bus 
id: 0000:05:00.0 
b: /job:localhost/replica:0/task:0/cpu:0 
a: /job:localhost/replica:0/task:0/cpu:0 
MatMul: /job:localhost/replica:0/task:0/gpu:0 
[[ 22.  28.] 
 [ 49.  64.]] 

All'inizio Risposta 2.

See: Using GPUs

Utilizzando una singola GPU su un sistema multi-GPU

Se si dispone di più di una GPU nel vostro sistema, la GPU con l'ID più basso verrà selezionata per impostazione predefinita. Se si desidera eseguire su una GPU diverso, sarà necessario specificare la preferenza in modo esplicito:

# Creates a graph. 
with tf.device('/gpu:2'): 
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') 
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') 
    c = tf.matmul(a, b) 
# Creates a session with log_device_placement set to True. 
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
# Runs the op. 
print sess.run(c) 

All'inizio di risposta 1.

Da CUDA_VISIBLE_DEVICES – Masking GPUs

La vostra applicazione CUDA devi indirizzare una GPU specifica? Se si è in cui è stato scritto codice GPU abilitato, in genere si utilizza una query dispositivo su selezionando le GPU desiderate. Tuttavia, una soluzione rapida e semplice per il test consiste nell'utilizzare la variabile di ambiente CUDA_VISIBLE_DEVICES su per limitare i dispositivi rilevati dall'applicazione CUDA. Questo può essere utile se si sta tentando di condividere risorse su un nodo o si desidera che esegua la GPU abilitata per il targeting di una GPU specifica.

ambiente sintassi variabile

Risultati

CUDA_VISIBLE_DEVICES = 1 solo dispositivo 1 sarà visto CUDA_VISIBLE_DEVICES = 0,1 Devices 0 e 1 saranno visibili CUDA_VISIBLE_DEVICES =”0,1” Idem come sopra, le virgolette sono opzionali CUDA_VISIBLE_DEVICES = 0,2,3 I dispositivi 0, 2, 3 saranno visibili; dispositivo 1 mascherato

CUDA enumera i dispositivi visibili a partire da zero. Nell'ultimo caso , i dispositivi 0, 2, 3 appariranno come dispositivi 0, 1, 2. Se si modifica dall'ordine della stringa a "2,3,0", i dispositivi 2,3,0 verranno enumerati come 0,1,2 rispettivamente. Se CUDA_VISIBLE_DEVICES è impostato su un dispositivo che non esiste , tutti i dispositivi verranno mascherati. È possibile specificare un mix di numeri di dispositivo validi e non validi. Tutti i dispositivi prima del valore non valido verranno enumerati, mentre tutti i dispositivi dopo il valore non valido saranno mascherati.

Per determinare l'ID del dispositivo per l'hardware disponibile nel sistema, è possibile eseguire l'eseguibile di deviceQuery NVIDIA incluso nell'SDK CUDA. Buona programmazione!

Chris Mason

+0

Ho fatto esattamente la stessa cosa. Ma poi quando ho fatto '' nvidia-smi''' ho visto che una uguale quantità di memoria è usata da tutti i dispositivi gpu. –

+0

le informazioni della gpu a portata di mano di tensorflow sono vecchie/rotte; invece (a partire dal 2017/10) prova: https://www.tensorflow.org/tutorials/using_gpu – michael

+0

@Michael Grazie. Risposta aggiornata –

Problemi correlati