Google ColaboratoryでKaggle環境を整える時の知っておくと良いことまとめ

## KaggleにおけるColab OPS的な話+α  
最近Kaggleにちゃんと取り組み始めてKaggler生活を楽しんでおります。
KaggleでDNNモデルを学習・推論する上でGPU/TPU環境を用意することが求められますが、環境の選択肢としては以下４種類が挙げられます。

1. Kaggle Notebookで時間制限付きのリソースを借りる（無料）
2. Google Colaboratory（無料/有料）
3. GCPでAI Platform（有料）
4. 自分のマシンのGPUを使う（使用自体は当然無料,マシン購入代と電気代がかかる）

私はKaggle初心者なので今回環境構築の手間と金銭的負担が相対的に少ない1,2の手段を選びました。
その結果Google Colaboratory(以下Colab)はコスパに優れ、工夫をすれば使い勝手も良い環境だと感じました。
そんなColabについてKaggleライフを送る上で抑えておくと良いポイントをいくつかご紹介します！

## 記載内容
1. Kaggle APIでコンペデータのダウンロードとsubmitを自動化する
1. Colab/ColabProを使う時はセッション切れが最大の敵
1. ColabでGPU/TPUを使いすぎて利用制限がかかった場合は別アカウントでColabを使う
1. githubと連携する
1. Kaggle TPUはColab TPUよりかなり速いのでどちらも使う
1. MLflowを使って実験結果を保存する

## Google Colaboratoryとは
Googleアカウントを所持している方なら誰でも利用できる無料のJupyter Notebook環境です。
基本的なライブラリもインストール済みの状態になっているので面倒な環境構築の手間が必要なくPythonプログラムを実行することができます。
これだけでも十分凄いのですがGPU/TPUを無料で利用することができます。
月額課金制になりますがColabPro（1072円/月）、ColabPro+（5243円/月）を購入することでさらに高性能のGPUをほぼ無制限に利用することができるようになることも特筆すべき点です。
例えばColabProの場合月1072円でTesla P100、メモリ27Gを利用することができますが、同じくらいのスペックをGCPで実現すると普通に月10万円くらいかかります。

Colabのパワーを知ったところで本題のKaggleでのColab利用についてtipsを書いていきます。

## ①Kaggle APIでコンペデータのダウンロードとsubmitを自動化する
APIを使うことでkaggleの任意のコンペからコンペデータをAPI経由でダウンロードすることと結果csvのsubmitまでを自動化することができるようになります。
Kaggle APIの利用によりKaggle Notebookと同等の使い勝手をColabで実現することができます。

まず事前にKaggleのアカウントページから「Create New API Token」をクリックして認証情報が記載されたkaggle.jsonをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006590/4b0c0af3-9114-39cf-236a-e6091a8f32bc.png)


ダウンロードしたkaggle.jsonをコンペのデータやNotebookを保存するドライブの任意のフォルダにアップロードします。
その後Colab上でAPIのインストール、Kaggle.jsonによる認証を行うことでコンペデータをダウンロードすることができます。

```
# Kaggle APIのインストール
!pip install kaggle

# マウントしたDriveの任意のフォルダに置いたkaggle.jsonファイルを

!cp /content/drive/MyDrive/{hoge} /content/

# kaggle.jsonをColabのストレージにコピーする
!mkdir -p ~/.kaggle/ && mv kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json

# 任意のコンペデータをダウンロードすることができる！！
!kaggle competitions download -c 'competitive-data-science-predict-future-sales'
```

さらに学習したモデルで予測したsubmissionのcsvファイルをAPI経由でコンペにsubmitすることもできます。

```
!kaggle competitions submit competitive-data-science-predict-future-sales -f "/content/drive/MyDrive/{hoge}" -m "{message}"
```


