web-dev-qa-db-fra.com

Utilisation de Keras et Tensorflow avec le processeur graphique AMD

Je commence à apprendre le keras qui, à mon avis, est une couche au-dessus de Tensorflow et de Theano. Cependant, je n’ai accès qu’aux GPU AMD tels que l’AMD R9 280X.

Comment configurer mon environnement Python de sorte que je puisse utiliser mes GPU AMD grâce à la prise en charge de Keras/Tensorflow pour OpenCL?

Je suis sous OSX.

62
Nyxynyx

J'écris un backend OpenCL 1.2 pour Tensorflow à l'adresse https://github.com/hughperkins/tensorflow-cl

Cette fourche de tensorflow pour OpenCL présente les caractéristiques suivantes:

  • il cible tous les périphériques OpenCL 1.2. Il ne nécessite pas OpenCL 2.0, ni SPIR-V, ni SPIR. N'a pas besoin de mémoire virtuelle partagée. Etc ...
  • il est basé sur une bibliothèque sous-jacente appelée 'cuda-on-cl', https://github.com/hughperkins/cuda-on-cl
    • les cibles cuda-on-cl doivent être en mesure de prendre n’importe quel code source NVIDIA® CUDA ™ et de le compiler pour les périphériques OpenCL 1.2. C'est un objectif très général, et un compilateur très général
  • pour l'instant, les fonctionnalités suivantes sont implémentées:
  • il est développé sur Ubuntu 16.04 (avec les processeurs Intel HD5500 et NVIDIA) et sur Mac Sierra (avec les processeurs Intel HD 530 et Radeon Pro 450)

Ce n'est pas le seul fork OpenCL de Tensorflow disponible. Il y a aussi un fork en cours de développement par Codeplay https://www.codeplay.com , en utilisant Computecpp, https://www.codeplay.com/products/computesuite/computecpp = Autant que je sache, leur fork a des exigences plus strictes que les miennes, en ce qui concerne les périphériques GPU spécifiques sur lesquels il fonctionne. Vous devez vérifier les Notes de support de la plate-forme (au bas de la page computecpp), pour déterminer si votre périphérique est pris en charge. Le fork codeplay est en fait un fork officiel de Google, qui se trouve ici: https://github.com/benoitsteiner/tensorflow-opencl

66
Hugh Perkins

La question initiale sur ce message était: Comment faire fonctionner Keras et Tensorflow avec un processeur graphique AMD.

La réponse à cette question est la suivante:

1.) Keras fonctionnera si vous pouvez faire en sorte que Tensorflow fonctionne correctement (éventuellement dans votre environnement virtuel/conda).

2.) Pour que Tensorflow fonctionne sur un processeur graphique AMD, comme d’autres l’ont déjà dit, une des solutions pourrait consister à compiler Tensorflow pour utiliser OpenCl. Pour ce faire, lisez le lien ci-dessous. Mais par souci de concision, je vais résumer les étapes requises ici:

  • Vous aurez besoin de pilotes propriétaires AMD. Celles-ci ne sont actuellement disponibles que sur Ubuntu 14.04 (la version avant qu'Ubuntu ne décide de modifier le rendu de l'interface utilisateur). La prise en charge d’Ubuntu 16.04 est, à l’écriture de ce message, limitée à quelques GPU via AMDProDrivers. Les lecteurs qui souhaitent approfondir leurs connaissances sur les GPU AMD devraient en être conscients!

  • La compilation de Tensorflow avec OpenCl nécessite également l’obtention et l’installation des conditions préalables suivantes: en-têtes OpenCl, ComputeCpp.

  • Une fois les conditions préalables remplies, configurez votre construction. Notez qu'il existe 3 options pour compiler Tensorflow: Std Tensorflow (stable), Tensorflow-opencl de Benoits Steiner (développement) et Tensorflow-opencl de Luke Iwanski (très expérimental) que vous pouvez extraire de github. Notez également que si vous décidez de construire à partir de l’une des versions d’Opencl, la question à utiliser opencl manquera car il est supposé que vous l’utilisez. Inversement, cela signifie que si vous configurez à partir du tensorflow standard, vous devrez sélectionner "Yes" (Oui) lorsque le script de configuration vous demande d’utiliser opencl et "NO" pour CUDA.

  • Puis lancez des tests comme suit:

    $ bazel test --config = sycl -k --test_timeout 1600 - // tensorflow/... - // tensorflow/contrib/... - // tensorflow/Java/... - // tensorflow/compilateur/...

