🔖

vast.aiでkaggleの環境構築

2024/12/08に公開

はじめに

最近のkaggleのコンペはGPUが必須のものが多いと思います。そんな中で、GPUの使用時間に制限のあるkaggle notebookでは満足できないと感じているkaggle中級者の方も多いのではないでしょうか(かくいう自分もそうでした)。この記事では、vast.aiというサービスを利用してGPUサーバーを借り、そこにkaggleの環境を構築する方法をまとめます。

※ここでまとめる方法はベストプラクティスではないです。自分はdockerやgitに疎いのですが、それらを使ってもっとうまくやれるんだろうなと想像しています。詳しい方いたら是非教えてください。

vast.aiとは?

vast.aiは、GPUリソースを個人間で貸し借りするクラウドベースのサービスです。高性能なGPUを時間単位でレンタルすることができます。kaggleのDiscussionでもたびたび話題に上がっています。

https://www.kaggle.com/discussions/questions-and-answers/384302

方法1:Jupyter Notebookの立ち上げ(難易度低)

Jupyter Notebookを立ち上げて、そこでkaggleの初心者向けコンペDigit Recognizerのデータセットをダウンロードし動かすことを目標にします。

https://www.kaggle.com/competitions/digit-recognizer

  • まずは会員登録を行い、「BILLING」から10ドルくらいチャージしてみてください。
  • 左のサイドバーから「TEMPLATES」に行き、「Pytorch (CuDNN Runtime)」というものをSELECTで選択します。

  • 次に左のサイドバーの「SEARCH」から、借りるインスタンスを選びます。GPUの種類やメモリ容量などのほかには、以下に注意します。

    • 左のほうにある「Disk Space To Allocate」はコンペに合わせて設定してください。これは後から変更できないようなので、注意が必要です。ちなみに僕がISIC2024コンペ(データサイズ2.69GB)に参加したときは、Disk Spaceを100GBに設定していました。

    • 「Max Duration」はインスタンスのライフタイムであり、これが経過するとインスタンスは自動で停止するとのことです。Max Durationが借りたい期間以上のものを選びましょう。

    • 「Reliability」はホストの信頼性の推定値です。どの程度がいいのかはよくわかりませんが、高いに越したことはないと思います。

  • インスタンスを借りて少し待つと、右のボタンがOPENになります。そしたらOPENの右下にあるJupyterのロゴが入ったボタンを押します。(僕のパソコンだと「この接続ではプライバシーが保護されません」と出ますが、無視してアクセスします。)

  • Jupyter notebookの画面に入れました。一番下のworkspaceのフォルダで作業します。

  • workspaceフォルダに入りました。この記事ではフォルダ構成は特に気にせず、ここに直接notebookファイル(try.ipynb)を作成し開きます。

  • ここから、kaggleのAPIを使ってデータセットをダウンロードします。まずjupyter notebookのセル上で以下を実行し、kaggleのパッケージをインストールします。
!pip install kaggle

以下の記事を参考にkaggle.jsonを発行し、このjsonファイル内のusernameとkeyを用いて以下のコードを実行します。

https://qiita.com/nekot0/items/80d903a32ee101b165b6

import os
os.environ['KAGGLE_USERNAME'] = 【jsonファイルに記載のusername】
os.environ['KAGGLE_KEY'] = 【jsonファイルに記載のkey】

その後、以下のコードを実行してコンペのデータをダウンロードします。

!kaggle competitions download -c digit-recognizer

以下のコードでダウンロードしたデータを解凍します。

import zipfile
import os

# 解凍するZIPファイルのパス
zip_file_path = 'digit-recognizer.zip'
# 解凍先のディレクトリ
extract_to = 'raw_data'
# ディレクトリが存在しない場合は作成
os.makedirs(extract_to, exist_ok=True)
# ZIPファイルを解凍
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    zip_ref.extractall(extract_to)
  • あとは必要なライブラリをpip installでインストールすれば実行できます。
  • 公開ノートブックを実行したい場合は、一度ローカルにダウンロードしてからjupyterのフォルダ内にドラッグ&ドロップして持っていきます。

方法2:CursorからSSH接続して操作する(難易度高)

上記方法だと自動補完などの生成AI系の機能が使えません。なので、ローカルのエディターからvast.aiのインスタンスにSSH接続して操作を行うことを目指します。ここではエディターにCursorを使います(VScode+github copilotでも手順はおなじはず)。Cursorの詳細については以下の資料がとても分かりやすかったです。

https://speakerdeck.com/k951286/aida-zai-eteitacursornoshao-jie-toji-jie-xue-xi-konhetenoshi-yong-rehiyu

  • vast.aiにおけるインスタンスの立て方は方法1と同じです。
  • インスタンスを立てた後は基本的には以下の記事の手順と同じです。

https://qiita.com/nlog2n2/items/1d1358f6913249f3e186

いくつか特筆すべき点をあげます。

  • vast.aiへの公開鍵の登録は、左のサイドバーのACCOUNTのページの右上にある「Change SSH Key」で行う。

  • ssh configに書き込むSSHの接続情報は、インスタンスの下図の>_のところから確認可能。

  • CursorからSSHで接続するとデフォルトで/root/に接続しようとするが、これをworkspaceに変更して接続する。

  • pythonやjupyterなどの拡張機能をインストールすること(recommendで出てくるやつを入れておけばOK)。

uvのインストール

SSH接続した後にuvで環境構築を行う手順もまとめておきます。

  • ターミナルを開き、以下を実行してuvをインストールする。
curl -LsSf https://astral.sh/uv/install.sh | sh
  • vast.aiのコンソール上でインスタンスをrebootすると、uvを認識するようになっている。
uv --version
# uv 0.5.7
  • 以下のコマンドでプロジェクトを新規作成する。
uv init {プロジェクト名}
  • Cursorのnew windowから作成したプロジェクトのフォルダに入りなおす。

gitのインストール

gitのインストール手順もまとめておきます。

  • ターミナルで以下のコマンドを実行する
sudo apt update
sudo apt install -y git
  • 正常にインストールされたか確認
git --version
  • ユーザー名とメールアドレスの設定を行う。
git config --global user.name "Your Name"
git config --global user.email "youremail@example.com"
  • プロジェクトのフォルダでgitリポジトリを作成する。
git init
  • githubでもリポジトリを作成し、そのリポジトリと接続する。
git remote add origin https://github.com/<ユーザー名>/<リポジトリ名>.git
  • ブランチ名を変更しpushする。
git branch -M main  # メインブランチ名を "main" に変更
git push -u origin main

費用感について

先日参加したISIC2024コンペでは、$0.3/hourくらいのインスタンスを6週間くらい借りて約4万円ほどかかりました。高く聞こえるかもしれませんが、GPUを積んだそれなりのPCを買うと50万円以上はかかることを考えると、まあこんなものかなと思います。

Discussion