简介: 云原生曾经成为业内云服务的一个趋势。在云原生上反对异构计算有助于晋升 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 的容器服务。
- 装置:
下载 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
- 配置:
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 容器进行整合。
原文链接
本文为阿里云原创内容,未经容许不得转载。