#contents
*Kubernetes と nvidia-docker2 の組み合わせ [#k3151436]
-こういうことをやりたい
#ref(Rancher-Kubernetes-gpu.png)
--Pod の resources 定義で、欲しい GPU 数を定義する
--そうすると、Kubernetes クラスタの中から、指定された GPU 数を満たす Node が自動的に選ばれて、そこで Pod が動く。
--また Pod に GPU がバインドされて他から使われないようにする
-Kubernetes には、デバイス管理のための拡張ができるようになっている
--device plugin : https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/
--Kubernetes 1.10 からデフォルトで有効になっている。今回使っているのは 1.11 なので device plugin を有効にする必要なし
-Nvidia は、Nvidia の GPU を Kubernetes から管理するための device plugin を公開している
--https://github.com/NVIDIA/k8s-device-plugin
*device-plugin の設定 [#n5072646]
+まずは、nvidia-docker2 をインストールして、デフォルトの runtime を nvidia-docker2 にする&br;
→ [[DeepLearning nvidia-docker2]]
+device plugin は、Kubernetes 1.10 からデフォルトで有効になっている(特にやることなし)
+Nvidia の device plugin ドライバをインストールする&br;
https://github.com/NVIDIA/k8s-device-plugin#running-gpu-jobs
$ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.11/nvidia-device-plugin.yml
daemonset.extensions/nvidia-device-plugin-daemonset created
+%%nvidia.com/gpu を指定しない Pod には、環境変数 NVIDIA_VISIBLE_DEVICES=none を設定する%%
--https://github.com/takmatsu/gpu-mutating-webhook で、Pod 配備の前処理で GPU が要求されていなかったら 環境変数 NVIDIA_VISIBLE_DEVICES=none を設定できる ... はずだけど
--2019-02-28 現在、K8s 1.11 でうまく動かないのでこれはあきらめる
--nvidia k8s-device-plugin の仕様では
WARNING: if you don't request GPUs when using the device plugin with NVIDIA images all the GPUs on the machine
will be exposed inside your container.
とのことなので、GPUを要求しない Pod には、環境変数 NVIDIA_VISIBLE_DEVICES=none を明示的に指定することにするべかな
---NVIDIA_VISIBLE_DEVICES=none GPUを使わない
---NVIDIA_VISIBLE_DEVICES=all すべてのGPUを使う (NVIDIA_VISIBLE_DEVICES未指定時の動作)
---NVIDIA_VISIBLE_DEVICES=0,1 GPU0 と GPU1 を使う (Pod に、欲しい GPU の個数を指定すると、nvidia k8s-device-plugin がのような環境変数を自動的に設定してくれる)
---NVIDIA_VISIBLE_DEVICES=0,1 GPU0 と GPU1 を使う (Pod に、欲しい GPU の個数を指定すると、nvidia k8s-device-plugin が、適当な GPU 付きの Node を選んで、このような環境変数を自動的に設定してくれる)
----
[[Deep Learning]]