通过节点池开启NVIDIA A100多实例GPU能力

更新时间: 2023-08-07 14:38:54

NVIDIA A100能够安全地划分为多达七个独立的GPU实例,能够为多个用户提供单独的GPU资源,进而提升GPU利用率。本文介绍如何通过节点池开启NVIDIA A100的多实例MIG(Multi-Instance GPU)能力。

前提条件

背景信息

GTC 2020,NVIDIA正式发布了搭载全新一代Amepere架构的Tesla A100,Ampere架构继承了前两代Volta和Turing架构的诸多优点,并增加了更多新的设计亮点,其中的一个重要特性是支持MIG。

NVIDIA A100由7个计算单元和8个内存单元组成,可以划分为多个大小相同(或不同)的 GPU 实例,每个GPU实例包含一定的计算单元和内存单元。

说明

内存指显存,每个内存单元为5 GB。

关于NVIDIA A100多实例GPU特性的更多信息,请参见NVIDIA A100多实例GPU用户指南

GPU实例规格的使用语法为:[compute]g.[memory]gb。例如,一个拥有1个计算单元和一个内存单元的GPU实例规格为:1g.5gb。在一张NVIDIA A100上可划分的MIG实例规格和数量如下所示:

实例规格

实例规格ID

单张A100最多划分实例数

每个实例的计算单元个数

每个实例内存单元个数

1g.5gb

19

7

1

1(5 GB)

2g.10gb

14

3

2

2(10 GB)

3g.20gb

9

2

3

4(20 GB)

4g.20gb

5

1

4

4(20 GB)

7g.40gb

0

1

7

8(40 GB)

使用节点池标签划分MIG

在创建节点池时,通过给节点池添加特定的标签,达到开启节点池内的节点的MIG能力。可通过以下两种方式指定划分MIG实例:

  • 指定单个MIG实例名称或ID

    该方式可在一张NVIDIA A100上划分多个相同的MIG实例规格,设置简单、便于理解。

  • 指定MIG实例规格序列

    该方式可在一张NVIDIA A100上自定义划分多种MIG实例规格,设置灵活。

方式一:指定单个MIG实例名称或ID

  • 节点池标签:ack.aliyun.com/gpu-partition-size

  • 标签值:单个MIG实例名称或ID(例如:1g.5gb或19)。

  • 示例:ack.aliyun.com/gpu-partition-size=1g.5gback.aliyun.com/gpu-partition-size=19

  • 含义:对每个NVIDIA A100按照指定的规格尽可能多的划分MIG。从上表中可以看到一张NVIDIA A100上最多可以划分7个规格为1g.5gb的MIG。

图 1. 容器服务控制台节点标签配置示例节点配置示例

方式二:指定MIG实例规格序列

  • 节点池标签:ack.aliyun.com/gpu-partition-sequence

  • 标签值:规格或ID序列(例如,1g.5gb-2g.10gb-3g.20gb或19-14-9),不过只有一些特定序列可用。

    A100目前支持18种序列,更多信息,请参见NVIDIA A100多实例GPU用户指南中的“A100 Supported Profiles”。

    ACK目前仅开放如下4种序列:

    索引号序列

    规格序列

    19-19-19-19-19-19-19

    1g.5gb-1g.5gb-1g.5gb-1g.5gb-1g.5gb-1g.5gb-1g.5gb

    14-14-14-19

    2g.10gb-2g.10gb-2g.10gb-1g.5gb

    9-9

    3g.20gb-3g.20gb

    5-19-19-19

    4g.20gb-1g.5gb-1g.5gb-1g.5gb

  • 示例:ack.aliyun.com/gpu-partition-sequence=3g.20gb-3g.20gback.aliyun.com/gpu-partition-sequence=9-9

  • 含义:对每个NVIDIA A100按照指定规格序列创建MIG实例。例如,对于序列3g.20gb-3g.20gb,NVIDIA A100会被划分为两个规格为3g.20gb的MIG。

    重要

    控制台标签的值不支持半角逗号(,),所以MIG序列需要使用短划线(-)连接。例如,在控制台填写标签ack.aliyun.com/gpu-partition-sequence=1g.5gb,2g.10gb,3g.20gb是不合法的,需要使用ack.aliyun.com/gpu-partition-sequence=1g.5gb-2g.10gb-3g.20gb

图 2. 容器服务控制台节点标签配置示例指定MIG实例规格序列

创建节点池

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏,单击集群
  3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏,选择节点管理 > 节点池
  5. 节点池页面,单击创建节点池

  6. 创建节点池对话框,配置节点池相关参数。

    有关配置项的详细说明,请参见创建GPU集群。部分配置项的说明如下所示:

    参数

    说明

    实例规格

    选择弹性裸金属服务器 > GPU型,选择名称首部为ecs.ebmgn7.的机型。

    节点标签

    在节点标签参数栏添加标签,单击添加图标图标,在文本框中输入ack.aliyun.com/gpu-partition-sequenceack.aliyun.com/gpu-partition-sequence,在文本框中输入相应的MIG实例规格或MIG序列。

    关于节点池标签的更多信息,请参见使用节点池标签划分MIG。此处以ack.aliyun.com/gpu-partition-sequence=3g.20gb-3g.20gb为例。

    添加节点标签
  7. 参数配置完成后,单击确认配置

