本業はwebエンジニアなので、機械学習的なお作法は知らずにとりあえずAWS上に機械学習をできる環境を立ち上げようと思ってまとめてみました。
機械学習用サーバ(以下、GPUサーバ)はプライベートサブネットに置くことにしました。
※踏み台を乗っ取られたら意味ないじゃんという説もあります…。
また機械学習をしたいのでGPUサーバにはJupyter NotebookとTensorFlowを入れる予定です。先にセキュリティグループのポート設定だけはしておこうと思います。GPUサーバにTensorFlowやCUDA・cuDNNをインストールする方法は後日書きます。
構成
基本構成
- GPUサーバ:1台(GPUインスタンス)
- 踏み台サーバ:1台(Bastianインスタンス)
- クラウドストレージ:1個(S3-Bucket)… マウントして使うことにした
※S3のマウントはこちら
構築手順
VPCの作成
- 1 個のパブリックサブネットを持つ VPCを選択する
- これを選択すると「Bastian-Subnet」をVPCと同時に作成することができる
- RouteTableもVPCと同時に作成される
- このタイミングでPablic用のInternet Gateway はattach されている
IPv4 CIDR ブロック | VPC名 | アベイラビリティゾーン |
---|---|---|
10.0.0.0/16 | GPU-VPC | us-east-1a |
名前タグ | VPC | アベイラビリティゾーン | IPv4 CIDR | Pablic/Private |
---|---|---|---|---|
Bastian-Subnet | GPU-VPC | us-east-1a | 10.0.0.0/24 | Pablic |
※少しでも安くしたかったのでアベイラビリティゾーンをバージニア北部にしました。
やはり若干、SSHが遅いですが慣れれば気にならないかなと思います。
Subnetの作成
- GPUサーバ用のSubnetを作成する(※GPU用はVPC作成時に同時作成されている)
- Pablic/PrivateはInternet Gatewayの設定をRouteTableで定義することで決定する
名前タグ | VPC | アベイラビリティゾーン | IPv4 CIDR | Pablic/Private |
---|---|---|---|---|
GPU-Subnet1 | GPU-VPC | us-east-1a | 10.0.1.0/24 | Private |
※GPU用のサブネットは拡張することを想定
Internet Gateway の確認 & 設定
- VPC作成時に自動作成されるので今回は割愛
Route Table の確認 & 設定
Bastian-SubnetにはRoute Tableは設定されているので、そのままインターネットに接続することができる。
Security Group の作成
GPUサーバ用と踏み台サーバ用の2つを作成する。設定は以下の通り。
踏み台サーバ用のセキュリティグループ
セキュリティグループ名 | VPC | 説明 |
---|---|---|
Bastian-Security | GPU-VPC | Use for Bastian |
インバウンドルール (※アウトバウンドは全て)
タイプ | ポート範囲 | ソース(種類) | ソース(IP/SG) | 説明 |
---|---|---|---|---|
SSH | 22 | カスタム | 各接続元のグローバルIP | SSH@ |
カスタムTCPルール | 6006 | カスタム | 各接続元のグローバルIP | TesnsorBoard |
カスタムTCPルール | 19999 | カスタム | 各接続元のグローバルIP | JupyterNotebook |
- SSHでの接続:22
- JuptyerNotebook:19999(ポート番号は任意)
- TensorBoarf:6006(ポート番号はデフォルト)
GPUサーバ用のセキュリティグループ
セキュリティグループ名 | VPC | 説明 |
---|---|---|
GPU-Security | GPU-VPC | Use for GPU |
インバウンドルール (※アウトバウンドは全て)
タイプ | ポート範囲 | ソース(種類) | ソース(IP/SG) | 説明 |
---|---|---|---|---|
SSH | 22 | カスタム | Bastian-Security | SSH from Bastian |
カスタムTCP | 6066 | カスタム | Bastian-Security | TesnsorBoard from Bastian |
SSH | 19999 | カスタム | Bastian-Security | JupyterNotebook from Bastian |
- SSHでの接続:22
- JuptyerNotebook:19999(踏み台サーバと同じにする)
- TensorBoarf:6006(デフォルト)
踏み台サーバの作成
- STEP1 AMIの選択
クイックスタートで「Ubuntu Server 16.04 」を選択する。
- STEP2 インスタンスタイプの作成
GPUインスタンス/p2.microを選択する。(踏み台だけの用途なのでインスタンスサイズはt2.microでOK)
- STEP3 インスタンスの設定
ネットワークには作成したVPCを選択し、サブネットにはVPCと同時に作成したパブリックサブネットを選択する。IAMロールは今は選ばない(後で設定できる)。また削除保護の有効化にはチェックを入れておく。
- STEP4 ストレージの追加
ストレージのサイズは8GBのままで変更する必要はない。
- STEP5 インスタンスのタグ付け
後で区別できるようにタグを付ける。ここではキーを「Name」「Client」「Owner」の3つとしてそれぞれ任意の値を入れる。
- STEP6 セキュリティグループの設定
既存のセキュリティグループから踏み台サーバ用のセキュリティグループBastian-Security を選択する。
(接続元に応じてBastian-Securityのインバウンドを変更する必要がある)
- STEP7 確認
STEP6で確認と作成を選択して問題なさそうならば作成をクリックすると以下のポップアップが表示されるので既存のキーペアから選択してインスタンスの作成をクリックするとインスタンスの作成が開始される。
Elastic IPの割り当て
踏み台サーバは外部に接続するのでElastic IPを割り当てておくと少しラクかも。
これで踏み台サーバの準備は完了です。
GPUサーバの作成
基本的には踏み台サーバの作り方と同じ。
- STEP1 AMIの選択
クイックスタートで「Ubuntu Server 16.04 」を選択する。
- STEP2 インスタンスタイプの作成
インスタンスタイプはGPUインスタンス/p2.xlargeを選択する。
(p2.xlargeはNVIDIA Tesla K80 GPUを搭載している)
- STEP3 インスタンスの設定
ネットワークには踏み台サーバと同じVPCを選択し、サブネットはGPUサーバ用に作成したGPU-Subnet1を選択する。IAMロールは今は選ばない(後で設定できる)。また削除保護の有効化にはチェックを入れておく。
- STEP4 ストレージの追加
ストレージのサイズを8GB→20GBへ変更する。(余裕を持つなら30GB)
- STEP5 インスタンスのタグ付け
後で区別できるようにタグを付ける。ここではキーを「Name」「Client」「Owner」の3つとしてそれぞれ任意の値を入れる。
- STEP6 セキュリティグループの設定
既存のセキュリティグループからGPUサーバ用のセキュリティグループGPU-Security を選択する。
- STEP7 確認
STEP6で確認と作成を選択して問題なさそうならば作成をクリックすると以下のポップアップが表示されるので既存のキーペアから選択してインスタンスの作成をクリックするとインスタンスの作成が開始される。
これでGPUサーバと踏み台サーバを構築できたので、あとはSSHで接続すれば完了。
GPUサーバにSSH接続する
踏み台サーバからGPUサーバへ簡単にSSH接続するために踏み台サーバの以下のディレクトリにkeyファイルを格納する。
/home/ubuntu/.ssh
パーミッションを変更して参照できるようにする。
$ chmod 600 GPU-Key.pem
.ssh/configファイルへ以下の内容を記載する。
# GPU-Srver host
# Hostnameは内部IP
Host GPU
Hostname 10.0.0.24
User ubuntu
IdentityFile /home/ubuntu/.ssh/GPU-Key.pem
※踏み台サーバにはグローバルIPで接続するが、GPUサーバは同じVPCにあるので内部IPで接続する。また内部IPはインスタンスを再起動しても変わらないので、confファイルに記載して問題ない。
configファイルが無い場合は以下のコマンドで作成する
$ cd /home/ubuntu/.ssh
$ touch config
この設定をすると
$ ssh GPU
だけで踏み台サーバから簡単にGPUサーバにSSH接続することができる。
まとめ
今回とりあえず環境を作ってみましたが、ここからGPUサーバにSSH接続して必要なもの(CUDA、NVIDIAドライバ、cuDNNなど)色々と入れていかなければならないので、そっちの方が大変でした。
また、ここではGPUインスタンスをプライベートサブネットに置いているので、実際にGPUサーバに諸々をインストールする際にはRoute Tableを設定してパブリックサブネットにした方が何かと便利かと思います。