简介: 云原生曾经成为业内云服务的一个趋势。在云原生上反对异构计算有助于晋升CPU的利用率。一文剖析业内支流GPU共享计划,并通知你阿里云cGPU牛在哪里!阿里云异构计算推出的cGPU(container GPU)容器技术,翻新地提出了一种不同于以往的GPU容器计划,克服了业内支流计划的一些常见的缺点,在保障性能的前提下,做到了容器之间的GPU显存隔离和工作隔离,为客户充分利用GPU硬件资源进行训练和推理提供的无效保障。

作者:阿里云异构计算高级技术专家 何旻

背景

云原生曾经成为业内云服务的一个趋势。在云原生上反对异构计算,这个性能在规范的Docker上曾经能够很好的反对了。为了进一步提高GPU的利用率、防止算力节约,须要在单个GPU上能够运行多个容器,并且在多个容器间隔离GPU利用,这在规范的Docker上是无奈做到的。为了满足这一需要,业界也做了很多摸索。NVIDIA vGPU, NVIDIA MPS, 基于rCUDA的计划等,都为用户更小颗粒度的应用GPU提供了可能。

近日,阿里云异构计算推出的cGPU(container GPU)容器技术,翻新地提出了一种不同于以往的GPU容器计划,克服了业内支流计划的一些常见的缺点,在保障性能的前提下,做到了容器之间的GPU显存隔离和工作隔离,为客户充分利用GPU硬件资源进行训练和推理提供的无效保障。

业内罕用计划简介

在介绍阿里云异构计算cGPU计算技术前,咱们先看看业内有哪些GPU共享计划吧:

NVIDIA MPS

NVIDIA MPS (NVIDIA Multi-Process Service)是NVIDIA公司为了进行GPU共享而推出的一套计划,由多个CUDA程序共享同一个GPU context,从而达到多个CUDA程序共享GPU的目标。同时,在Volta GPU上,用户也能够通过CUDA_MPS_ACTIVE_THREAD_PERCENTAGE变量设定每个CUDA程序占用的GPU算力的比例。

然而因为多个CUDA程序共享了同一个GPU context,这样引入的问题就是:当一个CUDA程序解体或者是触发GPU谬误的时候,其余所有CUDA程序的工作都无奈继续执行上来了,而这对于容器服务是灾难性的问题。

NVIDIA vGPU

NVIDIA vGPU计划是GPU虚拟化的计划,能够对多用户的强GPU隔离计划。它次要利用于虚拟化平台中,每个vGPU的显存和算力都是固定的,无奈灵便配置;另外vGPU的应用须要额定从NVIDIA公司购买license,这里咱们就不再具体探讨。

rCUDA相似计划

业内还有一种罕用计划是通过替换CUDA库实现API层面的转发,而后通过批改显存调配,工作提交等API函数来达到多个容器共享GPU的目标。这种计划的毛病是须要对动态链接的程序从新编译,同时在CUDA库降级的时候也须要进行批改来适配新版本。

阿里云cGPU容器技术

阿里云异构计算GPU团队推出了cGPU计划,相比其余计划,这是一个颠覆性的翻新:通过一个内核驱动,为容器提供了虚构的GPU设施,从而实现了显存和算力的隔离;通过用户态轻量的运行库,来对容器内的虚构GPU设施进行配置。阿里云异构计算cGPU在做到算力调度与显存隔离的同时,也做到了无需替换CUDA动态库或动静库;无需从新编译CUDA利用;CUDA,cuDNN等版本随时降级无需适配等个性。


图1. cGPU容器架构图

cGPU内核驱动为一个自主研发的宿主机内核驱动。它的长处在于:
• 适配开源规范的Kubernetes和NVIDIA Docker计划;
• 用户侧通明。AI利用无需重编译,执行无需CUDA库替换;
• 针对NVIDIA GPU设施的底层操作更加稳固和收敛;
• 同时反对GPU的显存和算力隔离。

应用形式

1 利用阿里云容器服务

阿里云容器服务曾经反对cGPU容器组件了,通过登录容器服务 Kubernetes 版控制台,只须要简略的点击几下,为容器节点打标,就能够利用cGPU容器隔离,最大化的利用GPU的硬件能力了。同时,还能够通过Prometheus的监控能力查看每个cGPU容器内的显存用量,在享受低成本的同时,保障了利用的可靠性。

疾速部署和应用的形式,能够参见阿里云开发者社区的文章:
https://developer.aliyun.com/article/762973
更具体的应用文档,能够参考阿里云的帮忙文档:
https://help.aliyun.com/document_detail/163994.html

2 在阿里云GPU实例上应用cGPU容器

为了更灵便的反对各种客户的须要,咱们也凋谢了阿里云GPU实例上应用cGPU容器的能力。cGPU依赖 Docker 和 NVIDIA Docker,在应用cGPU前,请确保环境能够失常创立带GPU的容器服务。

  1. 装置:
    下载cGPU 安装包:

wget http://cgpu.oss-cn-hangzhou.aliyuncs.com/cgpu-0.8.tar.gz

解压后执行 sh install.sh 命令装置。
装置后应用lsmod | grep cgpu 命令验证是否依照胜利:
lsmod | grep cgpu
cgpu_km 71355 0

  1. 配置:

