Verwenden von Keras & Tensorflow mit AMD-GPU

74

Ich fange an, Keras zu lernen, von dem ich glaube, dass es eine Schicht über Tensorflow und Theano ist. Ich habe jedoch nur Zugriff auf AMD-GPUs wie den AMD R9 280X.

Wie kann ich meine Python-Umgebung so einrichten, dass ich meine AMD-GPUs über die Keras / Tensorflow-Unterstützung für OpenCL nutzen kann?

Ich laufe unter OSX.

Nyxynyx
quelle
Ich glaube, das neue Theano-Backend wird sowohl OpenCL- als auch NVIDIA-Karten unterstützen. Was Tensorflow betrifft, gibt es ein offenes Problem für die OpenCL-Unterstützung. Es sieht nicht so aus, als ob große Fortschritte erzielt wurden.
Gobrewers14
3
AMD-GPUs in TensorFlow oder den meisten anderen neuronalen Netzwerkpaketen werden nicht unterstützt. Der Grund dafür ist, dass NVidia in die schnelle kostenlose Implementierung von neuronalen Netzwerkblöcken (CuDNN) investiert hat, auf die sich alle schnellen Implementierungen von neuronalen GPU-Netzwerken stützen (Torch / Theano / TF), während AMD diesen Markt nicht zu interessieren scheint.
Jaroslaw Bulatow
4
Vor kurzem kündigte Google an, AMD-GPUs zur Verwendung in ihren Rechenzentren zu kaufen, vermutlich auch für Anwendungen für maschinelles Lernen. Ein solcher Schritt ist nicht sinnvoll, wenn es keine Roadmap gibt, um gpus generischer zu unterstützen.
Thornhale
1
Auf den meisten Plattformen (derzeit Mac / Win / Linux) können Sie Keras auf PlaidML ausführen. PlaidML ist Open Source und enthält eine Alternative zu cuDNN, die auf den meisten GPUs funktioniert: github.com/plaidml/plaidml
Choong Ng
Einfache Möglichkeit , OpenCL auf Linux zu installieren gist.github.com/kytulendu/3351b5d0b4f947e19df36b1ea3c95cbe
user1462442

Antworten:

67

Ich schreibe ein OpenCL 1.2-Backend für Tensorflow unter https://github.com/hughperkins/tensorflow-cl

Diese Tensorflussgabel für OpenCL weist die folgenden Eigenschaften auf:

  • Es zielt auf alle OpenCL 1.2-Geräte ab. Es benötigt kein OpenCL 2.0, kein SPIR-V oder SPIR. Benötigt keinen gemeinsamen virtuellen Speicher. Und so weiter ...
  • Es basiert auf einer zugrunde liegenden Bibliothek namens "cuda-on-cl", https://github.com/hughperkins/cuda-on-cl
    • cuda-on-cl zielt darauf ab, jeden NVIDIA® CUDA ™ -Sauercode für OpenCL 1.2-Geräte zu kompilieren. Es ist ein sehr allgemeines Ziel und ein sehr allgemeiner Compiler
  • Derzeit sind folgende Funktionen implementiert:
  • Es wurde unter Ubuntu 16.04 (mit Intel HD5500- und NVIDIA-GPUs) und Mac Sierra (mit Intel HD 530 und Radeon Pro 450) entwickelt.

Dies ist nicht die einzige verfügbare OpenCL-Gabel von Tensorflow. Es gibt auch eine Gabel, die von Codeplay https://www.codeplay.com unter Verwendung von Computecpp, https://www.codeplay.com/products/computesuite/computecpp entwickelt wird. Ihre Gabel hat für mich höhere Anforderungen als meine eigene wissen, auf welchen spezifischen GPU-Geräten es funktioniert. Sie müssen die Platform Support Notes (unten auf der Seite "computecpp") überprüfen, um festzustellen, ob Ihr Gerät unterstützt wird. Die Codeplay-Gabel ist eigentlich eine offizielle Google-Gabel, die sich hier befindet: https://github.com/benoitsteiner/tensorflow-opencl

Hugh Perkins
quelle
Ich frage mich: Was ist der Grund, um nur Opencl 1.2 zu unterstützen? Es scheint viele Funktionen in Opencl 2.0 zu geben, die für tiefes Lernen nützlich sein könnten: developer.amd.com/tools-and-sdks/opencl-zone/…
Thornhale
2
Hat jemand ohne dedizierte GPU getestet, wie viel schneller der Tensorfluss wird, wenn eine integrierte GPU (Intel oder AMD) anstelle nur der CPU verwendet wird?
Thornhale
2
@ Thonhale Begründung lautet: Portabilität anvisieren. Beispielsweise unterstützt der Mac Sierra Radeon Pro 450-Treiber nur OpenCL 1.2, ebenso wie der Intel HD 530-Treiber, auf derselben Plattform. (und dies ist im Grunde ein brandneues Mac Book Pro)
Hugh Perkins
36

