最近Kubernetes、Docker和NVidia GPU驅動都進行了較大的升級,所以考慮對Kubernetes集羣升級NVidia GPU驅動版本。我這裏使用Ubuntu 18.04LTS + NVidia GPU Driver 410.78 + Kubernetes 1.13.1 + Docker CE 18.09-3 + NVidia Docker2 組合,雖然安裝的軟件較多,由於一直在用比較熟悉,還算順利。也能夠選擇其餘的版本組合,但所用的版本必定要匹配,不然會引發各類錯誤。node
這個步驟稍微多一些,具體方法參考:git
在容器中使用Nvidia的GPU,須要安裝nvidia-docker2。最新的nvidia-docker2版本須要docker-ce 18.09版本的支持。安裝方法以下:github
sudo apt-get install -y docker-ce=5:18.09.0~3-0~ubuntu-bionic --allow-change-held-packages
新安裝docker的,能夠參考:Ubuntu快速玩起色器學習 docker
Ubuntu默認安裝docker.io
的Docker版本,並不是最新版本。這裏直接安裝最新版本,查看 更多信息。json
安裝nvidia-docker2軟件,以下:ubuntu
# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f sudo apt-get purge -y nvidia-docker # Add the package repositories curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \ sudo apt-key add - distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \ sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update # Install nvidia-docker2 and reload the Docker daemon configuration sudo apt-get install -y nvidia-docker2 sudo pkill -SIGHUP dockerd # 測試一下: docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
首先,檢查每個節點,啓用 nvidia runtime爲缺省的容器運行時。咱們將編輯docker daemon config文件,位於/etc/docker/daemon.json
api
{ "exec-opts": ["native.cgroupdriver=systemd"], "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } }
上面的這一行("exec-opts": ["native.cgroupdriver=systemd"])是在Ubuntu16.04+DockerCE上面必需要的,不然kubelet沒法成功啓動(參考 http://www.javashuo.com/article/p-rqehlpup-bz.html)。app
若是
runtimes
沒有, 到nvidia-docker 參考,首先進行安裝。curl
第二步,啓用 DevicePlugins
feature gate,在每個GPU節點都要設置。機器學習
若是你的 Kubernetes cluster是經過kubeadm部署的,而且節點運行systemd,須要打開kubeadm 的systemd unit文件,位於 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
而後添加下面的參數做爲環境變量:
Environment="KUBELET_GPU_ARGS=--feature-gates=DevicePlugins=true"
該設置在1.10版本及之後,已經再也不須要了。參見:Kubernetes中調度GPU資源
從新載入配置文件,而後從新啓動服務:
$ sudo systemctl daemon-reload $ sudo systemctl restart kubelet
完成全部的GPU節點的選項啓用,而後就能夠在在Kubernetes中啓用GPU支持,經過安裝Nvidia提供的Daemonset服務來實現,方法以下:
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.12/nvidia-device-plugin.yml
NVIDIA GPUs 如今能夠經過資源名 nvidia.com/gpu請求在容器裏進行訪問。
將如下內容保存爲nvidia-gpu.yaml。
apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: nodeName: podc01 containers: - name: cuda-container image: nvidia/cuda:9.0-devel resources: limits: nvidia.com/gpu: 2 # requesting 2 GPUs - name: digits-container image: nvidia/digits:6.0 resources: limits: nvidia.com/gpu: 1 # requesting 2 GPUs
而後運行 kubectl apply -f nvidia-gpu.yaml -n nvidia,部署該pod到集羣中。
其中:
完畢。
更多參考: