OpenShift 中 NVIDIA GPU 的时间分片#

简介#

最新一代 NVIDIA GPU 提供一种称为多实例 GPU (MIG) 的操作模式。MIG 允许您将一个 GPU 分区为几个较小的、预定义的实例,每个实例看起来都像一个迷你 GPU,在硬件层提供内存和故障隔离。用户可以通过在这些预定义实例之一而不是完整的 GPU 上运行其工作负载来共享对 GPU 的访问。

本文档介绍了一种在 OpenShift 中启用 GPU 时间共享的新机制。它允许集群管理员为 GPU 定义一组副本,每个副本都可以独立分发给 Pod 以在其上运行工作负载。

与 MIG 不同,副本之间没有内存或故障隔离,但对于某些工作负载来说,这比根本无法共享要好。在底层,计算统一设备架构 (CUDA) 时间分片用于多路复用来自同一底层 GPU 副本的工作负载。

配置 GPU 时间分片#

以下部分向您展示如何配置 NVIDIA Tesla T4 GPU,因为它们不支持 MIG,但可以轻松接受多个小型作业。

启用 GPU 功能发现#

GPU 功能发现 (GFD) 的功能发布将 GPU 类型作为标签公开,并允许用户基于这些标签创建节点选择器,以帮助调度程序放置 Pod。默认情况下,当您创建 ClusterPolicy 自定义资源时,GFD 已启用。如果您禁用了它,可以使用以下命令重新启用它

$ oc patch clusterpolicy gpu-cluster-policy -n nvidia-gpu-operator \
    --type json \
    --patch '[{"op": "replace", "path": "/spec/gfd/enable", "value": true}]'

创建分片配置#

  1. 在启用时间分片配置之前,您需要告诉设备插件可能的配置是什么。

    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: device-plugin-config
      namespace: nvidia-gpu-operator
    data:
      A100-SXM4-40GB: |-
        version: v1
        sharing:
          timeSlicing:
            resources:
              - name: nvidia.com/gpu
                replicas: 8
              - name: nvidia.com/mig-1g.5gb
                replicas: 1
              - name: nvidia.com/mig-2g.10gb
                replicas: 2
              - name: nvidia.com/mig-3g.20gb
                replicas: 3
              - name: nvidia.com/mig-7g.40gb
                replicas: 7
      A100-SXM4-80GB: |-
        version: v1
        sharing:
          timeSlicing:
            resources:
              - name: nvidia.com/gpu
                replicas: 8
              - name: nvidia.com/mig-1g.10gb
                replicas: 1
              - name: nvidia.com/mig-2g.20gb
                replicas: 2
              - name: nvidia.com/mig-3g.40gb
                replicas: 3
              - name: nvidia.com/mig-7g.80gb
                replicas: 7
      Tesla-T4: |-
        version: v1
        sharing:
          timeSlicing:
            resources:
              - name: nvidia.com/gpu
                replicas: 8
    
  2. 创建 ConfigMap

    $ oc create -f device-plugin-config.yaml
    
  3. 告诉 GPU Operator 要使用哪个 ConfigMap 进行设备插件配置。您可以简单地修补 ClusterPolicy 自定义资源。

    $ oc patch clusterpolicy gpu-cluster-policy \
        -n nvidia-gpu-operator --type merge \
        -p '{"spec": {"devicePlugin": {"config": {"name": "device-plugin-config"}}}}'
    
  4. 将配置应用于您拥有的所有带有 Tesla TA GPU 的节点。GFD 使用 GPU 产品标记节点,在本例中为 Tesla-T4,因此您可以使用节点选择器一次标记所有节点。

    您还可以设置 devicePlugin.config.default=Tesla-T4,这将在整个集群中默认应用配置,而无需节点特定的标签。

    $ oc label --overwrite node \
        --selector=nvidia.com/gpu.product=Tesla-T4 \
        nvidia.com/device-plugin.config=Tesla-T4
    
  5. 几秒钟后,配置将应用,您可以验证是否已创建 GPU 资源副本。以下配置为 Tesla T4 GPU 创建八个副本,因此 nvidia.com/gpu 外部资源设置为 8

    $ oc get node --selector=nvidia.com/gpu.product=Tesla-T4-SHARED -o json | jq '.items[0].status.capacity'
    

    示例输出

    {
      "attachable-volumes-aws-ebs": "39",
      "cpu": "4",
      "ephemeral-storage": "125293548Ki",
      "hugepages-1Gi": "0",
      "hugepages-2Mi": "0",
      "memory": "16105592Ki",
      "nvidia.com/gpu": "8",
      "pods": "250"
    }
    
  6. 请注意,nvidia.com/gpu.product 标签已添加 -SHARED 后缀,以反映已启用时间分片。您可以在配置中禁用此功能。例如,Tesla T4 配置将如下所示

    version: v1
    sharing:
      timeSlicing:
        renameByDefault: false
        resources:
          - name: nvidia.com/gpu
            replicas: 8
    
  7. 验证是否已添加 GFD 标签以指示时间共享。

    $ oc get node --selector=nvidia.com/gpu.product=Tesla-T4-SHARED -o json \
     | jq '.items[0].metadata.labels' | grep nvidia
    

    示例输出

    "nvidia.com/cuda.driver.major": "510",
    "nvidia.com/cuda.driver.minor": "73",
    "nvidia.com/cuda.driver.rev": "08",
    "nvidia.com/cuda.runtime.major": "11",
    "nvidia.com/cuda.runtime.minor": "7",
    "nvidia.com/device-plugin.config": "Tesla-T4",
    "nvidia.com/gfd.timestamp": "1655482336",
    "nvidia.com/gpu.compute.major": "7",
    "nvidia.com/gpu.compute.minor": "5",
    "nvidia.com/gpu.count": "1",
    "nvidia.com/gpu.deploy.container-toolkit": "true",
    "nvidia.com/gpu.deploy.dcgm": "true",
    "nvidia.com/gpu.deploy.dcgm-exporter": "true",
    "nvidia.com/gpu.deploy.device-plugin": "true",
    "nvidia.com/gpu.deploy.driver": "true",
    "nvidia.com/gpu.deploy.gpu-feature-discovery": "true",
    "nvidia.com/gpu.deploy.node-status-exporter": "true",
    "nvidia.com/gpu.deploy.nvsm": "",
    "nvidia.com/gpu.deploy.operator-validator": "true",
    "nvidia.com/gpu.family": "turing",
    "nvidia.com/gpu.machine": "g4dn.xlarge",
    "nvidia.com/gpu.memory": "16106127360",
    "nvidia.com/gpu.present": "true",
    "nvidia.com/gpu.product": "Tesla-T4-SHARED",
    "nvidia.com/gpu.replicas": "8",
    "nvidia.com/mig.strategy": "single",
    

    如果您删除标签,节点配置将重置为其默认值。

