Chainer環境をAWSのUbuntu16.04+CUDA8.0上に構築する

目的

AWSUbuntu 16.04上にChainer環境を構築する

構成

  • OS: Ubuntu 16.04 (AMI ID: ami-0567c164)
  • CUDA 8.0
  • Cudnn8.0
  • Chainer 1.18

手順

cudaのインストール

$ wget https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v5.1/prod/8.0/cudnn-8.0-linux-x64-v5.1-tgz
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda

cudnnのインストール

agreementのせいでwgetで落とせないので、 https://developer.nvidia.com/rdp/cudnn-download から一旦PCに落としてscpでupした。

$ tar zxvf cudnn-8.0-linux-x64-v5.1.tgz

cudaディレクトリが解凍されるので、

$ sudo cp -r cuda/include/* /usr/local/cuda/include
$ sudo cp -r cuda/lib64/* /usr/local/cuda/lib64

として、既存の/usr/local/cuda配下に配置する

cudaへのパスを通す

/usr/local/cuda/bin と /usr/local/cuda/lib64 にパスを通すために、

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

を.bashrc (ログインシェル環境なら.bash_profileに)追記する

linux-genericのインストール

AWSのイメージには、GPUを動かすのに必要なlinux-genericがインストールされていない という情報があったため、実施。(やらなくても動くかも?未検証)

$ sudo apt install linux-generic
$ sudo reboot 
(再起動後)
$ sudo apt remove linux-virtual
$ sudo apt remove linux-virtual
$ sudo apt autoremove

pipのインストール / アップグレード

$ sudo apt install python-pip
$ pip install --upgrade pip

pyenvで必要になるので、opensslをインストール

$ sudo apt-get install libssl-dev

pyenv環境の構築

  • Chainer等のバージョンアップが今後多くなることを想定し、pyenv環境を作っておく。
$ cd ~
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
  • 以下コマンドによって.bash_rc(もしくは.bash_profile)に追記し、読み込まれるようにしておく
echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bashrc
echo 'if [ -d "${PYENV_ROOT}" ]; then' >> ~/.bashrc
echo '    export PATH=${PYENV_ROOT}/bin:$PATH' >> ~/.bashrc
echo '    export PATH=${PYENV_ROOT}/shims:$PATH' >> ~/.bashrc
echo '    eval "$(pyenv init -)"' >> ~/.bashrc
echo 'fi' >> ~/.bashrc
  • その場でも読み込んでおく(再ログインでも可)
$ source ~/.bashrc

上記は、インタラクティブシェルの場合。ログインシェル環境なら.bash_profileに追記し、source ~/.bash_profileする

  • pyenv-virtualenvもインストールする
$ cd ~/.pyenv/plugins
$ git clone git://github.com/yyuu/pyenv-virtualenv.git
  • pyenvで利用するpythonをインストール(インストールできるものはpyenv install -l で確認)
$ pyenv install 3.5.2
  • インストール完了の確認
$ pyenv versions
* system (set by /home/ubuntu/.pyenv/version)
  3.5.2
  • pipもpyenv化されていることを確認する
$ which pip
/home/ubuntu/.pyenv/shims/pip

/home/ubuntu/.local/bin/pip となっていたらおそらくパス設定をミスしている。

  • 利用するpyenvを設定する
$ pyenv global 3.5.2
  • 念のためログインし直しても同じ状態をキープしているか確認しておく
$ pyenv versions
  system
* 3.5.2 (set by /home/ubuntu/.pyenv/version)

pip パッケージのインストール

下記の内容をrequirements.txtとして保存して、依存パッケージのインストール

appdirs==1.4.0
chainer==1.18.0
cupy==1.0.0
cycler==0.10.0
decorator==4.0.10
filelock==2.0.7
matplotlib==1.5.3
nose==1.3.7
numpy==1.11.2
Pillow==3.4.2
protobuf==3.1.0.post1
py==1.4.31
pyparsing==2.1.10
pytest==3.0.4
python-dateutil==2.6.0
pytools==2016.2.4
pytz==2016.7
six==1.10.0

Pillowとかは最初なくてもよいかも。

$ pip install -r requirements.txt

これで、3.5.2 env配下にpipがインストールされた。chainerのバージョンをあげたりした場合は、 envを消して別のenvを定義して再インストールすればよい。

動作確認

  • CUDAの動作確認を行う。
$ python
>>> import chainer
>>> chainer.cuda.available
True
>>> chainer.cuda.cudnn_enabled
True
  • 公式サンプルを落として、実際に動かしてみる。
$ git clone https://github.com/pfnet/chainer.git
$ cd chainer/examples/mnist/
$ python train_mnist.py -g=0
  • 実行できることを確認
  • 標準出力冒頭で表示されたGPUGPU: 0であることを確認

  • -g=0オプションありと無しで実行時間を比較してみた。

GPUなし:
real     12m44.315s
user     30m1.920s
sys     60m23.720s
GPUあり:
real     1m20.846s
user     1m22.468s
sys     0m1.708s

10倍速になっており、確かにCUDAによる高速化が実現できている。

お掃除

不要なディレクトリやファイルを削除する

$ cd ~
$ rm cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
$ rm cudnn-8.0-linux-x64-v5.1.tgz
$ rm -r cuda
$ rm requirements.txt

経緯:

AWSGPU演算環境を確保しようと思い、適切なAMIを探していた。CUDAが最初からインストールされたAMIを使おうとしたらスポットリクエストには対応していなかったため、デフォルトのUbuntuでAMIを作成するのが結局割安に付きそうだったためクリーンインストールしてマイAMIを作成した