Die ursprüngliche Frage in diesem Beitrag lautete: Wie können Keras und Tensorflow mit einer AMD-GPU ausgeführt werden?

Die Antwort auf diese Frage lautet wie folgt:

1.) Keras funktioniert, wenn Sie dafür sorgen können, dass Tensorflow ordnungsgemäß funktioniert (optional in Ihrer virtuellen / Conda-Umgebung).

2.) Damit Tensorflow auf einer AMD-GPU funktioniert, wie andere angegeben haben, besteht eine Möglichkeit darin, Tensorflow für die Verwendung von OpenCl zu kompilieren. Lesen Sie dazu den unten stehenden Link. Der Kürze halber fasse ich hier die erforderlichen Schritte zusammen:

  • Sie benötigen AMDs proprietäre Treiber. Diese sind derzeit nur unter Ubuntu 14.04 verfügbar (die Version vor Ubuntu hat beschlossen, die Darstellung der Benutzeroberfläche zu ändern). Die Unterstützung für Ubuntu 16.04 ist beim Schreiben dieses Beitrags auf einige GPUs über AMDProDrivers beschränkt. Leser, die tiefes Lernen auf AMD-GPUs betreiben möchten, sollten sich dessen bewusst sein!

  • Zum Kompilieren von Tensorflow mit OpenCl-Unterstützung müssen Sie außerdem die folgenden Voraussetzungen erfüllen und installieren: OpenCl-Header, ComputeCpp.

  • Nachdem die Voraussetzungen erfüllt sind, konfigurieren Sie Ihren Build. Beachten Sie, dass es drei Optionen zum Kompilieren von Tensorflow gibt: Std Tensorflow (stabil), Benoits Steiners Tensorflow-opencl (entwicklungsbezogen) und Luke Iwanskis Tensorflow-opencl (sehr experimentell), die Sie aus Github ziehen können. Beachten Sie auch, dass bei der Entscheidung, aus einer der opencl-Versionen zu erstellen, die Frage zur Verwendung von opencl fehlt, da davon ausgegangen wird, dass Sie es verwenden. Umgekehrt bedeutet dies, dass Sie bei der Konfiguration über den Standard-Tensorflow "Ja" auswählen müssen, wenn das Konfigurationsskript Sie auffordert, opencl und "NO" für CUDA zu verwenden.

  • Führen Sie dann folgende Tests durch:

    $ bazel test --config = sycl -k --test_timeout 1600 - // Tensorflow / ... - // Tensorflow / Contrib / ... - // Tensorflow / Java / ... - // Tensorflow / Compiler / ...

Update: Dies in meinem Setup zu tun, dauert in meinem Setup außerordentlich lange. Der Teil, der lange dauert, sind alle laufenden Tests. Ich bin mir nicht sicher, was dies bedeutet, aber viele meiner Tests laufen nach 1600 Sekunden ab. Die Dauer kann wahrscheinlich auf Kosten weiterer Test-Timeouts verkürzt werden. Alternativ können Sie den Tensorfluss auch ohne Tests aufbauen. Zum Zeitpunkt dieses Schreibens hat das Ausführen der Tests bereits 2 Tage gedauert.

Oder bauen Sie das Pip-Paket einfach so:

bazel build --local_resources 2048,.5,1.0 -c opt --config=sycl //tensorflow/tools/pip_package:build_pip_package

Bitte lesen Sie den Blog-Beitrag bei Codeplay: Lukas Iwansky hat erst am 30. März 2017 einen umfassenden Tutorial-Beitrag darüber veröffentlicht, wie Tensorflow mit OpenCl funktioniert. Dies ist also ein sehr aktueller Beitrag. Es gibt auch einige Details, über die ich hier nicht geschrieben habe.

Wie in den vielen obigen Beiträgen angegeben, sind kleine Informationen über die Interwebs verteilt. Was Lukas 'Beitrag in Bezug auf den Wert hinzufügt, ist, dass alle Informationen an einem Ort zusammengefasst wurden, was die Einrichtung von Tensforflow und OpenCl etwas weniger entmutigend machen sollte. Ich werde hier nur einen Link bereitstellen:

https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl

Eine etwas vollständigere Anleitung wurde hier veröffentlicht:

