何が起こった?
昨日、Kaggle APIとGoogle Colabを連携させ、快適な開発環境が構築できて満足していました。ところが、朝起きてみると、昨日せっせと作ったはずの分析結果や予測結果、提出用ファイル一式が全部なくなっていました。ちーん。。。
どうやら、Google Colabを一定時間利用していないと、セッションが切れてカーネルがデタッチされ、ファイルやインストール済みのライブラリが消えてしまうようです。Kaggleに投稿した結果ファイルだけはKaggle側に保存されているのだけれど、いろいろ試行錯誤して「次はこれを投稿してみよう」と思っていたファイルはもう残っていない。。。あー、なるほど。そういう仕様でしたか。
調べてみると、「一定時間以上操作がない(90分ルール)」と「連続で長時間利用している(12時間ルール)」の2つの原因でセッションが切れるようでした。90分ルールはまあ分かる。開発よりも別のことを優先していたわけだから。しかし12時間ぶっ通しで集中して作業していたら、突然セッションが切れてファイルが消えてしまうのは、考えるだけでも恐ろしい。おじさん想像しただけで泣いちゃう。

対策:Google ColabとGoogleドライブとの連携
幸い、Google ColabとGoogleドライブは簡単に連携できます。下記のコードを実行することで、Google Colabの/content/driveディレクトリの下に、GoogleドライブのMyDriveディレクトリをマウントさせることができます。
from google.colab import drive
drive.mount('/content/drive')
これで、Google ColabからGoogleドライブ上のファイルを直接読み書きできるようになりました。
あとは、Google Colabの最初のセルに、環境構築用のコマンド一式をまとめておけば、朝起きてポチっと実行するだけで、Kaggle用に必要なライブラリやファイル一式が準備できるようになります。
私のノートブックでは、一番最初のセルに下記のような感じで設定しています。Googleドライブとの連携ついでに、GoogleドライブのKaggle用ディレクトリにkaggle.jsonファイルを置いて、Kaggle API用の認証を自動で済ませられるようにしています。
# ライブラリのインストールとデータの入手
! pip install -q pycaret
! pip install -q kaggle
# GoogleドライブをGoogle Colabにマウント
from google.colab import drive
drive.mount('/content/drive')
# 環境変数にプロジェクト用のフォルダを登録
%env KAGGLE_HOME=/content/drive/MyDrive/kaggle
%env KAGGLE_PJ=titanic # Googleドライブ上のフォルダ名
%env KAGGLE_COMPETITION=titanic # コンペの名前(ダウンロード時に使用)
# Kaggle APIキーをGoogleドライブからGoogle Colabにコピー
! mkdir ~/.kaggle
! cp $KAGGLE_HOME/kaggle.json ~/.kaggle/
! chmod 600 ~/.kaggle/kaggle.json
# Dataの取得
! kaggle competitions download -c $KAGGLE_COMPETITION
! unzip -n ./$KAGGLE_COMPETITION.zip -d $KAGGLE_HOME/$KAGGLE_PJ
こうしておけば、titanicから別のコンペに参加する場合でも、最初のセルの
%env KAGGLE_PJ=titanic # Googleドライブ上のフォルダ名
%env KAGGLE_COMPETITION=titanic # コンペの名前(ダウンロード時に使用)
を変えてやるだけで、ファイル置き場を簡単に切り替えることができます。
コンペの名前は、各コンペのDataタブの下の方にコマンドラインに書かれているので、「-c」オプションの横にある名前をコピペします。Titanicの場合は下記のような感じです。
ちなみに、Google Colabでの環境変数の指定方法は、上にあるように「%env」で行います。私は「!export KAGGLE_PJ=titanic」とやろうとして、うまくいかず、ちょっとハマりました。
参考にしたページ