×

关于在 OpenShift Virtualization 中使用虚拟 GPU

某些图形处理器 (GPU) 卡支持创建虚拟 GPU (vGPU)。如果管理员在HyperConverged自定义资源 (CR) 中提供配置详细信息,OpenShift Virtualization 可以自动创建 vGPU 和其他受管设备。对于大型集群,这种自动化尤其有用。

有关功能和支持详细信息,请参阅您的硬件供应商的文档。

受管设备

一个物理设备,可以将其划分为一个或多个虚拟设备。vGPU 是一种受管设备 (mdev);物理 GPU 的性能在虚拟设备之间分配。您可以将受管设备分配给一个或多个虚拟机 (VM),但虚拟机的数量必须与您的 GPU 兼容。有些 GPU 不支持多个虚拟机。

为受管设备准备主机

在配置受管设备之前,必须启用输入/输出内存管理单元 (IOMMU) 驱动程序。

添加内核参数以启用 IOMMU 驱动程序

要在内核中启用 IOMMU 驱动程序,请创建MachineConfig对象并添加内核参数。

先决条件
  • 您拥有集群管理员权限。

  • 您的 CPU 硬件是 Intel 或 AMD。

  • 您已在 BIOS 中启用了英特尔虚拟化技术 (Intel VT-d) 或 AMD IOMMU。

步骤
  1. 创建一个MachineConfig对象来标识内核参数。以下示例显示了 Intel CPU 的内核参数。

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker (1)
      name: 100-worker-iommu (2)
    spec:
      config:
        ignition:
          version: 3.2.0
      kernelArguments:
          - intel_iommu=on (3)
    # ...
    1 仅将新的内核参数应用于工作节点。
    2 name指示此内核参数在机器配置中的排名 (100) 及其用途。如果您的 CPU 是 AMD,请将内核参数指定为amd_iommu=on
    3 为 Intel CPU 将内核参数标识为intel_iommu
  2. 创建新的MachineConfig对象

    $ oc create -f 100-worker-kernel-arg-iommu.yaml
验证
  • 验证是否已添加新的MachineConfig对象。

    $ oc get MachineConfig

配置 NVIDIA GPU 运算符

您可以使用 NVIDIA GPU 运算符来配置工作节点,以便在 OpenShift Virtualization 中运行支持 GPU 加速的虚拟机 (VM)。

NVIDIA GPU 运算符仅受 NVIDIA 支持。有关更多信息,请参阅 Red Hat 知识库中的从 NVIDIA 获取支持

关于使用 NVIDIA GPU 运算符

您可以将 NVIDIA GPU 运算符与 OpenShift Virtualization 配合使用,以快速配置运行支持 GPU 的虚拟机 (VM) 的工作节点。NVIDIA GPU 运算符管理 OpenShift Container Platform 集群中的 NVIDIA GPU 资源,并自动化在为 GPU 工作负载准备节点时所需的任务。

在将应用程序工作负载部署到 GPU 资源之前,必须安装一些组件,例如启用计算统一设备架构 (CUDA)、Kubernetes 设备插件、容器运行时和其他功能(例如自动节点标记和监控)的 NVIDIA 驱动程序。通过自动化这些任务,您可以快速扩展基础设施的 GPU 容量。NVIDIA GPU 运算符尤其可以促进复杂人工智能和机器学习 (AI/ML) 工作负载的配置。

配置受管设备的选项

使用 NVIDIA GPU 运算符时,有两种可用的配置受管设备的方法。Red Hat 测试的方法使用 OpenShift Virtualization 功能来调度受管设备,而 NVIDIA 方法仅使用 GPU 运算符。

使用 NVIDIA GPU 运算符配置受管设备

此方法专门使用 NVIDIA GPU 运算符来配置受管设备。要使用此方法,请参阅 NVIDIA 文档中的NVIDIA GPU 运算符与 OpenShift Virtualization

使用 OpenShift Virtualization 配置受管设备

此方法(经 Red Hat 测试)使用 OpenShift Virtualization 的功能来配置受管设备。在这种情况下,NVIDIA GPU 运算符仅用于使用 NVIDIA vGPU Manager 安装驱动程序。GPU 运算符不配置受管设备。

