学習する天然ニューラルネット

主に機械学習に関する覚書や情報の整理。競プロ水色→Kaggle Master→?

貸せ、RunpodはKaggleでこう使う

Kaggle - Qiita Advent Calendar 2024 - Qiita 25日目の記事です。

はじめに: Kaggleにおける計算リソースの重要性

Kaggleでは、データサイエンスのコンペティションが開催されており、その多くはGPUを使った計算が必要だ。 例えば、画像認識のコンペティションでは、画像データを学習するために、大量の画像データをGPUで学習する必要がある。 これらの計算は、ローカルのPCでは難しいため、クラウド上の計算リソースを利用することが一般的だ。

そして、Kaggleのコンペティションにおいては、計算リソースの性能が勝敗を分けることが多い。 ぶっちゃけ私のようなセンスのない人間でも、多くの計算リソースを確保し、試行回数をとにかく増やせば、上位に入る確率が高まるのである。 (競プロや数学オリンピックではこうはいかない。資本主義バンザイ。)

計算リソースとしては、AWSやGCPが有名だが、これらは料金が高い。私のような貧民がこれらを多用してしまったら、破産待ったなしである。(資本主義が憎い。) そんな需要を満たすかのように、昨今ではGPUを専門に安く提供するサービスも増えてきている。その中でもRunpodは特に優れたサービスだと感じた。

本ブログでは、Kaggler向けに、Kaggleに特化したRunpodの使い方やそのTipsを紹介する。 さらに、特別ゲストとして、Kaggle Grandmaster であるエチレン( @ethylene_66 ) さんをご招待した。過去コンペでどのようにRunpodを使っていたか、実例を交えて語っていただく。

Runpodの紹介: なぜRunpodを使うのか

Runpodは、オンデマンドでGPUマシンを利用できるクラウドプラットフォームのひとつだ。 AWSやGCPなどの大手クラウドと比べると、手軽な価格帯やアカウント作成〜マシン構築までの簡単さが大きな特徴である。クラウド経験が浅い方でも導入しやすい設計だと感じた。また、他のGPUクラウドと比べて、インターフェイスがわかりやすく、Secrets(マネージドな環境変数管理)などの最低限エンジニアリングに必要な機能が揃っているのが魅力だ。 要約してしまえば、『価格が安く、使いやすい』というのがRunpodを使う理由だ。

どうやってKaggle向けにRunpodを使っていくのか、実際にGUIの操作を交えて説明していこう。 一緒に操作を進めていく方は、まず以下のリンクからRunpodに登録しておこう。

https://runpod.io?ref=6x122dhk 私のリファラルリンクだが、本記事への投げ銭代わりにご登録いただけると嬉しい。

登録が完了したら、作業を進める前にクレジットをチャージしておこう。Runpodは前払い制のサービスである(クラウド破産を免れるのでありがたい限りである)。

多分$10からチャージできる。

まずはStorageから始めよう

https://www.runpod.io/console/home にログインすると、GPU Cloud, Serverless, Storage の3つの選択肢が表示される。

GPU Cloudは、GPUを使った計算環境をデプロイするための機能だ。Kaggleではこの機能をメインに使うことになるだろう。 Serverlessは、GPUを用いたサーバーレスアーキテクチャを構築するための機能だ。今回は使わない。 Storageは、計算環境から切り離された永続データを保存するための機能だ。

実は一番うまく活用するべきなのは、Storage機能である。理由はちょっと複雑なのであとで説明する。 色々と便利なので、まずはGPU Cloudを使う前に、Storageを作っておこう。

Homeから Storage -> New Network Storage をクリックすると、以下のような画面になる。

ここで、Storageをリージョンとサイズを選択して作成する。リージョンによって、使えるGPUの種類が異なるので作成する前には使いたいGPUが使えるリージョンなのかをチェックしておこう。 サイズは、あとからでも増量はできるので、最初は小さめでも問題ない。 設定が終わったら、CreateをクリックしてStorageを作成する。

この前準備をしておいたほうがよい理由は、次にGPU Cloudの紹介をする際にわかる。

GPU Cloudで計算環境をデプロイしてみよう

さて、いよいよGPU Cloudを使って計算環境(Podと呼ばれる)をデプロイしてみよう。 先ほど作ったStorageの右下のDeployボタンをクリックしよう。

