预编译驱动容器#

关于预编译驱动容器#

使用预编译驱动程序的容器不需要互联网访问即可下载 Linux 内核头文件、GCC 编译器工具或操作系统软件包。

使用预编译驱动程序还可以避免传统驱动容器编译内核驱动程序时所需的计算需求突增。

这两个优点对大多数站点都很有价值,但对于互联网访问受限或资源受限的硬件站点尤其有益。

局限性和限制#

  • 支持使用预编译驱动程序部署驱动程序容器的功能仅限于使用 Ubuntu 22.04 操作系统和 x86_64 架构的主机。

    有关在 OpenShift Container Platform 中使用预编译驱动程序的信息,请参阅 NVIDIA GPU Operator for RHCOS 的预编译驱动程序

  • NVIDIA 支持最新发布的长期服务分支 (LTSB) 驱动程序分支的预编译驱动容器。

  • NVIDIA 为 awsazuregenericnvidiaoracle 内核变体构建镜像。如果您的主机运行不同的内核变体,您可以构建预编译驱动程序镜像并使用您自己的容器注册表。

  • 预编译驱动容器不支持 NVIDIA vGPU 或 GPUDirect Storage (GDS)。

确定预编译驱动容器是否可用#

预编译驱动容器根据以下模式命名

<驱动程序分支>-<linux-内核版本>-<操作系统标签>

例如,525-5.15.0-69-generic-ubuntu22.04

使用以下方法之一检查您的 Linux 内核和驱动程序分支是否有可用的驱动程序容器

  • 使用 Web 浏览器访问 NVIDIA GPU Cloud 注册表的 NVIDIA GPU 驱动程序页面:https://catalog.ngc.nvidia.com/orgs/nvidia/containers/driver/tags。使用搜索字段按您的操作系统版本过滤标签。

  • 使用 NGC CLI 工具列出驱动程序容器的标签

    $ ngc registry image info nvidia/driver
    

    示例输出

    Image Repository Information
      Name: driver
      Display Name: NVIDIA GPU Driver
      Short Description: Provision NVIDIA GPU Driver as a Container.
      Built By: NVIDIA
      Publisher: NVIDIA
      Multinode Support: False
      Multi-Arch Support: True
      Logo: https://assets.nvidiagrid.net/ngc/logos/Infrastructure.png
      Labels: Multi-Arch, NVIDIA AI Enterprise Supported, Infrastructure Software, Kubernetes Infrastructure
      Public: Yes
      Last Updated: Apr 20, 2023
      Latest Image Size: 688.87 MB
      Latest Tag: 525-5.15.0-69-generic-ubuntu22.04
      Tags:
          525-5.15.0-69-generic-ubuntu22.04
          525-5.15.0-70-generic-ubuntu22.04
          ...
    

在安装期间启用预编译驱动容器支持#

请参阅使用 Helm 安装 Operator 的通用说明:安装 NVIDIA GPU Operator。指定 --set driver.usePrecompiled=true--set driver.version=<driver-branch> 参数,如下面的示例命令所示

$ helm install --wait gpu-operator \
     -n gpu-operator --create-namespace \
     nvidia/gpu-operator \
     --version=v24.9.2 \
     --set driver.usePrecompiled=true \
     --set driver.version="<driver-branch>"

<driver-branch> 指定类似 525 的值。有关其他安装选项的信息,请参阅 常用 Chart 自定义选项

在安装后启用支持#

执行以下步骤启用对预编译驱动容器的支持

  1. 通过修改集群策略启用支持

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy --type='json' \
       -p='[
         {"op":"replace", "path":"/spec/driver/usePrecompiled", "value":true},
         {"op":"replace", "path":"/spec/driver/version", "value":"<driver-branch>"}
       ]'
    

    <driver-branch> 指定类似 525 的值。

    示例输出

    clusterpolicy.nvidia.com/cluster-policy patched
    
  2. 可选:确认驱动程序 DaemonSet Pod 终止

    $ kubectl get pods -n gpu-operator
    

    示例输出

    NAME                                                              READY   STATUS        RESTARTS   AGE
    pod/gpu-feature-discovery-pzzr8                                   2/2     Running       0          19m
    pod/gpu-operator-859cb64846-57hfn                                 1/1     Running       0          47m
    pod/gpu-operator-node-feature-discovery-master-6d6649d597-7l8bj   1/1     Running       0          10d
    pod/gpu-operator-node-feature-discovery-worker-v86vj              1/1     Running       0          10d
    pod/nvidia-container-toolkit-daemonset-6ltbv                      1/1     Running       0          19m
    pod/nvidia-cuda-validator-62w6r                                   0/1     Completed     0          17m
    pod/nvidia-dcgm-exporter-fh5wz                                    1/1     Running       0          19m
    pod/nvidia-device-plugin-daemonset-rwslh                          2/2     Running       0          19m
    pod/nvidia-device-plugin-validator-gq4ww                          0/1     Completed     0          17m
    pod/nvidia-driver-daemonset-xqrxk                                 1/1     Terminating   0          20m
    pod/nvidia-operator-validator-78mzv                               1/1     Running       0          19m
    
  3. 确认驱动程序容器 Pod 正在运行

    $ kubectl get pods -l app=nvidia-driver-daemonset -n gpu-operator
    

    示例输出

    NAME                                                          READY   STATUS    RESTARTS   AGE
    nvidia-driver-daemonset-5.15.0-69-generic-ubuntu22.04-thbts   1/1     Running   0          44s
    

    确保 Pod 名称包含类似 5.15.0-69-generic 的 Linux 内核语义版本号。