## ②Colab/ColabProを使う時はセッション切れが最大の敵
ColabはKaggleのGPU/TPUと異なり週当たりの時間制限を気にすることなくより長時間リソースを利用することができます。
勿論使いすぎれば利用が制限されますがColabProの場合標準サイズのRAMのGPU/TPUであれば１週間ほぼずっと学習/推論を回しても使えなくなることはないように感じました。

しかし、Colabにもセッション切れ問題という弱点があります。
Colabでは12時間、Colab Proでは最大24時間GPUを利用できますが、Colabでコードを実行してからPCを触らずに一定時間放置すると最大利用時間に至る前にセッションが自動的に切断されてしまいます。Colabのセッションは対話型なので一定時間クリックやキーボード操作がない場合、最大時間に達していなくてもセッションが切れるようになっています（ColabPro+を除く）。
これでは折角途中まで学習したモデルが不意に無駄になったりしますので迂闊に眠れません。


**セッション切れまでの時間**

|Colab|ColabPro|ColabPro+|
|-|-|-|
|90分|Colabより長い|バックグラウンド実行可能なので最大連続実行時間の24時間|
<br>
対処法は5点です。

1. GCPを使う
1. ColabPro+にグレードアップする
1. 自分のマシンのGPUを使う
1. Kaggle NotebookでGPU/TPUを使う
1. PCを離れる際クリックモジュールを起動してPCに自動クリックを行わせる。

ColabPro+はバックグラウンド実行が保証されているのでセッション切れの心配はないです。
1~4どれも検討から外れた時はColabかColabProを使うことになりますが、この際外出時や就寝時にマシン上で動くクリックスクリプトを起動しておけばセッション切れになることは防げます。（ただし、短期間に使いすぎることでGoogle側からセッションを強制終了される場合も当然あります。）

Pythonでのクリックスクリプトはpynputを使うことで実現することができます。

```
# pynputのインストール
pip install pynput
```


```
# .pyファイルを作り以下の内容を記載、Python hoge.pyで実行
from pynput.mouse import Controller, Button
import time

mouse = Controller()

while True:
    mouse.click(Button.left, 1)
    print('c')

    time.sleep(20)
```

※余談ですが、最大実行時間が24時間に設定されているcolabproを購入後TPUハイメモリを回しましたところ10時間ちょっとで切断されてしまいました。コンペ中TPUで長時間学習による切断を複数回食らいましたが、いずれも**10時間程度が連続実行の限界**というのは同じでした。 恐らくGPUもよほど他の利用者が少ない状況でなければ24時間連続実行が許されることはないと思います。

## ③ColabでGPU/TPUを使いすぎて利用制限がかかった場合は別アカウントでColabを使う
実体験として、Colab Proでも１週間TPUハイメモリをほぼ使いっぱなしにしてたら強制終了されました。
その後渋々同一アカウントでColabPro+にアップグレードしてTPUハイメモリで一晩学習を回したが９時間ちょっと実行したところで強制終了されてたのでColabPro+でも湯水のようにリソース使ってるとGPUやTPUの利用を制限されることは普通にあるようです。

※その後このアカウントでは丸2日TPUハイメモリを割り当ててもらえませんでした。ネット上で情報を探るとGPU等の割り当て制限を受けても数時間で割当てが復活したという話をいくつか見たのでかなり長期間の制限を食らっていることになります。ハイメモリはリソースが逼迫しやすいから制限も厳しいのでしょうか。

GPU/TPU制限された場合の対処は以下の5つが考えられます。

1. GCPを使う
1. Kaggle NotebookでGPU/TPUを使う
1. 自分のマシンのGPUを使う
1. 複数のGoogleアカウントでColabを使う
1. 割り当て制限が解除されるまで待つ

