web-dev-qa-db-ja.com

AMD GPUでKeras&Tensorflowを使用する

私はKerasを学び始めています。これはTensorflowとTheanoの上にある層だと私は思います。しかし、私はAMD R9 280XなどのAMD GPUにしかアクセスできない。

OpenCLに対するKeras/Tensorflowのサポートを通じて自分のAMD GPUを利用できるように、Python環境をどのように設定できますか?

私はOSXで走っています。

60
Nyxynyx

私はTensorflowのOpenCL 1.2バックエンドを書いています https://github.com/hughperkins/tensorflow-cl

OpenCL用のこのテンソルフローのフォークには、次のような特徴があります。

  • すべてのOpenCL 1.2デバイスを対象としています。 OpenCL 2.0、SPIR-V、またはSPIRは必要ありません。共有仮想メモリは必要ありません。等々 ...
  • それは 'cuda-on-cl'と呼ばれる基盤となるライブラリに基づいています--- https://github.com/hughperkins/cuda-on-cl
    • cuda-on-clは、任意のNVIDIA®CUDA™ソースコードを取得し、OpenCL 1.2デバイス用にコンパイルできるようにすることを目標としています。非常に一般的な目標であり、非常に一般的なコンパイラです。
  • 今のところ、以下の機能が実装されています。
  • ubuntu 16.04(Intel HD 5500とNVIDIA GPUを使用)とMac Sierra(Intel HD 530とRadeon Pro 450を使用)で開発されています。

これが利用可能なTensorflowの唯一のOpenCLフォークではありません。 Codeplayによって開発されているフォークもあります https://www.codeplay.com 、Computecppを使って、 https://www.codeplay.com/products/computesuite/computecpp =私の知る限りでは、それらのフォークはどのGPUデバイスで動作するかという点で私のものよりも強い要件を持っています。デバイスがサポートされているかどうかを判断するには、Platform Support Notes(computeppページの下部にあります)を確認する必要があります。コードプレイフォークは、実際には公式のGoogleフォークです。こちらには、 https://github.com/benoitsteiner/tensorflow-opencl があります。

63
Hugh Perkins

この記事に関する最初の質問は、KerasとTensorflowをAMD GPUで動かす方法です。

この質問に対する答えは次のとおりです。

1.)Tensorflowを正しく動作させることができれば(オプションで仮想/ conda環境内で)Kerasは動作します。

2.)TensorflowをAMD GPU上で動作させるには、他の人が述べているように、これがうまくいく方法の1つは、OpenClを使用するようにTensorflowをコンパイルすることです。そのためには下記のリンクを読んでください。しかし、簡潔にするために、ここで必要な手順を要約します。

  • AMD独自のドライバが必要になります。これらは現在Ubuntu 14.04(UbuntuがUIのレンダリング方法を変更することを決定する前のバージョン)でのみ利用可能です。 Ubuntu 16.04のサポートは、この記事の執筆時点ではAMDProDriversを介した少数のGPUに限定されています。 AMD GPUについて深く学びたいと思う読者はこれに気付くべきです!

  • OpenClをサポートしてTensorflowをコンパイルするには、OpenClヘッダー、ComputeCppという前提条件も入手してインストールする必要があります。

  • 前提条件が満たされたら、ビルドを構成します。 Tensorflowをコンパイルするための3つのオプションがあることに注意してください:Std Tensorflow(安定版)、Benoits SteinerのTensorflow-opencl(開発版)、そしてgithubから引き出すことができるLuke IwanskiのTensorflow-opencl(非常に実験的)。また、openclのバージョンのいずれかからビルドすることにした場合、openclを使用することは想定されていないため、openclを使用するという質問はなくなります。逆に言えば、もしあなたが標準テンソルフローから設定するなら、configureスクリプトがopenclを使うように頼むときに "Yes"を選ぶ必要があり、CUDAのために "NO"を選ぶ必要があることを意味します。

  • それから次のようにテストを実行します。

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

更新日:私のセットアップでこれを行うと、セットアップに非常に時間がかかります。時間がかかる部分は、実行されているすべてのテストです。これが何を意味するのかわかりませんが、私のテストの多くは1600秒でタイムアウトしています。より多くのテストがタイムアウトになるのを犠牲にして、おそらく期間を短くすることができます。あるいは、テストなしでテンソル流を構築することもできます。これを書いている時点では、テストの実行はすでに2日かかりました。

あるいはpipパッケージを次のようにビルドするだけです。

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

実際にCodeplayでブログ記事をお読みください:Lukas Iwanskyが、TensorflowをOpenClと連携させる方法に関する包括的なチュートリアル記事を2017年3月30日に投稿しました。したがって、これはごく最近の記事です。私がここで書いていないいくつかの詳細もあります。

