最近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到集群中。
其中:
完毕。
更多参考: