はじめに
当初書く予定だったネタが、まだあまり深く理解できていないのと、
自分の経験のなさから、ちょっと書くにはデカすぎる内容なのかなと思い、
こちらを書くことになりました。
Kernelオンリーコンペとは?
本来Kaggleではsubmissionはcsvにして提出すれば良いのですが、
最近のKaggleではほとんどがKernelオンリーコンペとなっています。
Kernelオンリーコンペとは、submission.csvの代わりにプログラムを提出する
コンペティションとなっております。
どうやって提出するの?
基本的な流れは以下の通りです。
コンペページから、submit predictionをクリック後、
このような画面が出てくるので、New notebookで
Kaggle専用のJupyterNotebookが出現します。
そのJupyterNotebook上で何らかの処理をさせたあと、
submission.csvを出力する動作を書けばOKです。
Kernelコンペで大事なこと
Kernelコンペでは基本的に、個別データセットOKのコンペがほとんどです。
データセットを持ち込めるということは、
実は学習済みモデルの重みやPickleデータをも持ってこれるということです。
つまり、Kernelコンペでは、事前に学習したモデルを持ってきて
推論だけ提出するといったことも可能です。
もちろん、No Internet Accessでも使用することができます。
Datasetについて
こうした、Kernelオンリーコンペに使われる追加データに関しては、
Dataset項目として扱われ、OpenでもCloseでも持つことができます。
Closeの場合、全体で20GB以内であればCloseデータも持つことができます。
Datasetのアップロード
ローカルのMacからデータセットをあげるのは、WebUI上のドラッグ&ドロップでいいのですが、
容量も逼迫しますし、GCPやオンプレサーバから直でアップロードしたいですよね。
そういう時の方法は二つあって、KaggleAPIかGCSを使用するの二通りになります。
Kaggle API
Kaggle APIを使えばリモートサーバから直接データをKaggleサーバの方に転送することが出来ます。
しかし、KaggleAPIでは現在PrivateDatasetでの利用は出来ないので、
PublicなDatasetでいいなら、KaggleAPIを利用しましょう。
容量とかも気にしなくていいですし、Openになったところでどうせ見ないでしょ。という感じもします。
GCSを利用する方法
とはいえ、コンペティションなので、OpenDatasetだと誰かに学習済みモデルを取られてしまうかも。
なので、Privateなデータセットをローカルに落とさずに行う方法をここに記載します。
その方法がGCSを利用する方法です。
GCSはGoogleCloudStrageのことで、AWSで言う所のS3バケットに相当します。
リモートサーバにGoogleCloudSDKをインストールして、
gcloud init
して認証情報を追加しておきましょう。
その後、gsutil
コマンドを使って、学習モデルデータをバケットに送信します。
そして、学習モデルデータをバケットに入れたら、当該ファイルだけ、
Authなしで見られる状態に権限追加をします。
その後、Notebookに戻って、Dataset→一番上に出てる自分のデータセットを使うを選択
そして、リンクからDownloadするで、GCSリンクを指定してあげれば
読み込ませることが出来ます。
これでローカルを介さずにKaggle上にPrivateDatasetを登録することができます。
(かなりややこしいですが...)
Kernelオンリーコンペの時間は、学習時間ではなく、予測制限時間
自分も勘違いしていたのですが、CPU<=6hourとか表記されてるコンペは
6時間以内に学習を終わらせるコンペだと思っていましたが、
本当は推論を6時間以内に終わらせるという意味です。
(でもKaggleやってたら、1subに正味そんな長いこと待ってられないので、
大抵そこまで使わずとも高速で推論してしまって終わりということが多いような気もします)
おわりに
急に忙しくなってちょっと残念な記事になってしまって申し訳ないです。
時間があったらもっとリッチで画像とか入れた記事にしたいと思います。
メリークリスマス!