はじめに

ここでは、Macbookに搭載されているNVIDIA製以外のGPUでKerasを動かす方法について言及します。周知の通り、2020年3月24日現在、KerasのバックエンドにあるTensorFlowはNVIDIA製のGPUにしか対応していないので、通常の方法ではKerasを動かすことができません。普通はNVIDIA製のGPUが入ったLinux OS(Ubuntsuなど)のコンピュータを用意すればいいですが、Macbookを標準に使用しているユーザの場合、簡単な検証をしたいたびに毎回コンピュータを変更するのはめんどくさいです。

したがってここでは、Macbook、というか、NVIDIA以外のGPUが搭載されたコンピュータでKerasを動かす方法について言及します。

環境設定

ターミナルのシェルは、zshではなく、bashにしておく方が無難かもしれません。最近のmacbookは、ターミナルの初期設定がzshが初期設定になっているようです。envコマンドを打ち、SHELL=/bin/bashとなっていればbash、SHELL=/bin/zshとなっていればzshです。ターミナルの環境設定でシェルの変更が可能です。

続いて、ターミナルで以下を入力します。pip3は一度のみでokです。

pip3 install plaidml-keras plaidbench

plaidmlとは、NVIDIA以外のGPUが扱える深層学習のフレームワークです。Kerasのバックエンドになります。続いて、exportコマンドで環境変数をセットします。

export PLAIDML_NATIVE_PATH=/usr/local/lib/libplaidml.dylib
export RUNFILES_DIR=/usr/local/share/plaidml

PLAIDML_NATIVE_PATHは、libplaidml.dylibをフルパスで指定します。通常のインストールの場合は上のパスでいいはずですが、これでうまくいかない場合は、libplaidml.dylibがどこにあるか探してください。打ち込んだら、

export

コマンドを打ち、きちんと反映されているかチェックします。続いて、どのCPU/GPUを使用するか、設定します。このためにターミナルで以下のコマンドを打ちます。

plaidml-setup

ここでyesを選択すると、CPU/GPUどれを使うか聞かれるので、数字で使用するものを選びます。通常は1を選択するとCPUになり、それより大きい数字だとGPUになります。

- 1: llvm_cpu.0
- 2: opencl_intel(r) hd graphics_615.0
- 3: metal_intel(r) hd graphics_615.0

大前の環境だと、こんな感じの選択肢が出てきます。2, 3がノートパソコンの相当しょぼいGPUです。外付けGPUを接続すると、ここにそれが出てくるかもしれません(手持ちがないので未検証)。選択すると、保存するかどうか出るので、保存します。続いて、ターミナルで以下のコードを打つと、ベンチマークが出てきます。

plaidbench keras mobilenet

安価なGPUだと20〜30秒、CPUだと2〜3分という感じでしょうか。安価なGPUでも、並列処理ができるのでかなり速くなります。これで設定が終わりです。

その後、python上でKerasのバックエンドをplaidmlにするように指定します。

export KERAS_BACKEND=plaidml.keras.backend

これでokです。この状態でjupyter notebookを開くと、KerasがGPUで使えるようになります。


永続化

さて、おそらくご存知の方も多いと思いますが、exportコマンドによる環境設定は、ターミナルを閉じると消え去ります。したがってKerasを使うたびに毎回exportで環境設定を行わなくてはなりません。これは大変なので、exportコマンドをの永続化を行います。まず、

cd ~/

で、ホームディレクトリに移動します。そして、

ls -a

で隠しファイルを含め、表示します。ここで、「.bash_profile」があるかないか、チェックしましょう。これは、ターミナル起動時、自動的に読み込むコマンドを定義する箇所です。したがいまして、ここにexportコマンドを書き込めば、その後、Kerasを実施するたびに毎回exportコマンドを打つ必要がなくなります。そういうわけで、ホームディレクトリにきちんと移動していることを確認してから、

vi .bash_profile

と打ち込み、編集画面を開きます(zsh使いの場合は、「.zprofile」らしい)。ここで、

export PLAIDML_NATIVE_PATH=/usr/local/lib/libplaidml.dylib
export RUNFILES_DIR=/usr/local/share/plaidml
export KERAS_BACKEND=plaidml.keras.backend

と書き込めばokです。vimの編集については、ここでは詳しく解説しませんが、

「i」が書き込みモード
「esc」が閲覧モード
「:wq」が上書き保存

となります。書き込みモードにしてから、コマンドを書き込み、閲覧モードにして、上書き保存しましょう。

最後にターミナルを一度閉じて、

export

と叩き、先ほど指定した3つの環境変数が設定されていれば、永続化に成功しています。


バックエンドが変わらない問題

export KERAS_BACKEND=plaidml.keras.backend

を実施しても、バックエンドが変わらないという問題が起こるようです。細かく検証したわけではありませんが、

pip3 install tensorflow

を実施すると、どこかでバックエンドをtensorflowに固定されるようです。これを解除する場合は、

pip3 uninstall plaidml-keras

として、一度plaidml-kerasを消します。その後もう一度、

pip3 install plaidml-keras

と書けば、バックエンドが無事変更できるようになりました。検証したバージョンは、

tensorflow: 2.3.0
plaidml-keras: 0.7.0 

となります。あと原因になりそうなのは、ホームディレクトリ直下の.kerasディレクトリにあるjsonファイルです。

cd ~/.keras

にあります。ここで、vi keras.jsonをすると、バックエンドの指定があります、が、これはどうやら原因にはならないかも?しれません。メモがわりに残しておきます。