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

先决条件#

部署工作流程需要满足以下先决条件。

  1. 您已经拥有一个正在运行的 OpenShift 容器平台集群,并可以访问至少一个支持 MIG 的 GPU。

  2. 您已遵循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 实例

      _images/Mig-profile-A100.png
  • 混合定义了一种异构声明策略。对几何结构没有约束;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 实例

      _images/mig-mixed-profile-A100.png

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 设备,请按照以下步骤操作

  1. 在 OpenShift 容器平台 CLI 中运行以下命令

    $ STRATEGY=mixed && \
      oc patch clusterpolicy/gpu-cluster-policy --type='json' -p='[{"op": "replace", "path": "/spec/mig/strategy", "value": '$STRATEGY'}]'
    

    注意

    这可能需要一段时间,因此请耐心等待至少 10-20 分钟,然后再深入研究任何形式的故障排除。

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

  3. 选择 ClusterPolicy 选项卡。新部署的 NVIDIA GPU Operator 的 ClusterPolicy gpu-cluster-policy 的状态显示 State:ready,表示安装成功。

    _images/cluster_policy_suceed.png
  4. 应用所需的 MIG 分区配置文件。要配置 3x 2g.10gb MIG 设备,请运行以下命令

    $ MIG_CONFIGURATION=all-2g.10gb && \
      oc label node/$NODE_NAME nvidia.com/mig.config=$MIG_CONFIGURATION --overwrite
    
  5. 等待 mig-manager 执行重新配置

    $ oc -n nvidia-gpu-operator logs ds/nvidia-mig-manager --all-containers -f --prefix
    

    重新配置的状态应从 success → pending → success 更改。

  6. 验证新的配置是否已应用

    $ 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 设备。

  7. 检查节点是否已标记

    $ 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

  8. 验证 MIG 实例是否已暴露

    $ oc get node/$NODE_NAME -ojsonpath={.status.allocatable} | jq . | grep nvidia
    
    "nvidia.com/mig-2g.10gb": "3",
    

    注意

    您可以忽略设置为 0 的值。

创建和应用自定义 MIG 配置#

按照以下指南创建新的切片配置文件。

  1. 准备自定义 configmap 资源文件,例如 custom_configmap.yaml。使用 configmap 作为指南,帮助您构建自定义配置。有关文件格式的更多文档,请参阅 mig-parted

    注意

    有关 A100 和 A30 上支持的所有组合和配置文件放置的列表,请参阅关于支持的配置文件的部分。

  2. 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
    
  3. 编辑集群策略,并在字段 spec.migManager.config.name 中输入 config map 的名称

    $ oc edit clusterpolicy
      spec:
        migManager:
          config:
            name: custom-mig-parted-config
    
  4. 按照设置 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)

  1. 在环境变量中指定主机名、策略和配置标签

    $ NODE_NAME=myworker.redhat.com
    $ STRATEGY=mixed
    $ MIG_CONFIGURATION=all-balanced
    
  2. 应用策略

    $ oc patch clusterpolicy/gpu-cluster-policy --type='json' \
        -p='[{"op": "replace", "path": "/spec/mig/strategy", "value": '$STRATEGY'}]'
    
  3. 使用配置标签标记节点

    $ oc label node $NODE_NAME nvidia.com/mig.config=$MIG_CONFIGURATION --overwrite
    

    MIG 管理器将 mig.config.state 标签应用于 GPU,然后终止所有 GPU Pod,以准备启用 MIG 模式并将 GPU 配置为指定的配置。

  4. 可选:验证 MIG 管理器是否配置了 GPU

    $ oc describe node | grep nvidia.com/mig.config
    

    示例输出

    nvidia.com/mig.config=all-balanced
    nvidia.com/mig.config.state=success
    
  5. 确认 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
    
  6. 可选:启动一个 Pod 以运行 nvidia-smi 命令并显示 GPU 资源。

    1. 启动 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
      
    2. 确认 Pod 成功运行

      $ oc get pods
      

      示例输出

      NAME                 READY   STATUS      RESTARTS   AGE
      command-nvidia-smi   0/1     Completed   0          3m34s
      
    3. 确认 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                                                           |
      +---------------------------------------------------------------------------------------+
      
    4. 删除示例 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 策略的开头部分。

  1. 在环境变量中指定主机名、策略和配置标签

    $ NODE_NAME=myworker.redhat.com
    $ STRATEGY=single
    $ MIG_CONFIGURATION=all-3g.40gb
    
  2. 应用策略

    $ oc patch clusterpolicy/gpu-cluster-policy --type='json' \
        -p='[{"op": "replace", "path": "/spec/mig/strategy", "value": '$STRATEGY'}]'
    
  3. 使用配置标签标记节点

    $ oc label node $NODE_NAME nvidia.com/mig.config=$MIG_CONFIGURATION --overwrite
    

    MIG 管理器将 mig.config.state 标签应用于 GPU,然后终止所有 GPU Pod,以准备启用 MIG 模式并将 GPU 配置为指定的配置。

  4. 确认 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
    
  5. 可选:启动一个 Pod 以运行 nvidia-smi 命令并显示 GPU 资源。

    1. 启动 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
      
    2. 确认 Pod 成功运行

      $ oc get pods
      

      示例输出

      NAME                 READY   STATUS      RESTARTS   AGE
      command-nvidia-smi   0/1     Completed   0          3m34s
      
    3. 确认 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                                                           |
      +---------------------------------------------------------------------------------------+
      
    4. 删除示例 Pod

      $ oc delete pod command-nvidia-smi
      

      示例输出

      pod "command-nvidia-smi" deleted
      

运行示例 GPU 应用程序#

让我们运行一个简单的 CUDA 示例,在本例中是 vectorAdd,方法是像在 Kubernetes 中通常那样请求 GPU 资源。

如果集群配置了 mixed 声明策略。

  1. 请求 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
    
  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
    

如果集群配置了 single 声明策略。

  1. 请求 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 的日志应该可以提供有关哪里出错的线索。

  1. 检查容器的日志

    $ 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'
    

通过以下方法解决此问题

  1. 正确排空节点。有关排空节点的指南,请参阅 OpenShift 容器平台文档了解如何在节点上疏散 Pod

  2. 通过强制标签更新来重新触发重新配置

    $ oc label node/$NODE_NAME nvidia.com/mig.config- --overwrite
    
    $ oc label node/$NODE_NAME nvidia.com/mig.config=$MIG_CONFIGURATION --overwrite