Kubernetes集羣升級NVidia GPU驅動版本

最近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

一、升級GPU驅動

這個步驟稍微多一些,具體方法參考:git

二、升級Docker CE容器引擎

在容器中使用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

三、升級nvidia-docker容器GPU引擎

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

四、設置Docker運行配置參數

首先,檢查每個節點,啓用 nvidia runtime爲缺省的容器運行時。咱們將編輯docker daemon config文件,位於/etc/docker/daemon.jsonapi

{
    "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

五、升級Kubernetes GPU add-on

完成全部的GPU節點的選項啓用,而後就能夠在在Kubernetes中啓用GPU支持,經過安裝Nvidia提供的Daemonset服務來實現,方法以下:

kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.12/nvidia-device-plugin.yml

六、運行 GPU Jobs測試

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到集羣中。

其中:

  • nodeName: podc01爲我指定的節點名稱,由於個人集羣中有的節點沒有GPU卡,若是有多個節點能夠經過label指定節點選擇。
  • nvidia爲命名空間,能夠經過kubectl create ns nvidia建立。

完畢。

 

更多參考:

相關文章
相關標籤/搜索