DevPod による計算基盤

DevPod を用いた計算基盤のメリットには以下のことが挙げられる:
- LDAP などを用いたアカウント管理が不要
- Kubernetes クラスタにデプロイすることでマシンの仮想化が可能
- コンテナ仮想環境による開発が可能

使用する Kubernetes のディストリビューションについては K3s が良さそう.公式のチュートリアルには minikube が使用されているが,こちらはマルチノード構成や別のマシンからのアクセスが面倒である.かといって Vanilla な Kubernetes はストレージプロビジョナーが標準搭載されていないため色々設定が必要で面倒である.
ディストリビューション | マルチノード | 別のマシンからのアクセス | ストレージプロビジョニング |
---|---|---|---|
Vanilla | ✅ | ✅ | ❌ |
K3s | ✅ | ✅ | ✅ |
minikube | ❌ | ❌ | ✅ |

DevPod は運用に Persistent Volume が必要である.ローカルのディレクトリを指定する hostPath
というのがあるが,これはシングルノード構成でしか使用できない.マルチノードでは NFS や Longhorn を利用する方法が一般的らしい.NFS は単一障害点になるし,通信のボトルネックにもなりそうだし,各ノードのストレージが無駄になる気もするので,Longhorn を使うのがいいんじゃないかなと思っている.ただ,そうなると Vanilla な Kubernetes でもよかったんじゃないか疑惑がある.

DevPod で GPU を使うには,大前提として Kubernetes で GPU が利用できるようにする必要がある.GPU Operator というやつを使えばいいらしい.ドキュメントにしたがって設定すれば問題ない.ただし K3s を使うのでパスとかは注意が必要.
次に DevPod 側の設定について説明する.DevPod で GPU を使えるようにするにはプロバイダ側で設定を変更する必要がある.GPU リソースの割り当て自体は limits で指定するだけで十分だ.注意したい点は Resources は YAML ではないということだ.たとえば limits.nvidia.com/gpu: 1
などと指定してもエラーが出る.ChatGPT に頼ってるとこの辺は勝手に YAML に変更しちゃうようで沼った.
limits.nvidia.com/gpu=1
ただこれだけだと GPU 関連の一部のファイルがマウントされないらしく,nvidia-smi
が実行できないが GPU はアタッチされているという謎の状態になる.Pod 内でドライバーをインストールすれば利用できるが不便.この問題を解決するのに runtime を設定する必要があった.
apiVersion: v1
kind: Pod
spec:
runtimeClassName: nvidia
ここ気づくまですごい苦労した.runtime を nvidia にするのはクラスタ側の設定でも可能なのでそっちで設定したほうが良心的かもしれない.あと,プロバイダレベルの変更になるのがやや不満.同じクラスタに対して複数のプロバイダの設定を用意すればいいかもしれないけどあまり美しくはないね.

注意したいのはイメージの選択である.PyTorch 使うからといって nvidia/cuda
を使うと痛い目に合う.以下のようなエラーが出た.
failed to get filesystem from image: error removing lib to make way for new symlink: unlinkat //lib/firmware/nvidia
原因は DevPod が Kubernetes でコンテナを立ち上げる際に Kaniko を使うのだが,この Kaniko にバグがあるというものである.今のところ修正される気配はない.
ただ PyTorch を実行するだけならべつにわざわざ CUDA イメージを使う必要はまったくない.Dev Container のプリセットで用意されている Python の環境とかで全然大丈夫だった.結局問題は解決できなかったが回避策はわかったのでなんとかなりそう.

あとは Dev Container の mounts を設定していると起動に失敗するという問題があった.まだ調査中.

これで解決しそうな気がしたがこれ機能しない.どういうことだろう?