cGPU组件会检测以下docker的环境变量,进行相应操作:
• ALIYUN_COM_GPU_MEM_DEV:为正整数,示意为host上每张卡的总显存大小。
• ALIYUN_COM_GPU_MEM_CONTAINER: 为正整数,指定容器内可见的显存容量。此参数同

ALIYUN_COM_GPU_MEM_DEV一起设定cGPU内可见的显存大小。如在一张4G显存的显卡上,咱们能够通  过-e ALIYUN_COM_GPU_MEM_DEV=4 -e ALIYUN_COM_GPU_MEM_CONTAINER=1的参数为容器调配1G显存。如果不指定此参数,则cGPU不会启动,此时会默认应用NVIDIA容器。

• ALIYUN_COM_GPU_VISIBLE_DEVICES:为正整数或uuid,指定容器内可见的GPU设施。如在一个有4张显卡的机器上,咱们能够通过-e ALIYUN_COM_GPU_VISIBLE_DEVICES=0,1来为容器调配第一和第二张显卡。或是-e ALIYUN_COM_GPU_VISIBLE_DEVICES=uuid1,uuid2,uuid3为容器调配uuid为uuid1,uuid2,uuid3z的3张显卡。
• CGPU_DISABLE:总开关,用于禁用cGPU。能够承受的参数是-e CGPU_DISABLE=true或-e CGPU_DISABLE=1,此时cGPU将会被禁用,默认应用nvidia容器。
• ALIYUN_COM_GPU_SCHD_WEIGHT 为正整数,有效值是1 - min(max_inst, 16),用来设定容器的算力权重。

c 运行演示:
以GN6i 单卡T4 为例,实现2个容器共享应用1个显卡。执行如下命令,别离创立2个docker 服务,设置显存别离为6G和8G。
docker run -d -t --gpus all --privileged --name gpu_test1 -e ALIYUN_COM_GPU_MEM_CONTAINER=6 -e ALIYUN_COM_GPU_MEM_DEV=15 nvcr.io/nvidia/tensorflow:19.10-py3
docker run -d -t --gpus all --privileged --name gpu_test2 -e ALIYUN_COM_GPU_MEM_CONTAINER=8 -e ALIYUN_COM_GPU_MEM_DEV=15 nvcr.io/nvidia/tensorflow:19.10-py3

如下图,进入Docker(gpu_test1) 后,执行nvidia-smi 命令,能够看到T4显卡的总内存为6043M

如下图,进入Docker(gpu_test2) 后,执行nvidia-smi 命令,能够看到T4显卡的总内存为8618M。

之后,就能够在每个容器内运行GPU训练或者推理的工作了。

性能剖析

在应用过程中,用户常常关怀的就是性能问题,cGPU容器计划会对性能有多少影响呢?上面是咱们的一组测试数据,在罕用的tensorflow框架下用benchmark工具别离测试了模型推理和训练性能。
以下数据的测试机为阿里云上的GPU型实例,具备8核CPU,32G内存,以及一张带有16G显存的NVIDIA T4显卡。测试数据为单次测试后果,因而可能会带有误差。

1 单cGPU容器 VS 单GPU直通性能比拟

咱们别离在cGPU容器外部以及规范的Docker容器外部跑测试,为cGPU容器内的GPU实例调配所有的显存和算力,来显示在不共享GPU的状况下的cGPU是否有性能损失。

下图是ResNet50训练测试在不同精度和batch_size下的性能比拟,绿色柱示意规范的容器性能,橙色柱示意cGPU容器内的性能,能够看到在不同的状况下,cGPU容器实例都简直没有性能损失。


图2. 单容器独占GPU--Resnet50 训练后果比照

下图是ResNet50推理测试在不同精度和batch_size下的性能比拟,同样的在不同的状况下,cGPU容器实例都简直没有性能损失。


图3. 单容器独占GPU--Resnet50 推理后果比照

2 cGPU容器 VS MPS容器GPU共享性能比拟

如前文所述,规范的Docker容器不反对共享,为了测试多容器共享单个GPU的性能,咱们采纳了MPS容器作为基准来进行性能比拟。同样的,咱们采纳了ResNet50的训练和推理benchmark作为测试用例,别离用两个cGPU容器和两个MPS容器共享一个GPU硬件。

下图是ResNet50训练测试在不同batch_size下的性能比拟,绿色柱示意两个MPS容器性能跑分的总和,橙色柱示意两个cGPU容器跑分的总和,能够看到,cGPU容器实例比照MPS容器简直没有性能损失,在大的batch_size的状况下甚至跑分高于MPS容器。


图4. 多容器共享GPU--Resnet50训练后果比照

下图是ResNet50推理测试在不同batch_size下的性能比拟,MPS容器和cGPU容器的性能差距不大,根本都在误差范畴之内。


图5. 多容器共享GPU--Resnet50推理后果比照

总结

阿里云cGPU容器技术,作为业内独创的基于内核虚构GPU隔离的GPU共享容器计划,在保障性能的前提下,做到了容器之间的GPU显存隔离和工作隔离,为客户充分利用GPU硬件资源进行训练和推理提供的无效保障。
同时, cGPU计划具备多种输入形式:客户既能够抉择阿里云GPU容器服务,简略便捷的实现GPU容器服务的共享、调度和监控;又能够抉择在阿里云ECS GPU实例上进行手动装置配置,灵便可控,不便的和已有GPU容器进行整合。

产品详情:https://yqh.aliyun.com/live/cgpu_release