Mise à jour: faire ceci sur ma configuration prend beaucoup de temps sur ma configuration. La partie qui prend longtemps sont tous les tests en cours. Je ne sais pas ce que cela signifie, mais beaucoup de mes tests ont expiré à 1 600 secondes. La durée peut probablement être raccourcie au prix de davantage de tests expirés. Alternativement, vous pouvez simplement créer un flux de tenseurs sans test. Au moment d'écrire ces lignes, l'exécution des tests prenait déjà deux jours.

Ou construisez simplement le paquet pip comme suit:

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

Veuillez lire l'article du blog sur Codeplay: Lukas Iwansky a publié un article complet sur le tutoriel expliquant comment faire fonctionner Tensorflow avec OpenCl le 30 mars 2017. Il s'agit donc d'un article très récent. Il y a aussi quelques détails que je n'ai pas écrits ici.

Comme indiqué dans les nombreux messages ci-dessus, de petites informations sont disséminées dans les interwebs. La publication de Lukas ajoute que toutes les informations ont été rassemblées au même endroit, ce qui devrait rendre la configuration de Tensforflow et d'OpenCl un peu moins ardue. Je ne fournirai qu'un lien ici:

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

Un parcours un peu plus complet a été posté ici:

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

Cela diffère principalement en indiquant explicitement à l'utilisateur qu'il/elle a besoin de:

  • créer des liens symboliques vers un sous-dossier
  • puis installez effectivement tensorflow via la commande "python setup.py develop".

Notez qu'une approche alternative a été mentionnée ci-dessus en utilisant tensorflow-cl:

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

Je suis incapable de discerner quelle approche est la meilleure pour le moment, bien qu'il semble que cette approche soit moins active. Moins de problèmes sont signalés et moins de conversations sont en cours pour les résoudre. Il y a eu une poussée majeure l'année dernière. Des poussées supplémentaires ont été annulées depuis novembre 2016, bien que Hugh semble avoir publié des mises à jour il y a quelques jours à la date de rédaction de ce billet. (Mise à jour: si vous lisez une partie du fichier Lisez-moi de la documentation, cette version de tensorflowo ne dépend désormais plus que de l'assistance de la communauté, car le développeur principal est occupé à vivre.)

MISE À JOUR (2017-04-25): J'ai quelques notes basées sur les tests de tensorflow-opencl ci-dessous.

  • Le futur utilisateur de ce paquet devrait noter que l'utilisation d'Opencl signifie que tout le gros du travail en informatique est transféré au GPU. Je mentionne cela parce que je pensais personnellement que la charge de travail de calcul serait partagée entre mon processeur et iGPU. Cela signifie que la puissance de votre GPU est très importante (en particulier la bande passante et la mémoire VRAM disponible).

Vous trouverez ci-dessous quelques chiffres permettant de calculer 1 époque à l'aide du jeu de données CIFAR10 pour MY SETUP (A10-7850 avec iGPU). Votre kilométrage variera presque certainement!

  • Tensorflow (via pip install): ~ 1700 s/Epoque
  • Tensorflow (w/SSE + AVX): ~ 1100 s/Époque
  • Tensorflow (avec opencl et iGPU): ~ 5800 s/Epoque

Vous pouvez voir que dans ce cas particulier, les performances sont pires. J'attribue cela aux facteurs suivants:

  • L'iGPU a seulement 1 Go. Cela conduit à beaucoup de va-et-vient entre CPU et GPU. (Opencl 1.2 n'a pas encore la possibilité de transmettre des données via des pointeurs; les données doivent être copiées dans les deux sens.)
  • L'iGPU ne dispose que de 512 processeurs de flux (et d'une bande passante mémoire de 32 Gbit/s), ce qui dans ce cas est plus lent que 4 CPU utilisant des jeux d'instructions SSE4 + AVX.
  • Le développement de tensorflow-opencl en est à ses débuts et de nombreuses optimisations dans SYCL, etc. n'ont pas encore été effectuées.

