かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

kaggle の notebook コンペで役に立ちそうなディレクトリ構成の話

こんばんは、kaaggle Advent Calendar 2020 の 17日目の記事です。


これは何

この記事では、MoA コンペで実際に私が使っていた事例を参考に kaggle の Code コンペティション (テーブルコンペ) におけるオフラインの実験 - kaggle notebook での推論 をシームレスに実行できるようなディレクトリ構成についてご紹介しようと思います。

目次

  • Code コンペティションについて

  • MoA コンペについて

  • 何が問題だったか

  • notebook がラクならパクればいいじゃん

  • まとめ

1 . Code コンペティションについて

Synchronous Code コンペティションとは Code コンペティションとは 2019 年の Instant Gratification コンペ (通称 kerneler君コンペ) から適用されたコンペ形態で、

  • Submit ボタンを押したタイミングで Private test set を使い ReRun される (そのデータで計算されたスコアが最終順位になる)

  • public test データが一部、または全く与えられず、ReRun 時に初めて public test データにアクセスできる (参加者からは見えない)

  • kaggle の notebook のセッション内で推論を行うコードを書く必要がある

  • notebook は CPU mode と GPU mode で実行上限時間が定められている

といった特徴があります。

そのため、画像コンペや NLPコンペのような、DeepLearning ベースで解くことが想定されるようなコンペティションにおいて、より良い精度を出そうと思うと、notebook 上で 学習 + 推論を行おうとすると、

  • 与えられた GPU メモリが足りないのでたくさんのエポック数を回せない

  • EfficientNet や BERT といったモデルを大きくできない (使用モデルが制限される)

などの不便が想定されます。そのため、参加者は学習と推論のコードを分けることが許可されており、多くの参加者は以下のような戦略を取っています

・kaggle notebook を学習用と推論用に分ける

  • この場合、GPU だと学習に最大 9h 使用できる

  • 学習済みのモデルはデータセットに upload する他、推論用 notebook の UI から KernelOutputFiles の tab から add することでアクセスできるようになる

・自宅の GPU サーバーや GCP で学習し、推論のみ notebook 環境で行う

  • この場合、資金の許す限り強いマシン、無限の時間を使用しモデルの育成を行うことができる

  • 学習済みモデルは kaggle datasets upload -p /path/to/model/weights などで Datasets に upload でき、推論用の notebook からは Datasets を add することでアクセスできるようになる

2 . MoA コンペについて

アドベントカレンダーでも紹介されているので詳細は省きますが、匿名特徴量のテーブルデータのコンペでかつ NN が有効なコンペでした。

public test は少し与えられており、コンペの焦点として、public test と private test が如何程似ているか、どれほど汎化性能を追求できるかが重要でした。(重要でないコンペはないと思いますが..)

そのため、私は制限上限の 2h いっぱい使って、特徴量加工、学習、推論を一気通貫で行いました。

特に、匿名で与えられた特徴量を RankGauss や PCA などを使って加工する特徴量エンジニアリングが主流であったため private test データも合わせて fit transform することで、ある程度事故を減らすことができたように思います。

しかし、1h 30min ほど使用していた私のベストモデルの伸びが鈍化してしまい、ダメ押しの推論のみのモデルもアンサンブルに含めようと方針転換したのでした。

3 . 何が問題だったか

推論のみのモデルを用意するにあたって、train + public test のみで fit した PCA モジュールなどを個別に保存して、推論時には transform するだけにする必要がありました。(fit_transform してしまうと private test 使用時に不整合が発生し、モデルの predict 時にエラーで落ちる --> Submission CSV Not Found になる) 結構ハマってしまった方も多かったようです。

これまで全部 notebook で実験を済ませていたこともあって、PCA を fit したモデルを dump したものは KernelOuputFiles から add すればよく楽チンだったのですが、

https://github.com/osuossu8/Kaggle_Bengali2019

画像や NLP で使用していた普段使いのディレクトリ構成を使用していた時は細々した手間が発生して面倒でした。具体的には、DeepLearning コンペだと pth だけ upload すれば良いことが多く、outputs というところに吐き出していた pth のみを uploads に cp して upload するという手抜き運用だったので、実験ごとにたくさんの中間出力ファイル (pkl に固めてました) が必要な本コンペには合わない構成でした。

4 . notebook がラクならパクればいいじゃん

Notebook の add がラク, 自分の Dir 構成が不便 ... ということで自分の実行環境でも kaggle の notebook の output みたいな形にすればええやんということで以下の Dir のような形に落ち着きました

https://github.com/osuossu8/KaggleMoA/tree/main/exp

exp dir 以下の exp00X の単位がそれぞれ新しい notebook を立ち上げることを擬似的に表しています。

ちょっとした工夫ですが、画像コンペで使う dir ではなんども使うスクリプトは .py に分割し、import するようにしているところを関数ベタがき上等のコピペ祭りを許容しています。

これにより、新しい notebook を推論用に立ち上げたときに notebook にコピペし、データセットを add するだけで回すことができました。

この構成のおかげでオフラインの実験が捗りました。使用感は notebook 環境さながら (当社比) でストレスなかったです。(コンペで結果残すのに繋がりませんでしたが ...)

同じく MoA コンペに参加されていた tawara さんも似たような結論に達されていたようです。

https://twitter.com/tawatawara/status/1335223646911021059?s=20

まとめ

  • "Notebook がラクならパクればいいじゃない" -- カエル・アントワネット (1994~)

以上です。ありがとうございました。


追記 ・twitter で指摘をいただき Code コンペとはのところを修正しました