OpenShift 容器平台中的 MIG 支持#
简介#
当您的应用程序不需要整个 GPU 的全部 power 时,NVIDIA 多实例 GPU (MIG) 非常有用。新的 NVIDIA Ampere 架构的 MIG 功能允许您将硬件资源拆分为多个 GPU 实例,每个实例都作为独立的启用 CUDA 的 GPU 暴露给操作系统。NVIDIA GPU Operator 1.7.0 及更高版本为 A100 和 A30 Ampere 卡提供 MIG 功能支持。这些 GPU 实例旨在支持多个独立的 CUDA 应用程序(最多 7 个),因此它们使用专用的硬件资源完全彼此隔离地运行。
GPU 的计算单元及其内存可以分区为多个 MIG 实例。从系统角度来看,每个实例都表现为独立的 GPU 设备,并且可以绑定到节点上运行的任何应用程序、容器或虚拟机。
从使用 GPU 的软件的角度来看,每个 MIG 实例看起来都像其自己的独立 GPU。
MIG 几何结构#
NVIDIA GPU Operator 1.7.0 及更高版本使 OpenShift 容器平台管理员能够动态地重新配置 MIG 分区的几何结构。MIG 分区的几何结构是指硬件资源如何绑定到 MIG 实例,因此它直接影响它们的性能以及可以分配的实例数量。例如,A100-40GB 具有八个计算单元和 40 GB 的 RAM。启用 MIG 模式后,第八个实例将保留用于资源管理。
下表提供了 NVIDIA A100-40GB 产品的 MIG 实例属性摘要
配置文件 |
内存 |
计算单元 |
同构实例的最大数量 |
---|---|---|---|
1g.5gb |
5 GB |
1 |
7 |
2g.10gb |
10 GB |
2 |
3 |
3g.20gb |
20 GB |
3 |
2 |
4g.20gb |
20 GB |
4 |
1 |
7g.40gb |
40 GB |
7 |
1 |
除了同构实例外,还可以选择一些异构组合。有关详尽的列表,请参阅多实例 GPU 用户指南文档。
以下是 A100-40GB 的另一个示例,其中包含异构(或“混合”)几何结构
2x 1g.5gb
1x 2g.10gb
1x 3g.10gb
先决条件#
部署工作流程需要满足以下先决条件。
您已经拥有一个正在运行的 OpenShift 容器平台集群,并可以访问至少一个支持 MIG 的 GPU。
您已遵循OpenShift 上的安装和升级概述中的指导,并已进行到创建集群策略 <create-cluster-policy>。
注意
在触发任何重新配置之前,节点必须是空闲的(已排空 GPU 工作负载)。有关排空节点的指南,请参阅 OpenShift 容器平台文档了解如何在节点上疏散 Pod。
在 OpenShift 中配置 MIG 设备#
MIG 声明策略#
NVIDIA GPU Operator 将 GPU 作为扩展资源暴露给 Kubernetes,这些资源可以被请求并暴露到 Pod 和容器中。MIG 配置的第一步是决定您想要的策略。声明策略在此处描述
单定义了一种同构声明策略,其中 MIG 实例像通常的 GPU 一样暴露。此策略将 MIG 实例作为
nvidia.com/gpu
资源暴露,与通常不支持 MIG 的(或禁用 MIG 的)设备相同。在此策略中,单个节点中的所有 GPU 必须以同构方式配置(相同的计算单元数量,相同的内存大小)。此策略最适合大型集群,基础设施团队可以在其中配置不同 MIG 几何结构的“节点池”,并使其可供用户使用。此策略的另一个优点是向后兼容性,现有的应用程序不必修改即可按此方式进行调度。A100-40GB 的示例
1g.5gb:7 个 nvidia.com/gpu 实例,或
2g.10gb:3 个 nvidia.com/gpu 实例,或
3g.20gb:2 个 nvidia.com/gpu 实例,或
7g.40gb:1 个 nvidia.com/gpu 实例
混合定义了一种异构声明策略。对几何结构没有约束;GPU 允许的所有组合都是允许的。此策略适用于较小的集群,在较小的集群中,在具有多个 GPU 的单个节点上,每个 GPU 可以配置为不同的 MIG 几何结构。
A100-40GB 的示例
所有单配置都是可能的
“平衡”配置
1g.5gb:2 个 nvidia.com/mig-1g.5gb 实例,以及
2g.10gb:1 个 nvidia.com/mig-2g.10gb 实例,以及
3g.20gb:1 个 nvidia.com/mig-3g.20gb 实例
NVIDIA GPU Operator 的 1.8 及更高版本支持在部署后更新 ClusterPolicy 中的 策略。
默认 configmap 定义了 A100-40GB、A100-80GB 和 A30-24GB 支持的单(同构)和混合(异构)配置文件的组合。configmap 允许管理员声明性地定义一组他们希望应用于节点上所有 GPU 的可能的 MIG 配置。下表描述了这些配置
GPU 类型 |
自定义标签 |
配置文件 |
MIG 实例 |
---|---|---|---|
A100-40GB |
|||
all-1g.5gb |
1g.5gb |
7 |
|
all-2g.10gb |
2g.10gb |
3 |
|
all-3g.20gb |
3g.20gb |
2 |
|
all-7g.40gb |
7g.40gb |
1 |
|
A100-80GB |
|||
all-1g.10gb |
1g.10gb |
7 |
|
all-2g.20gb |
2g.20gb |
3 |
|
all-3g.40gb |
3g.40gb |
2 |
|
all-7g.80gb |
7g.80gb |
1 |
|
A30-24GB |
|||
all-1g.6gb |
1g.6gb |
4 |
|
all-2g.12gb |
2g.12gb |
2 |
|
all-4g.24gb |
4g.24gb |
1 |
All-balanced 由 3 种不同的配置组成,并具有基于设备 UID 进行过滤的 device-filter。下面描述了可能的支持组合
GPU 类型 |
自定义标签 |
配置文件和 MIG 实例 |
---|---|---|
A100-40GB |
||
all-balanced |
1g.5gb:2 2g.10gb:1 3g.20gb:1 |
|
A100-80GB |
||
all-balanced |
1g.10gb:2 2g.20gb:1 3g.40gb:1 |
|
A30-24GB |
||
all-balanced |
1g.6gb: 2 2g.12gb:1 |
设置 MIG 声明策略并应用 MIG 分区#
在确定您的声明策略后,您需要通过编辑默认集群策略来设置此策略,然后应用 MIG 分区配置文件。
例如,要将声明策略设置为 mixed
,并将 MIG 分区配置文件设置为 3x 2g.10gb MIG 设备,请按照以下步骤操作
在 OpenShift 容器平台 CLI 中运行以下命令
$ STRATEGY=mixed && \ oc patch clusterpolicy/gpu-cluster-policy --type='json' -p='[{"op": "replace", "path": "/spec/mig/strategy", "value": '$STRATEGY'}]'
注意
这可能需要一段时间,因此请耐心等待至少 10-20 分钟,然后再深入研究任何形式的故障排除。
在 OpenShift 容器平台 Web 控制台中,从侧边菜单中选择 Operators > Installed Operators,然后单击 NVIDIA GPU Operator。
选择 ClusterPolicy 选项卡。新部署的 NVIDIA GPU Operator 的 ClusterPolicy gpu-cluster-policy 的状态显示
State:ready
,表示安装成功。应用所需的 MIG 分区配置文件。要配置 3x 2g.10gb MIG 设备,请运行以下命令
$ MIG_CONFIGURATION=all-2g.10gb && \ oc label node/$NODE_NAME nvidia.com/mig.config=$MIG_CONFIGURATION --overwrite
等待
mig-manager
执行重新配置$ oc -n nvidia-gpu-operator logs ds/nvidia-mig-manager --all-containers -f --prefix
重新配置的状态应从 success → pending → success 更改。
验证新的配置是否已应用
$ oc get pods -n nvidia-gpu-operator -lapp=nvidia-driver-daemonset -owide
选择 MIG GPU 启用节点上的 Pod 名称,然后运行以下命令
$ oc rsh -n nvidia-gpu-operator $POD_NAME nvidia-smi mig -lgi
+----------------------------------------------------+ | GPU instances: | | GPU Name Profile Instance Placement | | ID ID Start:Size | |====================================================| | 0 MIG 2g.10gb 19 3 4:2 | +----------------------------------------------------+ | 0 MIG 2g.10gb 19 5 0:2 | +----------------------------------------------------+ | 0 MIG 2g.10gb 19 6 2:2 | +----------------------------------------------------+
应用步骤 4 中的配置文件后,A100 将配置为 3 个 MIG 设备。
检查节点是否已标记
$ oc get nodes/$NODE_NAME --show-labels | tr ',' '\n' | grep nvidia.com
带有标签
nvidia.com/gpu.present=true nvidia.com/cuda.driver.major=470 nvidia.com/cuda.driver.minor=57 nvidia.com/cuda.driver.rev=02 nvidia.com/cuda.runtime.major=11 nvidia.com/cuda.runtime.minor=4 nvidia.com/gpu.compute.major=8 nvidia.com/gpu.compute.minor=0 nvidia.com/gpu.count=1 nvidia.com/gpu.family=ampere nvidia.com/gpu.machine=... nvidia.com/gpu.memory=40536 nvidia.com/gpu.product=NVIDIA-A100-SXM4-40GB nvidia.com/mig-2g.10gb.count=3 nvidia.com/mig-2g.10gb.engines.copy=2 nvidia.com/mig-2g.10gb.engines.decoder=1 nvidia.com/mig-2g.10gb.engines.encoder=0 nvidia.com/mig-2g.10gb.engines.jpeg=0 nvidia.com/mig-2g.10gb.engines.ofa=0 nvidia.com/mig-2g.10gb.memory=9984 nvidia.com/mig-2g.10gb.multiprocessors=28 nvidia.com/mig-2g.10gb.slices.ci=2 nvidia.com/mig-2g.10gb.slices.gi=2 nvidia.com/mig.config.state=success nvidia.com/mig.config=all-2g.10gb nvidia.com/mig.strategy=mixed [...]
注意
上面的摘录显示策略设置为
mixed
,MIG 配置设置为all-2g.10gb
。验证 MIG 实例是否已暴露
$ oc get node/$NODE_NAME -ojsonpath={.status.allocatable} | jq . | grep nvidia
"nvidia.com/mig-2g.10gb": "3",
注意
您可以忽略设置为 0 的值。
创建和应用自定义 MIG 配置#
按照以下指南创建新的切片配置文件。
准备自定义
configmap
资源文件,例如custom_configmap.yaml
。使用 configmap 作为指南,帮助您构建自定义配置。有关文件格式的更多文档,请参阅 mig-parted。注意
有关 A100 和 A30 上支持的所有组合和配置文件放置的列表,请参阅关于支持的配置文件的部分。
在
nvidia-gpu-operator
命名空间中创建自定义配置$ CONFIG_FILE=/path/to/custom_configmap.yaml && \ oc create configmap custom-mig-parted-config \ --from-file=config.yaml=$CONFIG_FILE \ -n nvidia-gpu-operator
编辑集群策略,并在字段
spec.migManager.config.name
中输入 config map 的名称$ oc edit clusterpolicy spec: migManager: config: name: custom-mig-parted-config
按照设置 MIG 声明策略并应用 MIG 分区中的指南,使用新创建的配置文件标记节点。
示例:混合 MIG 策略#
简介和默认 MIG 配置#
对于每个 MIG 配置,您需要指定一个策略和一个 MIG 配置标签。
此示例演示如何在具有 8 个 H100 80GB GPU 的一个 NVIDIA DGX H100 主机上配置 mixed
策略和 all-balanced
配置。DGX H100 主机运行 OpenShift 的单节点安装。
默认情况下,MIG 已禁用,并配置为 single
策略
$ oc describe node | grep nvidia.com/mig
示例输出
nvidia.com/mig.capable=true
nvidia.com/mig.config=all-disabled
nvidia.com/mig.config.state=success
nvidia.com/mig.strategy=single
使用默认配置,主机最多支持 8 个带有 GPU 的 Pod
$ oc describe node | egrep "Name:|Roles:|Capacity|nvidia.com/gpu|Allocatable:|Requests +Limits"
示例输出
Name: myworker.redhat.com
Roles: control-plane,master,worker
Capacity:
nvidia.com/gpu: 8
Allocatable:
nvidia.com/gpu: 8
Resource Requests Limits
nvidia.com/gpu 0 0
步骤#
以下步骤演示如何应用 mixed
策略和 MIG 配置标签 all-balanced
。
使用此策略和标签,每个 H100 GPU 启用以下 MIG 配置文件
2 x 1g.10gb
1 x 2g.20gb
1 x 3g.40g
对于具有 8 个 H100 GPU 的 NVIDIA DGX H100,执行这些步骤将导致集群上具有以下 GPU 容量
16 x 1g.10gb (8 x 2)
8 x 2g.20gb (8 x 1)
8 x 3g.40gb (8 x 1)
在环境变量中指定主机名、策略和配置标签
$ NODE_NAME=myworker.redhat.com $ STRATEGY=mixed $ MIG_CONFIGURATION=all-balanced
应用策略
$ oc patch clusterpolicy/gpu-cluster-policy --type='json' \ -p='[{"op": "replace", "path": "/spec/mig/strategy", "value": '$STRATEGY'}]'
使用配置标签标记节点
$ oc label node $NODE_NAME nvidia.com/mig.config=$MIG_CONFIGURATION --overwrite
MIG 管理器将
mig.config.state
标签应用于 GPU,然后终止所有 GPU Pod,以准备启用 MIG 模式并将 GPU 配置为指定的配置。可选:验证 MIG 管理器是否配置了 GPU
$ oc describe node | grep nvidia.com/mig.config
示例输出
nvidia.com/mig.config=all-balanced nvidia.com/mig.config.state=success
确认 GPU 资源可用
$ oc describe node | egrep "Name:|Roles:|Capacity|nvidia.com/gpu:|nvidia.com/mig-.* |Allocatable:|Requests +Limits"
以下示例输出显示了预期的 32 个 GPU 资源
16 x 1g.10gb
8 x 1g.10gb
8 x 3g.40gb
Name: myworker.redhat.com Roles: control-plane,master,worker Capacity: nvidia.com/gpu: 0 nvidia.com/mig-1g.10gb: 16 nvidia.com/mig-2g.20gb: 8 nvidia.com/mig-3g.40gb: 8 Allocatable: nvidia.com/gpu: 0 nvidia.com/mig-1g.10gb: 16 nvidia.com/mig-2g.20gb: 8 nvidia.com/mig-3g.40gb: 8 Resource Requests Limits nvidia.com/mig-1g.10gb 0 0 nvidia.com/mig-2g.20gb 0 0 nvidia.com/mig-3g.40gb 0 0
可选:启动一个 Pod 以运行
nvidia-smi
命令并显示 GPU 资源。启动 Pod
$ cat <<EOF | oc apply -f - apiVersion: v1 kind: Pod metadata: name: command-nvidia-smi spec: restartPolicy: Never containers: - name: cuda-container image: nvcr.io/nvidia/cuda:12.1.0-base-ubi8 command: ["/bin/sh","-c"] args: ["nvidia-smi"] EOF
确认 Pod 成功运行
$ oc get pods
示例输出
NAME READY STATUS RESTARTS AGE command-nvidia-smi 0/1 Completed 0 3m34s
确认
nvidia-smi
输出包含 32 个 MIG 设备$ oc logs command-nvidia-smi
示例输出
+---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.104.12 Driver Version: 535.104.12 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | 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 NVIDIA H100 80GB HBM3 On | 00000000:1B:00.0 Off | On | | N/A 25C P0 71W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 1 NVIDIA H100 80GB HBM3 On | 00000000:43:00.0 Off | On | | N/A 26C P0 70W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 2 NVIDIA H100 80GB HBM3 On | 00000000:52:00.0 Off | On | | N/A 31C P0 72W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 3 NVIDIA H100 80GB HBM3 On | 00000000:61:00.0 Off | On | | N/A 29C P0 71W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 4 NVIDIA H100 80GB HBM3 On | 00000000:9D:00.0 Off | On | | N/A 26C P0 71W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 5 NVIDIA H100 80GB HBM3 On | 00000000:C3:00.0 Off | On | | N/A 25C P0 70W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 6 NVIDIA H100 80GB HBM3 On | 00000000:D1:00.0 Off | On | | N/A 29C P0 73W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 7 NVIDIA H100 80GB HBM3 On | 00000000:DF:00.0 Off | On | | N/A 31C P0 72W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | MIG devices: | +------------------+--------------------------------+-----------+-----------------------+ | GPU GI CI MIG | Memory-Usage | Vol| Shared | | ID ID Dev | BAR1-Usage | SM Unc| CE ENC DEC OFA JPG | | | | ECC| | |==================+================================+===========+=======================| | 0 2 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 0 3 0 1 | 11MiB / 20096MiB | 32 0 | 2 0 2 0 2 | | | 0MiB / 32767MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 0 9 0 2 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 0 10 0 3 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 1 2 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 1 3 0 1 | 11MiB / 20096MiB | 32 0 | 2 0 2 0 2 | | | 0MiB / 32767MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 1 9 0 2 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 1 10 0 3 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 2 2 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 2 3 0 1 | 11MiB / 20096MiB | 32 0 | 2 0 2 0 2 | | | 0MiB / 32767MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 2 9 0 2 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 2 10 0 3 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 3 2 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 3 3 0 1 | 11MiB / 20096MiB | 32 0 | 2 0 2 0 2 | | | 0MiB / 32767MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 3 9 0 2 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 3 10 0 3 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 4 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 4 5 0 1 | 11MiB / 20096MiB | 32 0 | 2 0 2 0 2 | | | 0MiB / 32767MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 4 13 0 2 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 4 14 0 3 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 5 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 5 5 0 1 | 11MiB / 20096MiB | 32 0 | 2 0 2 0 2 | | | 0MiB / 32767MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 5 13 0 2 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 5 14 0 3 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 6 2 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 6 3 0 1 | 11MiB / 20096MiB | 32 0 | 2 0 2 0 2 | | | 0MiB / 32767MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 6 9 0 2 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 6 10 0 3 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 7 2 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 7 3 0 1 | 11MiB / 20096MiB | 32 0 | 2 0 2 0 2 | | | 0MiB / 32767MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 7 9 0 2 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 7 10 0 3 | 5MiB / 9984MiB | 16 0 | 1 0 1 0 1 | | | 0MiB / 16383MiB | | | +------------------+--------------------------------+-----------+-----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | No running processes found | +---------------------------------------------------------------------------------------+
删除示例 Pod
$ oc delete pod command-nvidia-smi
示例输出
pod "command-nvidia-smi" deleted
示例:单 MIG 策略#
此示例演示如何在具有 8 个 H100 80GB GPU 的一个 NVIDIA DGX H100 主机上配置 single
策略和 all-3g.40gb
配置。DGX H100 主机运行 OpenShift 的单节点安装。
有关初始默认 MIG 配置和查看它的信息,请参阅示例:混合 MIG 策略的开头部分。
在环境变量中指定主机名、策略和配置标签
$ NODE_NAME=myworker.redhat.com $ STRATEGY=single $ MIG_CONFIGURATION=all-3g.40gb
应用策略
$ oc patch clusterpolicy/gpu-cluster-policy --type='json' \ -p='[{"op": "replace", "path": "/spec/mig/strategy", "value": '$STRATEGY'}]'
使用配置标签标记节点
$ oc label node $NODE_NAME nvidia.com/mig.config=$MIG_CONFIGURATION --overwrite
MIG 管理器将
mig.config.state
标签应用于 GPU,然后终止所有 GPU Pod,以准备启用 MIG 模式并将 GPU 配置为指定的配置。确认 GPU 资源可用
$ oc describe node | egrep "Name:|Roles:|Capacity|nvidia.com/gpu:|nvidia.com/mig-.* |Allocatable:|Requests +Limits"
以下示例输出显示了预期的 16 个 GPU
Name: myworker.redhat.com Roles: control-plane,master,worker Capacity: nvidia.com/gpu: 16 nvidia.com/mig-1g.10gb: 0 nvidia.com/mig-2g.20gb: 0 nvidia.com/mig-3g.40gb: 0 Allocatable: nvidia.com/gpu: 16 nvidia.com/mig-1g.10gb: 0 nvidia.com/mig-2g.20gb: 0 nvidia.com/mig-3g.40gb: 0 Resource Requests Limits nvidia.com/mig-1g.10gb 0 0 nvidia.com/mig-2g.20gb 0 0 nvidia.com/mig-3g.40gb 0 0
可选:启动一个 Pod 以运行
nvidia-smi
命令并显示 GPU 资源。启动 Pod
$ cat <<EOF | oc apply -f - apiVersion: v1 kind: Pod metadata: name: command-nvidia-smi spec: restartPolicy: Never containers: - name: cuda-container image: nvcr.io/nvidia/cuda:12.1.0-base-ubi8 command: ["/bin/sh","-c"] args: ["nvidia-smi"] EOF
确认 Pod 成功运行
$ oc get pods
示例输出
NAME READY STATUS RESTARTS AGE command-nvidia-smi 0/1 Completed 0 3m34s
确认
nvidia-smi
输出包含 16 个 MIG 设备$ oc logs command-nvidia-smi
示例输出
+---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.104.12 Driver Version: 535.104.12 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | 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 NVIDIA H100 80GB HBM3 On | 00000000:1B:00.0 Off | On | | N/A 25C P0 75W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 1 NVIDIA H100 80GB HBM3 On | 00000000:43:00.0 Off | On | | N/A 27C P0 74W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 2 NVIDIA H100 80GB HBM3 On | 00000000:52:00.0 Off | On | | N/A 32C P0 75W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 3 NVIDIA H100 80GB HBM3 On | 00000000:61:00.0 Off | On | | N/A 30C P0 74W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 4 NVIDIA H100 80GB HBM3 On | 00000000:9D:00.0 Off | On | | N/A 27C P0 75W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 5 NVIDIA H100 80GB HBM3 On | 00000000:C3:00.0 Off | On | | N/A 25C P0 73W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 6 NVIDIA H100 80GB HBM3 On | 00000000:D1:00.0 Off | On | | N/A 30C P0 77W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ | 7 NVIDIA H100 80GB HBM3 On | 00000000:DF:00.0 Off | On | | N/A 31C P0 76W / 700W | N/A | N/A Default | | | | Enabled | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | MIG devices: | +------------------+--------------------------------+-----------+-----------------------+ | GPU GI CI MIG | Memory-Usage | Vol| Shared | | ID ID Dev | BAR1-Usage | SM Unc| CE ENC DEC OFA JPG | | | | ECC| | |==================+================================+===========+=======================| | 0 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 0 2 0 1 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 1 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 1 2 0 1 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 2 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 2 2 0 1 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 3 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 3 2 0 1 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 4 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 4 2 0 1 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 5 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 5 2 0 1 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 6 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 6 2 0 1 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 7 1 0 0 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ | 7 2 0 1 | 16MiB / 40448MiB | 60 0 | 3 0 3 0 3 | | | 0MiB / 65535MiB | | | +------------------+--------------------------------+-----------+-----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | No running processes found | +---------------------------------------------------------------------------------------+
删除示例 Pod
$ oc delete pod command-nvidia-smi
示例输出
pod "command-nvidia-smi" deleted
运行示例 GPU 应用程序#
让我们运行一个简单的 CUDA 示例,在本例中是 vectorAdd
,方法是像在 Kubernetes 中通常那样请求 GPU 资源。
如果集群配置了 mixed
声明策略。
请求
nvidia.com/mig-2g.10gb: 1
的 MIG 实例,如下所示注意
不需要 nodeSelector,因为 Pod 必然在
2g.10gb
MIG 实例上调度。$ cat << EOF | oc create -f - apiVersion: v1 kind: Pod metadata: name: cuda-vectoradd spec: restartPolicy: OnFailure containers: - name: cuda-vectoradd image: "nvidia/samples:vectoradd-cuda11.2.1" resources: limits: nvidia.com/mig-2g.10gb: 1 EOF
pod/cuda-vectoradd created
检查容器的日志
$ 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
如果集群配置了 single
声明策略。
请求
nvidia.com/gpu: 1
的 MIG 实例,并在具有2g.10gb
MIG 实例的节点上使用nodeSelector
节强制 Pod 调度,如下所示$ cat << EOF | oc create -f - apiVersion: v1 kind: Pod metadata: name: cuda-vectoradd spec: restartPolicy: OnFailure containers: - name: cuda-vectoradd image: "nvidia/samples:vectoradd-cuda11.2.1" resources: limits: nvidia.com/gpu: 1 nodeSelector: nvidia.com/gpu.product: A100-SXM4-40GB-MIG-1g.5gb EOF
禁用 MIG 模式#
要关闭 MIG 模式以便您可以利用 GPU 的全部容量,请运行以下命令
$ MIG_CONFIGURATION=all-disabled && \ oc label node/$NODE_NAME nvidia.com/mig.config=$MIG_CONFIGURATION --overwrite
故障排除#
MIG 重新配置完全由部署在 nvidia-mig-manager
DaemonSet 中的控制器处理。检查这些 Pod 的日志应该可以提供有关哪里出错的线索。
检查容器的日志
$ oc logs nvidia-mig-manager
集群管理员应在请求 MIG 重新配置之前,从任何 GPU 工作负载中排空节点。如果节点未正确排空,则
nvidia-mig-manager
将在日志中失败并显示此错误Updating MIG config: map[2g.10gb:3] Error clearing MigConfig: error destroying Compute instance for profile '(0, 0)': In use by another client Error clearing MIG config on GPU 0, erroneous devices may persist Error setting MIGConfig: error attempting multiple config orderings: all orderings failed Restarting all GPU clients previously shutdown by reenabling their component-specific nodeSelector labels Changing the 'nvidia.com/mig.config.state' node label to 'failed'
通过以下方法解决此问题
正确排空节点。有关排空节点的指南,请参阅 OpenShift 容器平台文档了解如何在节点上疏散 Pod。
通过强制标签更新来重新触发重新配置
$ oc label node/$NODE_NAME nvidia.com/mig.config- --overwrite
$ oc label node/$NODE_NAME nvidia.com/mig.config=$MIG_CONFIGURATION --overwrite