Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
kubernetesでGPUクラスタ
管理したい
NTT ソフトウェアイノベーションセンタ
大嶋悠司
モチベーション
• 機械学習
• 分散学習タスクの場合にいちいちノードにログインしたくない
• 複数のタスクを並列で走らせたい
• コンテナ単位で管理できればデプロイも楽
なぜkubernetesなのか
• コンテナオーケストレータの覇者であることがほぼ確定
• スケジューラなどが拡張しやすい
• アルファ版だがGPUサポートが有る
• コミュニティとしても盛り上がってるところ
• https://github....
GPUマネージメントのドキュメント
読めばなんなくわかる
kubernetesでGPU管理の構成
Node
GPU
DLフレームワーク
Nvidiaライブラリ
Nvidiaドライバ
spec:
template:
metadata:
labels:
app: mxd-worker1
spec:
volumes:
- name: nvidialib
hostPath:
path: /usr/lib/nvidia-375
co...
Nvidia-dockerなら動いたのに・・・
(旧) Nvidia-dockerはどうやってるいたか
謎の力で必要なライブラリを
/var/lib/nvidia-docker/volumes/nvidia_driver/{バージョン}
に集めてくれる
で、それをマウントしてる
解決策
kubernetesクラスタ構築前にnv-dockerをインストールしてライブ
ラリだけ集めた後
/var/lib/nvidia-docker/volumes/nvidia_driver/{バージョン}
をマウント
結果:動いた!
不満...
もっとかっこよくなりませんか…?
手段
1. kubernetes + docker + nvidia-docker2
2. kubernetes + cri-containerd + nvidia-container-runtime
3. ?...
nvida-docker2, nvidia-container-runtime
• nvidiaが最近始めたプロジェクト
• OCIランタイムスペックに準拠したGPUを利用するためのコンテ
ナランタイム
• ホスト側のCUDAのバージョンを自動...
docker, containerd, runcおさらい
dockerd
containerd
runc
shim
runc
shim
runc
shim
OCI ランタイムスペック
nvidia-docker2のやること
dockerd
containerd
runc
shim
runc
shim
nvidia
runtime
shim
OCI ランタイムスペック
nv-docker, nv-runtime, k8sの関係
k8sはdocker, cri-containerdに対して
deviceオプションでGPUデバイスを、-vでライブラリを入れる
デバイスオプション
このpodにはGPU 2つ
ライブ...
nv-docker, nv-runtime, k8sの関係
旧nv-dockerも一緒
デバイスオプション
このコンテナにはGPU 2つ
ライブラリのマウントも自動
2 GPUマウントするよー
nv-docker, nv-runtime, k8sの関係
nvidia-docker2, nv-runtimeは違う
環境変数でGPU数指定
NVIDIA_VISIBLE_DEVICES=0,1
このコンテナにはGPU 2つ
2GPUマウント...
方法1:k8s + docker + nvidia-docker2
Node
GPU
nv-runtime
素直な構成、安心と信頼の?docker
構築手順
• ワーカにnvidiaドライバインストール
• 各ノードにdockerインストール
• ワーカにnvidia-docker2インストール
• ワーカでdefault runtimeの設定変更
• kubeadmなどでkubernet...
各ワーカでの設定
{
"default-runtime": ”nvidia",
"runtimes": {
”nvidia": {
"path": "nvidia-container-runtime"
},
}
}
/etc/docker/da...
k8s + cri-containerd + nv-runtime
Node
GPU
CRI-containerd
nv-runtime
alpha版の組み合わせでちょっと怖い
でも将来的にはこっちが主流かも?
構築手順
• ワーカにnvidiaドライバインストール
• https://github.com/kubernetes-incubator/cri-containerd を参考に
cri-containerd等を各ノードにインストール
• ワー...
各ワーカでの設定
[cgroup]
path = "runtime”
[plugins.linux]
runtime = "/usr/bin/nvidia-container-runtime"
/etc/containerd/config.tml
nv-docker2, nv-runtime, k8sの組み合わせに
よる問題
このpodにはGPUはない
環境変数でGPU数指定
NVIDIA_VISIBLE_DEVICES=0,1
デバイス・ライブラリのマウント
このコンテナにはGPU 2...
kubernetesにGPUを管理させる
• nvidia-docker2/nvidia-container-runtimeでは
NVIDIA_VISIBLE_DEVICESをnoneとすればライブラリのマウントだ
け行う
• NVIDIA_V...
kubernetesにGPUを管理させる
• nvidia-docker2/nvidia-container-runtimeでは
NVIDIA_VISIBLE_DEVICESをnoneとすればライブラリのマウントだ
け行う
• NVIDIA_V...
結論
• 現状では怪しいワークアラウンドが必要になる
• nvidia-docker2を使うのも選択肢としてはありかも
• もしくは力技で関連ライブラリを共通のパスにコピーする方法
もある
• kubeletは/devの上から指定するだけだが、...
ちなみに‥GKEじゃだめですか?
• GKEはalphaとしてGPUインスタンスも扱える
• cudaドライバのインストール等をk8sのデーモンセットでできる
gcloud alpha container clusters create gpu...
KubernetesでGPUクラスタを管理したい
Próxima SlideShare
Cargando en…5
×

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

7.070 visualizaciones

Publicado el

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

Publicado en: Tecnología
  • Sé el primero en comentar

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

×