Python
AWS
GPU
機械学習
TensorFlow

AWS EC2のスポットインスタンスでGPU版tensorflowを動かす

More than 1 year has passed since last update.

最近tensorflow使い始めました:smile: 手元のMacBook Proだと学習にとっても時間がかかるので、AWS EC2のGPUインスタンスを使ってみることに.
EC2を安価に使うにはスポットインスタンス♪と思ったのですが、なんと、スポットインスタンスだとCUDAとかがセットアップされたNVIDIAのAMIが選択できないじゃないですか:scream: どうやら素のOSの上に自力で環境構築しないといけないっぽい. でも1回環境作ってしまえば再利用は可能.

というわけで、GPU版tensorflowを動かすまでの手順をまとめます. 構築する環境は
Ubuntu 16.04 LTS + CUDA + cuDNN + python3.6 + tensorflow-gpu
です.

EC2インスタンスの作成

EC2コンソールから「スポットインスタンスのリクエスト」でインスタンスを作成します.

  • AMI: Ubuntu 16.04 LTS
  • インスタンスタイプ: p2.large
  • EBS ボリューム: デフォルト8GBなので適当に増やす. 32GBとか.

インスタンスタイプはp2.8xlargeやp2.16xlargeでもいいですが、セットアップはp2.largeで行っておいて、学習時に8xlargeや16xlargeに切り替えてもいいかも.

EC2インスタンスが起動したら各モジュールを最新版にアップグレードし、最低限の開発環境をインストール.

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install libffi-dev libssl-dev gcc make

pyenvを使ってpython環境を整える

まずpyenvをgit cloneする.

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

.bashrc に以下追加.

PYENV_ROOT=$HOME/.pyenv
PATH=$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH
eval "$(pyenv init -)"

編集した.bashrcを読み込んでおく.

$ source ~/.bashrc

続いてpythonのインストール. 今回はpython 3.6を入れる.

$ pyenv install --list|grep 3.6
  3.3.6
  3.6.0
  3.6-dev
  3.6.1
  3.6.2rc1
$ pyenv install 3.6.1
$ pyenv global 3.6.1
$ which pip3
/home/ubuntu/.pyenv/shims/pip3  # pyenvが使われているのを確認
$ pip3 install aws  # ついでに入れておく

CUDAのインストール

CUDAのダウンロードサイトでdebファイルのダウンロード先を調べる.

  • OS:Linux,
  • Architecture: x86_64,
  • Distribution:Ubuntu,
  • Version: 16.04,
  • Installer Type: dev(local)

を選べば良い. URLが分かったら, wgetで取得してインストール.

$ wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb
$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb
$ sudo apt-get update
$ sudo apt-get install cuda

cuDNNのインストール

cuDNNのダウンロードサイトから cuDNN v6.0 Library for Linux を取得してインストールすれば良いのだが、ユーザ登録してログイン後のページからしかダウンロード出来ず、wgetでURL指定で簡単にダウンロード出来ない.
一度macに保存してscpでEC2に送り込むことにした.

# scpでローカルのMacからEC2にdevファイルをコピー. pemファイルのパスとIPは適宜変更.
$ scp -i aws.pem ~/Downloads/cudnn-8.0-linux-x64-v6.0.tgz ubuntu@12.34.56.789:~/
$ tar xzf cudnn-8.0-linux-x64-v6.0.tgz
$ sudo cp -a cuda/lib64/* /usr/local/lib/
$ sudo cp -a cuda/include/* /usr/local/include/
$ sudo ldconfig

tensorflowのインストール

CPU版のtensorflowが入っている場合はuninstallしてからGPU版を入れる. ついでによく使うライブラリも入れておく.

$ sudo apt-get install libcupti-dev
$ pip3 uninstall tensorflow
$ pip3 install tensorflow-gpu
$ pip3 install keras sklearn matplotlib scipy librosa

サンプルを動かして動作確認

今回はkerasのmnist-mlpで動作確認. git cloneでサンプルを取得して実行.

$ git clone https://github.com/fchollet/keras.git
$ cd keras/examples
$ $ python mnist_mlp.py 
Using TensorFlow backend.
...
Test loss: 0.118156189926
Test accuracy: 0.9811
$

動いた:sunglasses: