Wie kann ich intensives Lernen in einer nicht NVIDIA Umgebung beschleunigen?

8

Da ich nur eine AMD A10-7850 APU habe und nicht über die Mittel verfüge, die ich für eine NVIDIA-Grafikkarte im Wert von 800 bis 1200 US-Dollar ausgeben kann, versuche ich mit den Ressourcen, die ich benötige, um tieferes Lernen zu beschleunigen Tensorfluss / Keras.

Zunächst habe ich eine vorkompilierte Version von Tensorflow verwendet. InceptionV3 würde ungefähr 1000-1200 Sekunden benötigen, um 1 Epoche zu berechnen. Es war schmerzhaft langsam.

Um die Berechnungen zu beschleunigen, habe ich zuerst Tensorflow mit Optimierern selbst kompiliert (mit AVX- und SSE4-Anweisungen). Dies führte zu einer Verringerung der Berechnungszeiten um etwa 40%. Die gleichen Berechnungen, die oben durchgeführt wurden, dauern jetzt nur ungefähr 600 Sekunden zum Berechnen. Es ist fast erträglich - so etwas wie man Farbe trocken sehen kann.

Ich suche nach Möglichkeiten, die Berechnungszeiten weiter zu verringern. Ich habe nur eine integrierte AMD Grafikkarte, die Teil der APU ist. (Wie) (C / c) und ich benutze diese Ressource, um die Berechnung noch mehr zu beschleunigen?

Ganz allgemein sagen wir, es gibt andere Leute mit ähnlichen monetären Beschränkungen und Intel-Setups. Wie kann jemand OHNE diskrete NVIDIA-Karten ihre integrierten Grafikchips oder andere nicht-NVIDIA-Setup verwenden, um schneller als nur CPU-Leistung zu erreichen? Ist das möglich? Warum Warum nicht? Was muss getan werden, um dieses Ziel zu erreichen? Oder wird dies in naher Zukunft möglich sein (2-6 Monate)? Wie?

    
Thornhale 31.03.2017, 14:20
quelle

2 Antworten

15

Nachdem ich dieses Thema einige Monate lang untersucht habe, sehe ich 3.5 mögliche Wege:

1.) Tensorflow + OpenCl wie in den obigen Kommentaren erwähnt:

Es scheint eine gewisse Bewegung in diesem Bereich zu geben. Bei Codeplay hat Lukasz Iwanski gerade eine umfassende Antwort geschrieben, wie man Tensorflow hier mit opencl ausführen kann (ich werde nur einen Link wie oben angegeben bereitstellen, da sich die Information dort ändern könnte): Ссылка

Das Potenzial, integrierte Grafiken zu verwenden, ist verlockend. Es lohnt sich auch, die Verwendung dieser Kombination mit APUs zu erkunden. Aber ich bin nicht sicher, wie gut das funktionieren wird, da der OpenCl-Support noch in der frühen Entwicklungsphase ist und die Hardware-Unterstützung sehr begrenzt ist. Außerdem ist OpenCl nicht dasselbe wie eine handgefertigte Bibliothek von optimiertem Code. (UPDATE 2017-04-24: Ich habe den Code zum Kompilieren bekommen, nachdem ich einige Probleme hier gesehen habe! ) Leider wurden die erhofften Geschwindigkeitsverbesserungen ON MY SETUP (iGPU) nicht umgesetzt.

CIFAR 10 Datensatz:

  1. Tensorflow (via pip ak nicht optimiert): 1700sec / epoch bei 390% CPU Nutzung.
  2. Tensorflow (SSE4, AVX): 1100sec / Epoche bei 390% CPU Nutzung.
  3. Tensorflow (opencl + iGPU): 5800s / Epoche bei 150% CPU und 100% GPU-Auslastung.

Ihre Laufleistung kann erheblich variieren. Ich frage mich also, was andere Leute auf Ihren Setups relativ sprechen (nicht optimiert vs optimiert gegenüber Opencl)?

Was zu beachten ist: Opencl-Implementierung bedeutet, dass die gesamte Berechnung auf der GPU durchgeführt werden sollte. (Aktualisiert am 2017/4/29) Aber in Wirklichkeit ist dies noch nicht der Fall, da einige Funktionen noch nicht implementiert wurden. Dies führt zu einem unnötigen Hin- und Herkopieren von Daten zwischen CPU- und GPU-RAM . Auch hier sollten bevorstehende Änderungen die Situation verbessern. Und darüber hinaus können wir für diejenigen, die daran interessiert sind, zu helfen, und diejenigen, die es beschleunigen wollen, etwas tun, das messbare Auswirkungen auf die Leistung von Tensorflow mit opencl hat.

Aber wie es jetzt steht: 1 iGPU & lt; & lt; 4 CPUS mit SSE + AVX. Vielleicht hätten kräftigere GPUs mit größerem RAM und / oder opencl 2.0-Implementierung einen größeren Unterschied gemacht.

