kumilog.net

データ分析やプログラミングの話などを書いています。

Ubuntu16.04にChainerをインストールする

もうすぐ3.0が正式リリースらしい10/17に3.0が正式リリースされました*1Chainerですが、GPUサーバにインストールする手順をまとめてみます。もし手元のMacとかでGPUを使わないならpip install chainerするだけです。

用いた環境

今回はAzureのGPUインスタンス(NC 6)を使いました。Tesla K80が1枚刺さっていて、お値段は1時間100円くらいです。NCシリーズは日本リージョンがないので、米国東部リージョンで作成しました。(sshでコマンド叩くだけでも表示に若干タイムラグがある気がします。)

ChainerはUbuntu 14.04/16.04 LTS 64bit、CentOS 7 64bitに対応しているので、Ubuntu 16.04を使いました。

GPUの確認

インストールする前に作成したばかりのVMにはいってGPUの確認をしてみます。

$ lspci | grep -i nvidia
9e64:00:00.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)

正しくK80が認識されていました。

インストールに必要なもの / あるといいもの

インストールするものは以下のとおりです。バージョンは今回インストールしたバージョンです。

  • Python 3.6.2
  • CuPy 1.0.2
    • Numpyライクな計算をCUDAをつかって行うPythonライブラリです。ChainerでGPUを使う場合、内部的にはCuPyが用いられます。
  • NVIDIA Driver 384.66
  • CUDA 8.0
  • cuDNN 6.0
    • CUDAでDNNの計算に最適化したライブラリです*2
    • なくても動きますが、あると計算が早くなります。入れない理由はないです。

Chainerは現時点の最新版2.0.2をインストールしました。

NVIDIA DriverとCUDAのインストール

CUDA Toolkitを使うとドライバーとCUDAをインストールすることができます。最新版である8.0をインストールします。Chainer(正確にはCuPy)では8.0に対応していますが、フレームワーク側が対応しているか確認が必要です。

公式サイトのダウンロードページで、以下のようにポチポチ押していくとダウンロードのボタンがでてきます。

f:id:xkumiyu:20170905194042p:plain

今回はリンク先のURLでコピーしてwgetでダウンロードしました。

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo apt update
$ sudo apt install cuda

CUDAのインストールは10分くらいかかります。

インストールが終わると、ライブラリなどは/usr/local/cuda-8.0に格納され、/usr/local/cudaシンボリックリンクが貼られます。

環境変数の設定

.bashrcなどに以下を追記します。

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

追記したら、$ exec $SHELL -lなどでシェルの読み込みなおして環境変数を有効にします。

インストールされているか確認

ドライバのバージョン確認します*3

$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  384.66  Tue Aug  1 16:02:12 PDT 2017
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)

CUDAのバージョンを確認します。

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61

cuDNNのインストール

やっかいなことに、NVIDIAのメンバー登録が必要です。公式のダウンロードページから登録してログインして、ライセンスに許諾するとダウンロードをさせてもらえます。

先程、CUDA 8.0をインストールし、CuPyではcuDNN v6まで対応しているので、「Download cuDNN v6.0 (April 27, 2017), for CUDA 8.0」->「cuDNN v6.0 Library for Linux」と選択するとダウンロードできます。

圧縮されていますが、200MBくらいあります。(今回、東海岸のAzureを使っているので)ローカルからの転送に時間かかります。。

バイナリなので、CUDAがインストールされている場所にコピーするだけでインストール完了です。

$ tar -xf cudnn-8.0-linux-x64-v6.0.tgz
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include

CUDAやcuDNNの複数バージョンの共存

CUDAやcuDNNの複数のバージョンを共存させる可能ですが、環境が壊れる原因になるので極力やめましょう。共存したい場合は、nvidia-dockerがおすすめです。また、バージョンをアップグレードする際は、一度消してから入れ直す方が無難です。

Pythonのインストール

Pythonのインストールは割愛します。3.6.2をインストールしました。

インストールしておくといいPythonライブラリ

chainerのインストールには直接必要ないですが、後々必要になる可能性のあるライブラリです。(必要になってから入れてもいいと思います。)

  • pillow
    • 画像を扱うときに必要です。ImageDatasetを使うときに呼ばれます。
  • h5py
    • 作成したモデルをHDF5で保存するときに必要です。
  • matplotlib
    • Trainerでエラーログなどを図で出力するときに必要です。

Chainerのインストール

依存するライブラリをすべてインストールすると、あとはpipで入れることができます。

$ pip install cupy
$ pip install chainer

動作確認

$ python
Python 3.6.2 (default, Sep  5 2017, 12:02:46)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import chainer
>>> chainer.cuda.available
True
>>> chainer.cuda.cudnn_enabled
True

無事、インストールが完了し、ChainerからCUDAやcuDNNが使えていることが確認できます。もし、Falseになるようであれば、CUDAやcuDNNのパスを見直し、cupyを再インストールすると良いと思います。

GPUの使用率の確認

GPUの使用率はnvidia-smiコマンドで確認できます。lオプションで5秒間隔で更新されます。

$ nvidia-smi
Tue Sep  5 12:35:43 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.66                 Driver Version: 384.66                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 0000C915:00:00.0 Off |                    0 |
| N/A   39C    P0    71W / 149W |      0MiB / 11439MiB |     99%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

参考

*1:3.0特有の話はないです。2系も3系もインストール方法に変わりはありません。

*2:5系まではCNN系の最適化に注力していたそうですが、6.0以降はRNN系へも注力しているそうです。

*3:インストールした時点はファイルは存在しなかったのですが、nvidia-smiコマンドをたたいた後だと、ファイルが生成されていました。