すると、GPUを選択したり、Template(要はDocker Image)を選択したりする画面が出てくる。今回はとりあえず、A100のGPUを選択して進めてみよう。

Pod TemplateにはRunpod Pytorch 2.1を選ぶことをおすすめする。Kaggleの推論環境とPythonのバージョン、及び、Cudaのバージョンが合っているためだ。

他にも

  • GPUをいくつ搭載するか?
  • 長期間の使用を約束する代わりに割引を適用するか?

といった設定項目があるが、各自設定してほしい。 経験上Spotはすぐに止まるので、私は基本的にOn-Demandを使用している。

設定が終わったら、DeployをクリックしてPodをデプロイしよう。

以下のような画面が出てきたら、Podのデプロイが完了だ。あとは、この環境上で、あなたのコードを動かすだけである。Connectと書いてあるボタンを押せば、ssh接続に必要な情報が出てくるのであとは煮るなり焼くなりだ。

この計算環境のライフサイクルは挙動が特別なので、それを説明しないといけない。

  • デプロイされたPodを一時停止(処理状態をそのまま保存し、非課金状態に移行すること)することはできない。停止する場合には、ゴミ箱のアイコンを押すしかない。
  • /workspaceに保存されたデータは永続化される。つまり、それ以外のディレクタに保存したデータはPodを終了すると消える。
  • /workspaceには、Storageで作成したVolumeがマウントされている。(だからはじめにStorageでVolumeを作る必要があったんですね)

この挙動は、Docker Containerと捉えれば素直な挙動である。が、機械学習との相性は悪い。 なぜならば、機械学習では、事前学習済みモデルを用いたり、学習データを用いる計算をすることが多い。さらには、使うライブラリも多く、ライブラリのインストールには時間がかかる物が多いからだ。 起動するたびに環境が初期化されてしまう以上、効率的な機械学習環境のセットアップが重要だ。そのためのTipsを、次の章で説明していこう。

補足:

  • Storageを使わなくても、GPU CloudでPodをデプロイすることはできる。その場合、Podを停止することも可能となる。しかし、Podの実体のマシーンが他人に使われているときに、Podを再開することができない。これでは使いたいときに使えないし、停止中のPod内にあるデータを退避させることもできない。だから初手StorageでVolumeを作る必要があったんですね。
  • Templateを選択したあと、Edit Templateを押すと、portの設定や、環境変数の設定もできる。もし学習ログの可視化にtensorboardを使いたい場合には、対応する番号のportを開けておくとよいだろう。環境変数に関してはSecrets機能と深く関係するので、次の章で説明する。

Kaggle向け環境構築のTips

Runpodを使って、Kaggle向けの計算環境を構築する際のTipsをQA形式で紹介する。

Q: 作業場所はどこにするべきか?

A: /workspaceの配下にkaggleコンペ用のリポジトリを配置するのをおすすめする。データやモデル等もすべてこの配下に保存することで、Podを再起動してもデータが消えないようにする。

Q: Python環境は?ライブラリのインストールに時間がかかるんだけど

A: Kaggleコンペ用のリポジトリにPoetry環境を作成する。Poetryではリポジトリ直下の.venv/にライブラリをインストールするので、Podを再起動してもライブラリのインストールが不要になる。 なお、リポジトリ直下に.venv/を作成するためには、Poetryの設定ファイルpyproject.tomlに以下の設定を追加する必要がある。

[tool.poetry]
virtualenvs-in-project = true

Q: VSCodeでリモート開発するには?

A: これを見ろ。https://docs.runpod.io/tutorials/pods/connect-to-vscode これも見ろ。 https://blog.runpod.io/how-to-connect-vscode-to-runpod/

Q: shellの環境が毎回初期化されるのが不便だ。どうすればいい?

A: 環境setup用のshell scriptを作成しましょう。こればかりはどうしようもなかった。 例えば、私は以下のようなスクリプトを用いている。Podが起動したら初手でこれを実行している。

apt update
apt upgrade -y
apt install -y fish tmux htop
pip install poetry kaggle

mkdir ~/.kaggle
echo $RUNPOD_SECRET_kaggle_json > ~/.kaggle/kaggle.json
# パーミッションを設定
chmod 600 ~/.kaggle/kaggle.json

