最近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 组合,虽然安装的软件较多,因为一直在用比较熟悉,还算顺利。也可以选择其他的版本组合,但所用的版本一定要匹配,否则会引起各种错误。
1、升级GPU驱动
这个步骤稍微多一些,具体方法参考:
- 推荐:Ubuntu18.04上安装RTX 2080Ti显卡驱动
- Ubuntu 16.04安装NVIDIA的显卡驱动396和CUDA9.1
- Ubuntu 安装NVidia驱动
- Ubuntu换新显卡无法启动
- Ubuntu快速玩转机器学习
2、升级Docker CE容器引擎
在容器中使用Nvidia的GPU,需要安装nvidia-docker2。最新的nvidia-docker2版本需要docker-ce 18.09版本的支持。安装方法如下:
sudo apt-get install -y docker-ce=5:18.09.0~3-0~ubuntu-bionic --allow-change-held-packages
新安装docker的,可以参考:Ubuntu快速玩转机器学习
3、升级nvidia-docker容器GPU引擎
Ubuntu默认安装docker.io
的Docker版本,并非最新版本。这里直接安装最新版本,查看 更多信息。
安装nvidia-docker2软件,如下:
# 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
4、设置Docker运行配置参数
首先,检查每一个节点,启用 nvidia runtime为缺省的容器运行时。我们将编辑docker daemon config文件,位于/etc/docker/daemon.json
{ "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无法成功启动(参考 https://my.oschina.net/u/2306127/blog/1628082)。
如果
runtimes
没有, 到nvidia-docker 参考,首先进行安装。
第二步,启用 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
5、升级Kubernetes GPU add-on
- 参考:
- 完整安装过程,Kubernetes安装GPU支持插件
- GPU for K8s加载项,https://github.com/NVIDIA/k8s-device-plugin
完成所有的GPU节点的选项启用,然后就可以在在Kubernetes中启用GPU支持,通过安装Nvidia提供的Daemonset服务来实现,方法如下:
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.12/nvidia-device-plugin.yml
- 注意:这里的版本号v1.11,访问https://github.com/NVIDIA/k8s-device-plugin获得最新版本。
6、运行 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创建。
完毕。
更多参考:
- 关于AMD GPU的Kubernetes加载项:https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/