在 OpenShift 上安装 NVIDIA GPU Operator#

使用 Web 控制台安装 NVIDIA GPU Operator#

  1. 在 OpenShift 容器平台 Web 控制台中,从侧边菜单导航到Operators > OperatorHub,然后选择所有项目

  2. Operators > OperatorHub 中,搜索 NVIDIA GPU Operator。 有关更多信息,请参阅Red Hat OpenShift 容器平台文档

  3. 选择 NVIDIA GPU Operator,单击安装。 在后续屏幕中,单击安装

注意

在这里,您可以选择要部署 GPU Operator 的命名空间。 建议使用的命名空间是 nvidia-gpu-operator。 您可以选择任何现有命名空间或在选择命名空间下创建一个新命名空间。

如果您安装到 nvidia-gpu-operator 之外的任何其他命名空间,则 GPU Operator 将不会自动启用命名空间监控,并且 Prometheus 将不会收集指标和警报。 如果此命名空间中仅安装了受信任的 Operator,您可以手动启用命名空间监控,命令如下:

$ oc label ns/$NAMESPACE_NAME openshift.io/cluster-monitoring=true

继续为 NVIDIA GPU Operator 创建集群策略

使用 CLI 安装 NVIDIA GPU Operator#

作为集群管理员,您可以使用 OpenShift CLI (oc) 安装 NVIDIA GPU Operator

  1. NVIDIA GPU Operator 创建命名空间。

    1. 创建以下 Namespace 自定义资源 (CR),该资源定义了 nvidia-gpu-operator 命名空间,然后将 YAML 保存在 nvidia-gpu-operator.yaml 文件中

      apiVersion: v1
      kind: Namespace
      metadata:
        name: nvidia-gpu-operator
      

      注意

      建议使用的命名空间是 nvidia-gpu-operator。 您可以选择任何现有命名空间或创建新的命名空间名称。 如果您安装到 nvidia-gpu-operator 之外的任何其他命名空间,则 GPU Operator 将不会自动启用命名空间监控,并且 Prometheus 将不会收集指标和警报。

      如果此命名空间中仅安装了受信任的 Operator,您可以手动启用命名空间监控,命令如下:

      $ oc label ns/$NAMESPACE_NAME openshift.io/cluster-monitoring=true
      
    2. 通过运行以下命令创建命名空间

      $ oc create -f nvidia-gpu-operator.yaml
      
      namespace/nvidia-gpu-operator created
      
  2. 通过创建以下对象,在您在上一步中创建的命名空间中安装 NVIDIA GPU Operator

    1. 创建以下 OperatorGroup CR,并将 YAML 保存在 nvidia-gpu-operatorgroup.yaml 文件中

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: nvidia-gpu-operator-group
        namespace: nvidia-gpu-operator
      spec:
       targetNamespaces:
       - nvidia-gpu-operator
      
    2. 通过运行以下命令创建 OperatorGroup CR

      $ oc create -f nvidia-gpu-operatorgroup.yaml
      
      operatorgroup.operators.coreos.com/nvidia-gpu-operator-group created
      
  3. 运行以下命令以获取步骤 5 所需的 channel 值。

    $ oc get packagemanifest gpu-operator-certified -n openshift-marketplace -o jsonpath='{.status.defaultChannel}'
    

    示例输出

    v22.9
    
  4. 运行以下命令以获取步骤 5 所需的 startingCSV 值。

    $ CHANNEL=v22.9
    
    $ oc get packagemanifests/gpu-operator-certified -n openshift-marketplace -ojson | jq -r '.status.channels[] | select(.name == "'$CHANNEL'") | .currentCSV'
    

    示例输出

    gpu-operator-certified.v22.9.0
    
  5. 创建以下 Subscription CR,并将 YAML 保存在 nvidia-gpu-sub.yaml 文件中

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: gpu-operator-certified
      namespace: nvidia-gpu-operator
    spec:
      channel: "v22.9"
      installPlanApproval: Manual
      name: gpu-operator-certified
      source: certified-operators
      sourceNamespace: openshift-marketplace
      startingCSV: "gpu-operator-certified.v22.9.0"
    

    注意

    使用步骤 3 和 4 中返回的信息更新 channelstartingCSV 字段。

  6. 通过运行以下命令创建订阅对象

    $ oc create -f nvidia-gpu-sub.yaml
    
    subscription.operators.coreos.com/gpu-operator-certified created
    
  7. 可选:登录到 Web 控制台并导航到 Operators > Installed Operators 页面。 在 Project: nvidia-gpu-operator 中,将显示以下内容

    _images/gpu-operator-certified-cli-install.png
  8. 验证是否已创建安装计划

    $ oc get installplan -n nvidia-gpu-operator
    

    示例输出

    NAME            CSV                              APPROVAL   APPROVED
    install-wwhfj   gpu-operator-certified.v22.9.0   Manual     false
    
  9. 使用 CLI 命令批准安装计划

    $ INSTALL_PLAN=$(oc get installplan -n nvidia-gpu-operator -oname)
    
    $ oc patch $INSTALL_PLAN -n nvidia-gpu-operator --type merge --patch '{"spec":{"approved":true }}'
    

    示例输出

    installplan.operators.coreos.com/install-wwhfj patched
    
  10. 或者,单击 Upgrade available 并使用 Web 控制台批准计划

    _images/gpu-operator-certified-cli-install.png
  11. 可选:在 Web 控制台中验证安装是否成功。 显示更改为

    _images/cluster_policy_suceed.png

