AWS EC2の登録からDockerをインストールしTensorFlowを実行するまで

# はじめに
静岡Developers勉強会では「[人工知能ハンズオン](http://connpass.com/event/29469/)」を2016/4/23に開催します。自PC(Windows 10 Home 64bit)にDockerを使ってGoogleが提供しているオープンソースの人工知能ライブラリ「TensorFlow」を入れて動かすことが出来たのですが、Dockerって64bit版のみで32bit版がありません。
勉強会なので32bit PCしか持っていない人をどうしようかと思ったら、あるじゃないですか？ そう、クラウドならね。

# AWSの初登録
クラウドで有名かつ無料枠(12ヶ月間)があるのが、[Amazon Web Services（アマゾン ウェブ サービス、AWS）](https://aws.amazon.com/jp/?nc2=h_lg)ですね。
無料という言葉につられて、早速登録してみました。

※ネットで「AWS TensorFlow」で検索するとGPUの件が多く見つかるのですが、GPU版は少額ですがお金がかかるので今回は見送りました。
参照：[AWSのGPUインスタンス作成してStyleNetを学習させる](http://qiita.com/RyotaKatoh/items/989c914ad5be123352f1)

## アカウント作成
AWSを利用するにはアカウントが必要ですが、Amazonで本を購入したことがあるなら既にアカウントがありますよね。
以降は[AWSアカウント作成の流れ](http://aws.amazon.com/jp/register-flow/)に詳しく記載されているので、そちらを参考にします。なおアカウント作成にあたっては電話番号とクレジットカードが必要となります。自動音声ですが電話がかかってきますので画面に表示されたコードを入力します。

アカウントを作成したら、AWSマネジメントコンソールにアクセスし、必要事項を入力してログインします。

## データ・センター領域の選択
データ・センターを「東京リージョン」（＝東京を拠点とする領域）を選択します。自分はインスタンス作成後に気がついたのでオレゴンのままでした。
![aws_region.png](https://qiita-image-store.s3.amazonaws.com/0/14053/12f7f06b-3ed3-e399-fb8c-4c546d6cba53.png)

## EC2の選択
アマゾン ウェブ サービスの画面には様々なサービスがありますが、先頭にあるコンピュティーングのEC2(クラウド内の仮想サーバー)を選択します。
するとEC2のダッシュボード画面になりますので、「インスタンスの作成」ボタンをクリックします。
参考サイト：[EC2インスタンスを作成してログインする。](http://tech.lexues.co.jp/archives/1668)

### ステップ 1:Amazon マシンイメージ(AMI)
インスタンスも選択が多くあって迷うんですが、素直に先頭の「Amazon Linux AMI 2016.03 (HVM), SSD Volume Type 64ビット」を選択しました。

### ステップ 2:インスタンスタイプの選択
無料利用枠なので「t2.micro」を選択します。

### ステップ 3: インスタンスの詳細の設定
特にどこも触らずに、「次の手順: ストレージの追加」を選択します。

### ステップ 4: ストレージの追加
特にどこも触らずに、「次の手順: インスタンスのタグ付け」を選択します。

### ステップ 5: インスタンスのタグ付け
Nameタグの値にインスタンスにつけたい名前を記入後、「次の手順: セキュリティグループの設定」を選択します。今回は名前を「EC2-TENSORFLOW」にしました。

### ステップ 6: セキュリティグループの設定
「新しいセキュリティグループを作成する」で、セキュリティグループ名、説明に付けたい名前を記入します。今回は名前を「SG-TENSORFLOW」にしました。
（自分は今回やらなかったのですが、マイIPを選択することで現在クライアントPCが割り当てられているグローバルIPアドレスが追加されるようです。）

### ステップ 7: インスタンス作成の確認
各設定項目の確認です。問題がなければ、「作成」を選択します。
セキュリティグループの設定等は作成後でも変更可能です。

#### SSHログインに利用するキーペア（パブリックキー（公開鍵）とプライベートキー（秘密鍵））の作成
新しいキーペアの作成を選択、任意のキーペア名を記入後、「キーペアのダウンロード」を選択します。今回は名前を「sshkey-tensorflow」にしました。
すると、「sshkey-tensorflow.pem」がダウンロードされました。
その後、チェックを入れて、「インスタンスの作成」を選択します。

### インスタンスの作成
インスタンス作成中となります。しばらく待っても「インスタンスは現在作成中です」のままなので、心配になって「作成ログの表示」を押したら完了してました。表示変わらないのかな間際らしいですね。
右下の「インスタンスの表示」を選択します。

### 起動完了
インスタンス表示画面へ戻り、インスタンスの状態:「running」でステータスチェック:「2/2のチェックに合格しました」となっています。
これで起動完了となります。パブリックIPアドレスも表示されています。
![aws_instance.png](https://qiita-image-store.s3.amazonaws.com/0/14053/62315ea3-2910-232f-ae28-54c9f0d0180e.png)

# EC2インスタンスへログイン
起動したEC2インスタンスへSSHログインするためのターミナルソフトとして、[Tera Term](http://www.forest.impress.co.jp/library/software/utf8teraterm/)を使用します。

ホストにパブリックIPアドレスを入力します。
![aws_teraterm1.png](https://qiita-image-store.s3.amazonaws.com/0/14053/2d5b8e6b-49d6-1636-14e4-50cc1468f396.png)
AmazonLinuxの場合、デフォルトは「ec2-user」でログインします。先ほどダウンロードしたSSH秘密鍵「sshkey-tensorflow.pem」を指定して、OKを選択します。
![aws_teraterm2.png](https://qiita-image-store.s3.amazonaws.com/0/14053/e61226c4-2550-71e6-45a4-ad8dfe97df44.png)
これでログイン完了です。
![aws_teraterm3.png](https://qiita-image-store.s3.amazonaws.com/0/14053/1590dc61-a401-2f83-c3f7-e6053b112c16.png)

# Dockerのインストール
下記サイトを参考にDockerをインストールしました。
[EC2にDockerをインストールしてNginxコンテナを作る](http://labs.septeni.co.jp/entry/2015/11/19/213714)

Dockerをインストール

```bash
sudo yum install -y docker
```

 Dockerを起動
 
```bash
$ sudo service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:
```

ec2-userをdockerグループに追加

```bash
$ sudo usermod -a -G docker ec2-user
$ cat /etc/group |grep docker
docker:x:497:ec2-user
```

グループに追加されていることを確認したら、一度ログアウト(exit)して再度ログインしてください。

dockerグループに所属していれば、sudoなしで ec2-userから Dockerコマンドが使えます。

```bash
docker info
　　︙
Kernel Version: 4.4.5-15.26.amzn1.x86_64
Operating System: Amazon Linux AMI 2016.03
```

# DockerにTensorFlowのインストール
ここからはDockerの世界ですので、下記サイトの通りにします。
[WindowsユーザーがTensorFlowをインストールしてみた(Docker版)](http://yaju3d.hatenablog.jp/entry/2016/04/07/011033)

```bash
$ docker run -p 8888:8888 -p 6006:6006 b.gcr.io/tensorflow/tensorflow
　　　　　　　　　︙
[I 08:48:55.427 NotebookApp] The Jupyter Notebook is running at: http://[all ip
addresses on your system]:8888/
[I 08:48:55.427 NotebookApp] Use Control-C to stop this server and shut down all
 kernels (twice to skip confirmation).
 ```
 
# Jupyter Notebookの起動
 Webブラウザで「http:(パブリックIPアドレス):8888/」と入力しても、残念ながらJupyter Notebookが起動されませんでした。
 
## セキュリティグループの設定の追加
 セキュリティグループの初期設定では、22ポートのみとなっているので、Jupyter Notebook用の8888ポートとTensorBoard用の6006ポートを追加する必要がありました。
 ![aws_port.png](https://qiita-image-store.s3.amazonaws.com/0/14053/bd9501c3-376c-2cd6-4503-c0df58f18d5d.png)
 
## TensorFlowの動作確認
 これでWebブラウザで「http:(パブリックIPアドレス):8888/」と入力してJupyter Notebookが起動できました。
 
 ![jupyter_docker.png](https://qiita-image-store.s3.amazonaws.com/0/14053/1341b921-0c7a-ab10-350d-1ebfcc4e9197.png)

## TensorBoradの動作確認
Webブラウザで「http:(パブリックIPアドレス):6006/」と入力すると「TernsorBorad」が表示されます。
![jupyter_tersorboard.png](https://qiita-image-store.s3.amazonaws.com/0/14053/0682b1c7-a962-5599-9a36-34ecdb979a30.png)
※最初にグラフが「No scalar summary tags were found.」のエラーで表示されなかったのですが、Dockerをリスタートしたら表示されるようになりました。

```bash
$ docker ps
CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS              PORTS                                            NAMES
cea774063516        b.gcr.io/tensorflow/tensorflow   "/run_jupyter.sh"   31 hours ago        Up 31 hours         0.0.0.0:6006->6006/tcp, 0.0.0.0:8888->8888/tcp   thirsty_kare
$ docker stop thirsty_kare
$ docker start thirsty_kare
```
 
# その他
他に行ったのは、pipのバージョンが古かったのでバージョンアップ(pip 8.1.1)しました。

```bash
$ pip install -U pip
 ```

# EC2インスタンスの停止または削除
2017/04/10にAWSから無料期間終了の連絡メールが届きました。
停止でもいいのですが、もう使用することが無いので削除することにします。
アクションの「インスタンスの状態」から「削除」(停止の場合は「停止」)をクリックします。
![aws_delete.png](https://qiita-image-store.s3.amazonaws.com/0/14053/d1cb10a6-b6e3-6c3c-04f5-86964d59f7b7.png)
「インスタンスの削除」の確認画面が表示されるので「はい、削除する」ボタンをクリックします。
![aws_terminated.png](https://qiita-image-store.s3.amazonaws.com/0/14053/36134b12-9d08-0099-b40c-c6036775314e.png)
削除が終わらないので再表示したら、インスタンスの状態が「terminated」に変わっていました。この状態になったら、しばらく時間を置くと削除されるとのことです。

## キーペアの削除
キーペアは残していても課金されることはないですが、完全に削除する意味でキーペアも削除しておきます。
「削除」ボタンをクリックします。「キーペアの削除」の確認画面が表示されるので「はい」ボタンをクリックします。
![aws_sshkey_delete.png](https://qiita-image-store.s3.amazonaws.com/0/14053/3df2d1f0-d141-bc9b-67b7-cad4c4aad307.png)