AWSのGPUインスタンスを立てる

ちょっと前からfast.ai が提供しているディープラーニング学習のオンラインコースPractical Deep Learning For Coders, Part 1を始めています。

このコースはためになり面白い! ƪ(•◡•ƪ)"

(Udacityのコースより全然よい。しかも無料)

しかし、

自宅マシンのスペックが非力(メインメモリ8GB、GPUメモリ2GB)なため課題の途中でMEMORY ERRORの嵐。。(◞‸◟)

FloydHubはプロモーション期間が10/1で終了してしまいGPU無料枠を失ってしまいましたが UdacityのDeep Learning Nanodegreeを受講したときの特典、AWS100ドルクーポンがまだ残ってる!

ということで、AWSGPUインスタンスを立ち上げます。

fast.aiのgithubのレポジトリにはAWSのセットアップスクリプトが含まれています。若干の改造が必要でしたが超簡単にGPUインスタンスが使えるようになりました。:-)

なお、fast.aiのコースの内容についてはこのブログが大変参考になります。

futurismo.biz

スクリプトの改修点

setup_p2.sh

EC2インスタンスを作成するスクリプトです。そのまま実行すると、

Only us-west-2 (Oregon), eu-west-1 (Ireland), and us-east-1 (Virginia) are currently supported

というエラーが出ちゃいました。。

なので、強制的にOregonリージョンを使うようにしました。

# get the correct ami
#export region=$(aws configure get region)
export region='us-west-2'
export AWS_DEFAULT_REGION='us-west-2'

これでものの数分でP2インスタンスが起動できちゃいます。

P2インスタンスのコスト(2017/10/6時点)

P2インスタンスは東京リージョンでも使えるようになったのでスクリプトを修正すれば東京リージョンでも起動できると思いますが以下のようにコストが1.7倍するので学習用である限りは東京リージョンで使うのをやめたほうがいいと思います

リージョン P2インスタンスのコスト
米国東部 バージニア北部(us-east-1) $0.9
米国東部 オハイオ(us-east-2) $0.9
米国西部 オレゴン(us-west-2) $0.9
欧州アイルランド(eu-west-1) $0.972
欧州フランクフルト(eu-central-1) $1.362
アジアパシフィック ソウル(ap-northeast-2) $1.465
アジアパシフィック 東京(ap-northeast-1) $1.542
アジアパシフィック シドニー(ap-southeast-2) $1.542
アジアパシフィック シンガポール(ap-southeast-1) $1.718
アジアパシフィック ムンバイ(ap-south-1) $1.542
aws-alias.sh

setup_p2.shを実行すると fast-ai-commands.txtというファイルが作成され、その中で設定すべき環境変数が記述されているのですが.bash_profileなどに書き写すのに少し抵抗があり、これを自動的に設定するようにしました。

以下のコードを先頭に足します。

export AWS_DEFAULT_REGION='us-west-2' 
eval $(grep -e "^export" fast-ai-commands.txt) 

これでaws-alias.shを実行したとき、必要な環境変数が自動的に設定されてます。

ただ、このままでは aws-alias.shで定義されている aws-ssh 等がなぜかうまく動きません...

$instanceIpx.x.x.xのようになっているべきところ、"x.x.x.x"とダブルクォーテーションがついてしまっているのが原因でした。

なので、これを取り除くように修正します。( | sed -e "s/\"//g"を追加します)

# Original
#alias aws-start='aws ec2 start-instances --instance-ids $instanceId && aws ec2
wait instance-running --instance-ids $instanceId && export instanceIp=`aws ec2 d
escribe-instances --filters "Name=instance-id,Values=$instanceId" --query "Reser
vations[0].Instances[0].PublicIpAddress"` && echo $instanceIp'

# 修正版
alias aws-start='aws ec2 start-instances --instance-ids $instanceId && aws ec2 w
ait instance-running --instance-ids $instanceId && export instanceIp=`aws ec2 de
scribe-instances --filters "Name=instance-id,Values=$instanceId" --query "Reserv
ations[0].Instances[0].PublicIpAddress" | sed -e "s/\"//g"` && echo $instanceIp'

# Original
#alias aws-ip='export instanceIp=`aws ec2 describe-instances --filters "Name=ins
tance-id,Values=$instanceId" --query "Reservations[0].Instances[0].PublicIpAddre
ss"` && echo $instanceIp'

# 修正版
alias aws-ip='export instanceIp=`aws ec2 describe-instances --filters "Name=inst
ance-id,Values=$instanceId" --query "Reservations[0].Instances[0].PublicIpAddres
s" | sed -e "s/\"//g"` && echo $instanceIp'

これで、一度 source aws-alias.sh したあと、aws-startaws-sshaws-stopのコマンドで楽にEC2インスタンスの制御とsshログインができます。

簡単にP2インスタンスが起動できちゃうので使いすぎに注意ですね。。

Jupyter Notebook起動時に求められるパスワードは Lesson1のNote に記載されており、 dl_course です。