如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化

介绍

在GTC 2020(5月14日)大会上英伟达新一代架构“Ampere”(安培)正式亮相。继数据中心Volta GPU推出三年后终于亮剑。Ampere以数据中心GPU A100的形式首次亮相,专为科学计算,云图形和数据分析而构建。





如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化

TensorCore

A100 GPU 包括19.5 teraflops的FP32计算力,6912个FP32 CUDA Core,评价每个SM上64个,40GB内存。在性能上相比V100有较大的提升,装载了第三代TensorCore,在HPC和深度学习场景的稀疏矩阵,吞吐是V100的2倍。

  • 第三代TensorCore 加速支持 FP16, BF16, TF32, FP64, INT8, INT4, 和 Binary 等数据类型
  • 支持更多精度的选择,TF32 计算可以加速深度学习和HPC 应用中的FP32的输入和输出,速度是V100的FP32 FMA 10倍, 稀疏矩阵下20倍。
  • FP16 / FP32 混合精度的深度学习任务, 速度是V100的2.5倍, 稀疏矩阵下5倍
  • INT8 比 V100 INT8 快20倍
  • HPC FP64处理比V100 快2.5倍

如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化



如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化

MIG

第二个重要特性就是Mig(Multi-Instance GPU)虚拟化技术和GPU分区能力。无需额外费用即可提供多达7倍的GPU实例。
MIG 特性可以将每个 A100 划分为多达 7 个 GPU 实例以实现最佳利用率,有效地扩展了对每个用户和应用程序的访问。
新 MIG 功能可以将单个 GPU 划分为多个GPU分区,每个GPU实例分区的SMs在整个内存系统中都有独立的独立路径—— 片上交叉条端口、二级缓存库、内存控制器和 DRAM 地址总线都是唯一分配给单个实例的。这确保了单个用户的工作负载,即时实例的二级缓存和DRAM负载非常高,也不会对其他分区造成影响,为每个GPU分区实例提供了QOS(服务保证),提供故障隔离。







如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化

加速的 GPU 实例只能在完全物理 GPU 粒度下用于不同组织的用户,即使用户应用程序不需要完整的 GPU 。



如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化

具有 MIG 图的 CSP 多用户。来自同一个或不同组织的多个独立用户可以在一个物理 GPU 内分配他们自己的专用、受保护和隔离的 GPU 实例。

Kubernetes 上使用MIG

容器服务ACK提供纳管MIG GPU实例的功能,在控制台上可以一键购买或者添加带有A100 的GPU实例, 并纳管到Kubernetes中。

创建实例

在控制台上创建一个ACK集群,选择创建节点池,在节点池配置中选择 ecs.ebmgn7.26xlarge  规格,设置节点数量,并确认。

如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化

创建完成后,可以在节点池列表查看到节点池中的实例。

如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化

配置MIG

查看GPU 信息

登陆上ECS 实例,查看GPU 信息。 可以查看到实例上有8个A100 GPU实例,每个GPU是独立完整运行,未开启MIG。
如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化

查看支持Mig的规格

执行命令可以指定一个A100 实例查看可分区的规格

nvidia-smi mig -i 0 -lgip

如何通过ACK 纳管Nvidia A100 GPU实例,实现资源池化


可以看到,节点上id 为0 的这个A100 GPU实例,支持5个分区规格,分别是 1g.5gb / 2g.10gb / 3g.20gb / 4g.20gb / 7g.40gb  ,分别代表不同的显存大小,由于大小不同,一个GPU能支持的分区数量也不同。
根据第二列的id 可以知道每个规格的标识,在执行分区时会用到。

执行MIG 分区

我们指定上图中的执行命令

# nvidia-smi mig -i 0 -cgi 9,14,19,19
Successfully created GPU instance ID  2 on GPU  0 using profile MIG 3g.20gb (ID  9)
Successfully created GPU instance ID  3 on GPU  0 using profile MIG 2g.10gb (ID 14)
Successfully created GPU instance ID  9 on GPU  0 using profile MIG 1g.5gb (ID 19)
Successfully created GPU instance ID 10 on GPU  0 using profile MIG 1g.5gb (ID 19)

