Google Colabの使い方まとめ

# はじめに
[機械学習/ディープラーニング勉強としてやってきたこと -実践編-](https://qiita.com/shoji9x9/items/775f0d63589cfb4bd1f5)で

> * Google Colab
  * 最近使い始めましたが、これはすごいです！GPUだけでなくTPUまで使えます、そして無償です（ただし、TPUを使いこなすのはハードルが高そう）。既に役立つブログが書かれているので、それを検索して頂ければすぐに使い始められると思います。後日、それらのまとめ記事を書く予定です

と書きましたので、Google Colabの使い方をまとめてみます。と言っても、[【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)という素晴らしいブログが既にあるので、これを補足する形とします。

# 90分ルールと12時間ルール
まず、最も重要なのがGoogle Colabには時間制限があるということです。[2. シャットダウンまでの残時間は(90分ルールと12時間ルール)](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935#2-%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3%E3%81%BE%E3%81%A7%E3%81%AE%E6%AE%8B%E6%99%82%E9%96%93%E3%81%AF90%E5%88%86%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%A812%E6%99%82%E9%96%93%E3%83%AB%E3%83%BC%E3%83%AB)を読み理解しましょう。制限があると書きましたが、それほど強い制限ではないので悲観する必要はないと思います。

# Google Driveを使いましょう
上記のようにGoogle Colabは12時間経つと初期化されてしまうため、データを保持し続けることができません。そのためデータやコードはGoogle Driveに保持するのがいいと思います。

# Google DriveにGoogle Colab用ipynbファイルを新規作成する方法
Google Driveの左側の「新規」ボタンから「その他」->「アプリを追加」と選択し、Colaboratoryを追加して下さい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/9f65bcff-86d6-73ef-e53d-adf2f4bf1278.png)

そうすると以下のようにファイルを新規作成できるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/4cc9719a-3c8d-de51-9ea5-6fe232111df4.png)

# Google Driveをマウントする方法
[Google Driveをマウント](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935#google-drive%E3%82%92%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88)にも書かれていますが、以下のように書くだけです。ローカルの学習データの読み込み、モデルの保存、ログの出力をしたい場合には必要になると思います。

``` Python
from google.colab import drive
drive.mount('/content/drive')
# 必要ならば以下のようにディレクトリ移動する
%cd /content/drive/'My Drive'/'Google Colab'/
```

上記コードを実行すると認証用のリンクが表示されますので、それをクリックし、認証コードをコピー、Google ColabのセルにペーストするとGoogle Driveをマウントできます。ここまでやっておけばデータがいきなり消えることもなく安心ですね。Google Driveはファイルの履歴も勝手に取ってくれるので、さらに心強いです。

# GPUを使う方法
そして何といってもGoogle ColabはGPUを使えるのが魅力です！しかし設定を変更しないとGPUは使えません。「編集」->「ノートブックの設定」から「ハードウェアアクセラレータ」をGPUに変更しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/70a71f76-fe5c-4fb8-3a40-351325668b40.png)

そして何とTPUまで使えます！が、TPUを使う場合はコードもTPU向けに書く必要があるようで、自分はまだその技術習得をしていないため、本格的にTPUを使ったことはありません。通常の（GPUの場合と同じ）コードをTPUで動かすと、めちゃくちゃ遅かったです・・・。興味のある方は[Google ColaboratoryのTPUを試してみる](https://qiita.com/koshian2/items/25a6341c035e8a260a01)を読むと参考になるかもしれません。CNNではGPUよりもTPUの方が速い（というかメモリエラーにならない）ようです。

# 学習状況をスマホでモニタする
これは[8. 学習状況をスマホでモニタしたい](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935#8-%E5%AD%A6%E7%BF%92%E7%8A%B6%E6%B3%81%E3%82%92%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%A7%E3%83%A2%E3%83%8B%E3%82%BF%E3%81%97%E3%81%9F%E3%81%84)に書かれた[Hyperdash](https://hyperdash.io/)を自分も使っています。コードは以下の通りです。

``` Python
!pip install hyperdash
from hyperdash import monitor_cell
!hyperdash signup --github
```

上記コードを実行すると、Google Driveマウントと同じように認証用のリンクが表示されますので、同じように操作して下さい。学習結果を出力する先頭に以下のように書くことで、xxxという名前で結果が記録され、スマホから確認できます。その他詳細は公式資料などを参照下さい。

``` Python
%%monitor_cell 'xxx'
```

自分は他にも[Optuna](https://research.preferred.jp/2018/12/optuna-release/)を使っていますが、これも同様に!pipでインストールしimportして使っています。

## 2019/6/9追記
[Hyperdashの使い方](https://qiita.com/shoji9x9/items/896204303a7a56321d4c)にもう少し詳しい使い方を書きましたので、あわせてご覧下さい。

# あと何分？
[あと何分？](https://matome.naver.jp/odai/2136955708178878401/2138278187194822303)（12時間まであと何時間？）と聞きたくなったときは別のノートブックを開き以下のコマンドを実行してみて下さい。経過時間がわかります。

``` Python
!cat /proc/uptime | awk '{print $1 /60 /60 /24 "days (" $1 / 60 / 60 "h)"}'
```

なお、[7. 同時に複数notebookを使い分ける](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935#7-%E5%90%8C%E6%99%82%E3%81%AB%E8%A4%87%E6%95%B0notebook%E3%82%92%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%82%8B)に書かれている通り、GPUありインスタンスとGPUなしインスタンスは区別されるため、新しく開いたノートブックのハードウェアアクセラレータも必要に応じて変更して下さい。自分の場合は上記コマンドを保管した専用ノートブックを1つ作成し使っています。

# 12時間じゃ終わらない！という人は・・・
[5. 12h超えタスクを実行するには](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935#5-12h%E8%B6%85%E3%81%88%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF)をご覧下さい。12時間後に自動的に再実行する方法もありそうですね。

# 最後に
これくらい覚えておけば、それほど不自由なく使えると思います。無料でGPUを利用できる機会はそう多くないと思いますので今後も積極的に使っていく予定です。