以前に機械学習用にPCを購入したとき、Ubuntuをインストールしようとしましたが、GPUが認識できずあきらめてWindowsをインストールしていました。
Ubuntu Desktopをインストールしていましたが、Ubuntu Serverをインストールして試したら無事動かすことができたので手順を残しておきます。
Ubuntu Desktopでうまくインストールできなかった原因は、CUDAのInstallation Guide for Linuxに記載されていましたが、ドライバインストール前は、カーネルパラメータにnomodesetを付けて起動しないとコンソールモードにできないためでした。
UbuntuをGUIで使う必要がなければ、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
図のように設定して、SEARCHをクリックします。
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」をクリックします。
「CUDA Toolkit 8.0 GA2 (Feb 2017)」をクリックします。
Select Target Platformを下図のように選択します。
Base InstallerをDownloadします。
「cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb」がダウンロードされます。
インストール手順は、「Installation Guide for Linux」のリンクから参照できます。
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をダウンロードします。
「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%ほど速いです。