はらぺこらいおん

日々、思ったことを。

AWSのEC2 P2スポットインスタンスにCUDA8.0とChainerをセットアップ

AWSでP2インスタンスがリリースされました!(結構前になりますが。。。)

Amazon EC2 P2 インスタンス| AWS

今までの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時間)となってます。たまに高くなっている時もありますが、安い時に使って、終了したら消してしまう機械学習には丁度いい感じがします。

f:id:pictzzz:20170131222806p:plain

今回はUbuntu14.04をOSとして選択しました。なので、以前ブログに載せた記事とほぼ同じ手順になります。

pictzzz.hatenablog.com

AWSセットアップ

P2インスタンスを使うためにはVPCを用意しておく必要があります。スポットインスタンス作成を行う道すがら必要な環境のセットアップ用リンクが用意されているのでそれを使って設定していきます。

まずAWSにログインすると以下のような画面が出るかと思います。

f:id:pictzzz:20170131225215p:plain

まずは右上のリージョンを確認します。P2インスタンスは一部リージョンにしかないため、P2インスタンスの起動できるリージョンを選択します。今回はバージニア北部を選択しました。

次にEC2のメニューへと進みます。画面のEC2か、左上のサービスからEC2を選択します。

f:id:pictzzz:20170131232004p:plain

EC2の画面の左側のメニューからスポットリクエストを選択します。

f:id:pictzzz:20170131232057p:plain

青いボタンのスポットインスタンスのリクエストを選択します。

f:id:pictzzz:20170131232215p:plain

そうするとスポットインスタンスの作成ウィザードが起動します。 ここで今回はAMIをUbuntu14.04に変更し、インスタンスタイプをp2.xlargeを選択します。

f:id:pictzzz:20170131232346p:plain

インスタンスタイプを選択する際に表示されるウィンドウの右上の価格設定履歴から過去のスポットインスタンスの価格が見れます。

f:id:pictzzz:20170131232444p:plain

ネットワークの選択でP2インスタンスは最初からあるEC2-Classicが選択できません。そのため、VPCを新しく作る必要があります。 ネットワークの右側にある新しいVPCの作成をクリックします。

f:id:pictzzz:20170131232833p:plain

クリックするとVPCの作成画面に移動します。VPCの作成をクリックします。

f:id:pictzzz:20170131232903p:plain

VPCは以下のように作りました。インスタンスを1つだけ作る場合、特にどのような設定でもOKだと思います。今回は10.0.0.0/24のネットワークにIPv6はなしとしました。

f:id:pictzzz:20170131233055p:plain

次にサブネットを作成します。VPCの画面の左側にサブネットのメニューがあるのでクリックします。

f:id:pictzzz:20170131233346p:plain

サブネットは以下のように作りました。先ほど作成したVPCに紐付けて10.0.0.0/28のネットワークに、アベイラビリティゾーン(AZ)はaとしました。どのAZを選択しても問題ありません。ただし、AZごとに需要に応じてスポットインスタンスの価格が違うので注意です。

f:id:pictzzz:20170131233440p:plain

AWSからインターネットに抜けるためにインターネットゲートウェイを作成します。サブネットの画面の左側にインターネットゲートウェイのメニューがあるのでクリックします。インターネットゲートウェイの作成をクリックします。

f:id:pictzzz:20170131234049p:plain

名前を適当に入力します。

f:id:pictzzz:20170131234120p:plain

作ったインターネットゲートウェイVPCを紐付けします。VPCにアタッチをクリックします。

f:id:pictzzz:20170131234156p:plain

紐付けるVPCを選択します。

f:id:pictzzz:20170131234210p:plain

状態がattachedになればOKです。

f:id:pictzzz:20170131234246p:plain

さらにルートテーブルも作っておきます。インターネットゲートウェイの画面の左側にルートテーブルのメニューがあるのでクリックします。先ほど作成したVPCに紐付いたルートテーブルがあるためこれにインターネット向きのルートを追加します。

f:id:pictzzz:20170131233713p:plain

