AWSのGPUインスタンスでJupyter Notebookを実行する(Windows 2018/07版)

![表紙](https://images-na.ssl-images-amazon.com/images/I/51YQWxiLolL._SX388_BO1,204,203,200_.jpg)
[PythonとKerasによるディープラーニング](https://www.amazon.co.jp/Python%E3%81%A8Keras%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-Francois-Chollet/dp/4839964262 "amazonに飛びます")

買いました。
この1月貪るように読みながら「これはいぬ！これはねこ！」などとやっております。

大変よい本なのですが、巻末付録である標題の項目がWindowsユーザーにとっては少し不親切なのと、一部それはダメだろって部分があるのでそのあたりを補足出来たらと思いこの記事を書きました。

#概要
手順は以下の通りです。なおAWSのアカウントは既に作成してあり、コンソールにログインしているものとします。

* インスタンスの制限を解除してもらう
* セキュリティグループを作る
* インスタンスを立てる
* 任意のSSHクライアントでインスタンスに入る
* 諸々のパッケージをアップデートする
* SSL証明書を作る
* パスワードのハッシュを作る
* Jupyter Notebook(Lab)の構成ファイルを作る

#インスタンスの制限を解除してもらう
画面左のメニューから制限を開くと、こんな感じで種類ごとに立てられるインスタンス数の上限が見れます。

![02_インスタンス制限.PNG](https://qiita-image-store.s3.amazonaws.com/0/245527/f09beb3f-dcf2-9605-6826-50e9306cbe4a.png)

私の場合1番安いGPUインスタンスであるp2.xlargeの上限が0だったので、制限緩和のリクエストを送りました。

![03_インスタンス制限.PNG](https://qiita-image-store.s3.amazonaws.com/0/245527/bde70d00-6e31-e4d1-7868-eed786c74808.png)

上限が0のままインスタンスを立てようとすると
`You have requested more instances (1) than your current instance limit of 0 allows for the specified instance type. Please visit http://aws.amazon.com/contact-us/ec2-request to request an adjustment to this limit.`
と怒られます(ました)。

#セキュリティグループを作る
ダッシュボードから。
特にこだわりがなければdefaultを編集すればいいと思います。

![05_セキュリティグループ.PNG](https://qiita-image-store.s3.amazonaws.com/0/245527/7bb0fede-fe87-07c6-a4d2-563d0404a2f0.png)

#インスタンスを立てる
いよいよインスタンスを立てます。
本に倣いますのでAMIはDeep Learning AMI (Ubuntu) Version 12.0、
インスタンスタイプはp2.xlarge、
セキュリティグループは先ほど設定したものを使います。
キーペアは無ければ作ってダウンロードしておいてください。

![06_ステータス.PNG](https://qiita-image-store.s3.amazonaws.com/0/245527/9a6b0c44-e867-09c9-c87a-a5e2563de47e.png)

作成が完了したらダッシュボードから実行中のインスタンスを見に行き、
インスタンスの状態がrunningになってることを確認してIPv4パブリックIPをメモります。

#任意のSSHクライアントでインスタンスに入る
ここでは[PuTTY-ranvis](http://www.ranvis.com/putty)を使います。Windows10だと標準のものがあるみたいなのでそっちを使いましょう。
参考1：[PuTTY を使用した Windows から Linux インスタンスへの接続](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/putty.html)
参考2：[Windowsでsshクライアント「PuTTY」を使う](http://www.atmarkit.co.jp/ait/articles/1006/25/news095.html)

puttygen.exeで先ほど落とした秘密鍵を.pemから.ppkに変換し、
putty.exeを以下の設定にして開くを押します。

![07_putty.PNG](https://qiita-image-store.s3.amazonaws.com/0/245527/c17701a7-8ffd-2195-d8a8-9e6989e3de0f.png)
/セッション

![08_putty.PNG](https://qiita-image-store.s3.amazonaws.com/0/245527/499af459-9a95-f2b9-54a4-5b42a40c4ffc.png)
/接続

![09_putty.PNG](https://qiita-image-store.s3.amazonaws.com/0/245527/4aacde68-9ea3-2ae7-cd13-7c4ad3592256.png)
/接続/SSH/認証

ログイン出来ると

    =============================================================================
           __|  __|_  )
           _|  (     /   Deep Learning AMI (Ubuntu) Version 12.0
          ___|\___|___|
    =============================================================================
↑こんな感じの画面が出ます。


#諸々のパッケージをアップデートする
ここ何故か本だとpipを使ってるんですが、AnacondaなのでCondaの方がいいと思うんですね。

```
$ conda update conda
$ source activate tensorflow_p36
↑ここは好きな環境を選んでください。他に使える環境はコンソールに書いてあります。

$ conda update --all

↓ここからは任意。Pillowがないと5章で詰みます。
$ conda install Jupyterlab
$ conda install Pillow
```
参考：[Kerasに「PILが無い」と怒られた場合の対策](https://qiita.com/YankeeDeltaBravo225/items/6968c376a491b6171671)

#SSL証明書を作る
HTTPS接続に必要になります。

```
$ mkdir ssl
$ cd ssl
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout "cert.key" -out "cert.pem" -batch
$ cd
```

#パスワードのハッシュを作る
```
$ python -c 'import IPython;print(IPython.lib.passwd())'
```
パスワードの入力を求められるので、任意のパスワードを2回入力してください。
`'sha1:'`から始まるパスワードのハッシュが作成されるので、まるっとコピーします。

#Jupyter Notebook(Lab)の構成ファイルを作る
本ではJupyter Notebookの使用が推奨されていますが、後継のJupyter Labというものもあります。
参考：[Jupyter Lab事始め](https://qiita.com/taka4sato/items/378782763dec3dacb1ee)
ただし本稿執筆時点(2018/07/30)ではどちらで`--generate-config`してもjupyter_notebook_config.pyが作成される模様。

```
$ jupyter notebook --generate-config
```

作成された構成ファイルをviなり何なりで編集します。
参考：[Linuxの定番テキストエディタ「vi」をマスターしよう（1）基本操作編 (1/2)](http://www.atmarkit.co.jp/ait/articles/1712/06/news013.html)

```
$ vi ~/.jupyter/jupyter_notebook_config.py
```

先頭に

```python
c = get_config()
c.IPKernelApp.pylab = 'inline'
c.NotebookApp.ip = '*'
c.NotebookApp.port = 8888
c.NotebookApp.open_browser = False
c.NotebookApp.certfile = '/home/ubuntu/ssl/cert.pem'
c.NotebookApp.keyfile = '/home/ubuntu/ssl/cert.key'
c.NotebookApp.password = 'メモったパスワード'
```

を追加すればよいです。

#接続
ここまで終われば

```
$ jupyter notebook
```

でJupyterを起動し、ローカルのブラウザから
`https://メモったIP:8888`
に接続して終了です。セキュリティの警告が出るはずなのでブラウザごとに何とか対応してください。

お疲れ様でした。

#続きます(2018/08/01)
[AWS(EC2)でJupyter Notebookを使う際の面倒ごとを全部自動化する](https://qiita.com/nicco_mirai/items/7a4e3e912e2d3e0fb6ad)