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

前提条件

  • 已创建异构计算集群,且集群版本不低于1.20.4。具体操作,请参见创建异构计算集群
    注意 目前只有弹性裸金属服务器A100机型(即名称首部为ecs.ebmgn7.的机型)支持MIG功能,直通ECS A100机型(即名称首部为ecs.gn7.的机型)并不支持开启MIG能力。关于弹性裸金属服务器的更多信息,请参见弹性裸金属服务器概述
  • 已通过Kubectl工具连接异构计算集群。具体操作,请参见通过kubectl工具连接集群

背景信息

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-<实例规格名称,如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功能。