TensorFlow: Grafikoptimierung (GPU vs. CPU-Leistung)

8

Dieses Problem wurde ursprünglich auf Github # 3320 veröffentlicht. Es wäre gut, dort zu beginnen, da es mehr Details zum ursprünglichen Problem in diesem Thread gibt und sperrig ist, sodass ich nicht auf StackOverflow re-posten möchte. Eine Zusammenfassung des Problems ist, dass die Leistung langsamer ist, wenn die GPU als die CPU verwendet wird, um das TensorFlow-Diagramm zu verarbeiten. CPU / GPU Timelines (Debugging) sind zur Auswertung enthalten. Einer der Rückmeldungen bezog sich auf die Optimierung des Graphen zur Beschleunigung der Verarbeitung mit der Bitte um ein Spielzeugbeispiel zur Diskussion. Die " Original Solution " ist mein Code zum Lernen von Verstärkungen, der eine langsame Leistung zeigte und einige veröffentlichte Codes für die Diskussion und Evaluierung in der Community erstellte.

Ich habe die Testskripts sowie einige der Rohdaten, Trace Files & amp; TensorBoard Log-Dateien, um jede Überprüfung zu beschleunigen. CPUvsGPU testing.zip

Die Diskussion wurde in StackOverflow verschoben, da dieses Thema allen Tensorflow-Benutzern zugute kommen würde. Was ich zu entdecken hoffe, sind Möglichkeiten, die Leistung des veröffentlichten Graphen zu optimieren. Das Problem von GPU vs CPU kann getrennt werden, da es mit einem effizienteren TensorFlow Graph gelöst werden könnte.

Ich habe meine Originallösung genommen und die "Spielumgebung" entfernt. Ich ersetzte es durch eine zufällige Datengenerierung. In dieser Spielumgebung gibt es keine Erstellung / Änderung des TensorFlow-Graphen. Die Struktur folgt eng / nutzt nivwusquorums Github Reinforcement Learning Beispiel .

Am 15.07.2016 habe ich einen "git pull" gemacht, um auf Tensorflow zu fahren. Ich habe den Graph mit und ohne GPU aktiviert und die Zeiten aufgezeichnet (siehe angehängte Grafik). Das unerwartete Ergebnis ist, dass die GPU die CPU übertrifft (was die anfängliche Erwartung ist, die nicht erreicht wurde). Dieser Code "cpuvsgpu.py" mit den unterstützenden Bibliotheken funktioniert also besser mit der GPU. Daher habe ich meine Aufmerksamkeit darauf gerichtet, was sich zwischen meiner Originallösung und dem veröffentlichten Code unterscheidet. Ich aktualisiere auch den Kopf zum 17.7.2016. Etwas hat sich verbessert, da der Gesamtunterschied zwischen der CPU & amp; GPU auf der Original-Lösung ist wieder viel näher als eine Woche, wo ich 47s CPU vs 71s GPU sah. Ein kurzer Blick auf die neue Traces vs meine erste Spur, scheint wie "Zusammenfassung" wurde möglicherweise geändert, aber es kann auch andere Verbesserungen.

Ich habe zwei andere Kombinationen ausprobiert, um besser zu zeigen, wie die Originallösung funktioniert. Diese waren unter hoher CPU-Belastung (~ 60% - 70%) und simulierten dies bei gleichzeitiger Ausführung dieses Skripts. Die andere Variante bestand darin, die "Daten-IO" zu erhöhen, die Original-Lösung verwendet Listen von Beobachtungen, um Beobachtungen für das Training nach dem Zufallsprinzip auszuwählen. Diese Liste hat eine feste Obergrenze und beginnt dann, das erste Element in der Liste zu löschen, während das neue angehängt wird. Ich dachte mir, dass vielleicht eine davon das Streaming von Daten auf die GPU verlangsamte. Leider führte keine dieser Versionen dazu, dass die CPU die GPU übertraf. Ich führte auch eine schnelle GPUTESTER-App, die große Matrix-Multiplikation, um ein Gefühl für Timing Unterschiede mit der Größe der Aufgabe zu bekommen und sind wie erwartet.

Ich würde wirklich gerne wissen, wie man dieses Diagramm verbessert und die Anzahl kleiner OPS reduziert. Es sieht so aus, als würde hier die meiste Leistung ablaufen. Es wäre schön, irgendwelche Tricks zu erlernen, um kleinere Ops zu größeren zu kombinieren, ohne die Logik (Funktion) des Graphen zu beeinflussen.

    
mazecreator 31.07.2016, 22:05
quelle

1 Antwort

2

Danke für die ausgezeichnete Post.

Ich habe ein ähnliches Problem: Die GPU / CPU-Verarbeitung benötigt für zwei von TensorFlow bereitgestellte Beispiele mehr CPU und verstrichene Zeit als die CPU-Verarbeitung: Das lineare Regressionsverlustmodell und die MNIST für Anfänger, während das MNIST Deep-Skript signifikant ist Verbesserung der CPU und Elapsed bei der Verwendung der GPU Profiling GPU und CPU-Leistung Seite 10 startet die Diskussion.

Hier sind die Zahlen:

%Vor%

(Quelle: Profiling von GPU- und CPU-Leistung , Abb. 64 Ergebnisse )

    
djyredhat 17.06.2017 19:22
quelle