2016-07-31 9 views
8

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.

gtx 950 timing

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.

+1

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 –

+0

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

+0

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

Antwort

2

Results Danke für die ausgezeichnete Post.

Ich habe ein ähnliches Problem: GPU/CPU-Verarbeitung benötigt mehr CPU und verstrichene Zeit als CPU-Verarbeitung allein für zwei Beispiele von TensorFlow: Das lineare Regressionsverlustmodell und die MNIST für Anfänger, während das MNIST Deep-Skript zeigt Eine deutliche Verbesserung der CPU und des Elapsed bei Verwendung der GPU Profiling GPU and CPU Performance Seite 10 beginnt die Diskussion.

Hier sind die Zahlen:

workload  | win 8.1 win 8.1 win8.1  win 10 win 10 win 10 
workload  | cpu only cpu  gpu  cpu only cpu  gpu  
-------------+----------------------------------------------------------- 
mnist deep | 14053  384.26 328.92  12406  289.28 211.79 
mnist deep | 14044  384.59 328.45  12736  293.71 210.48 
mnist10,000 | 24.10  45.85  7.67  26.56  44.42  7.32 
mnist10,000 | 23.94  44.98  7.56  25.80  44.24  7.32 
mnist50,000 | 95.49  198.12 38.26  109.99  197.82 36.15 
mnist50,000 | 96.07  197.86 37.91  109.46  195.39 39.44 
    lr10,000 | 6.23  15.08  1.78  7.38  16.79  1.91 
    lr10,000 | 6.33  15.23  1.78  7.44  16.59  1.91 
    lr100,000 | 48.31  124.37 17.67  62.14  148.81 19.04 
    lr100,000 | 48.97  123.35 17.63  61.40  147.69 18.72 

(Quelle:. Profiling GPU and CPU Performance, Abb 64 Results)

+1

Während der Link die Frage beantworten kann, ist es besser, hier die wesentlichen Teile der Antwort anzugeben und den Link als Referenz anzugeben. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. Bitte lesen Sie diese [how-to-answer] (http://stackoverflow.com/help/how-to-answer) für eine qualitativ hochwertige Antwort. – thewaywewere

+0

Tolle Details aus Abb.18 + Abb.19 VTUNE Performance Hotspots entmystifizieren. Das einzige Detail, das fehlt, sind die tatsächlichen TimeDOMAIN-Kosten für den Zugriff auf Gerätespeichertypen. SMX-Architekturen sind hervorragend für mathematisch "dichte" Rechenkerne, aber ** haben immense ~ 350-700 [ns] Latenzen ** beim Zugriff auf '__global__' Speicher (** ist ein unvermeidliches Muss für ML-Klasse von DataSETs *) * ... so ** die realistischen TimeDOMAIN-Kosten sind ** grundsätzlich ** unvergleichbar mit Peta-FLOPs-Jagd-Micro-Benchmarks **, so beliebt bei Product-Marketing-Jungs & Mädels. Keine Panik, echte Anwendungsfälle bringen viele Überraschungen mit sich. – user3666197