Ubuntu14.04にCUDA8.0とChainerをインストール

# 概要

Chainer で GPU を利用できるようにするため、NVIDIA の GPU を利用するためのライブラリ CUDA をインストールしてみました。

# 環境
- Ubuntu 14.04 64bit
- gcc 4.8.4
- Intel Core i3-2370M
- NVIDIA GeForce 610M

# 準備

英語ですが、[NVIDIA 本家のインストールガイド](http://docs.nvidia.com/cuda/cuda-installation-guide-linux/)はきちんと読んでおいた方がいいと思います。CUDA のインストールはそれなりに落とし穴が多いので。

# インストール手順

## 1. NVIDIA のグラフィックドライバーを導入

Ubuntu の場合、デフォルトで [Nouveau](https://ja.wikipedia.org/wiki/Nouveau) というオープンソースのドライバが使われていますが、これが CUDA とは相性が悪く、そのままインストールすると大変なことになるようです。

私は、Software & Updates の Additional Drivers タブで、Nouveau ではなく nvidia-375 という NVIDIA 純正ドライバを選んで Apply Changes ボタンを押したあと、マシンを再起動したところ、うまく動きました(ドライバ名は GPU の種類によって異なるかもしれません）。英語表示で使っているので日本語の画面名がわかりませんが・・・。

![image](https://qiita-image-store.s3.amazonaws.com/0/26146/6d2f991b-c48e-7345-919f-3fd5f9236059.png)

（ちなみに、NVidia-375 にはバグがあるようで、サスペンド後にウィンドウのボーダーがおかしくなることがあります。その場合は、[この記事](http://askubuntu.com/questions/883648/problem-with-latest-nvidia-drivers-375-39-and-378-13)を参考にしてみてください。どうやら、Compiz 周りの問題らしいです)

## 2. CUDA Toolkit 8.0 のインストール

[NVIDIA 公式サイトからダウンロードしました](https://developer.nvidia.com/cuda-downloads)。私は `deb(network)` を選びました。最初、ごく小さい deb ファイルをダウンロードして、`dpkg -i` したあと、本体が自動的にダウンロード、ビルド、デプロイされるようです。

![image](https://qiita-image-store.s3.amazonaws.com/0/26146/d223fbe3-362b-a839-821b-81cdc4db281a.png)

インストールは上の画像の解説のとおり、ダウンロードした deb ファイルに対して、`dpkg -i ... ; apt-get update; apt-get install cuda` するだけです。gcc がらみで問題を起こる場合があるようですが、私の環境 `gcc 4.8.4` では問題なくインストールできました。

## 3. cuDNN のインストール

[cuDNN](https://developer.nvidia.com/cudnn) は、NVIDIA 純正のディープラーニングに特化したライブラリで、GPU の性能をさらに引き出すことが可能なようです。本来は、CUDA とセットでインストールすべきところなのですが、今回はインストールできませんでした。実は、NVIDIA の GPU には、[Compute Capability](https://developer.nvidia.com/cuda-gpus) という性能の指標があり、これが 3 以上ではないと、cuDNN は使用できないらしいのです。私の使っている GeForce 610M は 2.1 でした（…という話はネットのいろんなところに[書き込み](http://qiita.com/FaithnhMaster/items/15912b3c033a12c6219a#%E8%BF%BD%E8%A8%982016-04-24)があるのですが、cuDNN の本家サイトでは見つけることができませんでした…)。

私の場合、CUDA + cuDNN + Chainer のインストール自体はうまく行ったものの、その後サンプルコードを走らせたとき、
```
cupy.cuda.cudnn.CuDNNError: CUDNN_STATUS_ARCH_MISMATCH: b'CUDNN_STATUS_ARCH_MISMATCH'
```
というエラーメッセージが出て、Capability が足りないことに気づいたのです。

cuDNN のダウンロードには、NVIDIA の Accelerated Computing Developer Program への登録が必要です。無料ですが、英語でいくつかの簡単な質問に答える必要があります。

cuDNN のインストールページに行くと、`cuDNN v6.0 Library for Linux` と `cuDNN v6.0 Runtime Library for Ubuntu14.04(Deb)` と2種類のファイルがあります。前者はバイナリーのファイルが何個か入っていて、それを特定のディレクトリーにコピーするだけです。結論からいうと、前者を使ったほうが良さそうです。deb を使うと、Chainer がうまくインストールできませんでした(私の場合、結局、インストールできても、エラーが出て使えなかったわけですが…）

## 4. Chainer のインストール

すでに Chainer がインストール済みの場合も、インストールし直す必要があります。

```
$ pip uninstall chainer # インストール済の場合
$ pip install chainer --no-cache-dir
```
念のため[`--no-cache-dir`](https://pip.pypa.io/en/stable/reference/pip_install/#caching) を指定して、前回インストールされたときに使ったファイルを使わないようにしたほうがよいかもしれません。


# CPU vs GPU 性能比較

Chainer の[サンプルコード(MNIST)](https://github.com/pfnet/chainer/tree/master/examples/mnist)を走らせてみました。

## CPU

```
$ python train_mnist.py -e 1      
GPU: -1
# unit: 1000
# Minibatch-size: 100
# epoch: 1

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.188208    0.100633              0.943217       0.9679                    53.8063       
```

## GPU
```
$ python train_mnist.py -e 1 -g 0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 1

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.189797    0.0891953             0.9423         0.9715                    24.1826      
```

**CPUでは約54秒かかっているのに対して、GPUでは24秒とおよそ2倍程度に速くなっている**ことがわかります。GeForce 610Mはモバイル用の骨董品のように古いGPUなのですが、それでもCPUの2倍速いわけで、GPUのありがたみがよくわかりました。

いずれ性能の高いGPUを入手して、cuDNNも使ってみたいですね。

## 参考文献

[Ubuntu16.04にCUDA8.0とChainerをインストールする](http://qiita.com/IshitaTakeshi/items/3efce820986f4560765d)
内容だけでなく、タイトルと構成も真似させていただきました。ありがとうございます！