「ColabPro+にまでアップグレードしたのにGPU/TPUの利用上限に達してしまい暫く使えなくなってしまった、コンペ終了間近なのに！」という場合は積みです。次から大人しくGCPを使いましょう。
ということにはならず**複数のアカウントでcolabを使用すれば別アカウントのリソース制限に抵触することなくGPU/TPUを使用できます**。
当然アカウントごとにリソース使用量が計算されているはずなのでメインアカウントでTPUが使えなくなった場合でも別アカウントを使えば問題なくリソースを利用することができます。
GOOGLE様様ですよ本当に。。
そんなにリソース欲しいならGCP使えよなどと言われたらその通りではありますが、定額課金で高性能のGPU/TPUを手軽に長時間使うことができるColabにおいて、こういった小技を知っておくことでKaggle環境の候補とすることができるのではないでしょうか。

サブアカウントからコンペデータを格納しているメインアカウントのDriveにマウントしたい場合、サブアカウントのcolabでdrive.mountを実行してメインアカウントにマウントするだけでコンペデータをいじることができるようになります。


まず以下をColab上で実行します。

```
from google.colab import drive
drive.mount('/content/drive')
```

するとURLが表示されるのでこちらをクリックして遷移すると以下の画面に飛ぶので、メインアカウントをクリックしてサブアカウントのColabとメインアカウントのGoogle Driveをマウントします。


![スクリーンショット 2021-10-28 1.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006590/e970a9bf-7625-0c14-0d4a-8e4c9c846ecf.png)


## ④githubと連携する
githubのリポジトリにColabのipynbを保存することができます。
ただしPrivateリポジトリは不可であり、公開リポジトリでないとcommitできませんのでcheckpoint的に使い、
コンペ上の重要な情報は載せない方が良いかもしれません。

まずgithub上に保存したいColab上でファイルタブから「Githubにコピーを保存」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006590/49b2313d-7c90-f6fb-4f8f-da763264078a.png)


すると連携の許可を求められるので「Authorize googlecolab」を選択します。

![スクリーンショット 2021-10-28 1.39.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006590/dff7de20-63b7-1b2b-ef04-b864b1ec385b.png)

githubアカウントと連携ができたら以下のように手軽にColab上で保存したいタイミングでipynbをgithubにcommitすることができます。

![スクリーンショット 2021-10-28 1.44.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006590/59f74192-f952-8c0f-cfc4-cd896ce86c99.png)

## ⑤Kaggle TPUはColab TPUよりかなり速いのでどちらも使う
私はTPUについて詳しいわけではないのですし、一部のアルゴリズムしか試していないので絶対そうだとは言い切れませんが、同じNotebookを学習させるとKaggle TPUの方が圧倒的に速いです。
バッチサイズ512のLSTMで3倍以上速度に差が出ました。

2021/11/1現在Kaggle　TPUは週に30時間しか使えませんが使わないのは勿体ないです。RAMが16GBしかないので特徴量を作りすぎるとメモリオーバーしてしまいますので特徴量作成を最小限にしたり、特徴量選択済みのcsvを読み込むなどして使っていきたいです。

## ⑥MLflowを使って実験結果を保存する
こういう手札もあるよという話。
学習したモデルの推論で得た実験結果はスプレッドシートにまとめたりすることが多いと思いますが、MLflowというツールを使うことで機械学習の実験結果を自動で管理したり可視化して比較することができます。
Google Cloud Strageに都度実験結果を保存し、MLFlowのTrackingサーバーとして立てたGoogle Compute Engineで結果をコピーしてくることでWebUI上で自動管理された実験結果を確認することができるようになるようです。

これに関してはまだ実践する時間を作れていないので何も書けないのですが、備忘録として記述しておいて後で落ち着いてから試して追記します。


## まとめ
今回Kaggleに初参加して感じたのは、より多くの実験を効率的に回し、必要に応じて並列でガンガン実験を回す環境を整えることが思ったよりも重要だということでした。
統計やモデリングやEDAの能力は良いスコアを得るために不可欠ですが、実験環境が貧弱だと考えていることを効率的に実現するのに時間がかかるので初心者目線でこれからKaggleを始める方が最低限知っておくと良いことを書かせていただきました。

では、良いKaggleライフを！！