http://deep-beta.co.uk/setting-up-tensorflow-with-opencl-using-sycl/

Es unterscheidet sich hauptsächlich dadurch, dass dem Benutzer ausdrücklich mitgeteilt wird, dass er:

  • Erstellen Sie Symlinks zu einem Unterordner
  • und installieren Sie dann Tensorflow über den Befehl "python setup.py Develop".

Beachten Sie, dass oben ein alternativer Ansatz unter Verwendung von Tensorflow-cl erwähnt wurde:

https://github.com/hughperkins/tensorflow-cl

Ich kann derzeit nicht erkennen, welcher Ansatz besser ist, obwohl dieser Ansatz anscheinend weniger aktiv ist. Es werden weniger Probleme veröffentlicht und es finden weniger Konversationen zur Behebung dieser Probleme statt. Letztes Jahr gab es einen großen Schub. Seit November 2016 sind weitere Pushs abgeklungen, obwohl Hugh anscheinend vor einigen Tagen einige Updates zum Zeitpunkt des Schreibens dieses Beitrags veröffentlicht hat. (Update: Wenn Sie einen Teil der Dokumentations-Readme lesen, ist diese Version von Tensorflowo nur noch auf Community-Unterstützung angewiesen, da der Hauptentwickler mit dem Leben beschäftigt ist.)

UPDATE (25.04.2017): Ich habe einige Anmerkungen zum Testen von tensorflow-opencl unten.

  • Der zukünftige Benutzer dieses Pakets sollte beachten, dass die Verwendung von opencl bedeutet, dass der gesamte Rechenaufwand auf die GPU verlagert wird. Ich erwähne dies, weil ich persönlich dachte, dass die Rechenarbeitslast zwischen meiner CPU und der iGPU aufgeteilt werden würde. Dies bedeutet, dass die Leistung Ihrer GPU sehr wichtig ist (insbesondere Bandbreite und verfügbarer VRAM).

Im Folgenden finden Sie einige Zahlen zur Berechnung einer Epoche unter Verwendung des CIFAR10-Datensatzes für MY SETUP (A10-7850 mit iGPU). Ihr Kilometerstand wird mit ziemlicher Sicherheit variieren!

  • Tensorflow (über Pip-Installation): ~ 1700 s / Epoche
  • Tensorflow (mit SSE + AVX): ~ 1100 s / Epoche
  • Tensorflow (mit opencl & iGPU): ~ 5800 s / Epoche

Sie können sehen, dass in diesem speziellen Fall die Leistung schlechter ist. Ich schreibe dies folgenden Faktoren zu:

  • Die iGPU hat nur 1 GB. Dies führt zu viel Hin- und Herkopieren zwischen CPU und GPU. (Opencl 1.2 kann noch keine Daten über Zeiger übertragen. Stattdessen müssen Daten hin und her kopiert werden.)
  • Die iGPU verfügt nur über 512 Stream-Prozessoren (und eine Speicherbandbreite von 32 Gbit / s), die in diesem Fall mit SSE4 + AVX-Befehlssätzen langsamer als 4 CPUs sind.
  • Die Entwicklung von Tensorflow-Opencl befindet sich in den Anfängen, und viele Optimierungen in SYCL usw. wurden noch nicht durchgeführt.

Wenn Sie eine AMD-GPU mit mehr VRAM und mehr Stream-Prozessoren verwenden, erhalten Sie mit Sicherheit viel bessere Leistungszahlen. Mich würde interessieren, welche Zahlen die Leute erreichen, um zu wissen, was möglich ist.

Ich werde diese Antwort weiterhin beibehalten, wenn Updates veröffentlicht werden.

3.) Derzeit wird ein alternativer Weg angedeutet, der die RocM-Initiative von AMD und die miOpen-Bibliothek (cuDNN-Äquivalent) verwendet. Dies sind / werden Open-Source-Bibliotheken sein, die tiefes Lernen ermöglichen. Die Einschränkung ist, dass die RocM-Unterstützung derzeit nur für Linux existiert und dass miOpen noch nicht veröffentlicht wurde, aber Raja (AMD-GPU-Leiter) hat in einer AMA gesagt, dass es möglich sein sollte, mit den oben genannten Informationen tiefes Lernen durchzuführen AMD-GPUs. Tatsächlich ist Support nicht nur für Tensorflow geplant, sondern auch für Cafe2, Cafe, Torch7 und MxNet.

