MacのGPUでKerasを使う（デュアルブートUbuntu16.04）

所有するMacのグラフィックボードがNVIDIA製だったので、Tensorflowの実行に使えないか試してみました。

対象機種は[【爆速なるか!?】OSXでTensorflowのGPU版を使うためのセットアップ - Qiita](http://qiita.com/tawago/items/68bef63d8bb02797c669) こちらにまとめてあるので、ご自分のMacの「このMacについて」で確認してみてください。

（設定に関しましては自己責任にてお願い致します）

## デュアルブートUbuntu16.04

macOSでTensorflowをGPUで動かすことが出来たのですが、通常に起動するだけでもGPUメモリをかなり消費してしまうので、Ubuntuで試してみることにしました。

[OS X El CapitanとUbuntu 16.04 LTSのデュアルブート環境を構築する - OTTAN.XYZ](http://ottan.xyz/el-capitan-ubuntu-dual-boot-4020/)

こちらの手順が詳しいので、最新のmacOS Sierra(10.12.3)でも上手く動作させることが出来ました。

Macのハードディスクをパーテーションで区切り、USBに入れたUbuntu16.04のイメージから、[rEFInd](http://www.rodsbooks.com/refind/getting.html)というブートローダーを使って起動させることでデュアルブートすることが出来ます。

Ubuntu16.04のイメージは[北陸先端科学技術大学院大学リリース](https://ubuntulinux.jp/News/ubuntu1604-ja-remix)のイメージを使わせてもらいました。

![IMG_8973.JPG](https://qiita-image-store.s3.amazonaws.com/0/47128/cd386e55-8563-a3cc-062f-1317db748724.jpeg)

無事インストール出来れば起動時に「option(alt)」キー押下でパーテーションで分割したHDDが選択出来るようになります。

![IMG_8974.JPG](https://qiita-image-store.s3.amazonaws.com/0/47128/b98939b2-ff03-caca-0e94-0fc6cd802656.jpeg)

ブートローダー「rEFInd」を使ってUbuntuを起動します。

![Screenshot from 2017-02-11 08-30-50.png](https://qiita-image-store.s3.amazonaws.com/0/47128/2d21bfe5-1b1f-2631-ae74-b848f54e3692.png)

無事Ubuntuが使えるようになりました。

## CUDAインストール

下記の記事の手順に沿って行ったら上手くインストール出来ました。（ありがとうございます）

[Ubuntu 16.04へのCUDAインストール方法 - Qiita](http://qiita.com/yukoba/items/3692f1cb677b2383c983)

全くそのままの手順を転記するだけですが、スクリーンショットで補足しておきます。

![Screenshot from 2017-02-11 08-32-48.png](https://qiita-image-store.s3.amazonaws.com/0/47128/99438407-2c23-2356-07f4-c5fad2e1c647.png)

[CUDA 8.0 Downloads](https://developer.nvidia.com/cuda-downloads)

こちらのページからダウンロード、展開します。

```bash
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
```

`/usr/local/cuda-8.0`にファイルが展開されていることを確認したのち、

![Screenshot from 2017-02-11 08-45-30.png](https://qiita-image-store.s3.amazonaws.com/0/47128/8e54cd99-663d-9a7b-02c3-249410cfb6b3.png)


`~/.bashrc`に以下を追記し、パスを通します。

```text
export PATH="/usr/local/cuda-8.0/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH"
```

## cuDNN 5.1 のインストール

「cuDNN」という深層学習用のライブラリが必要になり、NVIDIAのアカウントを取得する必要があります。

![Screenshot from 2017-02-11 08-35-23.png](https://qiita-image-store.s3.amazonaws.com/0/47128/dd13a718-11bb-7fb9-b83f-d166238d92c7.png)

[cuDNN Download ](https://developer.nvidia.com/rdp/cudnn-download)

`Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0`にある

`cuDNN v5.1 Library for Linux`を選択します。

上述の記事を転記させて頂きます。

```bash
tar xzf cudnn-8.0-linux-x64-v5.1.tgz
sudo cp -a cuda/lib64/* /usr/local/lib/
sudo cp -a cuda/include/* /usr/local/include/
sudo ldconfig

rm -R -f cuda cudnn-8.0-linux-x64-v5.1.tgz
```

パスの通し方が上手くいかずハマったのですが、 `-a`を付けるとシンボリックリンクとしてコピー出来るんですね。

![Screenshot from 2017-02-11 08-38-15.png](https://qiita-image-store.s3.amazonaws.com/0/47128/4855159c-b39e-0216-62b3-c6c650fafb25.png)

`/usr/local/lib/`以下にcuDNNのライブラリがコピーされました。

![Screenshot from 2017-02-11 08-37-16.png](https://qiita-image-store.s3.amazonaws.com/0/47128/508aec51-0ab3-8227-b8a7-63883cb2ddca.png)

同じく`/usr/local/include/`にコピーされました。

## PythonとTensorflowのインストール

Python3系のインストールは、今回は`pnev`や`anaconda`などを使わず`sudo apt-get`を使いそのまま入れました。

（この後OpenCV3.1とffmpegをインストールする為、依存関係をできる限り簡単にしたかったので...）

[Download and Setup - Twnsorflow](https://www.tensorflow.org/get_started/os_setup)

Tensorflowの公式ページに沿ってインストールします。GPUを利用する際は`$ pip install tensorflow-gpu`で簡単にインストール出来る様になったみたいですね。

```bash
$ sudo apt-get install python3-pip python3-dev
$ pip3 install tensorflow-gpu
```

`HelloWorld`を試してみます。

![Screenshot from 2017-02-11 08-58-56.png](https://qiita-image-store.s3.amazonaws.com/0/47128/6f14884e-394e-4bb5-bc7b-5a80001069c2.png)

無事利用できるようになりました。GPU（GeForce GT 750M）のメモリは1GBなのですが、実際使えるのは650~750MB程です。

あまり階層の深い深層学習では使えないみたいですね。

![Screenshot from 2017-02-11 08-50-29.png](https://qiita-image-store.s3.amazonaws.com/0/47128/45a4428b-e6bd-3646-680e-c933b61c5c63.png)

Tensorflowは`/user/local/lib/python3.5/dist-packages`にインストールされています。

Python2.7を併用するには同じ要領で`/user/local/lib/python2.7/dist-packages`にインストールします。

## Kerasのインストール

Kerasのインストールは以下の通り。

```bash
$ pip3 install keras
```
でインストール出来ます。

依存関係のあるライブラリは、できる限り`pip`を使わず`sudo apt-get install`でインストールしました。

サンプルのCNNを利用したMNISTを実行してみます。

![Screenshot from 2017-02-11 11-26-42.png](https://qiita-image-store.s3.amazonaws.com/0/47128/90fbec5b-c473-2374-12f4-873ed6e5f91a.png)

体感速度でいうと、CPUの3倍程度でしょうか。

## まとめ

今回はUbuntuをデュアルブートしましたが、仮想環境の構築に慣れている方はそちらの方が良いかもしれません。

CPU環境では実行が難しかったRNN(seq2seq)は簡単なモデルのものならGPUメモリ1GB程度で実行出来るようなので、今度試してみたいと思います。

では。