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建立。

完毕。

 

更多参考:

相关文章
相关标签/搜索