创建 ClusterPolicy 实例#

当您在 OpenShift 容器平台中安装 NVIDIA GPU Operator 时,将创建一个 ClusterPolicy 的自定义资源定义。 ClusterPolicy 配置 GPU 堆栈,配置镜像名称和仓库、Pod 限制/凭据等。

注意

如果您创建一个包含空规范的 ClusterPolicy,例如 spec{},则 ClusterPolicy 部署将失败。

作为集群管理员,您可以使用 OpenShift 容器平台 CLI 或 Web 控制台创建 ClusterPolicy。 此外,当使用 NVIDIA vGPU 时,这些步骤有所不同。 请参阅下面的相应部分。

使用 Web 控制台创建集群策略#

  1. 在 OpenShift 容器平台 Web 控制台中,从侧边菜单中选择 Operators > Installed Operators,然后单击 NVIDIA GPU Operator

  2. 选择 ClusterPolicy 选项卡,然后单击创建 ClusterPolicy。 平台分配默认名称 *gpu-cluster-policy*。

    注意

    您可以使用此屏幕自定义 ClusterPolicy,但是默认设置足以配置和运行 GPU。

  3. 单击创建

    此时,GPU Operator 继续并安装所有必需的组件,以在 OpenShift 4 集群中设置 NVIDIA GPU。 至少等待 10-20 分钟,然后再深入研究任何形式的故障排除,因为这可能需要一段时间才能完成。

  4. 当安装成功时,新部署的 ClusterPolicy *gpu-cluster-policy* 的状态更改为 State:ready

_images/cluster-policy-state-ready.png

使用 CLI 创建集群策略#

  1. 创建 ClusterPolicy

    $ oc get csv -n nvidia-gpu-operator gpu-operator-certified.v22.9.0 -ojsonpath={.metadata.annotations.alm-examples} | jq .[0] > clusterpolicy.json
    
    $ oc apply -f clusterpolicy.json
    
    clusterpolicy.nvidia.com/gpu-cluster-policy created
    

使用 NVIDIA vGPU 创建 ClusterPolicy 实例#

先决条件#

  • 请参阅 使用 NVIDIA vGPU 部分,了解有关在 RedHat OpenShift 上使用 NVIDIA vGPU 的先决条件步骤。

使用 Web 控制台创建集群策略#

  1. 在 OpenShift 容器平台 Web 控制台中,从侧边菜单中选择 Operators > Installed Operators,然后单击 NVIDIA GPU Operator

  2. 选择 ClusterPolicy 选项卡,然后单击创建 ClusterPolicy。 平台分配默认名称 *gpu-cluster-policy*。

  3. 驱动程序部分下提供许可 ConfigMap 的名称,这应在上面 NVIDIA vGPU 的先决条件步骤中创建。 有关示例,请参阅以下屏幕截图,并相应地修改值。

_images/cluster_policy_vgpu_1.png
  1. 驱动程序部分下指定 repository 路径、image 名称和捆绑的 NVIDIA vGPU 驱动程序 version。 如果注册表不是公共的,请在驱动程序高级配置部分下指定先决条件步骤中创建的 imagePullSecret

_images/cluster_policy_vgpu_2.png
  1. 单击创建

    此时,GPU Operator 继续并安装所有必需的组件,以在 OpenShift 4 集群中设置 NVIDIA GPU。 至少等待 10-20 分钟,然后再深入研究任何形式的故障排除,因为这可能需要一段时间才能完成。

  2. 当安装成功时,新部署的 ClusterPolicy *gpu-cluster-policy* 的状态更改为 State:ready