An dieser Stelle möchte ich hinzufügen, dass ähnliche Anstrengungen mit Caffe und / oder Theano + OpenCl unternommen wurden. Der limitierende Schritt scheint in allen Fällen die manuelle Portierung der CUDA / cuDNN-Funktionalität auf das openCl-Paradigma zu sein.

2.) RocM + MIOpen

RocM steht für Radeon Open Compute und scheint ein Sammelsurium von Initiativen zu sein, die Deep-Learning auf nicht möglich machen -NVIDIA (meist Radeon-Geräte). Es enthält 3 Hauptkomponenten:

  • HIP: Ein Werkzeug, das CUDA-Code in Code umwandelt, der von AMD GPUs konsumiert werden kann.
  • ROCk: ein 64-Bit-Linux-Kernel-Treiber für AMD CPU + GPU-Geräte.
  • HCC: Ein C / C ++ - Compiler, der Code in Code für eine heterogene Systemarchitekturumgebung (HSA) kompiliert.

Offenbar ist RocM dafür ausgelegt, AMDs Stärken sowohl mit CPU- als auch mit GPU-Technologie zu spielen. Ihr Ansatz zur Beschleunigung des Deep-Learning nutzt beide Komponenten. Als APU-Inhaber interessiert mich diese Möglichkeit besonders. Aber Vorsicht: Kaveri APUs haben nur eingeschränkte Unterstützung (nur integrierte Grafiken werden unterstützt). Zukünftige APUs wurden noch nicht veröffentlicht. Und es scheint, dass hier noch viel Arbeit geleistet wird, um dieses Projekt in einen reifen Zustand zu bringen. Eine Menge Arbeit wird hoffentlich diesen Ansatz innerhalb eines Jahres zum Laufen bringen, da AMD angekündigt hat, dass seine Radeon Instinct-Karten in diesem Jahr (2017) veröffentlicht werden.

Das Problem für mich ist, dass RocM Tools für den Aufbau von Deep-Learning-Bibliotheken bereitstellt. Sie stellen selbst keine Deep-Learning-Bibliotheken dar. Als Datenwissenschaftler, der sich nicht auf die Entwicklung von Werkzeugen konzentriert, möchte ich einfach etwas, das funktioniert. und bin nicht unbedingt daran interessiert, das zu bauen, was ich dann lernen möchte. Es gibt nicht genug Stunden am Tag, um beides in der Firma, in der ich bin, gut zu machen.

NVIDIA hat natürlich CUDA und cuDNN, die Libraries von handgefertigtem Assembler-Code sind, der für NVIDIA-GPUs optimiert ist. Alle wichtigen Deep-Learning-Frameworks bauen auf diesen proprietären Bibliotheken auf. AMD hat derzeit überhaupt nichts.

Ich bin unsicher, wie erfolgreich AMD in dieser Hinsicht zu NVIDIA kommen wird. Aber in einem Artikel von Carlos Perez vom 03.04.2017 hier . Ein aktuelles Vortrag in Stanford spricht auch allgemein über Ryzen, Vega und Deep Learning zusammenpassen. Im Wesentlichen besagt der Artikel, dass MIOpen diese handgefertigte Bibliothek von optimierten Deep Learning-Funktionen darstellen wird für AMD-Geräte Diese Bibliothek wird voraussichtlich im ersten Halbjahr 2017 veröffentlicht werden. Ich bin nicht sicher, wie bald diese Bibliotheken in die großen Deep-Learning-Frameworks integriert werden und was der Umfang der funktionalen Implementierung zu diesem Zeitpunkt sein wird.

Aber anscheinend hat AMD schon mit den Entwicklern von Caffe, um die Code-Basis zu "hippifizieren" . Grundsätzlich wird CUDA-Code über HIP automatisch in C-Code konvertiert. Die Automatisierung kümmert sich um die große Mehrheit der Code-Basis, so dass nur weniger als 0,5% des Codes geändert werden mussten und manuelle Aufmerksamkeit erforderten. Vergleichen Sie das mit der manuellen Übersetzung in den openCl-Code, und man beginnt, das Gefühl zu bekommen, dass dieser Ansatz nachhaltiger sein könnte. Was mir nicht klar ist, ist, wo die untergeordnete Assembler-Sprachoptimierung ins Spiel kommt.

(Update 2017-05-19) Aber mit der bevorstehenden Veröffentlichung von AMD Vega-Karten (die professionelle Frontier Edition-Karte nicht für die Verbraucher wird zuerst), gibt es Hinweise, dass wichtige Deep Learning-Frameworks werden durch das MIOpen-Framework unterstützt. A Forbes Artikel , der heute veröffentlicht wurde, zeigt den Fortschritt, den MiOpen in den letzten paar Monaten in Bezug auf die Leistung übernommen hat: es scheint signifikant zu sein. (Update 2017-08-25) MiOpen wurde offiziell veröffentlicht. Wir reden hier nicht mehr hypothetisch. Jetzt müssen wir nur ausprobieren, wie gut dieses Framework funktioniert.

