AWSのEC2 P2スポットインスタンスにCUDA8.0とChainerをセットアップ
AWSでP2インスタンスがリリースされました!(結構前になりますが。。。)
今までのG2インスタンスやElasticGPU(インスタンスにアタッチできるGPU)より、汎用的な計算に向いており、Tesla K80を搭載しているようです。
今回はp2.xlargeのスポットインスタンスを使ってみたいと思います。簡単に行いたい場合はオンデマンドインスタンスの方が良いです。オンデマンドインスタンスの場合、NVIDIA公式からドライバー等がセットアップされたAMI(OSのテンプレートみたいなもの)が提供されているためです。
それでもなぜスポットインスタンスを使うのかというと、価格が安いからです。以下に料金がありますが、P2インスタンスの中で一番小さいp2.xlargeで$0.9/1 時間(約100円/1時間)となります。バージニア北部リージョンの場合。ちなみに東京リージョンにはP2インスタンスはまだありません。(2017/1/31現在)
EC2 インスタンスの料金 – アマゾン ウェブ サービス (AWS)
対してスポットインスタンスはだいたい$0.1〜0.2/1時間(約10〜25円/1時間)となってます。たまに高くなっている時もありますが、安い時に使って、終了したら消してしまう機械学習には丁度いい感じがします。
今回はUbuntu14.04をOSとして選択しました。なので、以前ブログに載せた記事とほぼ同じ手順になります。
AWSセットアップ
P2インスタンスを使うためにはVPCを用意しておく必要があります。スポットインスタンス作成を行う道すがら必要な環境のセットアップ用リンクが用意されているのでそれを使って設定していきます。
まずAWSにログインすると以下のような画面が出るかと思います。
まずは右上のリージョンを確認します。P2インスタンスは一部リージョンにしかないため、P2インスタンスの起動できるリージョンを選択します。今回はバージニア北部を選択しました。
次にEC2のメニューへと進みます。画面のEC2か、左上のサービスからEC2を選択します。
EC2の画面の左側のメニューからスポットリクエストを選択します。
青いボタンのスポットインスタンスのリクエストを選択します。
そうするとスポットインスタンスの作成ウィザードが起動します。 ここで今回はAMIをUbuntu14.04に変更し、インスタンスタイプをp2.xlargeを選択します。
インスタンスタイプを選択する際に表示されるウィンドウの右上の価格設定履歴から過去のスポットインスタンスの価格が見れます。
ネットワークの選択でP2インスタンスは最初からあるEC2-Classicが選択できません。そのため、VPCを新しく作る必要があります。 ネットワークの右側にある新しいVPCの作成をクリックします。
クリックするとVPCの作成画面に移動します。VPCの作成をクリックします。
VPCは以下のように作りました。インスタンスを1つだけ作る場合、特にどのような設定でもOKだと思います。今回は10.0.0.0/24のネットワークにIPv6はなしとしました。
次にサブネットを作成します。VPCの画面の左側にサブネットのメニューがあるのでクリックします。
サブネットは以下のように作りました。先ほど作成したVPCに紐付けて10.0.0.0/28のネットワークに、アベイラビリティゾーン(AZ)はaとしました。どのAZを選択しても問題ありません。ただし、AZごとに需要に応じてスポットインスタンスの価格が違うので注意です。
AWSからインターネットに抜けるためにインターネットゲートウェイを作成します。サブネットの画面の左側にインターネットゲートウェイのメニューがあるのでクリックします。インターネットゲートウェイの作成をクリックします。
名前を適当に入力します。
作ったインターネットゲートウェイとVPCを紐付けします。VPCにアタッチをクリックします。
紐付けるVPCを選択します。
状態がattachedになればOKです。
さらにルートテーブルも作っておきます。インターネットゲートウェイの画面の左側にルートテーブルのメニューがあるのでクリックします。先ほど作成したVPCに紐付いたルートテーブルがあるためこれにインターネット向きのルートを追加します。
ルートテーブルを選択し、下に表示される詳細のルートを選択します。その画面に表示される編集をクリックします。
送信先:0.0.0.0/0、ターゲット:先ほど作成したインターネットゲートウェイとして保存します。
ここまででEC2インスタンスを作成する環境の構築が完了です。スポットインスタンスの作成ウィザードへ戻ります。(別のウィンドウかタブで開いているはずです。
作成したVPCとサブネットを選択します。最後の最高価格はスポットインスタンスの価格が上昇しても払えると思える最大の金額になります。この金額はあくまで払おうと思っている最大値であって、この金額が請求されるわけではありません。が、スポットインスタンスの価格がこの価格を超えると、2分後にインスタンスが強制終了されます。
インスタンスにつけるボリュームを作成します。NVIDIAのドライバーやCUDAのインストールファイルが大きいので15GB以上はあった方がいいと思います。デフォルトの8GBだと確実に足りません。画像や動画の学習を行う場合、もっと容量はいると思います。もちろん、別途EBS(ディスク)を接続することもできます。
画面下部ではキーペアを選択します。ここで作成したキーを使ってインスタンスにSSH接続します。キーペアを新しく作る場合は、右側の新しいキーペアの作成をクリックします。
キーペアの作成をクリックします。
キーペアの名前を適当に入力します。
作成が完了するとダウンロードされます。
スポットインスタンスの作成ウィザードへ戻ります。
一番下まで行き、確認をクリックします。その後、確認画面が出ますので、作成をクリックすると、スポットインスタンスのリクエストが作成されます。入力した金額をスポットインスタンスの価格が下回った場合、実際にインスタンスが作成されます。
画面左側のメニューからインスタンスの画面に移動します。作成されたスポットインスタンスはこの画面に表示されます。ステータスが2/2になったらアクセス可能です。
起動するまでに数分かかりますので、その間にEIP(グローバルIP)とセキュリティグループ(FWのようなもの)を作成しておきます。左側のメニューからElastic IPをクリックします。新しいアドレスの割り当てをクリックします。
スコープはVPCを選択します。
グローバルIPが割り当てられます。アクションのアドレスの関連付けをクリックします。
先ほど作成したインスタンスに紐付けます。
画面左側のメニューからセキュリティグループを選択します。作成したVPCに紐付いているセキュリティグループを選びます。下に詳細が出てくるので、インバウンドをクリックします。編集をクリックします。
SSH(22ポート)を送信元0.0.0.0(全て)で許可します。送信元が特定される場合は、ここでIPアドレスを入力して制限することをお勧めします。
ダウンロードしたキーを使ってSSH接続します。キーはホームディレクトリーの下のkeysディレクトリーに置いてあることを想定してます。
$ cd ~/keys $ chmod 600 dnn-key.pem $ ssh -i dnn-key.pem ubuntu@xxx.xxx.xxx.xxx
CUDAセットアップ
ここから作成したインスタンスにCUDAをセットアップします。
以下のURLからCUDAのセットアップファイルをダウンロードし、インストールします。
CUDA 8.0 Downloads | NVIDIA Developer
このファイルをダウンロードしました。
コマンドは最新のダウンロードURLを確かめてください。
wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run mv cuda_8.0.44_linux-run cuda_8.0.44_linux.run chmod +x cuda_8.0.44_linux.run
OSのアップデートとnouveau無効化を行います。
- OSアップデート
sudo apt-get update sudo apt-get upgrade sudo apt-get install build-essential git python-pip python-dev libxml2-dev libxslt1-dev zlib1g-dev libcurl4-openssl-dev libatlas-base-dev linux-image-extra-virtual libopencv-dev python-numpy sudo apt-get autoremove
- nouveau無効化
# sudo vi /etc/modprobe.d/blacklist-nouveau.conf blacklist nouveau blacklist lbm-nouveau options nouveau modeset=0 alias nouveau off alias lbm-nouveau off
# sudo vi /etc/modprobe.d/nouveau-kms.conf options nouveau modeset=0
$ sudo update-initramfs -u
# sudo vi /etc/default/grub # GRUB_CMDLINE_LINUX_DEFAULT="" # ""の部分にtextを追加 GRUB_CMDLINE_LINUX_DEFAULT="text"
sudo reboot
- CUDAインストール
$ sudo apt-get install linux-headers-`uname -r`
インストールしておかないと以下のようなエラーが出て、CUDAのインストールに失敗したのでインストールしておきます。
The driver installation is unable to locate the kernel source. Please make sure that the kernel source packages are installed and set up correctly. If you know that the kernel source packages are installed and set up correctly, you may pass the location of the kernel source with the '--kernel-source-path' flag.
デフォルトでインストールします。ドライバーもインストールします。
./cuda_8.0.44_linux.run Do you accept the previously read EULA? accept/decline/quit: accept Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 367.48? (y)es/(n)o/(q)uit: y Do you want to install the OpenGL libraries? (y)es/(n)o/(q)uit [ default is yes ]: Do you want to run nvidia-xconfig? This will update the system X configuration file so that the NVIDIA X driver is used. The pre-existing X configuration file will be backed up. This option should not be used on systems that require a custom X configuration, such as systems with multiple GPU vendors. (y)es/(n)o/(q)uit [ default is no ]: Install the CUDA 8.0 Toolkit? (y)es/(n)o/(q)uit: y Enter Toolkit Location [ default is /usr/local/cuda-8.0 ]: Do you want to install a symbolic link at /usr/local/cuda? (y)es/(n)o/(q)uit: y Install the CUDA 8.0 Samples? (y)es/(n)o/(q)uit: y Enter CUDA Samples Location [ default is /home/ubuntu ]:
以下のパスを環境変数に追加しておきます。
# vi .bashrc export CUDA_PATH=/usr/local/cuda-8.0 export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64 export PATH=$PATH:$CUDA_PATH/bin export CFLAGS=-I$CUDA_PATH/include export LDFLAGS=-L$CUDA_PATH/lib64
環境変数を追加後、以下のコマンドでGPUの情報が取得できるようになります。
$ source .bashrc $ nvidia-smi Tue Jan 31 13:10:52 2017 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 367.48 Driver Version: 367.48 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla K80 Off | 0000:00:1E.0 Off | 0 | | N/A 34C P0 71W / 149W | 0MiB / 11439MiB | 99% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
- cuDNNインストール
こちらのURLから登録を行ってダウンロードしました。
NVIDIA cuDNN | NVIDIA Developer
ダウンロードしたファイルは以下のcuDNN v5.1 Library for Linuxです。ファイルはダウンロード後、scpでインスタンスにアップロードします。
ライブラリーディレクトリーにコピーします。
$ tar xfz cudnn-8.0-linux-x64-v5.1.tgz $ sudo cp cuda/include/cudnn.h $CUDA_PATH/include/ $ sudo cp cuda/lib64/* $CUDA_PATH/lib64/
Chainerセットアップ
最後にChainerをインストールします。Chainerはpipでインストールできます。今回はユーザーランドにインストールします。
pip install --user chainer -vvvv
- インストール確認
$ pip freeze | grep chainer chainer==1.20.0.1
最新バージョンがインストールされていることが確認できました!
セットアップは以上となります。お疲れさまでした!
Let’s enjoy deep learning life on AWS!