使用 OpenShift Virtualization 方法时,您仍然需要按照NVIDIA 文档配置 GPU 运算符。但是,此方法与 NVIDIA 文档的不同之处在于:

  • 您不得覆盖HyperConverged自定义资源 (CR) 中的默认disableMDEVConfiguration: false设置。

    NVIDIA 文档中所述,设置此功能标志会阻止 OpenShift Virtualization 配置受管设备。

  • 您必须配置您的ClusterPolicy清单,使其与以下示例匹配:

    示例清单
    kind: ClusterPolicy
    apiVersion: nvidia.com/v1
    metadata:
      name: gpu-cluster-policy
    spec:
      operator:
        defaultRuntime: crio
        use_ocp_driver_toolkit: true
        initContainer: {}
      sandboxWorkloads:
        enabled: true
        defaultWorkload: vm-vgpu
      driver:
        enabled: false (1)
      dcgmExporter: {}
      dcgm:
        enabled: true
      daemonsets: {}
      devicePlugin: {}
      gfd: {}
      migManager:
        enabled: true
      nodeStatusExporter:
        enabled: true
      mig:
        strategy: single
      toolkit:
        enabled: true
      validator:
        plugin:
          env:
            - name: WITH_WORKLOAD
              value: "true"
      vgpuManager:
        enabled: true (2)
        repository: <vgpu_container_registry> (3)
        image: <vgpu_image_name>
        version: nvidia-vgpu-manager
      vgpuDeviceManager:
        enabled: false (4)
        config:
          name: vgpu-devices-config
          default: default
      sandboxDevicePlugin:
        enabled: false (5)
      vfioManager:
        enabled: false (6)
    1 将此值设置为false。虚拟机不需要。
    2 将此值设置为true。需要与虚拟机一起使用 vGPU。
    3 用您的注册表值替换<vgpu_container_registry>
    4 将此值设置为false,以允许 OpenShift Virtualization 配置受管设备而不是 NVIDIA GPU 运算符。
    5 将此值设置为false,以防止将 vGPU 设备发现并宣传到 kubelet。
    6 将此值设置为false可阻止加载vfio-pci驱动程序。请改用OpenShift虚拟化文档中介绍的方法配置PCI直通。
其他资源

vGPU如何在节点之间分配

对于每个物理设备,OpenShift虚拟化都会配置以下值:

  • 单个mdev类型。

  • 所选mdev类型的最大实例数。

集群架构会影响设备的创建和分配方式。

大型集群,每个节点有多个卡

在具有多个支持相似vGPU类型的卡的节点上,相关设备类型将以循环方式创建。例如:

# ...
mediatedDevicesConfiguration:
  mediatedDeviceTypes:
  - nvidia-222
  - nvidia-228
  - nvidia-105
  - nvidia-108
# ...

在此场景中,每个节点有两个卡,两者都支持以下vGPU类型:

nvidia-105
# ...
nvidia-108
nvidia-217
nvidia-299
# ...

在每个节点上,OpenShift虚拟化都会创建以下vGPU:

  • 第一张卡上16个nvidia-105类型的vGPU。

  • 第二张卡上2个nvidia-108类型的vGPU。

一个节点只有一张卡,支持多个请求的vGPU类型

OpenShift虚拟化使用mediatedDeviceTypes列表中首先出现的支持类型。

例如,一个节点上的卡支持nvidia-223nvidia-224。配置了以下mediatedDeviceTypes列表:

# ...
mediatedDevicesConfiguration:
  mediatedDeviceTypes:
  - nvidia-22
  - nvidia-223
  - nvidia-224
# ...

在此示例中,OpenShift虚拟化使用nvidia-223类型。

管理中介设备

在将中介设备分配给虚拟机之前,必须先创建这些设备并将其公开给集群。您还可以重新配置和删除中介设备。

创建和公开中介设备

作为管理员,您可以通过编辑HyperConverged自定义资源(CR)来创建中介设备并将其公开给集群。

先决条件
  • 您已启用输入/输出内存管理单元(IOMMU)驱动程序。

  • 如果您的硬件供应商提供驱动程序,则您已将其安装在要创建中介设备的节点上。

步骤
  1. 通过运行以下命令在默认编辑器中打开HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
    配置了中介设备的示例配置文件
    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      mediatedDevicesConfiguration:
        mediatedDeviceTypes:
        - nvidia-231
        nodeMediatedDeviceTypes:
        - mediatedDeviceTypes:
          - nvidia-233
          nodeSelector:
            kubernetes.io/hostname: node-11.redhat.com
      permittedHostDevices:
        mediatedDevices:
        - mdevNameSelector: GRID T4-2Q
          resourceName: nvidia.com/GRID_T4-2Q
        - mdevNameSelector: GRID T4-8Q
          resourceName: nvidia.com/GRID_T4-8Q
    # ...
  2. 通过将中介设备添加到spec.mediatedDevicesConfiguration部分来创建它们。

    YAML代码片段示例
    # ...
    spec:
      mediatedDevicesConfiguration:
        mediatedDeviceTypes: (1)
        - <device_type>
        nodeMediatedDeviceTypes: (2)
        - mediatedDeviceTypes: (3)
          - <device_type>
          nodeSelector: (4)
            <node_selector_key>: <node_selector_value>
    # ...
    1 必需:配置集群的全局设置。
    2 可选:覆盖特定节点或节点组的全局配置。必须与全局mediatedDeviceTypes配置一起使用。
    3 如果使用nodeMediatedDeviceTypes,则为必需。覆盖指定节点的全局mediatedDeviceTypes配置。
    4 如果使用nodeMediatedDeviceTypes,则为必需。必须包含键:值对。

    在OpenShift Virtualization 4.14之前,mediatedDeviceTypes字段名为mediatedDevicesTypes。配置中介设备时,请确保使用正确的字段名称。

  3. 确定要公开给集群的设备的名称选择器和资源名称值。您将在下一步中将这些值添加到HyperConverged CR。

    1. 通过运行以下命令查找resourceName值:

      $ oc get $NODE -o json \
        | jq '.status.allocatable \
          | with_entries(select(.key | startswith("nvidia.com/"))) \
          | with_entries(select(.value != "0"))'
    2. 通过查看/sys/bus/pci/devices/::./mdev_supported_types//name的内容来查找mdevNameSelector值,将正确的系统值替换为您的系统。

      例如,nvidia-231类型的名称文件包含选择器字符串GRID T4-2Q。使用GRID T4-2Q作为mdevNameSelector值允许节点使用nvidia-231类型。

  4. 通过将mdevNameSelectorresourceName值添加到HyperConverged CR的spec.permittedHostDevices.mediatedDevices部分来将中介设备公开给集群。

    YAML代码片段示例
    # ...
      permittedHostDevices:
        mediatedDevices:
        - mdevNameSelector: GRID T4-2Q (1)
          resourceName: nvidia.com/GRID_T4-2Q (2)
    # ...
    1 公开与主机上此值映射的中介设备。
    2 匹配在节点上分配的资源名称。
  5. 保存更改并退出编辑器。

