MIG 支持

多实例 GPU(MIG)功能支持将 NVIDIA A100 等 GPU 安全地划分为多个独立的 GPU 实例,用于 CUDA 应用。例如,NVIDIA A100 支持最多七个独立的 GPU 实例。

MIG 为多个用户提供了独立的 GPU 资源,以实现 GPU 的最佳利用率。该功能特别适用于那些无法完全饱和 GPU 计算能力的工作负载,因此用户可能希望并行运行不同的工作负载以最大化利用率。

本文档概述了启用 Alauda Build of NVIDIA GPU Device Plugin 的 MIG 支持所需的操作步骤。有关技术概念、MIG 设置以及使用 NVIDIA Container Toolkit 运行带 MIG 的容器的更多详细信息,请参阅 MIG User Guide

前提条件

  • Alauda Build of GPU Device Plugin:v0.18.0+
  • NVIDIA Blackwell、Hopper™ 和 Ampere GPU(参见 Supported GPUs

使用不同 MIG 策略进行测试

none 策略

none 策略旨在保持 Alauda Build of GPU Device Plugin 的运行方式与以往相同。插件不会区分是否启用了 MIG 的 GPU,会枚举节点上的所有 GPU,并使用资源类型 nvidia.com/gpu 提供它们。

操作步骤

测试此策略时,我们检查启用和未启用 MIG 的 GPU 枚举情况,确保两种情况下都能看到 GPU。测试假设集群中单个节点上有一块 GPU。

  1. 验证 GPU 上未启用 MIG:

    nvidia-smi
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
    |-------------------------------+----------------------+----------------------+
    | 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  A100-SXM4-40GB      Off  | 00000000:36:00.0 Off |                    0 |
    | N/A   29C    P0    62W / 400W |      0MiB / 40537MiB |      6%      Default |
    |                               |                      |             Disabled |
    +-------------------------------+----------------------+----------------------+
  2. 进入 管理员 -> Marketplace -> 集群插件 页面,切换到目标集群,然后部署或更新 Alauda Build of GPU Device Plugin 集群插件: 在配置表单中将 MIG 策略设置为 none

  3. 观察节点上有 1 个 GPU 可用,资源类型为 nvidia.com/gpu

    kubectl describe node {node-id}
    ...
    Capacity:
    nvidia.com/gpu:          1
    ...
    Allocatable:
    nvidia.com/gpu:          1
    ...
  4. 部署一个 Pod 使用 GPU 并运行 nvidia-smi

    kubectl run -it --rm \
       --image=nvidia/cuda:12.4.1-base-ubuntu20.04 \
       --restart=Never \
       --limits=nvidia.com/gpu=1 \
       mig-none-example -- nvidia-smi -L
    GPU 0: A100-SXM4-40GB (UUID: GPU-15f0798d-c807-231d-6525-a7827081f0f1)

single 策略

single 策略旨在保持用户在 Kubernetes 中使用 GPU 的体验与以往相同。MIG 设备仍使用资源类型 nvidia.com/gpu 枚举,但该资源类型对应的属性现在映射到节点上可用的 MIG 设备,而非完整的 GPU。

操作步骤

测试此策略时,我们检查单一类型的 MIG 设备是否使用传统的 nvidia.com/gpu 资源类型进行枚举。测试假设集群中单个节点上有一块已启用 MIG 的 GPU。

  1. 在 GPU 上启用 MIG(需先停止所有 GPU 客户端) 在控制节点执行:

    kubectl label node {node-id} nvidia-device-enable-

    在 GPU 节点执行:

    systemctl stop kubelet
    nvidia-smi -mig 1
    Enabled MIG Mode for GPU 00000000:36:00.0
    All done.
    nvidia-smi --query-gpu=mig.mode.current --format=csv,noheader
    Enabled
    systemctl start kubelet

    在控制节点执行:

    kubectl label node {node-id} nvidia-device-enable=pgpu
  2. 在 GPU 上创建 7 个单切片 MIG 设备:

    INFO

    以下示例针对 Nvidia A100 型号。其他型号可通过执行命令 nvidia-smi mig -lgip 查询支持的划分类型。 例如,针对 Nvidia A30 型号,执行命令后:

    +-----------------------------------------------------------------------------+
    | GPU instance profiles:                                                      |
    | GPU   Name             ID    Instances   Memory     P2P    SM    DEC   ENC  |
    |                              Free/Total   GiB              CE    JPEG  OFA  |
    |=============================================================================|
    |   0  MIG 1g.6gb        14     4/4        5.81       No     14     1     0   |
    |                                                             1     0     0   |
    +-----------------------------------------------------------------------------+
    |   0  MIG 1g.6gb+me     21     1/1        5.81       No     14     1     0   |
    |                                                             1     1     1   |
    +-----------------------------------------------------------------------------+
    |   0  MIG 2g.12gb        5     2/2        11.75      No     28     2     0   |
    |                                                             2     0     0   |
    +-----------------------------------------------------------------------------+
    |   0  MIG 2g.12gb+me     6     1/1        11.75      No     28     2     0   |
    |                                                             2     1     1   |
    +-----------------------------------------------------------------------------+
    |   0  MIG 4g.24gb        0     1/1        23.56      No     56     4     0   |
    |                                                             4     1     1   |
    +-----------------------------------------------------------------------------+

    你可以运行 nvidia-smi mig -cgi 14,14,14,14 -C 创建 4 个单切片 MIG 设备,或者运行 nvidia-smi mig -cgi 14,14,5 -C 创建 2 个单切片 MIG 设备和 1 个双切片 MIG 设备。 详情参见 Supported MIG Profiles

    # 它们必须是节点上存在的相同 MIG 设备类型,适用于 single 策略
    nvidia-smi mig -cgi 19,19,19,19,19,19,19 -C
    nvidia-smi -L
    GPU 0: A100-SXM4-40GB (UUID: GPU-4200ccc0-2667-d4cb-9137-f932c716232a)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/7/0)
      MIG 1g.5gb Device 1: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/8/0)
      MIG 1g.5gb Device 2: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/9/0)
      MIG 1g.5gb Device 3: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/10/0)
      MIG 1g.5gb Device 4: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/11/0)
      MIG 1g.5gb Device 5: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/12/0)
      MIG 1g.5gb Device 6: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/13/0)
  3. 进入 管理员 -> Marketplace -> 集群插件 页面,切换到目标集群,然后部署或更新 Alauda Build of GPU Device Plugin 集群插件: 在配置表单中将 MIG 策略设置为 single

  4. 观察节点上有 7 个 MIG 设备可用,资源类型为 nvidia.com/gpu

    kubectl describe node {node-id}
    ...
    Capacity:
    nvidia.com/gpu:          7
    ...
    Allocatable:
    nvidia.com/gpu:          7
    ...
  5. 部署 7 个 Pod,每个 Pod 使用一个 MIG 设备(然后查看它们的日志并删除)

    for i in $(seq 7); do
       kubectl run \
          --image=nvidia/cuda:12.4.1-base-ubuntu20.04 \
          --restart=Never \
          --limits=nvidia.com/gpu=1 \
          mig-single-example-${i} -- bash -c "nvidia-smi -L; sleep infinity"
    done
    pod/mig-single-example-1 created
    pod/mig-single-example-2 created
    pod/mig-single-example-3 created
    pod/mig-single-example-4 created
    pod/mig-single-example-5 created
    pod/mig-single-example-6 created
    pod/mig-single-example-7 created
    for i in $(seq 7); do
    echo "mig-single-example-${i}";
    kubectl logs mig-single-example-${i}
    echo "";
    done
    mig-single-example-1
    GPU 0: A100-SXM4-40GB (UUID: GPU-4200ccc0-2667-d4cb-9137-f932c716232a)
       MIG 1g.5gb Device 0: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/7/0)
    
    mig-single-example-2
    GPU 0: A100-SXM4-40GB (UUID: GPU-4200ccc0-2667-d4cb-9137-f932c716232a)
       MIG 1g.5gb Device 0: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/9/0)
    
    ...
    for i in $(seq 7); do
    kubectl delete pod mig-single-example-${i};
    done
    pod "mig-single-example-1" deleted
    pod "mig-single-example-2" deleted
    ...