Si vous utilisez un processeur graphique AMD avec plus de VRAM et plus de processeurs de flux, vous êtes certain d'obtenir des chiffres de performance bien meilleurs. Je serais intéressé de lire quels chiffres les gens atteignent pour savoir ce qui est possible.

Je continuerai à maintenir cette réponse si/quand les mises à jour seront mises à jour.

3.) Une alternative est actuellement suggérée qui utilise l'initiative RocM d'AMD et la bibliothèque miOpen (équivalent de nuDNN). Ce sont/seront des bibliothèques open-source qui permettent un apprentissage approfondi. La mise en garde est que le support RocM n’existe actuellement que pour Linux et que miOpen n’a pas encore été publié dans la nature, mais Raja (tête du processeur graphique AMD) a déclaré dans un AMA qu’en utilisant ce qui précède, il devrait être possible de faire un apprentissage approfondi sur les GPU AMD. En fait, une assistance est prévue non seulement pour Tensorflow, mais également pour Cafe2, Cafe, Torch7 et MxNet.

34
Thornhale

On peut utiliser le processeur graphique AMD via le backend PlaidML Keras.

Le plus rapide : PlaidML est souvent 10 fois plus rapide (ou plus) que les plates-formes populaires (telles que TensorFlow CPU) car il prend en charge tous les GPU, indépendamment de la marque et du modèle. PlaidML accélère l'apprentissage en profondeur sur les processeurs AMD, Intel, NVIDIA, ARM et intégrés.

Plus simple : PlaidML est simple à installer et supporte plusieurs interfaces (Keras et ONNX actuellement)

Gratuit : PlaidML est complètement open source et ne repose sur aucune bibliothèque de fournisseur avec des licences propriétaires et restrictives.

Pour la plupart des plates-formes, démarrer avec l'apprentissage approfondi accéléré est aussi simple que d'exécuter quelques commandes (en supposant que vous avez Python (v2 ou v3) installé):

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

Choisissez quel accélérateur vous souhaitez utiliser (de nombreux ordinateurs, en particulier les ordinateurs portables, en ont plusieurs):

plaidml-setup

Ensuite, essayez d’analyser les performances d’inférence MobileNet:

plaidbench keras mobilenet

Ou encore, essayez de former MobileNet:

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

Pour l'utiliser avec le set de keras

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

Pour plus d'informations

https://github.com/plaidml/plaidml

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

11
Talha Junaid

