Chainer環境をAWSのUbuntu16.04+CUDA8.0上に構築する
目的
AWSのUbuntu 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
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
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
経緯:
AWSでGPU演算環境を確保しようと思い、適切なAMIを探していた。CUDAが最初からインストールされたAMIを使おうとしたらスポットリクエストには対応していなかったため、デフォルトのUbuntuでAMIを作成するのが結局割安に付きそうだったためクリーンインストールしてマイAMIを作成した