mixed 策略

mixed 策略旨在为集群中每种可用的 MIG 设备配置枚举不同的资源类型。

操作步骤

测试此策略时,我们检查所有 MIG 设备是否使用其完全限定名称形式 nvidia.com/mig-<slice_count>g.<memory_size>gb 进行枚举。测试假设集群中单个节点上有一块已启用 MIG 的 GPU。

  1. 验证 GPU 上已启用 MIG 且无 MIG 设备存在:

    nvidia-smi
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
    |-------------------------------+----------------------+----------------------+
    | 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  A100-SXM4-40GB      On   | 00000000:00:04.0 Off |                   On |
    | N/A   32C    P0    43W / 400W |      0MiB / 40537MiB |     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|                       |
    |==================+======================+===========+=======================|
    |  No MIG devices found                                                       |
    +-----------------------------------------------------------------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+
  2. 在 GPU(Nvidia A100)上创建 3 个不同大小的 MIG 设备:

    nvidia-smi mig -cgi 9,14,19 -C
    nvidia-smi -L
    GPU 0: A100-SXM4-40GB (UUID: GPU-4200ccc0-2667-d4cb-9137-f932c716232a)
    MIG 3g.20gb Device 0: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/2/0)
    MIG 2g.10gb Device 1: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/3/0)
    MIG 1g.5gb Device 2: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/9/0)
  3. 进入 管理员 -> Marketplace -> 集群插件 页面,切换到目标集群,然后部署或更新 Alauda Build of GPU Device Plugin 集群插件: 在配置表单中将 MIG 策略设置为 mixed

  4. 观察节点上有 3 个 MIG 设备可用,资源类型为 nvidia.com/gpu

    kubectl describe node {node-id}
    ...
    Capacity:
    nvidia.com/mig-1g.5gb:   1
    nvidia.com/mig-2g.10gb:  1
    nvidia.com/mig-3g.20gb:  1
    ...
    Allocatable:
    nvidia.com/mig-1g.5gb:   1
    nvidia.com/mig-2g.10gb:  1
    nvidia.com/mig-3g.20gb:  1
    ...
  5. 部署 3 个 Pod,每个 Pod 使用一个可用的 MIG 设备

    kubectl run -it --rm \
       --image=nvidia/cuda:12.4.1-base-ubuntu20.04 \
       --restart=Never \
       --limits=nvidia.com/mig-1g.5gb=1 \
       mig-mixed-example -- nvidia-smi -L
    GPU 0: A100-SXM4-40GB (UUID: GPU-4200ccc0-2667-d4cb-9137-f932c716232a)
    MIG 1g.5gb Device 0: (UUID: MIG-GPU-4200ccc0-2667-d4cb-9137-f932c716232a/9/0)
    pod "mig-mixed-example" deleted