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}]'
创建分片配置#
在启用时间分片配置之前,您需要告诉设备插件可能的配置是什么。
--- 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
创建 ConfigMap
$ oc create -f device-plugin-config.yaml
告诉 GPU Operator 要使用哪个 ConfigMap 进行设备插件配置。您可以简单地修补
ClusterPolicy
自定义资源。$ oc patch clusterpolicy gpu-cluster-policy \ -n nvidia-gpu-operator --type merge \ -p '{"spec": {"devicePlugin": {"config": {"name": "device-plugin-config"}}}}'
将配置应用于您拥有的所有带有 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
几秒钟后,配置将应用,您可以验证是否已创建 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" }
请注意,
nvidia.com/gpu.product
标签已添加 -SHARED 后缀,以反映已启用时间分片。您可以在配置中禁用此功能。例如,Tesla T4 配置将如下所示version: v1 sharing: timeSlicing: renameByDefault: false resources: - name: nvidia.com/gpu replicas: 8
验证是否已添加 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 |
false |
false |
|
为了向后兼容,此标志为 |
false |
false |
false |
注意
与标准 GPU 请求不同,请求多个共享 GPU 并不能保证您将获得成比例的计算能力。它仅指定您将有权访问由其他客户端共享的 GPU,每个客户端都可以自由地在底层 GPU 上运行任意数量的进程。在内部,GPU 将简单地为所有客户端的所有 GPU 进程提供相等的时间份额。failRequestsGreaterThanOne
标志旨在帮助用户理解这种微妙之处,方法是将 1 的请求视为访问请求而不是独占资源请求。建议设置 failRequestsGreaterThanOne=true
,但默认情况下将其设置为 false 以保持向后兼容性。