Thornhale
quelle
Ich würde gerne sehen, wie AMD aktiv wird - persönlich habe ich alle AMD-Karten -, aber es wurde uns schon bald zu lange gesagt (nicht, dass AMD hier die Kontrolle darüber hat, ob TensorFlow usw. es implementiert). Hat AMD ein "Issue Tracker" -Äquivalent, das Sie zufällig kennen?
Ehiller
Wissen Sie, wie sich die Szene verändert hat, seit Sie diese Antwort geschrieben haben?
Maxie Berkmann
21

Man kann AMD GPU über das PlaidML Keras Backend verwenden.

Am schnellsten : PlaidML ist häufig 10-mal schneller (oder mehr) als gängige Plattformen (wie TensorFlow-CPU), da es alle GPUs unterstützt, unabhängig von Marke und Modell. PlaidML beschleunigt das Deep Learning auf AMD-, Intel-, NVIDIA-, ARM- und eingebetteten GPUs.

Am einfachsten : PlaidML ist einfach zu installieren und unterstützt mehrere Frontends (Keras und ONNX derzeit).

Kostenlos : PlaidML ist vollständig Open Source und basiert nicht auf Herstellerbibliotheken mit proprietären und restriktiven Lizenzen.

Für die meisten Plattformen ist der Einstieg in das beschleunigte Deep Learning so einfach wie das Ausführen einiger Befehle (vorausgesetzt, Sie haben Python (v2 oder v3) installiert):

virtualenv plaidml
source plaidml/bin/activate
pip install plaidml-keras plaidbench

Wählen Sie den Beschleuniger aus, den Sie verwenden möchten (viele Computer, insbesondere Laptops, verfügen über mehrere):

plaidml-setup

Versuchen Sie als Nächstes, die Inferenzleistung von MobileNet zu vergleichen:

plaidbench keras mobilenet

Oder trainieren Sie MobileNet:

plaidbench --batch-size 16 keras --train mobilenet

Um es mit Keras Set zu benutzen

os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"

Für mehr Informationen

https://github.com/plaidml/plaidml

https://github.com/rstudio/keras/issues/205#issuecomment-348336284

Talha Junaid
quelle
Ich benutze die ganze Zeit PlaidML und habe je nach GPU ein Benchmarking durchgeführt. Es funktioniert ganz gut auf allen meinen Macs.
Bryan Butler
Diese drei Befehle stehen am Anfang jedes Skripts: import plaidml.keras plaidml.keras.import_backend() from keras import backend as K
Bryan Butler
7

Dies ist eine alte Frage, aber seit ich die letzten Wochen damit verbracht habe, es selbst herauszufinden:

  1. OpenCL-Unterstützung für Theano ist ein Hit und Miss. Sie fügten ein libgpuarray-Backend hinzu, das immer noch fehlerhaft zu sein scheint (dh der Prozess läuft auf der GPU, aber die Antwort ist falsch - wie 8% Genauigkeit auf MNIST für ein DL-Modell, das auf CPU oder nVidia eine Genauigkeit von ~ 95 +% erreicht CUDA). Da ~ 50-80% der Leistungssteigerung auf dem nVidia-Stack jetzt aus den CUDNN-Bibliotheken stammt, bleibt OpenCL nur im Staub. (SIEHE UNTEN!) :)
  2. ROCM scheint sehr cool zu sein, aber die Dokumentation (und sogar eine klare Erklärung, was ROCM ist / was es tut) ist schwer zu verstehen. Sie geben ihr Bestes, aber sie sind mehr als 4 Jahre zurück. Es funktioniert NICHT NICHT NICHT auf einem RX550 (zum jetzigen Zeitpunkt). Verschwenden Sie also keine Zeit (hier war eine der Wochen :)). Zunächst scheint ROCM eine neue Ergänzung des Treibersatzes zu sein (AMDGPU-Pro ersetzen oder erweitern), aber es ist tatsächlich ein Kernelmodul und ein Satz von Bibliotheken, die AMDGPU-Pro im Wesentlichen ersetzen. (Stellen Sie sich dies als das Äquivalent von Nvidia-381-Treiber + CUDA vor, das einige Bibliotheken haben). https://rocm.github.io/dl.html (Ehrlich gesagt habe ich die Leistung noch nicht getestet oder versucht, sie mit neueren Mesa-Treibern zum Laufen zu bringen. Ich werde das irgendwann tun.
  3. Fügen Sie MiOpen zu ROCM hinzu, und das ist im Wesentlichen CUDNN. Sie haben auch einige ziemlich klare Anleitungen für die Migration. Aber noch besser.
  4. Sie haben "HIP" erstellt, einen automatischen Übersetzer von CUDA / CUDNN nach MiOpen. Es scheint ziemlich gut zu funktionieren, da die APIs direkt ausgerichtet wurden, um übersetzbar zu sein. Es gibt Konzepte, die keine perfekten Karten sind, aber im Allgemeinen sieht es gut aus.