_images/cluster-policy-state-ready.png

使用 CLI 创建集群策略#

  1. 创建 ClusterPolicy

    $ oc get csv -n nvidia-gpu-operator gpu-operator-certified.v22.9.0 -ojsonpath={.metadata.annotations.alm-examples} | jq .[0] > clusterpolicy.json
    

    修改 clusterpolicy.json 文件以指定在先决条件步骤中创建的 driver.licensingConfigdriver.repositorydriver.imagedriver.versiondriver.imagePullSecrets。 下面的代码段显示了一个示例,请根据需要更改值。

    "driver": {
         "repository": "<repository-path>"
         "image": "driver",
         "imagePullSecrets": [],
         "licensingConfig": {
           "configMapName": "licensing-config",
           "nlsEnabled": true
         }
         "version": "470.82.01"
    }
    
    $ oc apply -f clusterpolicy.json
    
    clusterpolicy.nvidia.com/gpu-cluster-policy created
    

验证 NVIDIA GPU Operator 是否成功安装#

验证 NVIDIA GPU Operator 是否成功安装,如此处所示

  1. 运行以下命令以查看这些新的 Pod 和 DaemonSet

    $ oc get pods,daemonset -n nvidia-gpu-operator
    
    NAME                                                      READY   STATUS      RESTARTS   AGE
    pod/gpu-feature-discovery-c2rfm                           1/1     Running     0          6m28s
    pod/gpu-operator-84b7f5bcb9-vqds7                         1/1     Running     0          39m
    pod/nvidia-container-toolkit-daemonset-pgcrf              1/1     Running     0          6m28s
    pod/nvidia-cuda-validator-p8gv2                           0/1     Completed   0          99s
    pod/nvidia-dcgm-exporter-kv6k8                            1/1     Running     0          6m28s
    pod/nvidia-dcgm-tpsps                                     1/1     Running     0          6m28s
    pod/nvidia-device-plugin-daemonset-gbn55                  1/1     Running     0          6m28s
    pod/nvidia-device-plugin-validator-z7ltr                  0/1     Completed   0          82s
    pod/nvidia-driver-daemonset-410.84.202203290245-0-xxgdv   2/2     Running     0          6m28s
    pod/nvidia-node-status-exporter-snmsm                     1/1     Running     0          6m28s
    pod/nvidia-operator-validator-6pfk6                       1/1     Running     0          6m28s
    
    NAME                                                           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                                                                                                         AGE
    daemonset.apps/gpu-feature-discovery                           1         1         1       1            1           nvidia.com/gpu.deploy.gpu-feature-discovery=true                                                                      6m28s
    daemonset.apps/nvidia-container-toolkit-daemonset              1         1         1       1            1           nvidia.com/gpu.deploy.container-toolkit=true                                                                          6m28s
    daemonset.apps/nvidia-dcgm                                     1         1         1       1            1           nvidia.com/gpu.deploy.dcgm=true                                                                                       6m28s
    daemonset.apps/nvidia-dcgm-exporter                            1         1         1       1            1           nvidia.com/gpu.deploy.dcgm-exporter=true                                                                              6m28s
    daemonset.apps/nvidia-device-plugin-daemonset                  1         1         1       1            1           nvidia.com/gpu.deploy.device-plugin=true                                                                              6m28s
    daemonset.apps/nvidia-driver-daemonset-410.84.202203290245-0   1         1         1       1            1           feature.node.kubernetes.io/system-os_release.OSTREE_VERSION=410.84.202203290245-0,nvidia.com/gpu.deploy.driver=true   6m28s
    daemonset.apps/nvidia-mig-manager                              0         0         0       0            0           nvidia.com/gpu.deploy.mig-manager=true                                                                                6m28s
    daemonset.apps/nvidia-node-status-exporter                     1         1         1       1            1           nvidia.com/gpu.deploy.node-status-exporter=true                                                                       6m29s
    daemonset.apps/nvidia-operator-validator                       1         1         1       1            1           nvidia.com/gpu.deploy.operator-validator=true                                                                         6m28s
    

    nvidia-driver-daemonset Pod 在每个包含受支持 NVIDIA GPU 的工作节点上运行。

    注意

    当驱动程序工具包处于活动状态时,DaemonSet 被命名为 nvidia-driver-daemonset-<RHCOS-version>。 其中 RHCOS-version 等于 <OCP XY>.<RHEL XY>.<related date YYYYMMDDHHSS-0DaemonSet 的 Pod 被命名为 nvidia-driver-daemonset-<RHCOS-version>-<UUID>