验证节点池中的节点是否开启MIG功能

当节点池创建完成后,根据以下操作验证节点池中的节点是否开启MIG功能。

  1. 执行以下命令,查询开启MIG能力的节点。

    kubectl get nodes -l aliyun.accelerator/nvidia_mig_sequence

    预期输出:

    NAME                      STATUS   ROLES    AGE   VERSION
    cn-beijing.192.168.XX.XX   Ready    <none>   99s   v1.20.4-aliyun.1
  2. 执行以下命令,查看上述节点上报的MIG资源名称。

    资源名称的首部为nvidia.com/mig-

    kubectl get nodes cn-beijing.192.168.XX.XX -o yaml | grep " nvidia.com/mig-" | uniq

    预期输出:

    nvidia.com/mig-3g.20gb: "16"

    从预期输出可得,节点的资源名称为nvidia.com/mig-3g.20gb,该节点总共有16个3g.20gb MIG实例可用。

    说明

    节点上报的MIG资源名称与指定的MIG实例规格或规格序列有关。本文档以ack.aliyun.com/gpu-partition-sequence=3g.20gb-3g.20gb为例。

  3. 申请MIG资源。

    如果某个Pod需要申请MIG资源,需要在应用Pod的YAML中resources.limits部分填写MIG实例规格及个数。

    # 省略其他。
            resources:
              limits:
                nvidia.com/mig-<MIG实例规格,如3g.20gb>: <申请资源个数>
    .....
    1. 根据以下示例创建mig-sample.yaml文件。

      该示例申请了2个3g.20gb的MIG资源。

      cat > /tmp/mig-sample.yaml <<- EOF
      apiVersion: batch/v1
      kind: Job
      metadata:
        name: pytorch-mnist
      spec:
        parallelism: 1
        template:
          spec:
            containers:
            - name: pytorch-mnist
              image: registry.cn-beijing.aliyuncs.com/ai-samples/nvidia-pytorch-sample:20.11-py3
              command:
              - python
              - main.py
              resources:
                limits:
                  nvidia.com/mig-3g.20gb: 2 #申请2个3g.20gb的MIG实例。
            restartPolicy: Never
      EOF
    2. 执行以下命令,部署应用。

      kubectl apply -f /tmp/mig-sample.yaml
  4. 查看Pod是否处于Running状态,然后查看Pod日志。

    1. 执行以下命令,查看Pod是否处于Running状态。

      kubectl get pod

      预期输出:

      NAME                  READY   STATUS    RESTARTS   AGE
      pytorch-mnist-t2ncm   1/1     Running   0          2m25s
    2. 当Pod处于Running状态,执行以下命令查看Pod日志。

      kubectl logs pytorch-mnist-t2ncm

      预期输出:

      /opt/conda/lib/python3.6/site-packages/torchvision/datasets/mnist.py:480: UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at  ../torch/csrc/utils/tensor_numpy.cpp:141.)
        return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s)
      cuda is available:  True
      current device:  0
      current device name:  A100-SXM4-40GB MIG 3g.20gb
      Using downloaded and verified file: ../data/MNIST/raw/train-images-idx3-ubyte.gz
      Extracting ../data/MNIST/raw/train-images-idx3-ubyte.gz to ../data/MNIST/raw
      Using downloaded and verified file: ../data/MNIST/raw/train-labels-idx1-ubyte.gz
      Extracting ../data/MNIST/raw/train-labels-idx1-ubyte.gz to ../data/MNIST/raw
      Using downloaded and verified file: ../data/MNIST/raw/t10k-images-idx3-ubyte.gz
      Extracting ../data/MNIST/raw/t10k-images-idx3-ubyte.gz to ../data/MNIST/raw
      Using downloaded and verified file: ../data/MNIST/raw/t10k-labels-idx1-ubyte.gz
      Extracting ../data/MNIST/raw/t10k-labels-idx1-ubyte.gz to ../data/MNIST/raw
      Processing...
      Done!
      ......
  5. 进入容器并查看设备信息。

    1. 执行以下命令,进入容器。

      kubectl exec -ti pytorch-mnist-t2ncm bash
    2. 执行以下命令,查看设备信息。

      nvidia-smi -L

      预期输出:

      GPU 0: A100-SXM4-40GB (UUID: GPU-da5ae315-b486-77ea-9527-3cbbf5b9****)
        MIG 3g.20gb Device 0: (UUID: MIG-GPU-da5ae315-b486-77ea-9527-3cbbf5b9****/1/0)
      GPU 1: A100-SXM4-40GB (UUID: GPU-cc7ebb1f-902c-671c-3fcb-8daf49cc****)
        MIG 3g.20gb Device 0: (UUID: MIG-GPU-cc7ebb1f-902c-671c-3fcb-8daf49cc****/2/0)

      从预期输出中可看到两个规格为3g.20gb的MIG实例。

  6. Pod运行完成后,执行以下命令,查看Pod状态。

    kubectl get pod

    预期输出:

    NAME                  READY   STATUS      RESTARTS   AGE
    pytorch-mnist-t2ncm   0/1     Completed   0          3m1s

    若Pod处于Completed状态,表示节点池中的节点已开启MIG功能。

阿里云首页 容器服务 Kubernetes 版 ACK 相关技术圈