git config --global user.email "{githubのメアド}"
git config --global user.name "{githubのユーザ名}"

$RUNPOD_SECRET_kaggle_jsonは、RunpodのSecrets機能を使って、Kaggle APIのトークンを設定している。 認証情報系はSecrets機能を使えば、セキュアに環境変数として管理・受け渡しが可能だ。setup用のscriptにも簡単に組み込めるためオススメである。

Podを作るときに環境変数のところでこんな感じに書いている。

Q: 学習したモデルを保存してたらディスク容量が大きくなり、費用が嵩んできた。どうすればいい?

A: 学習に毎回使わないものに関しては、Google Cloud Storageにアップロードする。とても安い。

実用例 by エチレンさん

ありがたいことに 「Kaggle RunPod 部」の一員として一章書かせてもらえることになったので、布教のために過去コンペでの RunPod 活用例について紹介させていただくことにした。 どちらも RunPod のスケーラビリティに助けられた事例であり、これをきっかけに私が使うためのインスタンスを食い尽くさない程度に RunPod 使用者が増えると嬉しい。

コンペ内容や解法の詳細には踏み込まないので、そちらが気になる方はコンペの Discussion や他の方の解法まとめを参照してもらいたい。

飛行機雲コンペ

コンペ内容:画像セグメンテーション

コンペの解法 : https://www.kaggle.com/competitions/google-research-identify-contrails-reduce-global-warming/discussion/430543

コンペ終了1週間前、銀圏上位をさまよっていたとき、当時は注目されていなかった強いモデルをチームメイトが発見したおかげで金圏が見えてきていた。 シングルモデルで銀圏上位を取ることが可能な強力なモデルでありなんとしてでもアンサンブルに組み込みたかったものの、learning rate 等のハイパラ調整が難しく、学習に半日ほど要する手のかかるモデルで、残り時間で良いハイパラを引けるかが怪しかった。

そこで計算資源を増やすためにクラウド GPU サーバーを借りることにしたものの、GCP/AWS は高価だし、安価なことで有名な vast.ai はクレカが通らず、途方にくれていた。 ネットの海からなんとか探し出した RunPod には無事登録できたため、最終的にはインスタンスを複数(たしか RTX 4090 と A6000 をそれぞれ2台)立てることでハイパラ調整と 5-fold での訓練をコンペ終了前に完了でき、画像コンペでの初の金メダルを獲得した。

LLM 20 Questions コンペ

コンペ内容:20 Questions という言語ゲームをbot同士に戦わせる

コンペの解法 : https://www.kaggle.com/competitions/llm-20-questions/discussion/531106

詳細は省略するが、複数の 7B〜8B モデルを手元でそれぞれ 400,000,000 回以上推論させる必要がある解法を選択したため、自宅の RTX 4090 1台では到底計算リソースが足りなかった。

そこで例のごとく RunPod で GPU インスタンスを借りることにした。 コンペ終了2週間前での解法選択だったため、贅沢に RTX 4090 が8台刺さったインスタンスを借りることにした。 $3/hour で減っていく残高を見るのは心が傷んだが、無事に1週間程度で必要な推論が終了し、$500の支出で済んだ。 仮に GCP で同程度のインスタンスを借りようとすると4倍以上の価格のため、軽症で済んだとも言える。優勝賞金で回収できたわけだし。

まとめ

Runpodを使えば、安価かつ手軽にGPUリソースを確保でき、Kaggleの勝率を引き上げることができる。大手クラウドに比べて破産リスクが少ないのも良い点である。

本記事では、Kaggle向けにRunpodを使う際のTipsを紹介した。特に、Storageの活用や、Poetryを使ったPython環境の構築、Secrets機能の活用などはあまり情報が出回っていないのではないかと思うので、参考にしていただければ幸いである。

もう一度リファラルリンクを貼っておくので、「Kaggle Runpod 部(?)」への入会をお待ちしてます。 https://runpod.io?ref=6x122dhk

Kaggle - Qiita Advent Calendar 2024 - Qiitaの9日目の記事はRunpodの対抗馬であるvast.aiの解説がなされているので、興味がある方はこちらも合わせて参照されたい。

vast.aiでkaggleの環境構築