凌云时刻 · 技术

导读:阿里云异构计算推出的 cGPU 容器技术为客户充分利用 GPU 硬件资源进行训练和推理提供有效保障。

作者 | 何旻
来源 | 凌云时刻(微信号:linuxpk

前言

云原生已经成为业内云服务的一个趋势。在云原生上支持异构计算,这个功能在标准的 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 等版本随时升级无需适配等特性。

cGPU 容器架构图

cGPU 内核驱动为一个自主研发的宿主机内核驱动。它的优点在于:

  • 适配开源标准的 Kubernetes 和 NVIDIA Docker 方案;

  • 用户侧透明。AI 应用无需重编译,执行无需 CUDA 库替换;

  • 针对 NVIDIA GPU 设备的底层操作更加稳定和收敛;

  • 同时支持 GPU 的显存和算力隔离。

使用方式

 利用阿里云容器服务

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

快速部署和使用的方式,可以复制下方链接至浏览器打开,参见阿里云开发者社区的文章:
https://developer.aliyun.com/article/762973

更详细的使用文档,可以复制下方链接至浏览器打开,参考阿里云的帮助文档:
https://help.aliyun.com/document_detail/163994.html

 在阿里云 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
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),用来设定容器的算力权重。

 运行演示

以 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 显卡。测试数据为单次测试结果,因此可能会带有误差。

 单 cGPU 容器   VS   单 GPU 直通性能比较

我们分别在 cGPU 容器内部以及标准的 Docker 容器内部跑测试,为 cGPU 容器内的 GPU 实例分配所有的显存和算力,来显示在不共享 GPU 的情况下的 cGPU 是否有性能损失。

下图是 ResNet50 训练测试在不同精度和 batch_size 下的性能比较,绿色柱表示标准的容器性能,橙色柱表示 cGPU 容器内的性能,可以看到在不同的情况下,cGPU 容器实例都几乎没有性能损失。

单容器独占 GPU —— Resnet50 训练结果对比

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

单容器独占 GPU —— Resnet50 推理结果对比

 cGPU 容器   VS   MPS 容器 GPU 共享性能比较

如前文所述,标准的 Docker 容器不支持共享,为了测试多容器共享单个 GPU 的性能,我们采用了 MPS 容器作为基准来进行性能比较。同样的,我们采用了 ResNet50 的训练和推理 benchmark 作为测试用例,分别用两个 cGPU 容器和两个 MPS 容器共享一个 GPU 硬件。

下图是 ResNet50 训练测试在不同 batch_size 下的性能比较,绿色柱表示两个 MPS 容器性能跑分的总和,橙色柱表示两个 cGPU 容器跑分的总和,可以看到, cGPU 容器实例对比 MPS 容器几乎没有性能损失,在大的 batch_size 的情况下甚至跑分高于 MPS 容器。

多容器共享 GPU —— Resnet50 训练结果对比

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

多容器共享 GPU —— Resnet50 推理结果对比

结语

阿里云 cGPU 容器技术,作为业内首创的基于内核虚拟 GPU 隔离的 GPU 共享容器方案,在保证性能的前提下,做到了容器之间的 GPU 显存隔离和任务隔离,为客户充分利用 GPU 硬件资源进行训练和推理提供的有效保障。

同时,cGPU 方案具有多种输出方式:客户既可以选择阿里云 GPU 容器服务,简单便捷的实现 GPU 容器服务的共享、调度和监控;又可以选择在阿里云 ECS GPU 实例上进行手动安装配置,灵活可控,方便的和已有 GPU 容器进行整合。

END

往期精彩文章回顾

一家典型的云原生企业,如何在创业早期数次“弯道超车”?

阿里云配额中心正式发布

以用户为师,报喜鸟用需求助力云备份产品创新

2020云栖大会:技术的今生与未来尽收眼底

阿里云配额中心正式发布

物联网的“最好”与“最坏”之间往往只差了一个“安全”

云网络十年:探路者阿里云的理想和坚持

重磅预告!企业上云的正确姿势

蒋江伟:代码是我们最重要的资产!

云原生:重新定义信息产业生态体系

长按扫描二维码关注凌云时刻

每日收获前沿技术与科技洞见