ルートテーブルを選択し、下に表示される詳細のルートを選択します。その画面に表示される編集をクリックします。

f:id:pictzzz:20170131233828p:plain

送信先:0.0.0.0/0、ターゲット:先ほど作成したインターネットゲートウェイとして保存します。

f:id:pictzzz:20170131234332p:plain

ここまででEC2インスタンスを作成する環境の構築が完了です。スポットインスタンスの作成ウィザードへ戻ります。(別のウィンドウかタブで開いているはずです。

作成したVPCとサブネットを選択します。最後の最高価格はスポットインスタンスの価格が上昇しても払えると思える最大の金額になります。この金額はあくまで払おうと思っている最大値であって、この金額が請求されるわけではありません。が、スポットインスタンスの価格がこの価格を超えると、2分後にインスタンスが強制終了されます。

f:id:pictzzz:20170131234650p:plain

インスタンスにつけるボリュームを作成します。NVIDIAのドライバーやCUDAのインストールファイルが大きいので15GB以上はあった方がいいと思います。デフォルトの8GBだと確実に足りません。画像や動画の学習を行う場合、もっと容量はいると思います。もちろん、別途EBS(ディスク)を接続することもできます。

f:id:pictzzz:20170131234939p:plain

画面下部ではキーペアを選択します。ここで作成したキーを使ってインスタンスSSH接続します。キーペアを新しく作る場合は、右側の新しいキーペアの作成をクリックします。

f:id:pictzzz:20170131235854p:plain

キーペアの作成をクリックします。

f:id:pictzzz:20170201001733p:plain

キーペアの名前を適当に入力します。

f:id:pictzzz:20170201001800p:plain

作成が完了するとダウンロードされます。

f:id:pictzzz:20170201001910p:plain

スポットインスタンスの作成ウィザードへ戻ります。
一番下まで行き、確認をクリックします。その後、確認画面が出ますので、作成をクリックすると、スポットインスタンスのリクエストが作成されます。入力した金額をスポットインスタンスの価格が下回った場合、実際にインスタンスが作成されます。

画面左側のメニューからインスタンスの画面に移動します。作成されたスポットインスタンスはこの画面に表示されます。ステータスが2/2になったらアクセス可能です。

f:id:pictzzz:20170201000158p:plain

起動するまでに数分かかりますので、その間にEIP(グローバルIP)とセキュリティグループ(FWのようなもの)を作成しておきます。左側のメニューからElastic IPをクリックします。新しいアドレスの割り当てをクリックします。

f:id:pictzzz:20170201000344p:plain

スコープはVPCを選択します。

f:id:pictzzz:20170201000441p:plain

グローバルIPが割り当てられます。アクションのアドレスの関連付けをクリックします。

f:id:pictzzz:20170201000724p:plain

先ほど作成したインスタンスに紐付けます。

f:id:pictzzz:20170201001105p:plain

画面左側のメニューからセキュリティグループを選択します。作成したVPCに紐付いているセキュリティグループを選びます。下に詳細が出てくるので、インバウンドをクリックします。編集をクリックします。

f:id:pictzzz:20170201001223p:plain

SSH(22ポート)を送信元0.0.0.0(全て)で許可します。送信元が特定される場合は、ここでIPアドレスを入力して制限することをお勧めします。

f:id:pictzzz:20170201001403p:plain

ダウンロードしたキーを使って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

f:id:pictzzz:20170201002718p:plain

このファイルをダウンロードしました。

f:id:pictzzz:20170201003321p:plain

コマンドは最新のダウンロード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
$ 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                                                 |
+-----------------------------------------------------------------------------+

f:id:pictzzz:20170201003418p:plain

こちらのURLから登録を行ってダウンロードしました。

NVIDIA cuDNN | NVIDIA Developer

ダウンロードしたファイルは以下のcuDNN v5.1 Library for Linuxです。ファイルはダウンロード後、scpでインスタンスにアップロードします。

f:id:pictzzz:20170201003547p:plain

ライブラリーディレクトリーにコピーします。

$ 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!