概要
Chainer で GPU を利用できるようにするため、NVIDIA の GPU を利用するためのライブラリ CUDA をインストールしてみました。
環境
- Ubuntu 14.04 64bit
- gcc 4.8.4
- Intel Core i3-2370M
- NVIDIA GeForce 610M
準備
英語ですが、NVIDIA 本家のインストールガイドはきちんと読んでおいた方がいいと思います。CUDA のインストールはそれなりに落とし穴が多いので。
インストール手順
1. NVIDIA のグラフィックドライバーを導入
Ubuntu の場合、デフォルトで Nouveau というオープンソースのドライバが使われていますが、これが CUDA とは相性が悪く、そのままインストールすると大変なことになるようです。
私は、Software & Updates の Additional Drivers タブで、Nouveau ではなく nvidia-375 という NVIDIA 純正ドライバを選んで Apply Changes ボタンを押したあと、マシンを再起動したところ、うまく動きました(ドライバ名は GPU の種類によって異なるかもしれません)。英語表示で使っているので日本語の画面名がわかりませんが・・・。
(ちなみに、NVidia-375 にはバグがあるようで、サスペンド後にウィンドウのボーダーがおかしくなることがあります。その場合は、この記事を参考にしてみてください。どうやら、Compiz 周りの問題らしいです)
2. CUDA Toolkit 8.0 のインストール
NVIDIA 公式サイトからダウンロードしました。私は deb(network)
を選びました。最初、ごく小さい deb ファイルをダウンロードして、dpkg -i
したあと、本体が自動的にダウンロード、ビルド、デプロイされるようです。
インストールは上の画像の解説のとおり、ダウンロードした deb ファイルに対して、dpkg -i ... ; apt-get update; apt-get install cuda
するだけです。gcc がらみで問題を起こる場合があるようですが、私の環境 gcc 4.8.4
では問題なくインストールできました。
3. cuDNN のインストール
cuDNN は、NVIDIA 純正のディープラーニングに特化したライブラリで、GPU の性能をさらに引き出すことが可能なようです。本来は、CUDA とセットでインストールすべきところなのですが、今回はインストールできませんでした。実は、NVIDIA の GPU には、Compute Capability という性能の指標があり、これが 3 以上ではないと、cuDNN は使用できないらしいのです。私の使っている GeForce 610M は 2.1 でした(…という話はネットのいろんなところに書き込みがあるのですが、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
を指定して、前回インストールされたときに使ったファイルを使わないようにしたほうがよいかもしれません。
CPU vs GPU 性能比較
Chainer のサンプルコード(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をインストールする
内容だけでなく、タイトルと構成も真似させていただきました。ありがとうございます!