Colab 無料版で kaggle 画像コンペ【ドライブ 15 GB でも可】

colab-mounts-kaggle-dataset Kaggle
colab-mounts-kaggle-dataset



結論の概要だけ述べますと,
「kaggle コンペのデータセットは GCS (Google Cloud Storage) にあるため,コンペデータの GCS を Google Colaboratory から gcsfuse でマウントすることにより,Google Drive のマイドライブ及び Google Colaboratory のテンポラリのディスク容量を全く圧迫しないで,画像コンペなどの重量級なデータセットにアクセスできる」
ということです.
このことについて,当該記事にて詳細な手順を記載します.

なぜこれをやろうとしたか?

コードコンペについて EDA 以外は kaggle 上の notebook でほとんど計算していましたが,コードを提出する必要のないコンペでは,良いコード補完と自動整形機能を有するローカルの VS Code にてコーディングして,そのままローカルのターミナルで計算することが大半でした.

しかし,今回取り組もうとした kaggle のコンペ:Happywhale – Whale and Dolphin Identification のデータ容量が .zip の状態でも 62.06 GB もあり,展開した場合は単純計算でこれの倍以上のディスク容量が一時的にでも必要になりますが,ノート PC なんかはスペックによっては厳しいですし,ストレージに余裕があっても抵抗があります.
そして今回は画像コンペなので,GPU or TPU を積極的に活用していきたいところです.
(本当だったら良い GPU を持つマシンを揃えたいところだけれども,説得性のある費用対効果を提示できるだけの実績がないことに起因して,家庭内の稟議が通らない故...)

上記のような事情をお持ちの方で GPU / TPU を用いたい場合で非常に助かるサービスとして,まず思い浮かぶのが kaggle の notebook か Google Colaboratory (以下 colab) だと思います.
両者で連続稼働時間の制限があり,長い時間学習させたい場合や,学習以外の他の処理が重い場合などは,コンペで kaggle notebook 使用の指定がない限りは,途中で Google Drive に学習途中のモデルを保存したり,それを再利用することが容易にできる colab に軍配が上がることでしょう.

理想的な環境が colab であるという一時的な結論にたどり着きました.
しかし,問題はストレージ容量です.
非課金勢においては,Google Drive は全体で悲しいかな 15 GB しかありません.
MyDrive より階層が上の colab のテンポラリ領域(セッション終了時に全部消える領域)では 100 GB 程度使うことができますが,パッケージやらなにやらで,自由に使えるのは残り 65 GB 程度で,今回のコンペの 62.06 GB ある zip を展開しようものなら,たちまちオーバーすることでしょう.

ネット上のいろんな記事を拝見しましたが,大体は,「kaggle API で colab のテンポラリに持ってくる」というもので,今回のようなケースでは解決できませんでした.

「課金する or kaggle notebook でやるしかない or 稟議通すしか無いか...」 そう思っていたのですが,諦めずに調べを進めた結果,今回紹介する手法にたどり着きました.
長くなってしまいましたが,具体的な手法は以下です.

Google Drive / colab のディスク容量を使用せず kaggle コンペデータにアクセスする方法

流れとしては,

  1. 対象の kaggle コンペの code タブで New Notebook で新規 notebook を開く
  2. 開いた notebook で kaggle_datasets にて GCS パスを表示させてコピー
  3. colab 起動し,Google Cloud SDK の認証を web ブラウザ経由で許可する
  4. GPG 鍵取得/Google Cloud Strage FUSE を colab 環境にインストール
  5. マウント用のディレクトリを好きな名前で生成/gscfuse コマンドで GCS パスを今作ったディレクトリでマウント

です.
順番に見ていきましょう.

1. 対象の kaggle コンペの code タブで New Notebook で新規 notebook を開く

以下,赤矢印のとおりです.

kaggle: code -> new notebook

2. 開いた notebook で kaggle_datasets にて GCS パスを表示させてコピー

すると新規の notebook が開きます.
ここに,以下コマンドをコピペして実行すると,GCS パスが表示されます.

from kaggle_datasets import KaggleDatasets
KaggleDatasets().get_gcs_path()
kaggle: get gcs path

gs:// の後に続く最後のクォーテーションを含まない文字列は後で使うので,このページを開いたままにするか,他の媒体にコピペするかしましょう.

3. colab 起動し,Google Cloud SDK の認証を web ブラウザ経由で許可する

colab を起動します.
少し時間が立つとランタイムが接続されます.
フォルダの初期状態としては,次のように sample_data のみある状態でしょう.

colab: start

ここに以下コードをコピペして実行し,SDK の認証を許可しましょう.

from google.colab import auth
auth.authenticate_user()
colab: authenticate_user()
アカウント選択画面で対象のアカウントをクリック
SDK 認証画面で許可をクリック
認証コードを赤矢印の部分をクリックしてコピー

上記でコピーした認証コードを colab の空欄にペーストして enter で認証されます.

colab: authentication

4. GPG 鍵取得/Google Cloud Strage FUSE を colab 環境にインストール

以下コマンドをコピペして実行します.

!echo "deb http://packages.cloud.google.com/apt gcsfuse-`lsb_release -c -s` main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
!curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
!apt-get -y -q update
!apt-get -y -q install gcsfuse
colab: installing gcsfuse

5. マウント用のディレクトリを好きな名前で生成/gscfuse コマンドで GCS パスを今作ったディレクトリでマウント

以下コピペして実行します.
ここで,”{GCS パスの gs:// 以降の文字列}” について,ダブルクォーテーションの中身は先程 kaggle notebook にて表示した文字列をコピペしてください.

!mkdir -p tmp
!gcsfuse --implicit-dirs --limit-bytes-per-sec -1 --limit-ops-per-sec -1 "{GCS パスの gs:// 以降の文字列}" tmp
colab: mount kaggle competition dataset

これで tmp という名前で kaggle コンペデータセットについてマウントできました.
以下のように,フォルダを確認すると,

colab: folders

ちゃんと,tmp の中にコンペデータが見えていますね!
そして,ディスクも全然消費されていない! 素晴らしい!
API からマウントできるクラウドストレージであれば,恐らく kaggle 以外でも使えると予想されます.

以上,Google Drive / colab のディスク容量を使用せず kaggle コンペデータにアクセスする方法でした.

コメント

タイトルとURLをコピーしました