初心者向けに、Amazon Web Service上でGPUインスタンスを作るやり方をスクリーンショット多めでまとめました。
この記事はUdacityの自動運転ナノデグリー(Self-Driving Car Engineer Nanodegree)受講者向けに執筆したため、
<ドンピシャで役立つ読者>
・Udacityの自動運転ナノデグリーを受講している
・GPU付きPCを持ってない or 非力なPCしか持ってない
ですが基本的な操作は一緒なので、
<まあまあ役立つ読者>
・最近よく聞くAWSだかEC2だかを使ってクラウドPCを借りてみたい
・学校用メアドを持っている(学生特典\$100/\$40分が貰える)
となります。
目的
この記事で達成する事は、
(0. 学生特典を申請し)
- AWSアカウントを新規作成して
- 学生特典の\$100/\$40を獲得し
- AWS上にGPUインスタンス(≒仮装クラウドPC)を立ち上げ
- AWS上でjupyter notebookを起動し
- 自分のPCのブラウザを通してプログラミングする
です。
Udacityの自動運転ナノデグリーを進めるにあたって、ディープラーニングのソースコードをGPUで試したくなります。そこでGPU付きPCを新たに買ったり自作したりするのではなく、AWS上にあるGPUインスタンス(≒仮装クラウドPC)を借りてやってみようという記事です。AWSでGPUインスタンス(≒仮装クラウドPC)作る利点は、
- 数万円レベルの初期投資がかからない
- ネット環境がさえあれば既に持ってるノートPCのスペックがカスでも大丈夫
- つまりカフェとかでもUdacityできる
- 現代っぽい
です。
更にこの記事でもやり方紹介しますが、学生なら\$100/\$40分貰えるのでUdacity自動運転ナノデグリーのTerm1の間くらいなら無料でAWS GPUインスタンスを使えるのではないでしょうか。\$100 or \$40の違いは、自分の所属してる学校等がAWSの加盟校なのかによります。ちなみに先生など教える側であれば、\$200/\$75らしいです(2017年9月現在)。
0. 学生特典を申請
※ ~~@〇〇.ac.jp で終わるような学校用メアドを持っていないと\$100/\$40は貰えないので、持ってない方は 1. AWSアカウントを新規作成まで読み飛ばしてください。
0-1. aws educateに申請
aws educateで必要事項を入力し、
必要事項を入力したら(Promo Codeはとりあえず今は空欄でOKです)、
AWSアカウントID(12桁)を求められるので、AWSアカウントを持ってない人はここで他の一般の人と同じやり方で新規作成します。もちろん既にAWSアカウントを持っている人は自分のAWSアカウントID(12桁)を入力すればOKです。
この画面は後でまた使うため、タブは消さずに取っておいて下さい!!もし消してしまったら、恐らく大学名から入力し直しです。
※ ASW学生特典申請には2種類あって、①普通の一般的なAWSアカウントを後から「このアカウントは学生です」って申請する方法(to enter an AWS Account ID)と、②もう最初っから「AWS学生用アカウント下さい!」って申請する方法(to select an AWS Educate Starter Account)があります。どっちを選ぶべきかというと、クレカを持ってれば①、持ってなければ②、です。①は最大限の特典を貰えかつ卒業後も引続き同じアカウントを使い続けることができる代わりにクレカを必要とし、②は特典のお得感は少し減るし卒業すると使えなくなるがクレカを必要としません。
1. AWSアカウントを新規作成
AWS自体のアカウントを作ります。
1-1. Amazon.co.jpとは別の、AWS用アカウントを作成
新規作成
を選択し、
もし日本のAmazon.co.jpのアカウントしか持ってない方は上の私は新規ユーザーです。
で新しくAWS用のアカウントを作成します。もし米国のAmazon.comのアカウントを持っている方は同じアカウントをAWS用としても流用できるので、下の私は既存のユーザーです
を選び、いつもと同じパスワードを入力します。
※ ここで使用するメアドはAWS自体のアカウント用なので、aws educateに申請した学校用メアドじゃなくても大丈夫です。
1-2. AWSアカウント用の必要事項を入力
次に、AWSを使用するにあたっての追加の必要事項を入力します。このステップでクレカ情報等を入力します。Amazon公式のページに登録の流れがスクショ付きで解説されています。
また途中で本人確認のため、電話機に自動音声の電話がかかってきます。したがってご自身の携帯電話もしくは固定電話をご用意ください。
これでAWSアカウント自体は登録完了です。早速AWSのトップページ、マネージメントコンソールを開いてみましょう。
2. 学生特典の$100/$40を獲得
0-1. aws educateに申請での画面に戻って、途中だったaws educateの申請を完了させます。
2-1. AWSアカウントID(12桁)の取得と入力
マイアカウントへ進み、
AWSアカウントID(12桁)の数字をコピーし、
0-1. aws educateに申請での画面に戻って、AWSアカウントID(12桁)の数字を貼り付けます。
2-2. メアド認証をして、Promo Codeを入力
aws educateに登録した学校用メアドの方に以下のようなメールが届き、メール本文にある数字でメアドの認証を行います。
メアド認証後、これで無事aws educateへの申請が完了です。
数日後Promo Codeを記載したメールが届くので、AWSコンソールのクレジット画面にてそのPromo Codeを入力すると、学生特典の\$100/\$40が貰えます!
3. AWS上にGPUインスタンスを立ち上げ
※ ここら辺から、Udacity色が強くなってきます。
いよいよAWS上にGPUインスタンスを立ち上げます。インスタンスっていう言葉は簡単にいうと、クラウド(AWS)上にある仮装PCのことです。AWSにはGPU特化型インスタンス(≒仮装クラウドPC)の他にも、様々なタイプのが用意されています。
3-1. GPUインスタンスのリミット数を上げてもらう
AWSアカウント作成とase educateへの申請を無事終えた訳ですが、なぜか初期状態ではGPUインスタンスをすぐには作れません。AWS側で特殊な準備が必要なのかわかりませんが、「GPUインスタンス使わせてくれ〜」という申請をわざわざしなければいけません。
AWSコンソールのリミット画面へ行き、Request limit increase(リミット増加リクエスト)
をクリックします。
ここでは、2017年9月現在最新GPUインスタンスであるg3系、の中でも最安プランのg3.4xlarge
インスタンスを選択してますが、g2系かg3系なら何でも良いと思います。g3.
の後に続く数字が大きくなればなるほどスペックは高くなりますが、当然お値段も上がります。Udacityの自動運転ナノデグリーのTerm1では一世代前のg2.2xlarge
を例に解説していたので、g3系最安プランのg3.4xlarge
でも性能は十分だと思われます。
次に必要事項を入力します。
-
Region(地域)
:自分の使いたいGPUインスタンスがある地域 -
Limit(リミット)
:"Increase Limit"を選択 -
New limit value(リミット数)
:作りたいGPUインスタンス個数を好きなだけ申請 -
Use Case Description(使用目的)
:"I would like to use GPU instances for deep learning."の一言で十分
申請すると、以下のような確認画面が出てきます。
そして1分後には申請が降りました(笑)
3-2. GPUインスタンスを作る
今までは下準備で、ここからが本作業です。
EC2 ダッシュボードへ行き、Launch Instance(インスタンス作成)
をクリックします。
まず最初に画面右上からRegion(地域)
を選択してください。自分の住んでいる場所に近い方が好ましいです。条件は、
・g2系もしくはg3系インスタンスがある
・"udacity-carnd"という名前のコミュニティAMI(≒OS)がある
です。ちなみに"Asia Pacific (Tokyo)"なら上記全ての条件を満たしています。
Region(地域)
を選択したら、画面左側からCommunity AMIs(コミュニティ版 AMI)
を選択して"udacity-carnd"と検索します。
AMIは簡単にいうとインスタンス(≒仮装クラウドPC)に入れるOSのことで、例えばWindows ServerやAmazonオリジナルのLinuxが用意されています。ここでは、Udacity側が自動運転ナノデグリー用に特別に作成したAMIを使わせて頂くことにします。そういったAMIは、Community AMIs(コミュニティ版 AMI)
の中から検索して見つけます。
3-1. GPUインスタンスのリミット数を上げてもらうで申請したGPUインスタンスを探して選択し、Review and Launch(レビュー)
をクリックします(Launchと書いてありますが、まだ起動しないので大丈夫です)。
GPUインスタンスの詳細情報確認の画面に移るので、"Security Groups"欄のEdit security groups(セキュリティグループの編集)
をクリックしてセキュリティについて設定します。
-
Assign a security group(セキュリテイグループの割り当て)
:"Create a new security group(セキュリティグループの新規作成)"を選択 -
Security group name(セキュリティグループの名前)
:適当にわかりやすい名前 -
Type(タイプ)
:"Custom TCP Rule(カスタムTCP)"を選択 -
Port Range(ポート番号)
:"8888" -
Source(ソース)
:"Anywhere(どこからでも)"を選択
※ Port Range(ポート番号)
はjupyter notebookの場合、一般的に"8888"がよく使われます。
※ Udacityの例ではSource(ソース)
に"Anywhere(どこからでも)"を選択してますが、外部の変な人から自分のAWSにアクセスされるのが怖い方は違うのを選択しても大丈夫だと思われます。
そしてReview and Launch(レビュー)
をクリックします。
これで設定はほぼ完了です。設定項目を確認したら、画面右下のLaunch(立ち上げ)
をクリックします。
普通はここでsshする為の公開鍵と秘密鍵の設定をするのですが、Udacityが自動運転ナノデグリー用に作成したAMI(≒OS)では授業中に配布されたパスワードを入力してログインする為、鍵は必要ありません。なのでProceed without a key pair(鍵の設定なしで進む)
を選択し、I acknowledge that...(私はこのAMIのパスワードを知らない限りログインできないことを承知しています)
にチェックマークを入れ、Launch Instance(インスタンス立ち上げ)
をクリックします。
これで遂にやっとGPUインスタンスが作れました!
-
Instance Status(インスタンスステータス)
が "pending" から→ "running" に -
Status Checks(ステータスチェック)
が "Initializing" から→ "2/2 checks..." に
なるまで数分間待ちます。
3-3. 間違って消してしまわないよう設定する
さてこれで晴れてGPUインスタンスを使えるようになったのですが、使い始める前に大事な設定を一つしておきましょう。
インスタンスを終了するにはStop
とTerminate
の2種類の方法があります。
-
Stop
:いわゆる普通のシャットダウンに当たるので普段はこっちを選ぶ -
Terminate
:インスタンス(≒仮装クラウドPC)ごと削除、つまりデータが吹っ飛びます
なので間違えてTerminate
しないように、「Terminate
前に今一度確認の警告を鳴らす」という設定をします。なぜかデフォルトでONじゃないんですよねこれが。
(僕は間違えてTerminate
してしまったので最初から作り直しました…その残骸がスクショに写ってますね汗)
設定したいインスタンスを右クリックし、Instance Setting(インスタンスの設定)
→Change Termination Protection(ターミネートプロテクションの設定)
へ進みます。
Yes, Enable(はい、有効化します)
をクリックして、設定完了です。
もし間違ってTerminate
しようとすると、以下の画面でYes
が押せなくなります。もし本当にTerminate
したくなった場合は、同じやり方で今度はプロテクションをDisable(無効化します)
にして外してあげる必要があります。
※ Stop
すれば基本機能が止まるので時間制で加算される使用料金も止まりますが、ストレージは止まらない為ストレージ(ディスク容量)代が微量ですがかかるらしいです。Terminate
すればストレージ(ディスク容量)代はかかりませんが、その代わりデータが吹っ飛びます。
※ 使ってない間ストレージ(ディスク容量)代もかけたくないし & データも消されたくないという方は、毎回作業終わりにscpとかでAWS上のデータを自分のPCにダウンロードしてTerminate
する→3-2. GPUインスタンスを作るからやり直す→またscpとかで今度は自分のPCからAWS上にデータをアップロードして作業開始、という作戦が良いのではないでしょうか。
4. AWS上でjupyter notebookを起動
sshで自分のPCから→AWSのインスタンス(≒仮装クラウドPC)に接続し、AWS上でjupyter notebook本体を起動させます。jupyter notebookとは、ブラウザ上でPython等の出力結果を逐一確認しながらプログラミングできる便利ツールです。
4-1. sshで自分のPCから→AWSに接続する
自分のPCでターミナルを起動し、
自分のPC名: $ ssh carnd@〇〇.〇〇.〇〇.〇〇(インスタンスのIPv4 Public IP)
と入力し、何か聞かれたらyes
と入力してエンターを押します。
※ 〇〇.〇〇.〇〇.〇〇(インスタンスのIPv4 Public IP)
はインスタンスを起動するたびに変わります。
授業中に配布されたパスワードを入力し、以下のように
carnd@ip-〇〇.〇〇.〇〇.〇〇: $
と表示されてコマンド入力待ちの状態になったら接続成功です。
ここから先のコマンドは、AWSのインスタンス上でのコマンドです。
4-2. 自動運転ナノデグリーに必要な物をコピーしてくる
AWSの動作確認用として、LeNetプログラムを動かしてみたいと思います。AWSのインスタンス上で以下のようにコマンドを入力してGitHubからコピーしてきます。
carnd@ip-〇〇.〇〇.〇〇.〇〇: $ git clone https://github.com/udacity/CarND-LeNet-Lab.git
次に、自動で作成されたフォルダに移動します。
carnd@ip-〇〇.〇〇.〇〇.〇〇: $ cd CarND-LeNet-Lab/
4-3. AWS上で jupyter notebook本体を起動する
AWSのインスタンス上で以下のようにコマンドを入力します。
carnd@ip-〇〇.〇〇.〇〇.〇〇: $ source activate carnd-term1
すると、carnd@ip-〇〇.〇〇.〇〇.〇〇: $
の前に(carnd-term1)
と付きます。
ちゃんとファイルがあるか確認し、
carnd@ip-〇〇.〇〇.〇〇.〇〇: $ ls
いざ、AWSのインスタンス上でjuypter notebookを起動します!
(Udacity側が気を利かせて独自AMIに最初からjupyter notebookをインストールしてくれてます)
carnd@ip-〇〇.〇〇.〇〇.〇〇: $ juypter notebook LeNet-Lab-Solution.ipynb
出力画面の最後の方で「起動できるブラウザが見つからなかったよ」っと怒られてますが、大丈夫です。AWSのインスタンスは液晶ディスプレイのないPCのようなものであり、そんなPCにWebブラウザなんてインストールされていなくてもおかしくありません。
5. 自分のPCのブラウザを通してプログラミング
とは言えjupyter notebookってのはWebブラウザ上で使用するものですし、じゃあどうするのかというと、自分のPCのWebブラウザからAWSのインスタンス上で起動したjupyter notebookを使用します。
5-1. 自分のPCからAWS上のjupyter notebookにアクセス
自分のPCでWebブラウザを立ち上げ、URLバーに〇〇.〇〇.〇〇.〇〇(インスタンスのIPv4 Public IP):8888
と入力します。
〇〇.〇〇.〇〇.〇〇(インスタンスのIPv4 Public IP)
がAWSのインスタンス(≒仮装クラウドPC)の住所で、:8888
はその中のjupyter notebookの部屋番号を示しています。
以下のように自分のPCのWebブラウザで(AWSのインスタンス上で起動してる)jupyte notebookの画面が表示されたら成功です。
LeNet-Lab-Solution.ipynb
をクリックして、
画面上部のCell
→Run all
をクリックしてPythonプログラムを走らせます。
以下のような結果が出力されれば、成功です!
5-2. AWS上のインスタンスを停止する
最終出力を確認できたら、4-3. AWS上で jupyter notebook本体を起動するで「起動できるブラウザが見つからなかったよ」とちょっと怒られたターミナル画面が残ってると思いますので、そこでCtrl + c
を同時に押して(AWSのインスタンス上で起動してる)jupyter notebookを停止します。
何か聞かれたらy
と入力してエンターを押します。
次にAWSのインスタンス上で以下のコマンドを入力して、AWSへの接続を切ります。
carnd@ip-〇〇.〇〇.〇〇.〇〇: $ exit
再度、
自分のPC名: $
のようにコマンド待ちの状態に戻ったら、AWSへの接続は遮断されています。最後に、AWSマネージメントコンソール上でインスタンスをStop
します(Terminate
じゃないですよ!)
停止したいインスタンスを右クリックし、Instance State
→Stop
の順にクリックします。
Instance State
がstopped
になり、インスタンスは無事停止されます。
普通に使っている分にはちゃんとデータは保存されます。次回起動した際に前回jupyter notebookで編集したプログラムがなくなってる(汗)!ということは今の所起きたことがありません。
以上