nvidia-smi mig -i 0 -cci
Successfully created compute instance ID  0 on GPU  0 GPU instance ID  9 using profile MIG 1g.5gb (ID  0)
Successfully created compute instance ID  0 on GPU  0 GPU instance ID 10 using profile MIG 1g.5gb (ID  0)
Successfully created compute instance ID  0 on GPU  0 GPU instance ID  3 using profile MIG 2g.10gb (ID  1)
Successfully created compute instance ID  0 on GPU  0 GPU instance ID  2 using profile MIG 3g.20gb (ID  2)

上述命令会将 0号GPU 做MIG 分区,虚为4块GPU,分别是一个编号9 (3g.20gb), 一个14 (2g.10gb),2个19 (1g.5gb) 。

查看分区

完成MIG分区后,执行 nvidia-smi  即可看到MIG 实例。

nvidia-smi

在MIG device 这一栏中可以看到MIG实例信息:

+-----------------------------------------------------------------------------+
| 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  |     11MiB / 20096MiB | 42      0 |  3   0    2    0    0 |
|                  |      0MiB / 32767MiB |           |                       |
+------------------+----------------------+-----------+-----------------------+
|  0    3   0   1  |      7MiB /  9984MiB | 28      0 |  2   0    1    0    0 |
|                  |      0MiB / 16383MiB |           |                       |
+------------------+----------------------+-----------+-----------------------+
|  0    9   0   2  |      3MiB /  4864MiB | 14      0 |  1   0    0    0    0 |
|                  |      0MiB /  8191MiB |           |                       |
+------------------+----------------------+-----------+-----------------------+
|  0   10   0   3  |      3MiB /  4864MiB | 14      0 |  1   0    0    0    0 |
|                  |      0MiB /  8191MiB |           |                       |
+------------------+----------------------+-----------+-----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

根据这个方法,可以将机器上所有GPU 的MIG 做好划分。

重启Device Plugin

当给节点上所有GPU做完MIG配置后,更新节点上的GPUDevicePlugin, 将mig策略打开

sed -i 's/"--pass-device-specs"/"--pass-device-specs", "--mig-strategy=mixed"/g' /etc/kubernetes/manifests/nvidia-device-plugin.yml


DevicePlugin 正常运行后可以看到节点上注册了MIG 实例对应的资源:

kubectl describe node <your node>

Capacity:
 cpu:                     104
 ephemeral-storage:       123722704Ki
 hugepages-1Gi:           0
 hugepages-2Mi:           0
 memory:                  791733364Ki
 nvidia.com/gpu:          0
 nvidia.com/mig-1g.5gb:   16
 nvidia.com/mig-2g.10gb:  8
 nvidia.com/mig-3g.20gb:  8

部署应用

部署应用,声明使用 mig-2g.10gb 型号的GPU

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: smi
spec:
  restartPolicy: OnFailure
  containers:
  - name: nvidia-smi
    command:
    - nvidia-smi 
    - -L
    image: nvidia/cuda:9.0-base
    resources:
      limits:
        nvidia.com/mig-2g.10gb: 1
      requests:
        nvidia.com/mig-2g.10gb: 1
EOF


查看日志

# kubectl logs smi
GPU 0: A100-SXM4-40GB (UUID: GPU-7780f282-99a1-7024-f7a4-65a55230ed76)
  MIG 2g.10gb Device 0: (UUID: MIG-GPU-7780f282-99a1-7024-f7a4-65a55230ed76/3/0)

总结

相比上代Volta架构的V100,A100 的INT8推理、FP32训练性能提升20倍,FP64计算性能提升2.5倍,是历史上进步最大的一次,是NVIDIA GPU 计算一个巨大的飞跃。 A100 中创新提出MIG 多GPU分区技术,能在保障QoS 和隔离的情况下将一块GPU切分成不同大小的GPU实例,利用MIG功能能够将我们的GPU变成一个灵活的资源池,根据使用情况动态分配GPU分区。
目前Kubernetes 使用MIG 的方式需要用户在机器上手动执行MIG 分区,后续ACK团队也会持续关注探索,紧跟用户需求,提供用户更友好地GPU池化能力。

上一篇:不写代码也可以驾驭阿里云OpenAPI


下一篇:NVIDIA GPU 支持Containerd 小结