上記の多くの記事で示されているように、わずかな情報がウェブ間に広がっています。 Lukasの投稿が価値に関して追加しているのは、すべての情報が1つの場所にまとめられているため、TensforflowとOpenClを設定するのが少し面倒なことです。ここにリンクを提供するだけです。

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

もう少し完全なウォークスルーがここに掲載されています。

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

それは主にユーザーに彼/彼女がする必要があることを明示的に伝えることによって異なります:

  • サブフォルダーへのシンボリックリンクを作成する
  • そして実際に "python setup.py Develop"コマンドでtensorflowをインストールしてください。

Tensorflow-clを使用した代替アプローチが上で言及されていることに注意してください。

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

現時点ではどちらのアプローチが優れているかはわかりませんが、このアプローチはあまり活発ではないようです。投稿される問題が少なくなり、それらの問題を解決するための会話が減少しています。昨年は大きなプッシュがありました。この記事の執筆時点で、Hugh氏は数日前にいくつかの更新をプッシュしているようだが、追加のプッシュは2016年11月以来消えている。 (更新:あなたがドキュメンテーションのreadmeのいくつかを読んだならば、主要な開発者が人生で忙しいので、このバージョンのtensorflowoは今コミュニティサポートだけに頼ります。)

更新(2017-04-25):以下のtensorflow-openclのテストに基づいていくつかの注意点があります。

  • このパッケージを将来使用するユーザーは、openclを使用するということは、コンピューティングの面ですべての面倒な作業がGPUに移行することを意味することに注意してください。私が個人的に計算作業負荷が私のCPUとiGPUの間で共有されるであろうと思っていたので、私はこれについて言及します。これはあなたのGPUのパワーが非常に重要であることを意味します(特に帯域幅と利用可能なVRAM)。

以下は、私の設定用のCIFAR10データセット(iGPU付きA10-7850)を使用して1エポックを計算するためのいくつかの数値です。あなたの走行距離はほぼ確実に変わります!

  • Tensorflow(ピップインストールによる):〜1700秒/エポック
  • テンソル流(w/SSE+ AVX):〜1100秒/エポック
  • テンソルフロー(w/openclとiGPU):〜5800秒/エポック

この特定のケースでは、パフォーマンスが悪くなっていることがわかります。私はこれを次の要因に帰します。

  • IGPUは1GBしかありません。これにより、CPUとGPU間で大量のコピーがやり取りされます。 (Opencl 1.2はまだポインタを介してデータを渡す能力を持っていません;代わりにデータは前後にコピーされなければなりません。)
  • IGPUには512個のストリームプロセッサ(および32Gb/sのメモリ帯域幅)しかないため、この場合はSSE4 + AVX命令セットを使用した4個のCPUより低速です。
  • Tensorflow-openclの開発はまだ初期段階にあり、SYCLなどでの多くの最適化はまだ行われていません。

より多くのVRAMとより多くのストリームプロセッサを搭載したAMD GPUを使用している場合は、はるかに優れたパフォーマンス値が得られるはずです。私は何が可能であるかを知るために人々が何を達成しているかを読むことに興味があるでしょう。

更新がプッシュされた場合はいつでもこの回答を維持します。

3.)AMDのRocMイニシアチブとmiOpen(cuDNNに相当する)ライブラリを使用するという代替手段が現在示唆されています。これらは、ディープラーニングを可能にするオープンソースライブラリです。注意点は、現在RocMサポートはLinuxにしか存在しないこと、そしてmiOpenはまだ一般に公開されていないことですが、Raja(AMD GPUの責任者)は AMA で述べています。 AMD GPUについて深く学習することは可能なはずです。実際、Tensorflowだけでなく、Cafe 2、Cafe、Torch 7、およびMxNetのサポートも予定されています。

33
Thornhale

PlaidML Kerasバックエンドを介してAMD GPUを使用することができます。

最速:PlaidMLは一般的なプラットフォーム(TensorFlow CPUのような)よりも10倍速く(またはそれ以上)、製造元やモデルに関係なくすべてのGPUをサポートしています。 PlaidMLは、AMD、Intel、NVIDIA、ARM、および組み込みGPUに関する深い学習を加速します。

最も簡単:PlaidMLはインストールが簡単で複数のフロントエンドをサポートします(現在はKerasとONNX)

無料:PlaidMLは完全にオープンソースであり、独自の制限付きライセンスを持つベンダーのライブラリに依存しません。

ほとんどのプラットフォームでは、高速ディープラーニングを開始するのは、いくつかのコマンドを実行するのと同じくらい簡単です(Python(v2またはv3)がインストールされていると仮定して)。

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

どのアクセラレータを使用するかを選択します(多くのコンピュータ、特にラップトップには複数のコンピュータがあります)。