3.) Neon

Neon ist Nervanas (jetzt von Intel erworbener) Open-Source-Deep-Learning-Framework. Der Grund, warum ich diesen Rahmen erwähne, ist, dass er relativ einfach zu verwenden scheint. Die Syntax ist so einfach und intuitiv wie Keras. Noch wichtiger ist jedoch, dass dieses Framework aufgrund einiger handgefertigter Assembler-Sprachen Geschwindigkeiten bis zu 2x schneller als Tensorflow auf einigen Benchmarks erreicht hat Optimierung für diese Berechnungen. Potentiell ist es nicht zu verachten, Rechenzeiten von 500 Sekunden / Epoche bis 300 Sekunden / Epoche zu schneiden. 300 Sekunden = 5 Minuten. Man könnte also 15 Epochen in einer Stunde schaffen. und etwa 50 Epochen in etwa 3,5 Stunden! Aber im Idealfall möchte ich diese Art von Berechnungen in weniger als einer Stunde durchführen. Um zu diesen Levels zu kommen, muss ich eine GPU verwenden, und nur NVIDIA bietet zu diesem Zeitpunkt volle Unterstützung in dieser Hinsicht: Neon verwendet auch CUDA und cuDNN, wenn eine GPU verfügbar ist (und natürlich muss es eine NVIDIA-GPU sein) ). Wenn Sie Zugriff auf andere Intel-Hardware haben, ist dies natürlich eine gute Möglichkeit, dies zu verfolgen. Schließlich wurde Neon aus einer Motivation heraus entwickelt, um die Dinge auch bei Nicht-NVIDIA-Setups (wie Nervanas Custom CPUs und jetzt Intel FPGAs oder Xeon Phis) optimal zu nutzen.

3.5.) Intel Movidius

Update 2017-08-25: Ich bin auf dieser Artikel . Intel hat einen USB3.0-Stick-basierten "Deep Learning" -Accelerator veröffentlicht. Offensichtlich funktioniert es mit Cafe und ermöglicht dem Benutzer, eine gemeinsame Cafe-basierte Feinabstimmung von Netzwerken und Inferenz durchzuführen. Das ist wichtig zu betonen: Wenn Sie Ihr eigenes Netzwerk von Grund auf neu trainieren wollen, ist der Wortlaut hier sehr zweideutig. Ich gehe daher davon aus, dass abgesehen von der Feinabstimmung eines Netzwerks, das Training selbst immer noch an etwas mit mehr Parallelen durchgeführt werden sollte. Der eigentliche Kicker ist jedoch folgendes: Als ich nach der Preisgestaltung gefragt habe, kostet dieser Stick nur $ 79. Das ist nichts im Vergleich zu den Kosten für Ihre durchschnittliche NVIDIA 1070-80 (ti) -Karte. Wenn Sie einige Sehprobleme nur durch die Verwendung gemeinsamer Netzwerktopologien lösen möchten, die bereits für einige verwandte Aufgaben verfügbar sind, können Sie diesen Steuerknüppel verwenden, um ihn an Ihre eigenen Bedürfnisse anzupassen. Anschließend kompilieren Sie den Code und setzen ihn in diesen Steuerknüppel ein. Viele Anwendungsfälle können mit diesem Stick abgedeckt werden, und für wieder $ 79 könnte es sich lohnen. Da Intel dies vorschlägt, schlagen sie vor, auf Intel zu setzen. Ihr Modell besteht darin, die Wolke (d. H. Nervana Cloud) für das Training zu verwenden. Verwenden Sie diesen Chip dann für die Prototyp-Inferenz oder Inferenz, wenn der Energieverbrauch eine Rolle spielt. Ob dies der richtige Ansatz ist oder nicht, bleibt dem Leser überlassen.

Zu diesem Zeitpunkt sieht es so aus, als ob tiefes Lernen ohne NVIDIA immer noch schwierig zu realisieren ist. Einige begrenzte Geschwindigkeitsgewinne sind schwierig, aber möglicherweise durch die Verwendung von Opencl möglich. Andere Initiativen klingen vielversprechend, aber es wird Zeit brauchen, um die tatsächlichen Auswirkungen dieser Initiativen zu klären.

    
Thornhale 04.04.2017, 22:41
quelle
2

Wenn Ihre Plattform opencl unterstützt, können Sie sie mit Tensorflow verwenden. Es gibt eine experimentelle Unterstützung für Linux unter dieses github-Repository . Einige vorläufige Anweisungen finden Sie unter den Dokumentationsteil dieses GitHub-Repositorys .

    
etarion 31.03.2017 15:08
quelle