TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Ubuntu 16.04 LTSにChainerをインストールする

以前に機械学習用にPCを購入したとき、Ubuntuをインストールしようとしましたが、GPUが認識できずあきらめてWindowsをインストールしていました。

Ubuntu Desktopをインストールしていましたが、Ubuntu Serverをインストールして試したら無事動かすことができたので手順を残しておきます。

Ubuntu Desktopでうまくインストールできなかった原因は、CUDAのInstallation Guide for Linuxに記載されていましたが、ドライバインストール前は、カーネルパラメータにnomodesetを付けて起動しないとコンソールモードにできないためでした。
UbuntuGUIで使う必要がなければ、Ubuntu Serverからインストールした方が簡単です。
後からGUIをインストールすることもできます。

Nouveau kernel driver をdisableにする

/etc/modprobe.d/blacklist-nouveau.confを作成して、以下のように編集します。

$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

反映してリブートします。

$ sudo update-initramfs -u
$ sudo reboot

ドライバダウンロード

以前失敗したときは、GeForceのドライバをPPAからインストールしていましたが、今回はNvidiaのサイトからダウンロードしました。
http://www.nvidia.com/Download/index.aspx?lang=en-us

f:id:TadaoYamaoka:20180105221236p:plain
図のように設定して、SEARCHをクリックします。
f:id:TadaoYamaoka:20180105221325p:plain
DOWNLOADをクリックします。
NVIDIA-Linux-x86_64-384.98.run」がダウンロードされます。

インストール

ビルドツールがないとエラーになるので、build-essentialをインストールしておきます。

$ sudo apt-get install build-essential

gccのバージョンが5.4であることを確認します。

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.

ドライバをインストールします。

$ sudo ./NVIDIA-Linux-x86_64-384.98.run

リブートします。(不要かも)

$ sudo reboot

ドライバが認識できていることを確認します。

$ sudo lspci | grep -i nvidia
65:00.0 VGA compatible controller: NVIDIA Corporation Device 1b06 (rev a1)
65:00.1 Audio device: NVIDIA Corporation Device 10ef (rev a1)
$ nvidia-smi
Fri Jan  5 20:58:17 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.90                 Driver Version: 384.90                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:65:00.0 Off |                  N/A |
|  0%   44C    P5    28W / 250W |      0MiB / 11171MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

CUDAダウンロード

NvidiaのサイトからCUDAをダウンロードします。
https://developer.nvidia.com/cuda-toolkit

TensorFlowも使う予定なので、CUDA8をダウンロードします。
「Download Now」をクリックした後、ページの下の方にある「Legacy Releases」をクリックします。
f:id:TadaoYamaoka:20180105222616p:plain

「CUDA Toolkit 8.0 GA2 (Feb 2017)」をクリックします。
f:id:TadaoYamaoka:20180105222741p:plain

Select Target Platformを下図のように選択します。
f:id:TadaoYamaoka:20180105222817p:plain

Base InstallerをDownloadします。
「cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb」がダウンロードされます。

インストール手順は、「Installation Guide for Linux」のリンクから参照できます。
f:id:TadaoYamaoka:20180105223111p:plain

CUDAのインストール

Installation Guide for Linuxの通りにインストールしました。

ダウンロードした.debパッケージをインストールします。

$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb

インストールされるのはレポジトリのメタデータだけなので、以下のコマンドでCUDAをインストールします。

$ sudo apt-get update
$ sudo apt-get install cuda

環境変数の設定

.bashrcに以下の行を追記します。

$ vi .bashrc
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

再起動します。

$ sudo reboot

再起動後、GUIのログイン画面が表示されるようになったので、CUIに戻しました。

$ sudo systemctl set-default multi-user.target
$ sudo reboot

cuDNNのダウンロード

NvidiaのサイトからcuDNNをダウンロードします。
https://developer.nvidia.com/cudnn

「Download」をクリックします。
「I Agree To the Terms of the cuDNN Software License Agreement」にチェックします。
TensorFlowが対応しているcuDNN v6.0をダウンロードします。
f:id:TadaoYamaoka:20180105224006p:plain
「Runtime Library」と「Developer Library」の2つをダウンロードします。
「libcudnn6_6.0.21-1+cuda8.0_amd64.deb」と「libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb」がダウンロードされます。

インストール手順は、「Installation Guide」のリンクから参照できます。

cuDNNのインストール

Installation Guideの通りインストールしました。

$ sudo dpkg -i libcudnn6_6.0.21-1+cuda8.0_amd64.deb
$ sudo dpkg -i libcudnn6-dev_6.0.21-1+cuda8.0_amd64.deb

Anacondaのインストール

pyenvを使ってAnacondaをインストールします。

pyenvをインストールします。

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

.bashrcに環境変数を追加します。

$ echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc

再ログインします。

インストール可能なPythonの一覧を表示します。

$ pyenv install --list

Anacondaをインストールします。問題の起きなそうなPython 3.5がインストールされるanaconda3-4.2.0をインストールします。

$ pyenv install anaconda3-4.2.0

インストールされたPythonの一覧を確認します。

$ pyenv versions
* system (set by /home/xxx/.pyenv/version)
  anaconda3-4.2.0

anaconda3-4.2.0をデフォルトにします。

$ pyenv global anaconda3-4.2.0

anaconda3-4.2.0がデフォルトになったことを確認します。

$ pyenv versions
  system
* anaconda3-4.2.0 (set by /home/xxx/.pyenv/version)

Chainerのインストール

先にcupyをインストールします。

pip install cupy

Chainerをインストールします。

pip install chainer

MNISTサンプル実行

MNISTサンプルを実行します。

$ git clone https://github.com/chainer/chainer.git
$ cd chainer
$ python examples/mnist/train_mnist.py -g 0

以下のエラーが発生しました。

Traceback (most recent call last):
  File "examples/mnist/train_mnist.py", line 127, in <module>
    main()
  File "examples/mnist/train_mnist.py", line 78, in main
    updater = training.updaters.StandardUpdater(
AttributeError: module 'chainer.training.updaters' has no attribute 'StandardUpdater'

サンプルがChainerのリリース版の最新に対応していないようです。(tagを指定してgit cloneすればよかったかも)
examples/mnist/train_mnist.pyの78行目の

training.updaters.StandardUpdater

training.StandardUpdater

に修正します。

再度実行します。

$ python examples/mnist/train_mnist.py -g 0
QXcbConnection: Could not connect to display 
中止 (コアダンプ)

実行中にコアダンプが出力されました。
X windowが有効でないときに、matplotlibがエラーを吐くようです。
参考:QXcbConnection: Could not connect to display のエラー対処 - Qiita

train_mnist.pyのソースを確認すると、「--noplot」というオプションがあるようなので、「--noplot」を付けて実行します。

$ python examples/mnist/train_mnist.py -g 0 --noplot
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
(略)
20          0.00584211  0.0890107             0.99795        0.9846                    35.6723       
     total [##################################################] 100.00%
this epoch [..................................................]  0.00%
     12000 iter, 20 epoch / 20 epochs
    348.04 iters/sec. Estimated time to finish: 0:00:00.

実行できました。

参考までに、同じPCのWindows上で実行すると、

(略)
20          0.0119292   0.0924681             0.996449       0.9859                    45.5555

となりました。
elapsed_timeを比較すると、Ubuntuが35.6723で、Windowsが45.5555となっており、Ubuntuの方が27.7%ほど速いです。