KubernetesでGPUクラスタを管理したい

471 views

Published on

DockerTokyo #20で発表した内容です。
https://dockerjp.connpass.com/event/73122/

Published in: Technology
  • Be the first to comment

KubernetesでGPUクラスタを管理したい

  1. 1. kubernetesでGPUクラスタ 管理したい NTT ソフトウェアイノベーションセンタ 大嶋悠司
  2. 2. モチベーション • 機械学習 • 分散学習タスクの場合にいちいちノードにログインしたくない • 複数のタスクを並列で走らせたい • コンテナ単位で管理できればデプロイも楽
  3. 3. なぜkubernetesなのか • コンテナオーケストレータの覇者であることがほぼ確定 • スケジューラなどが拡張しやすい • アルファ版だがGPUサポートが有る • コミュニティとしても盛り上がってるところ • https://github.com/google/kubeflow • https://github.com/tensorflow/k8s
  4. 4. GPUマネージメントのドキュメント 読めばなんなくわかる
  5. 5. kubernetesでGPU管理の構成 Node GPU DLフレームワーク Nvidiaライブラリ Nvidiaドライバ
  6. 6. spec: template: metadata: labels: app: mxd-worker1 spec: volumes: - name: nvidialib hostPath: path: /usr/lib/nvidia-375 containers: - name: mxd-worker1 image: mxnet/python:gpu volumeMounts: - mountPath: /usr/local/nvidia name: nvidialib readOnly: true resources: requests: alpha.kubernetes.io/nvidia-gpu: 4 limits: alpha.kubernetes.io/nvidia-gpu: 4 これで大丈夫 ドキュメントにもそう書いてある
  7. 7. Nvidia-dockerなら動いたのに・・・
  8. 8. (旧) Nvidia-dockerはどうやってるいたか 謎の力で必要なライブラリを /var/lib/nvidia-docker/volumes/nvidia_driver/{バージョン} に集めてくれる で、それをマウントしてる
  9. 9. 解決策 kubernetesクラスタ構築前にnv-dockerをインストールしてライブ ラリだけ集めた後 /var/lib/nvidia-docker/volumes/nvidia_driver/{バージョン} をマウント 結果:動いた! 不満点1:マウントパスに各ノードのcudaのバージョンが必要 不満点2:nvidia-docker1.0はプロジェクトが終了してる
  10. 10. もっとかっこよくなりませんか…? 手段 1. kubernetes + docker + nvidia-docker2 2. kubernetes + cri-containerd + nvidia-container-runtime 3. ??? 目標 1. コミュニティでちゃんとサポートされそうなこと 2. k8sのマニフェストにノード固有の設定が不要なこと
  11. 11. nvida-docker2, nvidia-container-runtime • nvidiaが最近始めたプロジェクト • OCIランタイムスペックに準拠したGPUを利用するためのコンテ ナランタイム • ホスト側のCUDAのバージョンを自動的に認識してなんとかして くれる • 最新版のdockerにも対応してる • 特徴として環境変数でGPU数や、GPUアーキテクチャの指定な どを細かく指定できる
  12. 12. docker, containerd, runcおさらい dockerd containerd runc shim runc shim runc shim OCI ランタイムスペック
  13. 13. nvidia-docker2のやること dockerd containerd runc shim runc shim nvidia runtime shim OCI ランタイムスペック
  14. 14. nv-docker, nv-runtime, k8sの関係 k8sはdocker, cri-containerdに対して deviceオプションでGPUデバイスを、-vでライブラリを入れる デバイスオプション このpodにはGPU 2つ ライブラリのマウントはユーザの責任 2 GPUマウントするよー
  15. 15. nv-docker, nv-runtime, k8sの関係 旧nv-dockerも一緒 デバイスオプション このコンテナにはGPU 2つ ライブラリのマウントも自動 2 GPUマウントするよー
  16. 16. nv-docker, nv-runtime, k8sの関係 nvidia-docker2, nv-runtimeは違う 環境変数でGPU数指定 NVIDIA_VISIBLE_DEVICES=0,1 このコンテナにはGPU 2つ 2GPUマウントしよう デバイス・ライブラリのマウント
  17. 17. 方法1:k8s + docker + nvidia-docker2 Node GPU nv-runtime 素直な構成、安心と信頼の?docker
  18. 18. 構築手順 • ワーカにnvidiaドライバインストール • 各ノードにdockerインストール • ワーカにnvidia-docker2インストール • ワーカでdefault runtimeの設定変更 • kubeadmなどでkubernetesクラスタ構築
  19. 19. 各ワーカでの設定 { "default-runtime": ”nvidia", "runtimes": { ”nvidia": { "path": "nvidia-container-runtime" }, } } /etc/docker/daemon.json
  20. 20. k8s + cri-containerd + nv-runtime Node GPU CRI-containerd nv-runtime alpha版の組み合わせでちょっと怖い でも将来的にはこっちが主流かも?
  21. 21. 構築手順 • ワーカにnvidiaドライバインストール • https://github.com/kubernetes-incubator/cri-containerd を参考に cri-containerd等を各ノードにインストール • ワーカにnvidia-container-runtimeをインストール • ワーカにcontainerdのruntimeを設定 • kubeadmなどでkubernetesクラスタ構築
  22. 22. 各ワーカでの設定 [cgroup] path = "runtime” [plugins.linux] runtime = "/usr/bin/nvidia-container-runtime" /etc/containerd/config.tml
  23. 23. nv-docker2, nv-runtime, k8sの組み合わせに よる問題 このpodにはGPUはない 環境変数でGPU数指定 NVIDIA_VISIBLE_DEVICES=0,1 デバイス・ライブラリのマウント このコンテナにはGPU 2つ 2GPUマウントしよう 誰が GPUを管理するか複雑になる
  24. 24. kubernetesにGPUを管理させる • nvidia-docker2/nvidia-container-runtimeでは NVIDIA_VISIBLE_DEVICESをnoneとすればライブラリのマウントだ け行う • NVIDIA_VISIBLE_DEVICES=noneにしておきながらkubernetes側で resourceを記述する 結果: docker + nvidia-docker2 なら目標を満たせた cri-conainerd + nvidia-container-runtimeだとなぜかずっとpending
  25. 25. kubernetesにGPUを管理させる • nvidia-docker2/nvidia-container-runtimeでは NVIDIA_VISIBLE_DEVICESをnoneとすればライブラリのマウントだ け行う • NVIDIA_VISIBLE_DEVICES=noneにしておきながらkubernetes側で resourceを記述する 結果: docker + nvidia-docker2 なら目標を満たせた cri-conainerd + nvidia-container-runtimeだとなぜかずっとpending が、これはかっこいい方法なんだろうか
  26. 26. 結論 • 現状では怪しいワークアラウンドが必要になる • nvidia-docker2を使うのも選択肢としてはありかも • もしくは力技で関連ライブラリを共通のパスにコピーする方法 もある • kubeletは/devの上から指定するだけだが、nvidia-docker2では GPUのUUIDやアーキテクチャを指定とかいろいろ機能があるが まだkubernetesと上手く連携できない • このあたりのインタフェースの整理はこれからだと思われる
  27. 27. ちなみに‥GKEじゃだめですか? • GKEはalphaとしてGPUインスタンスも扱える • cudaドライバのインストール等をk8sのデーモンセットでできる gcloud alpha container clusters create gpu-cluster --accelerator type=nvidia-tesla-k80,count=1 --zone=asia-east1-a --enable-kubernetes-alpha $ kubectl apply -f daemonset.yaml https://github.com/ContainerEngine/accelerators

×
Save this presentationTap To Close