📑

超初心者なりにGCP+DockerのKaggle環境構築してみた(2024/12 ver)

に公開

はじめに

背景

これまで、何度かKaggleやSignateのコンペに参加してきたものの、テーブルコンペやゲーム用のローカルGPUでもなんとか実験できるレベルのコンペでした。
最近はLLMコンペが増えており、A100やH100などのGPUメモリが大きいGPUが搭載されたマシンの利用は避けられないものとなっています。
この度、私もLLMコンペに参加することを決めたため、クラウド上にGPUマシンを立てる必要がありました。

目的

この記事は、(2024/12時点)初心者がKaggle環境を構築するにあたって行ったことを残しておくものです。

  • 要件
    • 複数人で共通のマシンを利用したい
    • GCP上にGPU環境を構築する。(Kaggleの環境構築記事が多かったためGCPを選択)
    • DockerでKaggle環境を構築する。(複数人でVMを使用することから、ユーザー個別のコンテナ上で開発した方が混乱が生じにくい?Pythonの環境構築もスクラッチからやるよりは簡単そうだったため)

とはいえ、様々な記事を参考に見様見真似で構築したものですが。。。
この記事ではそれらの参考にした記事の紹介をしつつ、初心者が躓いたポイントを補足させていただくことで、これからKaggleに参戦する方が迷うことなく環境構築することができればと思い投稿させていただきました。

GCP環境の構築

参考にした記事

https://osushinekotan.hatenablog.com/entry/2023/10/01/223228
基本的には記事の内容通りに作ることでCUDAやPytorchが入ったVMを構築することができます!
(DeepLearningVMなるものがあるなんて、とても便利だなと...)

記事の補足

SSH公開鍵の作成

記事では当然のようにSSH公開鍵を登録していますが、私はここで躓きました。
以下のコマンドを自分のPCのターミナルで打つことで作成することができ、カレントディレクトリ上にid_ed25519.pubと.pubがないものが作成されるはずです。
.pubの方が公開鍵で.pubがない方が秘密鍵になります。
公開鍵の中身をGCP上の「手動で作成したSSH認証鍵の追加」の欄にコピペしてあげましょう。

ssh-keygen -t ed25519 -C "VM上のユーザーネームとして登録したい文字列"

https://qiita.com/rihib/items/9b1f611619695cbf68a0

  • ~/.ssh/config のUserに入力するユーザー名は上記コマンドで設定したユーザーネームです。
  • ユーザーネームをメアドにしていると、VM上では@以降が無視されるみたいなので注意。(abcd@gmail.comの場合、VM上ではabcdがユーザーネームになっていてconfigのユーザーネームもabcdにしておかないと入れない)
  • IdentityFileには秘密鍵のパスを登録するのをお忘れなきよう。秘密鍵は絶対に外部に漏らさないでくださいね。
  • 追加のユーザーを登録したい場合は公開鍵の設定欄を追加して登録すればよいです。
  • 外部IPが変わる設定になっているため、VMを起動して外部IPが変わっていた場合はその都度~/.ssh/configのIPも書き換える必要があります。

バケットとVMの接続

GCP上のストレージとVMが連携できると何かと便利だよねということで、こちらも設定しました。

参考にした記事

https://osushinekotan.hatenablog.com/entry/2023/10/01/223228
同じ記事のmount.shを実行しましょう。

補足

記事の内容ではないのですが、バケットがマウントされているディレクトリを他のユーザーと共有できるようにすべく、浅めの位置にディレクトリを作成しました。
具体的には、VM上の/homeに新たにdataディレクトリを作成し、これをマウントするディレクトリとして指定しています。
このディレクトリを作成するには、権限設定が必要になります。
以下のコマンドで実施できます。

chmod 777 /home/data

https://qiita.com/shisama/items/5f4c4fa768642aad9e06
しかしながら、ものぐさな私は/home配下にまとめて権限付与してしまった方が今後も考えると早いのでは?と思い、

chmod 777 -R /home

を実行しました。
この後、Permission DeniedというエラーでsshでVMに接続することができなくなってしまいました。
どうやら/home/user_nameに含まれているssh関係のフォルダの権限に変更が入るとssh接続ができなくなるようです。
必要な場所に必要な分の権限を設定しましょう。
解決方法は以下の記事を参考にしました。(手元のvscodeでは接続できなかったため、GCP上のコンソールから接続し、実行しました。)
https://qiita.com/rikuto125/items/bdb01b241eb5a408da34

Docker環境の構築

参考にした記事

VMへのDockerのインストールは↓から
https://docs.docker.com/engine/install/ubuntu/#installation-methods
Kaggleコンテナの構築
https://zenn.dev/yuto_mo/articles/d261e96f35986a
5.2のImageをpullする場合を実施しましょう。
こちらは特に躓かなかったです。
ちなみに、インストールしたDockerやプルしたイメージは他のユーザーからも利用できます。(nvidiaドライバーも同様です)
そのため、他のユーザーはポートや名前が被らないように適宜変更しつつ、以下のコマンドを打つだけで自分のコンテナを立てられます。

docker run -itd --gpus all -p 8888:8888 -v "$(pwd)":/home -w /home --name container-name gcr.io/kaggle-gpu-images/python /bin/bash

作成したコンテナを起動して、無事にユーザー個別のコンテナ上で開発ができるようになりました。
また、上記記事の前編でKaggleコマンドについても解説されており、この後参考にさせていただいています。
https://zenn.dev/yuto_mo/articles/5c5311a83892b2

ちなみに

Dockerでマウントするディレクトリの中にGCPのバケットをマウントしているディレクトリを入れてあげると便利です。
私は先ほどの「/home/data」の他にも「コンテナでマウントするプロジェクトフォルダの中のdataディレクトリ」を作成し、同じ.shコードでマウントしています。
こうすることで、どちらのディレクトリにも同一のGCPのバケットの内容が同期されます。
/home/dataをシンボリックリンクで繋いで参照することも試したのですが、この場合だとコンテナ内でdataディレクトリが表示されず(Dockerの仕様なのでしょうか。)、それぞれに.shを実行することで無理やり同期させています。

おわりに

書いてみると意外と長くなってしまいました。。
これも初心者が苦戦した跡だということで、生温かい目で見ていただけるとありがたいです。
参考になったよという方は反応をいただけると大変励みになります。

また、以下の内容で現在の環境を改善したく、方法をご存知の方は教えていただけますと幸いです。

今の環境で改善したいこと

  • GCPの自動シャットダウンを設定したい。他のサービスだとあった気がするのに。。
  • プルしたKaggle-Docker環境をカスタマイズしたい。devcontainerを使ってvscode拡張機能も入れてみたい。(なんとなくでやってみたものの、devcontainerを起動してもプルしたKaggle環境のイメージで立ち上がらず)
  • sshした後にコンテナに入る二段階の操作が地味に面倒。ローカルから直接入れたりしないものか。

参考にした記事(再掲)

GCP環境の構築
https://osushinekotan.hatenablog.com/entry/2023/10/01/223228
SSHについて
https://qiita.com/rihib/items/9b1f611619695cbf68a0
権限設定周り
https://qiita.com/shisama/items/5f4c4fa768642aad9e06
https://qiita.com/rikuto125/items/bdb01b241eb5a408da34
Dockerのインストール
https://docs.docker.com/engine/install/ubuntu/#installation-methods
Kaggleコンテナの構築
https://zenn.dev/yuto_mo/articles/d261e96f35986a
Kaggleコマンド
https://zenn.dev/yuto_mo/articles/5c5311a83892b2

Discussion