禁用对预编译驱动容器的支持#

执行以下步骤禁用对预编译驱动容器的支持

  1. 通过修改集群策略禁用支持

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy --type='json' \
        -p='[
          {"op": "replace", "path": "/spec/driver/usePrecompiled", "value":false},
          {"op": "replace", "path": "/spec/driver/version", "value":"550.90.07"},
        ]'
    

    示例输出

    clusterpolicy.nvidia.com/cluster-policy patched
    
  2. 确认传统驱动容器 Pod 正在运行

    $ kubectl get pods -l app=nvidia-driver-daemonset -n gpu-operator
    

    示例输出

    NAME                            READY   STATUS    RESTARTS   AGE
    nvidia-driver-daemonset-qwprp   1/1     Running   0          10m
    

    确保 Pod 名称不包含 Linux 内核语义版本号。

构建自定义驱动容器镜像#

如果您的 Linux 内核变体没有可用的预编译驱动容器,您可以执行以下步骤来构建和运行容器镜像。

注意

NVIDIA 对自定义驱动程序容器镜像提供有限的支持。

先决条件

  • 您可以访问私有容器注册表,例如 NVIDIA NGC Private Registry,并且可以将容器镜像推送到该注册表。

  • 您的构建机器可以访问互联网以下载操作系统软件包。

  • 您知道要使用的 CUDA 版本,例如 12.1.0。CUDA 版本仅指定用于构建驱动程序容器的基础镜像。此版本与结果驱动程序容器关联或支持的 CUDA 版本没有任何关联。

    查找您的操作系统支持的 CUDA 版本的一种方法是访问 NVIDIA GPU Cloud 注册表:https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda/tags 并查看标签。使用搜索字段过滤标签,例如 base-ubuntu22.04。过滤后的结果显示 CUDA 版本,例如 12.1.012.0.112.0.0 等。

  • 您知道要使用的 GPU 驱动程序分支,例如 525

步骤

  1. 克隆驱动程序容器存储库并将目录更改到该存储库

    $ git clone https://gitlab.com/nvidia/container-images/driver
    
    $ cd driver
    
  2. 将目录更改到驱动程序目录下的操作系统名称和版本

    $ cd ubuntu22.04/precompiled
    
  3. 设置用于构建驱动程序容器镜像的环境变量。

    • 指定您的私有注册表 URL

      $ export PRIVATE_REGISTRY=<private-registry-url>
      
    • 指定与您的内核变体匹配的 KERNEL_VERSION 环境变量,例如 5.15.0-1033-aws

      $ export KERNEL_VERSION=5.15.0-1033-aws
      
    • 指定构建驱动程序容器时要使用的 CUDA 基础镜像的版本

      $ export CUDA_VERSION=12.1.0
      
    • 指定驱动程序分支,例如 525

      $ export DRIVER_BRANCH=525
      
    • 指定 OS_TAG 环境变量以标识访客操作系统名称和版本

      $ export OS_TAG=ubuntu22.04
      

      该值必须与访客操作系统版本匹配。

  4. 构建驱动程序容器镜像

    $ sudo docker build \
        --build-arg KERNEL_VERSION=$KERNEL_VERSION \
        --build-arg CUDA_VERSION=$CUDA_VERSION \
        --build-arg DRIVER_BRANCH=$DRIVER_BRANCH \
        -t ${PRIVATE_REGISTRY}/driver:${DRIVER_BRANCH}-${KERNEL_VERSION}-${OS_TAG} .
    
  5. 将驱动程序容器镜像推送到您的私有注册表。

    • 登录到您的私有注册表

      $ sudo docker login ${PRIVATE_REGISTRY} --username=<username>
      

      出现提示时输入您的密码。

    • 将驱动程序容器镜像推送到您的私有注册表

      $ sudo docker push ${PRIVATE_REGISTRY}/driver:${DRIVER_BRANCH}-${KERNEL_VERSION}-${OS_TAG}
      

下一步

  • 要使用自定义驱动程序容器镜像,请按照在安装期间或之后启用支持的步骤进行操作。

    如果您尚未安装 GPU Operator,除了 Helm 的 --set driver.usePrecompiled=true--set driver.version=${DRIVER_BRANCH} 参数之外,还需指定 --set driver.repository="$PRIVATE_REGISTRY" 参数。

    如果容器注册表不是公共的,您需要在 GPU Operator 命名空间中创建一个镜像拉取密钥,并在 --set driver.imagePullSecrets=<pull-secret> 参数中指定它。

    如果您已经安装了 GPU Operator,请在集群策略中为驱动程序指定私有注册表

    $ kubectl patch clusterpolicies.nvidia.com/cluster-policy --type='json' \
        -p='[{"op": "replace", "path": "/spec/driver/repository", "value":"$PRIVATE_REGISTRY"}]'