阿里云 cGPU 容器技术白皮书相关推荐

  1. 阿里云边缘容器服务、申通 IoT 云边端架构入选 2021 云边协同发展阶段性领先成果

    2021 年 6 月 4 日,由中国信息通信研究院(以下简称"中国信通院")主办的 " 2021 云边协同大会 " 在北京举行.本次会议以 " 开启分 ...

  2. CloudCare容器技术白皮书

    DevOps的方法论已经广泛应用到各种有开发,测试,运维团队的场景中,实际落地案例下在资源编排,容器集群管理,镜像仓库管理,容器服务监控上有大量的技术平台和技术栈组合.结合CloudCare在大量企业 ...

  3. 应用10秒部署、成本降低50% 阿里云serverless容器改写云计算极限

    在将应用部署时间从以天计缩短到以小时计后,云计算正进入秒计时代:阿里云推出的最新计算形态Serverless容器服务改写了云计算极限,单实例启动时间为创世界纪录的10秒,1分钟可弹出1000实例,这使 ...

  4. 精彩回顾 | 阿里云APM城市技术行·深圳站

    " 前端业务越来越丰富,底层架构越来越复杂,计算资源越来越多元化,单一的APM产品如何支撑构建云上应用的完整监控体系,保障平台的稳定性?近期在深圳举行的阿里云APM城市技术行活动给出了答案. ...

  5. 阿里云发布城市大脑白皮书,公布三大衡量标准

    今天,阿里云研究中心发布<城市大脑探索"数字孪生城市"白皮书>,指出真正的"城市大脑"应有三大衡量标准,市场应该学会去伪存真.据统计,智慧城市的投入 ...

  6. 在阿里云Kubernetes容器服务上打造TensorFlow实验室

    简介 Jupyter notebook是强大的数据分析工具,它能够帮助快速开发并且实现机器学习代码的共享,是数据科学团队用来做数据实验和组内合作的利器,也是机器学习初学者入门这一个领域的好起点. 而T ...

  7. 数据库诞生40年,阿里云AWS用技术推动第三次变革

    本文讲的是数据库诞生40年,阿里云AWS用技术推动第三次变革,数据库诞生于上世纪50/60年代.1961年美国通用公司研发第一个数据库系统DBMS诞生.1976年霍尼韦尔公司(Honeywell)开发 ...

  8. 阿里云数据库2020技术年报新鲜出炉,全力开启牛年新征程!

    简介:阿里云数据库2020技术年报 祝大家元宵节快乐 心圆梦圆,阖家团圆 牛年"犇"向新征程! 原文链接:https://developer.aliyun.com/article/ ...

  9. 阿里云Kubernetes容器服务上体验Knative

    概述 Knative Serving是一种可缩放至零.请求驱动的计算运行环境,构建在 Kubernetes 和 Istio 之上,支持为 serverless 应用.函数提供部署与服务.Knative ...

  10. 阿里云的专业技术认证分为哪些?为啥要获得阿里云的ACP认证!

    1.阿里云的专业技术认证分为哪些? 阿里云的专业技术认证路线为 ACA(Alibaba Cloud Certification Associate ).ACP(Alibaba Cloud Certif ...

最新文章

  1. centos卸载harbor_【Harbor】Harbor镜像仓库的安装与历史版本镜像的清理
  2. 深圳大学 c语言,深圳大学C语言实验(3页)-原创力文档
  3. 实习第一周(Golang)
  4. MAKEWPARAM 宏 及MAKELONG ,MAKELPARAM,MAKELRESULT
  5. oracle 复制组删除,利用copy在ASM磁盘组之间迁移
  6. 双城记s001_双城记! (使用数据讲故事)
  7. Django-安装xadmin的方法及主要配置方法
  8. mysql主从搭建教程
  9. 存储盟主将要退位云计算会是最后盟主?
  10. CentOS安装NVidia驱动提示kernel source path问题
  11. CSDN写博客添加代码两种方法
  12. 专业的数据库连接工具:DBeaverEE for Mac中文版
  13. 运维、开发、测试等 IT 岗位薪酬体系大公开!你拖后腿了吗?
  14. 模拟赛 东风谷早苗
  15. 环信webIM即时通讯学习笔记
  16. linux下,pip安装lap出现问题 ,已解决,亲测有效
  17. typeof(undefined) == undefined 成立吗?
  18. 达梦redo log损坏的处理办法
  19. numpy ndarray嵌套ndarray浅显理解
  20. 龙门标局:R商标是指什么?购买的商标能标注R吗?

热门文章

  1. Source Insight 3.5 序列号分享
  2. java入门第五步之数据库项目实战
  3. Windows 2003网络负载均衡的实现
  4. 函数名的使用-闭包-迭代器
  5. centos7.5配置ntp时间服务器
  6. linux audit审计(7)--读懂audit日志
  7. Flash 显示全景图
  8. Python游戏开发入门3 Pygame屏幕绘制机制
  9. 20200627每日一句
  10. 190430每日一句