Zenn
Open7

DevPod による計算基盤

fjktkmfjktkm

DevPod を用いた計算基盤のメリットには以下のことが挙げられる:

  • LDAP などを用いたアカウント管理が不要
  • Kubernetes クラスタにデプロイすることでマシンの仮想化が可能
  • コンテナ仮想環境による開発が可能
fjktkmfjktkm

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

ディストリビューション マルチノード 別のマシンからのアクセス ストレージプロビジョニング
Vanilla
K3s
minikube
fjktkmfjktkm

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

fjktkmfjktkm

DevPod で GPU を使うには,大前提として Kubernetes で GPU が利用できるようにする必要がある.GPU Operator というやつを使えばいいらしい.ドキュメントにしたがって設定すれば問題ない.ただし K3s を使うのでパスとかは注意が必要.

https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/index.html

次に DevPod 側の設定について説明する.DevPod で GPU を使えるようにするにはプロバイダ側で設定を変更する必要がある.GPU リソースの割り当て自体は limits で指定するだけで十分だ.注意したい点は Resources は YAML ではないということだ.たとえば limits.nvidia.com/gpu: 1 などと指定してもエラーが出る.ChatGPT に頼ってるとこの辺は勝手に YAML に変更しちゃうようで沼った.

Resources
limits.nvidia.com/gpu=1

ただこれだけだと GPU 関連の一部のファイルがマウントされないらしく,nvidia-smi が実行できないが GPU はアタッチされているという謎の状態になる.Pod 内でドライバーをインストールすれば利用できるが不便.この問題を解決するのに runtime を設定する必要があった.

Pod Manifest Template
apiVersion: v1
kind: Pod
spec:
  runtimeClassName: nvidia

ここ気づくまですごい苦労した.runtime を nvidia にするのはクラスタ側の設定でも可能なのでそっちで設定したほうが良心的かもしれない.あと,プロバイダレベルの変更になるのがやや不満.同じクラスタに対して複数のプロバイダの設定を用意すればいいかもしれないけどあまり美しくはないね.

fjktkmfjktkm

注意したいのはイメージの選択である.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 にバグがあるというものである.今のところ修正される気配はない.

https://devpod.sh/docs/tutorials/reduce-build-times-with-cache

https://github.com/GoogleContainerTools/kaniko/issues/3006

ただ PyTorch を実行するだけならべつにわざわざ CUDA イメージを使う必要はまったくない.Dev Container のプリセットで用意されている Python の環境とかで全然大丈夫だった.結局問題は解決できなかったが回避策はわかったのでなんとかなりそう.

fjktkmfjktkm

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

ログインするとコメントできます