Google Colaboratory で TPU 実行してみる

# TL;DR
ローカルで作成したTensorflow.kerasで CNN を実装し、
Google Colaboratory でモデル作成したら、自分のPCで実行するよりも早くできた
忘れないようにするためのメモがてら情報を残します

# はじめに
Deep Learning したいデータ と tensorflow.kerasを利用したpython ファイルを
Google Drive に置いて、Google Colaboratory で、TPU を利用して、 model（VGG8） を作成しました。

# Google Colaboratory で TPU を使うときのコード
TPUを使うときのおまじない。

```python:vgg8.py
tpu_grpc_url = "grpc://"+os.environ["COLAB_TPU_ADDR"]
tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver(
            tpu_grpc_url)
tf.contrib.distribute.initialize_tpu_system(tpu_cluster_resolver)
strategy = tf.contrib.distribute.TPUStrategy(
            tpu_cluster_resolver, steps_per_run=100)

with strategy.scope():
    model = モデル作成
    model.compile(xxx)
    model.fit(xxx)
    result = model.evaluate(xxx)
```

**注意点**
strategy.scope() の中で model を作成すること

実際に作成したコードは [最後のリンク](https://github.com/na59ri/lemocari) に置いています。


# Google Drive へデータを保存する
１. ブラウザ上で、Googleアカウントでログイン後、以下の画像の順番でアクセスすると、Google Drive のページへ飛ぶ
![スクリーンショット 2020-02-11 0.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232494/91e0ac0b-9c66-27e0-0de4-b9d0f3286166.png)
2. pythonを実行したい階層に、Deep Learning したいデータ、および、コードをドラッグ&ドロップして、ファイルをコピーする（今回コピーしたのは、カッコで括った部分）
![スクリーンショット 2020-02-11 0.49.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232494/bc585fdb-6dbb-573d-a3fb-4b57470721b7.png)

# Google Colaboratory で TPU を有効にする

1. Google にて、"Google Colaboratory" で検索すると、上位に検索結果が出てくる。"Colaboratory - Google"を選択する
![スクリーンショット 2020-02-11 0.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232494/159a5a36-d8bf-4f17-0250-7c1982417b4b.png)
2. ポップアップが表示されるので、右下の"PYTHON 3 の新しいノートブック" を選択する
![スクリーンショット 2020-02-11 0.55.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232494/dcd45d1b-02e6-f5df-5206-3398563637b8.png)
3. 新しいノートブックが表示されるので、上部のタブ"ランタイム" -> "ランタイムのタイプを変更"を選択する
![スクリーンショット 2020-02-11 0.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232494/ce5d0e6a-241c-ddee-4354-a846b1f6c538.png)
4. ポップアップが表示されるので、ハードウェアアクセラレータの項目を "None" から "TPU" へ変更し、保存を選択する
![スクリーンショット 2020-02-11 0.56.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232494/53e89323-4c2f-8ea3-b2e5-83aa85e73ed0.png)

# Google Colaboratory で CNN を実行

1. Google Colaboratory で Google Drive をマウントするために、左上の"メニューアイコン" -> "フォルダアイコン" -> "ドライブをマウント"を選択すると、右側にコマンドが出てくるので、"再生アイコン"を選択。選択後、リンクが表示されるので、そこから、Google Driveの利用許可画面が出てくるので、認証を実施し、認証コードを取得し、"Enter your authorization code"にペーストする
![スクリーンショット 2020-02-11 1.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232494/c295c797-7bc2-a3f7-9891-36d40365ed61.png)
2. "cd /content/drive/My\ Drive/<pythonファイルを置いたディレクトリ>" で実行ファイルが置いてあるディレクトリまで移動する
![スクリーンショット 2020-02-11 1.13.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232494/28697c64-b48c-1647-285b-a0c705c1b8d4.png)
3. "!python xxx.py" と入力後、"再生アイコン" を選択することで python を実行する

**注意**
Google Colaboratory では RAM 12.72GB 利用できるようだが、
Deep larning 実施時に、上記 RAM をオーバーすると、処理が停止する。
そのため、画像サイズやCNNのモデルのパラメータサイズについては細心の注意が必要です。

# CNN の model を Google Drive から取得

1. 上記実行時に、Outputディレクトリにmodel を保存しているのであれば、Google Drive からドラッグ&ドロップで取得可能。[作成したコード](https://github.com/na59ri/lemocari)では、以下の２つのファイルを作成する。
![スクリーンショット 2020-02-11 1.24.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232494/565f1736-b5b4-a656-a39b-d36d76894121.png)

# さいごに

CNN を手軽に実装できる Google Drive と Google Colaboratory の組み合わせはPCでdeep larningを行うよりも高速に実施できるのでおすすめです。
ただし、画像サイズが大きかったり、モデルが大きすぎるとpythonが途中で止まるため、そのときにはPCやクラウドサービスの利用に置き換える必要です。
今回の作成したコードでは、２５６x２５６の画像で、全部で2700枚の教師データであれば、問題なく動作しました。

ぜひ、tensorflow.keras を実装試してみたい人は是非実施ください。


# 参考URL
- [Google ColaboratoryのTPUを試してみる](https://qiita.com/koshian2/items/25a6341c035e8a260a01)
- [TensorFlow1.14以降のTPUの取り扱い方について](https://qiita.com/koshian2/items/9d538c7082687a3fb802)
- [今回、作成したコード](https://github.com/na59ri/lemocari)