将配置应用于 MachineSet#

使用 OpenShift,您可以利用 Machine Management 功能在支持它的平台上动态 provision 节点。

例如,管理员可以为配置了启用时间分片的 Tesla T4 GPU 的节点创建一个 MachineSet。这为不需要完整 T4 GPU 的工作负载提供了一个副本池。

考虑一个名为 worker-gpu-nvidia-t4-us-east-1 的 MachineSet,并配置了 Machine Autoscaler。您要确保新节点将自动启用时间分片,也就是说,您要将标签应用于每个新节点。这可以通过在 MachineSet 模板中设置标签来完成。

$ oc patch machineset worker-gpu-nvidia-t4-us-east-1a \
    -n openshift-machine-api --type merge \
    --patch '{"spec": {"template": {"spec": {"metadata": {"labels": {"nvidia.com/device-plugin.config": "Tesla-T4"}}}}}}'

现在,Machine Autoscaler 为此 MachineSet 创建的任何新机器都将具有该标签,并且启用时间分片。

ConfigMap 示例值#

下表显示了 ConfigMap 的示例值,该 ConfigMap 包含多个 config.yaml 文件(small、medium 和 large)。

字段

描述

副本数

可以为每个命名资源指定的副本数。

2

5

10

默认重命名

false 时,SHARED 后缀将添加到产品标签。

false

false

false

failRequestsGreaterThanOne

为了向后兼容,此标志为 false

false

false

false

注意

与标准 GPU 请求不同,请求多个共享 GPU 并不能保证您将获得成比例的计算能力。它仅指定您将有权访问由其他客户端共享的 GPU,每个客户端都可以自由地在底层 GPU 上运行任意数量的进程。在内部,GPU 将简单地为所有客户端的所有 GPU 进程提供相等的时间份额。failRequestsGreaterThanOne 标志旨在帮助用户理解这种微妙之处,方法是将 1 的请求视为访问请求而不是独占资源请求。建议设置 failRequestsGreaterThanOne=true,但默认情况下将其设置为 false 以保持向后兼容性。