验证
  • 可选:通过运行以下命令确认设备已添加到特定节点:

    $ oc describe node <node_name>

关于更改和删除中介设备

您可以通过多种方式重新配置或删除中介设备:

  • 编辑HyperConverged CR并更改mediatedDeviceTypes部分的内容。

  • 更改与nodeMediatedDeviceTypes节点选择器匹配的节点标签。

  • HyperConverged CR的spec.mediatedDevicesConfigurationspec.permittedHostDevices部分中删除设备信息。

    如果您从spec.permittedHostDevices部分中删除设备信息,而没有从spec.mediatedDevicesConfiguration部分中删除它,则无法在同一节点上创建新的中介设备类型。要正确删除中介设备,请从这两个部分中删除设备信息。

从集群中删除中介设备

要从集群中删除中介设备,请从HyperConverged自定义资源(CR)中删除该设备的信息。

步骤
  1. 通过运行以下命令在默认编辑器中打开HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. HyperConverged CR的spec.mediatedDevicesConfigurationspec.permittedHostDevices部分中删除设备信息。删除这两个条目可确保您以后可以在同一节点上创建新的中介设备类型。例如:

    示例配置文件
    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      mediatedDevicesConfiguration:
        mediatedDeviceTypes: (1)
          - nvidia-231
      permittedHostDevices:
        mediatedDevices: (2)
        - mdevNameSelector: GRID T4-2Q
          resourceName: nvidia.com/GRID_T4-2Q
    1 要删除nvidia-231设备类型,请将其从mediatedDeviceTypes数组中删除。
    2 要删除GRID T4-2Q设备,请删除mdevNameSelector字段及其对应的resourceName字段。
  3. 保存更改并退出编辑器。

使用中介设备

您可以将中介设备分配给一个或多个虚拟机。

使用CLI将vGPU分配给虚拟机

将中介设备(例如虚拟GPU (vGPU))分配给虚拟机 (VM)。

先决条件
  • 中介设备在HyperConverged自定义资源中配置。

  • VM已停止。

步骤
  • 通过编辑VirtualMachine清单的spec.domain.devices.gpus部分,将中介设备分配给虚拟机 (VM)。

    虚拟机清单示例
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    spec:
      domain:
        devices:
          gpus:
          - deviceName: nvidia.com/TU104GL_Tesla_T4 (1)
            name: gpu1 (2)
          - deviceName: nvidia.com/GRID_T4-2Q
            name: gpu2
    1 与中介设备关联的资源名称。
    2 在VM上标识设备的名称。
验证
  • 要验证设备是否可从虚拟机访问,请运行以下命令,将替换为VirtualMachine清单中的deviceName值:

    $ lspci -nnk | grep <device_name>

使用Web控制台将vGPU分配给虚拟机

您可以使用OpenShift Container Platform Web控制台将虚拟GPU分配给虚拟机。

您可以将硬件设备添加到从自定义模板或YAML文件创建的虚拟机。您无法将设备添加到特定操作系统的预提供引导源模板。

先决条件
  • vGPU在您的集群中配置为中介设备。

    • 要查看连接到集群的设备,请点击侧边菜单中的计算硬件设备

  • VM已停止。

步骤
  1. 在OpenShift Container Platform Web控制台中,点击侧边菜单中的虚拟化虚拟机

  2. 选择您要为其分配设备的虚拟机。

  3. 详细信息选项卡上,单击GPU 设备

  4. 单击添加 GPU 设备

  5. 名称字段中输入一个标识值。

  6. 设备名称列表中,选择要添加到虚拟机的设备。

  7. 单击保存

验证
  • 要确认设备已添加到虚拟机,请单击YAML选项卡并查看VirtualMachine配置。已调解的设备会添加到spec.domain.devices段落中。