如何在基于 Rocky Linux 的 Kubernetes 上安装带有 A100 的 NVIDIA GPU Operator
本文是How to install NVIDIA GPU Operator with A100 on Kubernetes base Rocky linux的中文翻译版本,内容有删减
以前在kubernetes使用NVIDIA GPU非常复杂。为了部署一个简单的容器,我们需要构建驱动程序drivers、容器运行时CRI、设备插件device plugin和监控等基本组件。最近NVIDIA GPU Feature Discovery添加了一些功能,以减少 GPU 配置的麻烦,但系统工程师的需求仍然没有得到满足,因为 NVIDIA 驱动程序和运行时仍然需要手动配置。NVIDIA GPU Feature Discovery 在 Kubernetes 集群中以 DaemonSet 的方式运行,每个节点上都会运行一个 GPU Feature Discovery 容器。该容器使用 NVIDIA Device Plugin 来访问节点上的 GPU 设备,并收集相关属性.
Fig1. https://developer.nvidia.com/blog/nvidia-gpu-operator-simplifying-gpu-management-in-kubernetes
通过使用NVIDIA GPU Operator,可以解决在Kubernetes中使用GPU的复杂配置问题。如果查看NVIDIA博客提供的与NVIDIA GPU Operator相关的内容(图1),可以看到驱动程序、运行时、设备插件和监控都被配置为容器。因此,您不再需要在操作系统中安装NVIDIA驱动程序。
Fig2. https://developer.nvidia.com/blog/nvidia-gpu-operator-simplifying-gpu-management-in-kubernetes/
此外,NVIDIA A100 GPU引入了一项名为MIG的功能。与此同时,GPU过去仅限于一种称为Virtual GPU的功能,以使用类似于Intel CPU的超线程的并行处理功能。这是一种在分片后并行使用GPU内存的功能,为使用此功能需要额外的许可费用,并且由于必须在Hypervisor和Guest OS中安装GPU驱动程序,管理起来也非常困难。基本上,由于内存被分片和使用,导致在机器学习或深度学习中可以训练的模型大小受到限制,因此它在ML/DL中的使用受到限制,在虚拟桌面基础设施中使用较多。
A100 GPU引入的MIG功能在GPU上支持虚拟化,将一个GPU分割为最多7个实例,减少了Hypervisor部分,提供了管理和性能上的收益。然而,基于实例的VRAM碎片化仍然存在,这是GPU架构中无法避免的问题。
Fig4. https://docs.nvidia.com/datacenter/tesla/mig-user-guide/
现在,我将解释如何配置NVIDIA GPU Operator。首先,让我们检查配置NVIDIA GPU Operator的基本要求。
- Kubernetes v1.19+
- NVIDIA GPU Operator v1.9
- Linux distributions
Ubuntu 18.04.z, 20.04.z LTS, Red Hat Enterprise Linux CoreOS (RHCOS) for use with OpenShift 4.8 and 4.9, CentOS 7
安装helm
如果在你的worker节点上没有安装helm,请确保先安装helm。helm安装完成后,添加NVIDIA helm仓库。
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 \
&& chmod 700 get_helm.sh \
&& ./get_helm.sh
$ helm repo add nvidia https://nvidia.github.io/gpu-operator \
&& helm repo update
安装 NVIDIA GPU Operator
一般情况下,我们可以通过以下命令安装GPU Operator。
$ helm install --wait \
-n gpu-operator-resources --create-namespace \
gpu-operator \
nvidia/gpu-operator
但是,如前面所述,我们选择了Rocky Linux和A100 GPU的MIG选项作为基本操作系统,因此我们需要进行更详细的设置。
针对 Rocky Linux的配置
当我们使用helm安装gpu operator时,需要以下额外的设置来使用MIG和Rocky linux。如下面的选项所示,所有版本都是ubi8。ubi代表通用基础镜像,更多信息请参考Redhat官网。关于 GPU operator 的安装选项更多信息可以在NVIDIA GPU Operator中找到。
mig.strategy=mixed
(mixed意味着使用A100 GPU的MIG,或选择single来禁用它。)driver.repository=**homelab.net**/nvcr.io/nvidia
在NGC Catalog中可以查看包含所有的os类型的nvidia gpu驱动程序。当pod启动时,此标签会自动选择,我们可以找到CentOS 8版本,但是找不到Rocky Linux。因此,您需要在使用私有仓库中的镜像。driver.version=450.156.00
根据要使用的CUDA版本,可以选择GPU驱动程序,如果使用版本470,则可以使用根据实例选择而丢弃的额外内存。相关链接可以在NVIDIA MIG手册主页上找到。driver.manager.version=v0.2.0-ubi8
toolkit.version=1.7.2-ubi8
dcgm.version=2.3.1-ubi8
operator.version=v1.9.0-ubi8
operator.initContainer.version=cuda:11.2.1-base-ubi8
validator.version=v1.9.0-ubi8
※你可以通过下面的命令来修改docker镜像的tag。
$ docker pull nvcr.io/nvidia/driver:450.156.00-centos8
$ docker tag \
nvcr.io/nvidia/driver:450.156.00-centos8 \
homelab.net/nvcr.io/nvidia/driver:450.156.00-rocky8
$ docker push homelab.net/nvcr.io/nvidia/driver:450.156.00-rocky8
为A100 MIG and Rocky安装NVIDIA GPU Operator
万事俱发,A100 GPU上的MIG和Rocky Linux已经准备就绪。尝试使用helm重新部署它。
$ helm install --wait \
-n gpu-operator-resources --create-namespace \
--version v1.9.0 \
--set mig.strategy=mixed \
--set driver.repository=homelab.net/nvcr.io/nvidia \
--set driver.version=450.156.00 \
--set driver.manager.version=v0.2.0-ubi8 \
--set toolkit.version=1.7.2-ubi8 \
--set dcgm.version=2.3.1-ubi8 \
--set operator.version=v1.9.0-ubi8 \
--set operator.initContainer.version=cuda:11.2.1-base-ubi8 \
--set validator.version=v1.9.0-ubi8 \
gpu-operator \
nvidia/gpu-operator
别忘记了。如果使用MIG的混合模式,则必须事先设置实例切片的节点标签。使用下面的命令来进行节点标签。
kubectl get node --selector='!node-role.kubernetes.io/master' -o name | xargs -I {} kubectl label {} nvidia.com/mig.config=all-balanced --overwrite
成果
当所有设置都完成后,您可以检查以下设置。
$ kubectl -n gpu-operator-resources get pods
NAME READY STATUS RESTARTS AGEgpu-feature-discovery-28wq6 1/1 Running 0 1hgpu-operator-854d7c5c770lzsxc 1/1 Running 0 1hgpu-operator-node-feature-discovery-master-868f8cb84c-hvp9q 1/1 Running 0 1hgpu-operator-node-feature-discovery-worker-26d46 1/1 Running 0 1hnvidia-container-toolkit-daemonset-2d8xs 1/1 Running 0 1hnvidia-cuda-validator-27fdv 0/1 Completed 0 1hnvidia-dcgm-4lvvf 1/1 Running 0 1hnvidia-dcgm-exporter-28rn7 1/1 Running 0 1hnvidia-device-plugin-daemonset-2gp6q 1/1 Running 0 1hnvidia-driver-daemonset-4bkgg 1/1 Running 0 1hnvidia-mig-manager-2txtt 1/1 Running 0 1hnvidia-operator-validator-2jx7t 1/1 Running 0 1h
现在您已经知道如何配置使用NVIDIA GPU Operator
在kubernetes中部署gpu pod。使用gpu operator可以很容易地在将来更改nvidia驱动程序和cuda驱动程序版本,因为您不必单独配置依赖于操作系统的nvidia驱动程序和容器运行时。随着需要管理的节点和GPU类型越来越多,这可能是一个巨大的优势。