2016-03-03 14 views
8

Ich würde gerne wissen, was als "Best Practice" für Multi-GPU-Systeme beim Training von Netzwerken mit TensorFlow gilt.TensorFlow: Multi-GPU-Konfiguration (Performance)

Z. B., einer meiner Netzwerke sieht wie folgt aus:

      input 
          | 
         (...) <-- convolutional layers 
          | 
         _________ 
    fully-connected |  | fully-connected 
    output stream 1 -> |  | <- output stream 2 

Does effizient mehrere GPUs TensorFlow zuteilen? Oder sollte ich selbst angeben, welche GPU TensorFlow für eine bestimmte Operation verwenden soll?

Ich habe es bis jetzt nicht getestet, habe gerade ein paar GPU-Experimente heute gestartet. Aber im Moment habe ich nicht angegeben, die Vorrichtung auf die Faltungsschichten zu verwenden, aber ich habe es für die vollständig verbundene Schichten angeben:

# flattened information of the last convolutional layer 
h_pooln_flat = tf.reshape(...) 

with tf.device("/gpu:0"): 
    # stream 1 stuff 

with tf.device("/gpu:1"): 
    # stream 2 stuff 

Ist das eine gute Idee? Oder sollte die Ressourcenzuweisung für TensorFlow offen bleiben?

Ich denke, ein einzelner "Strom" von Faltungsschichten kann nicht parallel berechnet werden ?! Es spielt also keine Rolle, welches Gerät den Faltung-, Pooling-, ... Teil macht.

Irgendwelche Tipps, um die beste Leistung zu erhalten?

Derzeit trainiere ich auf einem Knoten eines Slurm-Clusters mit 2 GPUs, aber möglicherweise könnte ich auf mehr Knoten trainieren, also 4, 6 oder sogar 8 GPUs. Allerdings würde ich mit mehr als 2 GPUs viel Overhead haben?


EDIT (langsam Performance Multi-GPU): Nach einigen Tests Ich bin sehr erstaunt, ... wenn ich lasse TensorFlow entscheiden, was die gerätespezifischen Aussagen zuzuteilen und entfernen Sie das Netzwerk erheblich schnellere Züge . Das war wirklich überraschend für mich ... Was könnte effektiver sein, als jeden Ausgabestrom auf einer GPU zu haben, wenn es insgesamt zwei GPUs gibt? Außerdem scheint Tensorflow (laut der Ausgabe) nur eine GPU zu verwenden ?!


EDIT2 (NaN-Werte): Nach einigen Tests, die ich erfuhr, dass meine manuelle Einrichtung von gpu:0 für Strom 1 und gpu:1 für Strom 2 ist nicht nur langsamer als im Stich gelassen TensorFlow entscheiden, was zu verwenden (und nach die piped Skript Ausgabe TensorFlow verwendet nur eine GPU) aber auch manchmal meine (ich weiß nicht warum) meine "gpu:0 für Stream 1" und gpu:1 für Stream 2 "-Lösung erzeugt nur NaN-Werte. Wie direkt oder kurz nach der Initialisierung. Sehr merkwürdig.

Benötigt TensorFlow eine Art Thread-Locking oder manuelle Kopie der Eingabedaten für mehrere Grafikprozessoren?

+1

Ich kann Ihre Frage nicht beantworten, aber ich kann darauf hinweisen, dass sie in der Tensorflow-Dokumentation erwähnen, dass die Zuweisung von Prozessoren (GPUs und CPUs) in einer gierigen Methode erfolgt, nachdem benutzerdefinierte Platzierungsbedingungen zugewiesen wurden. Hier ist das Whitepaper: http://download.tensorflow.org/paper/whitepaper2015.pdf. Siehe Abschnitte 3.2 und 4.3. Ich bin gespannt, ob es auch Antworten auf die Best Practices gibt. – nfmcclure

+0

Alle Datenübertragungen werden für Sie ausgeführt, und Sie müssen keine Eingabedaten sperren, um NaNs zu verhindern. Sie können aber auch NaN bekommen, wenn Ihre Optimierung divergiert –

+0

Ja, aber ich habe nie das NaN-Problem mit meinem Netzwerk auf einer einzigen GPU bekommen. Ich meine, in 5 von 5 Experimenten konvergierte es normalerweise auf einer einzelnen GPU, aber in 3 out 5 Multi-GPU-Läufen bekam ich NaN-Werte. Zusätzlich: Warum sollte Multi-GPU langsamer sein? Ich meine, aufgrund der Datenübertragung zwischen den GPUs habe ich nicht die doppelte Geschwindigkeit erwartet, aber langsamer? – daniel451

Antwort

5

Die Logik für die Standardplatzierung von Geräten liegt in simple_placer.cc

ich etwas in der Logik fehlt, aber von this line scheint es, dass es alle GPU ops auf gpu gesetzt werden: 0

Sie können sehen, von der Implementierung, dass die Platzierungsstrategie die Datenübertragungs- oder Berechnungskosten nicht berücksichtigt, ist manuelle Platzierung oft besser als automatisch. Zum Beispiel, wenn Sie eine Art von Eingabe-Pipeline tun, legt die Standard-Platzierung in der Regel einige Datenverarbeitungsoptionen auf GPU, was die Dinge insgesamt langsamer macht.

Soweit Ihre Implementierung wird langsam ... vielleicht gpu0-> GPU1 Kopie irgendwo passiert?

Die Einrichtung von Multi-GPU-Setups ist eine offene Angelegenheit, lassen Sie uns wissen, was Sie finden!