Nachdem ich 3-4 Wochen lang versucht hatte, OpenCL usw. herauszufinden, fand ich dieses Tutorial, um Ihnen den schnellen Einstieg zu erleichtern. Es ist eine Schritt-für-Schritt-Anleitung, um hipCaffe zum Laufen zu bringen. Im Gegensatz zu nVidia stellen Sie bitte sicher, dass Sie Hardware unterstützt haben !!!! https://rocm.github.io/hardware.html . Denken Sie, Sie können es ohne die unterstützte Hardware zum Laufen bringen? Viel Glück. Du wurdest gewarnt. Sobald Sie ROCM eingerichtet haben (UND DIE ÜBERPRÜFUNGSTESTS AUSFÜHREN), finden Sie hier das hipCaffe-Tutorial. Wenn Sie ROCM eingerichtet haben, führen Sie innerhalb von 10 Minuten einen MNIST-Validierungstest durch - süß! https://rocm.github.io/ROCmHipCaffeQuickstart.html

Selly
quelle
Ein Link zu einer Lösung ist willkommen, aber stellen Sie sicher, dass Ihre Antwort ohne sie nützlich ist: Fügen Sie dem Link einen Kontext hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist, und zitieren Sie dann den relevantesten Teil der Seite, die Sie verwenden. erneutes Verknüpfen mit, falls die Zielseite nicht verfügbar ist. Antworten, die kaum mehr als ein Link sind, können gelöscht werden.
paper1111
Zu Ihrer Information, die von Ihnen verlinkten Seiten existieren nicht mehr und leiten sie an eine andere Stelle weiter, die die Antworten nicht vollständig enthält.
Maxie Berkmann
Lassen Sie mich den neuesten Status in der nächsten Woche überprüfen, um die Antwort zu aktualisieren.
Thornhale
4

Theano hat Unterstützung für OpenCL , aber es ist immer noch in einem frühen Stadium. Theano selbst ist nicht an OpenCL interessiert und ist auf Community-Unterstützung angewiesen .

Die meisten Operationen sind bereits implementiert, und es geht hauptsächlich darum, die gegebenen Operationen zu optimieren und zu optimieren.

Um das OpenCL-Backend nutzen zu können, müssen Sie sich selbst erstellen libgpuarray .

Aus persönlicher Erfahrung kann ich Ihnen sagen, dass Sie mit etwas Glück CPU-Leistung erhalten. Die Speicherzuordnung scheint sehr naiv implementiert zu sein (daher ist die Berechnung langsam) und stürzt ab, wenn der Speicher knapp wird. Aber ich ermutige Sie, zu versuchen, den Code zu optimieren oder Fehler zu melden.

nemo
quelle
4
Hat sich diesbezüglich in den letzten 6 Monaten etwas geändert?
Thornhale
5
Theano wurde eingestellt
Erik Aigner
@ErikAigner Offiziell. Fehler sind immer noch behoben und die Community kann dazu beitragen.
Nemo
1
In der Tat wurde Theano eingestellt .
Josiah Yoder
3

Wenn Sie Zugriff auf andere AMD-GPUs haben, lesen Sie bitte hier: https://github.com/ROCmSoftwarePlatform/hiptensorflow/tree/hip/rocm_docs

Dies sollte Sie in die richtige Richtung für den Tensorflow auf der ROCm-Plattform bringen, aber Sellys Beitrag über https://rocm.github.io/hardware.html ist der Deal mit dieser Route. Diese Seite ist keine vollständige Liste. Ich habe selbst herausgefunden, dass die Xeon E5 v2 Ivy Bridge mit ROCm einwandfrei funktioniert, obwohl sie v3 oder höher auflistet. Grafikkarten sind jedoch etwas wählerischer. gfx8 oder neuer mit ein paar kleinen ausnahmen, polaris und vielleicht andere im laufe der zeit.

UPDATE - Es sieht so aus, als ob hiptensorflow eine Option für die Unterstützung von opencl während der Konfiguration hat. Ich würde sagen, untersuchen Sie den Link, auch wenn Sie nicht über gfx8 + oder polaris gpu verfügen, wenn die opencl-Implementierung funktioniert. Es ist ein langwieriger Prozess, aber ein oder drei Stunden (je nach Hardware) nach einer gut geschriebenen Anweisung sind nicht zu viel zu verlieren, um es herauszufinden.

Kruft Industries
quelle