集群监控#

GPU Operator 生成 GPU 性能指标 (DCGM-export)、状态指标 (node-status-exporter) 和节点状态警报。 为了使 OpenShift Prometheus 收集这些指标,托管 GPU Operator 的命名空间必须具有标签 openshift.io/cluster-monitoring=true

当 GPU Operator 安装在建议的 nvidia-gpu-operator 命名空间中时,如果未定义 openshift.io/cluster-monitoring 标签,则 GPU Operator 会自动启用监控。 如果定义了标签,则 GPU Operator 将不会更改其值。

通过设置 openshift.io/cluster-monitoring=false 来禁用 nvidia-gpu-operator 命名空间中的集群监控,如下所示

$ oc label ns/nvidia-gpu-operator openshift.io/cluster-monitoring=false

如果 GPU Operator 未安装在建议的命名空间中,则 GPU Operator 将不会自动启用监控。 如下所示手动设置标签

$ oc label ns/$NAMESPACE openshift.io/cluster-monitoring=true

注意

仅当在此命名空间中安装了受信任的 Operator 时才执行此操作。

日志记录#

nvidia-driver-daemonset Pod 有两个容器。

  1. 运行以下命令以检查与 nvidia-driver-ctr 关联的日志

    注意

    此日志显示主容器正在等待驱动程序二进制文件,并将其加载到内存中。

    $ oc logs -f nvidia-driver-daemonset-410.84.202203290245-0-xxgdv -n nvidia-gpu-operator -c nvidia-driver-ctr
    
  2. 运行以下命令以检查与 openshift-driver-toolkit-ctr 关联的日志

    注意

    此日志显示正在构建驱动程序。

    $ oc logs -f nvidia-driver-daemonset-410.84.202203290245-0-xxgdv -n nvidia-gpu-operator -c openshift-driver-toolkit-ctr
    

运行示例 GPU 应用程序#

运行一个简单的 CUDA VectorAdd 示例,该示例将两个向量相加在一起,以确保 GPU 已正确引导。

  1. 运行以下命令

    $ cat << EOF | oc create -f -
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: cuda-vectoradd
    spec:
     restartPolicy: OnFailure
     containers:
     - name: cuda-vectoradd
       image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0-ubi8"
       resources:
         limits:
           nvidia.com/gpu: 1
    EOF
    
    pod/cuda-vectoradd created
    
  2. 检查容器的日志

    $ oc logs cuda-vectoradd
    
    [Vector addition of 50000 elements]
    Copy input data from the host memory to the CUDA device
    CUDA kernel launch with 196 blocks of 256 threads
    Copy output data from the CUDA device to the host memory
    Test PASSED
    Done
    

获取有关 GPU 的信息#

nvidia-smi 显示内存使用情况、GPU 利用率和 GPU 的温度。 通过在 Pod 中运行流行的 nvidia-smi 命令来测试 GPU 访问。

要查看 GPU 利用率,请从 GPU Operator DaemonSet 中的 Pod 运行 nvidia-smi

  1. 切换到 nvidia-gpu-operator 项目

    $ oc project nvidia-gpu-operator
    
  2. 运行以下命令以查看这些新的 Pod

    $ oc get pod -owide -lopenshift.driver-toolkit=true
    
    NAME                                                  READY   STATUS    RESTARTS   AGE   IP            NODE                           NOMINATED NODE   READINESS GATES
    nvidia-driver-daemonset-410.84.202203290245-0-xxgdv   2/2     Running   0          23m   10.130.2.18   ip-10-0-143-147.ec2.internal   <none>           <none>
    

    注意

    使用 Pod 和节点名称,在正确的节点上运行 nvidia-smi

  3. 在 Pod 中运行 nvidia-smi 命令

    $ oc exec -it nvidia-driver-daemonset-410.84.202203290245-0-xxgdv -- nvidia-smi
    
    Defaulted container "nvidia-driver-ctr" out of: nvidia-driver-ctr, openshift-driver-toolkit-ctr, k8s-driver-manager (init)
    Mon Apr 11 15:02:23 2022
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 510.47.03    Driver Version: 510.47.03    CUDA Version: 11.6     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
    | N/A   33C    P8    15W /  70W |      0MiB / 15360MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+
    

    生成两个表。 第一个表反映了有关所有可用 GPU 的信息(示例显示了一个 GPU)。 第二个表提供了有关使用 GPU 的进程的详细信息。

    有关描述表内容的更多信息,请参阅 nvidia-smi 的手册页。