plaidml-setup

次に、MobileNetの推論パフォーマンスのベンチマークを試してください。

plaidbench keras mobilenet

または、MobileNetのトレーニングを試してください。

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

ケラスセットで使用する

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

詳細については

https://github.com/plaidml/plaidml

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

8
Talha Junaid

これは昔からの質問ですが、ここ数週間で自分で解決しようとしたので。

  1. Theanoに対するOpenCLのサポートは失敗しています。libgpuarrayバックエンドを追加しました。これはまだバグがあるようです(つまり、プロセスはGPU上で実行されますが答えは間違っています - DLモデルに対するMNISTの8%の精度のように、CPUまたはnVidia CUDAの約95 +%の精度です。また、nVidiaスタックのパフォーマンス向上の50〜80%がCUDNNライブラリによるものであるため、OpenCLはまさにほこりのままになります。 (下記参照!) :)
  2. ROCMはとてもクールに見えますが、ドキュメント(そしてROCMが何であるか/それが何をしているかの明確な宣言さえ)は理解するのが難しいです。最善を尽くしますが、4年以上遅れています。 RX550では動作しません(これを書いている時点で)。だからあなたの時間を無駄にしないでください(これは週の1が行ったところです:))。最初は、ROCMはドライバセットに新しく追加された(AMDGPU-Proに置き換わる、またはそれを補強する)ように見えますが、実際にはAMDGPU-Proに代わるカーネルモジュールとライブラリのセットです。 (これはNvidia-381ドライバ+ CUDAライブラリの一種に相当すると考えてください)。 https://rocm.github.io/dl.html (正直なところ、まだパフォーマンスをテストしていないか、または最近のMesaドライバで動作させることを試みています。いつか実行するつもりです。
  3. ROCMにMiOpenを追加すれば、それは本質的にCUDNNです。また、移行のためのかなり明確なガイドもあります。しかし、もっと良いです。
  4. 彼らは、CUDA/CUDNNからMiOpenへの自動翻訳である "HIP"を作成しました。彼らはAPIを直接並べるのでかなりうまくいったようです。翻訳可能です。完璧な地図ではない概念がありますが、一般的にそれはよさそうです。

さて、最後に、OpenCLなどを理解しようとしている3-4週間の後、私はあなたがすぐに始めるのを助けるためにこのチュートリアルを見つけました。それはhipCaffeを立ち上げて実行するためのステップバイステップです。ただしnVidiaとは異なり、ハードウェアをサポートしていることを確認してください。 https://rocm.github.io/hardware.html 。サポートされているハードウェアがなくても機能すると思いますか?がんばろう。あなたは警告されました。 ROCMを起動して実行したら(そして検証テストを実行したら)、ここにhipCaffeのチュートリアルがあります - ROCMを取得した場合は、10分以内にMNIST検証テストを行うことになります。 https://rocm.github.io/ROCmHipCaffeQuickstart.html

5
Selly

TheanoはOpenCLをサポートしていますが、まだ初期段階です。 Theano自体はOpenCLには興味がなく、 コミュニティサポート に依存しています。

ほとんどの 操作はすでに実装されており、ほとんどの場合、指定された操作を調整して最適化することです。

OpenCLバックエンドを使用するには、自分自身で buildlibgpuarrayする必要があります。

個人的な経験から、運が良ければCPUのパフォーマンスが向上することがわかります。メモリ割り当ては非常に単純に実装されているように見え(したがって計算は遅くなります)、メモリが不足するとクラッシュします。しかし、コードの最適化やバグ報告の手助けをすることをお勧めします。

4
nemo

あなたが他のAMD gpuのへのアクセスを持っているならば、ここを見てください: https://github.com/ROCmSoftwarePlatform/hiptensorflow/tree/hip/rocm_docs

これでROCmプラットフォーム上のテンソルフローについて正しい方向に進むことができますが、 https://rocm.github.io/hardware.html に関するSellyの投稿はこのルートに関するものです。そのページは網羅的なリストではない、私は自分でXeon E5 v2 Ivy Bridgeがv3以上をリストしているにもかかわらずROCmでうまく動作することを発見した、しかしもう少しうるさい。時間が経つにつれて、いくつかの小さな例外を除いて、gfx8以降。

UPDATE - configure中にhiptensorflowにopenclサポートのオプションがあるようです。 openclの実装がうまくいっていれば、gfx8 +やpolaris gpuがなくてもリンクを調べるといいでしょう。それは長い時間がかかるプロセスですが、よく書かれた指示に続く1時間か3時間(ハードウェアに依存します)は見つけるために失うことが多すぎません。

3

Tensorflow 1.3はAMD ROCmスタックでサポートされています。

既成のdocker画像も公開されています。

3
user1917768