C'est une vieille question, mais depuis que j'ai passé les dernières semaines à essayer de le résoudre moi-même:

  1. Le support OpenCL pour Theano est aléatoire. Ils ont ajouté un back-end libgpuarray qui semble toujours être bogué (le processus s’exécute sur le GPU mais la réponse est fausse - comme une précision de 8% sur MNIST pour un modèle DL obtenant une précision d'environ 95% sur le CPU ou nVidia CUDA). De plus, comme environ 50 à 80% de l’amélioration des performances sur la pile nVidia provient maintenant des bibliothèques CUDNN, OpenCL restera dans la poussière. (VOIR CI-DESSOUS!) :)
  2. ROCM semble être très cool, mais la documentation (et même une déclaration claire de ce que ROCM est/ce qu'il fait) est difficile à comprendre. Ils ' Ils font de leur mieux, mais ils ont plus de 4 ans de retard. Cela ne marche PAS PAS sur une RX550 (à ce jour). Alors ne perdez pas votre temps (c’est là que l’une des semaines est passée :)). Au début, il semble que ROCM soit un nouvel ajout au jeu de pilotes (remplaçant AMDGPU-Pro ou l'augmentant), mais il s'agit en fait d'un module de noyau et d'un ensemble de bibliothèques qui remplacent essentiellement AMDGPU-Pro. (Pensez-y comme à l'équivalent du pilote Nvidia-381 + de certaines bibliothèques CUDA). https://rocm.github.io/dl.html (Honnêtement, je n'ai toujours pas testé les performances ou essayé de le faire fonctionner avec des pilotes Mesa plus récents. Je le ferai de temps en temps.
  3. Ajoutez MiOpen à ROCM, et il s’agit essentiellement de CUDNN. Ils disposent également de guides très clairs sur la migration. Mais mieux encore.
  4. Ils ont créé "HIP", un traducteur automatique de CUDA/CUDNN vers MiOpen. Il semble que cela fonctionne plutôt bien car ils alignaient directement l'API pour être traduisible. Il y a des concepts qui ne sont pas des cartes parfaites, mais en général, ça a l'air bien.

Enfin, après trois ou quatre semaines d’essai pour comprendre OpenCL, etc., j’ai trouvé ce tutoriel pour vous aider à démarrer rapidement. C'est une étape à suivre pour lancer hipCaffe. Contrairement à nVidia, assurez-vous que vous avez du matériel supporté !!!! https://rocm.github.io/hardware.html . Pensez-vous pouvoir le faire fonctionner sans leur matériel pris en charge? Bonne chance. Tu as été prévenu. Une fois que ROCM est opérationnel (et lancez les tests de vérification), voici le didacticiel hipCaffe - si vous possédez ROCM, vous ferez un test de validation MNIST dans les 10 minutes - adorable! https://rocm.github.io/ROCmHipCaffeQuickstart.html

5
Selly

Theano prend en charge OpenCL, mais il en est encore à ses débuts. Theano lui-même n'est pas intéressé par OpenCL et s'appuie sur support de la communauté .

La plupart des opérations sont déjà implémentées et il s’agit principalement de régler et d’optimiser les opérations données.

Pour utiliser le backend OpenCL, vous devez construirelibgpuarray vous-même.

Par expérience personnelle, je peux vous dire que vous obtiendrez des performances de processeur si vous avez de la chance. L'allocation de mémoire semble être très naïvement mise en œuvre (le calcul sera donc lent) et va planter lorsqu'elle manque de mémoire. Mais je vous encourage à essayer et peut-être même à optimiser le code ou à aider à signaler les bogues.

4
nemo

Si vous avez accès à d'autres gpu d'AMD, veuillez consulter ici: https://github.com/ROCmSoftwarePlatform/hiptensorflow/tree/hip/rocm_docs

Cela devrait vous amener dans la bonne direction pour tensorflow sur la plate-forme ROCm, mais le post de Selly à propos de https://rocm.github.io/hardware.html est le problème avec cet itinéraire. Cette page n’est pas exhaustive, j’ai appris par moi-même que le Xeon E5 v2 Ivy Bridge fonctionnait bien avec le ROCm même s’il répertorie la v3 ou une version plus récente, mais les cartes graphiques sont un peu plus difficiles. gfx8 ou plus récent à quelques petites exceptions près, polaris et peut-être d’autres au fil du temps.

UPDATE - Il semblerait que hiptensorflow ait une option pour le support opencl pendant la configuration. Je dirais qu'il faut enquêter sur le lien même si vous n'avez pas gfx8 + ou polaris gpu si l'implémentation opencl fonctionne. La procédure est longue, mais une heure ou trois (en fonction du matériel), à la suite d’une instruction bien écrite, n’est pas si difficile à perdre à découvrir.

3
Kruft Industries

Tensorflow 1.3 a été pris en charge sur la pile AMD ROCm:

Une image de menu fixe prédéfinie a également été publiée:

3
user1917768