2016-01-17 9 views
16

Ich habe 3 GTX Titan GPUs in meinem Gerät. Ich betreibe das Beispiel in Cifar10 versehen mit cifar10_train.py und bekam die folgende Ausgabe:Verwendet TensorFlow standardmäßig alle verfügbaren Grafikprozessoren in der Maschine?

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) 

Es sieht für mich, dass TensorFlow selbst versucht, auf zwei Geräte zu initialisieren (gpu0 und gpu1).

Meine Frage ist, warum es das nur auf zwei Geräten tut und gibt es eine Möglichkeit, das zu verhindern? (Ich will es nur laufen, als ob es eine einzelne GPU)

+1

gefunden [Jede Art und Weise TF zu zwingen, nicht ganze Ressourcen zu besetzen? (in Bezug auf Multi-GPU)] (https://groups.google.com/a/tensorflow.org/forum/#!searchin/discuss/gpu/discuss/QmMqfikKxlU/BC5P4XrDEgAJ), was zu [CUDA_VISIBLE_DEVICES - Maskierung von GPUs] (http : //acceleware.com/blog/cudavisibledevices-masking-gpus) –

+0

Das hilft wirklich. Aber warum sollte TensorFlow automatisch für alle Geräte auf der Maschine initialisiert werden? BTW nur ​​eine Antwort, die ich akzeptiere. – Zk1001

+0

TensorFlow zielt auf "Forschung bis zur Produktion" ab. Es scheint der Standard zu sein, die gesamte Rechenleistung zu nutzen, die die Erwartung erfüllt, dass die Arbeit so schnell wie möglich erledigt wird. Großartig, dass tatsächlich abgestimmt werden kann. Aber du hast 3 GPUs erwähnt und nur 2 in deinen Logs. Warum das? –

Antwort

19

See: Using GPUs

Manuelle Geräteplatzierung

Wenn Sie möchten, dass eine bestimmte Operation auf einem Gerät Ihrer Wahl laufen Statt dessen, was automatisch für Sie ausgewählt wird, können Sie mit einen Gerätekontext erstellen, sodass alle Vorgänge in diesem Kontext die gleiche Gerätezuordnung haben.

# 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)) 

Sie, dass jetzt a und b sehen zu cpu:0 zugeordnet sind. Da ein Gerät nicht explizit für die Operation MatMul angegeben wurde, wählt die TensorFlow-Laufzeit basierend auf der Operation und den verfügbaren Geräten (in diesem Beispiel GPU: 0) eine Option aus und kopiert Tensoren bei Bedarf automatisch zwischen Geräte.

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.]] 

Frühere Antwort 2.

Siehe auch: Using GPUs

eine einzelne GPU auf einem Multi-GPU-System

Wenn Sie mehr als eine GPU haben in Ihrem System wird die GPU mit der niedrigsten ID standardmäßig ausgewählt. Wenn Sie auf einer anderen GPU ausgeführt werden soll, werden Sie den Vorzug geben müssen explizit:

# 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) 

Früher 1. Antwort

Von CUDA_VISIBLE_DEVICES – Masking GPUs

Hat Ihr CUDA Anwendung müssen Sie eine bestimmte GPU anvisieren? Wenn Sie GPU-aktivierten Code schreiben, würden Sie in der Regel eine Geräteabfrage verwenden, um die gewünschten GPUs auszuwählen . Eine schnelle und einfache Lösung für den Test besteht jedoch darin, die Umgebungsvariable CUDA_VISIBLE_DEVICES auf einzuschränken, damit die von Ihrer CUDA-Anwendung angezeigten Geräte eingeschränkt werden. Dies kann nützlich sein, wenn Sie versuchen, Ressourcen auf einem Knoten zu teilen, oder Sie wollen Ihre GPU-fähige ausführbare Datei auf eine bestimmte GPU zielen.

Umgebungsvariable Syntax

Ergebnisse

CUDA_VISIBLE_DEVICES = 1 Nur Vorrichtung 1 CUDA_VISIBLE_DEVICES = 0,1 Geräte 0 und 1 zu sehen sein wird CUDA_VISIBLE_DEVICES =“0,1” Das gleiche wie oben zu sehen sein, Anführungszeichen sind optional CUDA_VISIBLE_DEVICES = 0,2,3 Geräte 0, 2, 3 sind sichtbar; Gerät 1 ist maskiert

CUDA wird die sichtbaren Geräte beginnend bei Null aufzählen. Im letzten Fall erscheinen die Geräte 0, 2, 3 als Geräte 0, 1, 2. Wenn Sie die Reihenfolge der Zeichenfolge zu "2,3,0" ändern, werden die Geräte 2,3,0 als aufgezählt als 0,1,2 jeweils. Wenn CUDA_VISIBLE_DEVICES auf ein Gerät gesetzt ist, das nicht existiert, werden alle Geräte maskiert. Sie können eine Mischung aus gültigen und ungültigen Gerätenummern angeben. Alle Geräte vor dem ungültigen Wert werden aufgelistet, während alle Geräte nach dem ungültigen Wert maskiert werden.

Um die Geräte-ID für die verfügbare Hardware in Ihrem System zu ermitteln, können Sie die NVIDIA-Datei deviceQuery, die im CUDA SDK enthalten ist, mit ausführen. Fröhliche Programmierung!

Chris Mason

+0

Ich tat genau das Gleiche. Aber dann, als ich '' 'nvidia-smi''' machte, sah ich, dass von allen GPU-Geräten dieselbe Speichermenge verwendet wurde. –

+0

die verknüpfte-tensorflow gpu info ist alt/kaputt; Stattdessen (ab 2017/10) versuchen Sie: https://www.tensorflow.org/tutorials/using_gpu – michael

+0

@Michael Danke. Aktualisierte Antwort –

Verwandte Themen