Diese Ausgabe wurde ursprünglich auf 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 "Ursprüngliche Lösung" ist mein verstärkender Lerncode, der eine langsame Leistung zeigte und einige veröffentlichte Codes für die Diskussion und Bewertung in der Gemeinschaft erstellte.TensorFlow: Grafikoptimierung (GPU-CPU-Leistung)
Ich habe die Testskripts sowie einige der Rohdaten, Trace-Dateien & TensorBoard-Protokolldateien eingeschlossen, 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.
Was ich tat, war meine Original-Lösung zu nehmen und die "Game Environment" 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 nivwusquorum's Github Reinforcement Learning Example.
Am 15.07.2016 habe ich einen "git pull" gemacht, um Tensorflow zu steuern. 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. Also habe ich meine Aufmerksamkeit darauf gerichtet, was zwischen meiner Original Solution und dem veröffentlichten Code anders sein kann. Ich aktualisiere auch den Kopf zum 17.7.2016. Etwas hat sich verbessert, da der Gesamtunterschied zwischen der CPU & GPU Original Solution ist viel näher als eine Woche wieder, wo ich sah 47s CPU vs 71s GPU. 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.
habe ich versucht, zwei andere Kombinationen besser zu reflektieren, wie die Original-Lö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, wobei die Original-Lösung Listen von Beobachtungen verwendet, 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 diese Grafik zu verbessern und die Anzahl der kleinen OPS zu reduzieren. 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.
gegen GPU-Leistung für 7k Vergleich x 7k matmul kann die falsche Metrik hier sein. IE, ich sehe Ihre langsamste Operation dauert <1ms, was bedeutet, dass Ihre Datengrößen winzig sind, so dass Sie Mikro-Benchmark-GPU vs CPU auf winzige Datengrößen, um ein Gefühl dafür, wie viel Gewinn (oder Verlust) sollten Sie erwarten, wenn Sie zu bewegen GPU –
Mein Hauptzweck des 7K x 7K-Datensatzes war mehr, um sicherzustellen, dass die GPU tatsächlich funktionierte. Also mit großen Aufgaben ist die GPU in Ordnung. Dies war mehr für mich selbst ein Beweis dafür, dass die ursprüngliche Ausgabe der GPU langsamer war als die CPU, auf der die GPU richtig installiert und CUDA kompiliert wurde. – mazecreator
Dann führt Netzwerke einen Batch von 200 x 189 in 5 Ebenen mit Dropout() zwischen jeder Ebene. Die Ebenen sind 140, 120, 100, 80 und 3 als Ausgabe. – mazecreator