通过节点池开启NVIDIA A100多实例GPU能力
NVIDIA A100能够安全地划分为多达七个独立的GPU实例,能够为多个用户提供单独的GPU资源,进而提升GPU利用率。本文介绍如何通过节点池开启NVIDIA A100的多实例MIG(Multi-Instance GPU)能力。
前提条件
已创建异构计算集群,且集群版本不低于1.20.4。具体操作,请参见创建异构计算集群。
重要目前只有弹性裸金属服务器A100机型(即名称首部为ecs.ebmgn7.的机型)支持MIG功能,直通ECS A100机型(即名称首部为ecs.gn7.的机型)并不支持开启MIG能力。关于弹性裸金属服务器的更多信息,请参见弹性裸金属服务器概述。
已通过Kubectl工具连接异构计算集群。具体操作,请参见获取集群KubeConfig并通过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.5gb
或ack.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.20gb
或ack.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. 容器服务控制台节点标签配置示例
创建节点池
- 登录容器服务管理控制台。
- 在控制台左侧导航栏,单击集群。
- 在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏,选择 。
在节点池页面,单击创建节点池。
在创建节点池对话框,配置节点池相关参数。
有关配置项的详细说明,请参见创建GPU集群。部分配置项的说明如下所示:
参数
说明
实例规格
选择
,选择名称首部为ecs.ebmgn7.的机型。节点标签
在节点标签参数栏添加标签,单击
图标,在键文本框中输入
ack.aliyun.com/gpu-partition-sequence
或ack.aliyun.com/gpu-partition-sequence
,在值文本框中输入相应的MIG实例规格或MIG序列。关于节点池标签的更多信息,请参见使用节点池标签划分MIG。此处以
ack.aliyun.com/gpu-partition-sequence=3g.20gb-3g.20gb
为例。参数配置完成后,单击确认配置。
验证节点池中的节点是否开启MIG功能
当节点池创建完成后,根据以下操作验证节点池中的节点是否开启MIG功能。
执行以下命令,查询开启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
执行以下命令,查看上述节点上报的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
为例。申请MIG资源。
如果某个Pod需要申请MIG资源,需要在应用Pod的YAML中
resources.limits
部分填写MIG实例规格及个数。# 省略其他。 resources: limits: nvidia.com/mig-<MIG实例规格,如3g.20gb>: <申请资源个数> .....
根据以下示例创建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
执行以下命令,部署应用。
kubectl apply -f /tmp/mig-sample.yaml
查看Pod是否处于Running状态,然后查看Pod日志。
执行以下命令,查看Pod是否处于Running状态。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE pytorch-mnist-t2ncm 1/1 Running 0 2m25s
当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! ......
进入容器并查看设备信息。
执行以下命令,进入容器。
kubectl exec -ti pytorch-mnist-t2ncm bash
执行以下命令,查看设备信息。
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实例。
Pod运行完成后,执行以下命令,查看Pod状态。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE pytorch-mnist-t2ncm 0/1 Completed 0 3m1s
若Pod处于Completed状态,表示节点池中的节点已开启MIG功能。