TensorFlow: Multi-GPU-Konfiguration (Leistung)

8

Ich würde gern wissen, was als "best practice" für Multi-GPU-Systeme gilt, wenn Netzwerke mit TensorFlow trainiert werden.

ZB eines meiner Netzwerke sieht so aus:

%Vor%

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

Ich habe es bis jetzt nicht bewertet, ich habe heute nur ein paar GPU-Experimente gestartet. Im Moment habe ich jedoch nicht angegeben, welches Gerät für die Faltungslayer verwendet werden soll, aber ich habe es für die vollständig verbundenen Layer spezifiziert:

%Vor%

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

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

Irgendwelche Tipps, um die beste Leistung zu erzielen?

Momentan trainiere ich an 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 es bei mehr als 2 GPUs viel Overhead geben?

EDIT (langsame Multi-GPU-Performance): Nach einigen Tests bin ich ziemlich erstaunt ... wenn ich TensorFlow entscheide, welche gerätespezifischen Anweisungen zugewiesen und entfernt werden sollen, trainiert das Netzwerk erheblich schneller. 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 (je nach Ausgabe) nur eine GPU zu verwenden?!

EDIT2 (NaN-Werte): Nach einigen weiteren Tests habe ich festgestellt, dass mein manuelles Setup von gpu:0 für Stream 1 und gpu:1 für Stream 2 nicht nur langsamer ist, als TensorFlow zu entscheiden, was zu tun ist verwenden (und entsprechend der piped Skript Ausgabe TensorFlow verwendet nur one 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 seltsam.

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

    
daniel451 03.03.2016, 22:53
quelle

1 Antwort

5

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

Ich vermisse etwas in der Logik, aber aus dieser Zeile scheint es, dass es alle GPU Ops auf GPU: 0

setzen wird

Sie können aus der Implementierung sehen, dass die Platzierungsstrategie die Datenübertragungs- oder Berechnungskosten nicht berücksichtigt, daher 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 langsam ist ... vielleicht gpu0- & gt; GPU1 Kopie irgendwo passiert?

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

    
Yaroslav Bulatov 04.03.2016, 04:02
quelle