Tim Wang Tech Blog

如何在基于 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中的使用受到限制,在虚拟桌面基础设施中使用较多。

Fig3. https://blogs.vmware.com/apps/2018/09/using-gpus-with-virtual-machines-on-vsphere-part-3-installing-the-nvidia-grid-technology.html

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类型越来越多,这可能是一个巨大的优势。