用尽每一寸GPU,阿里云cGPU容器技术白皮书重磅发布!

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 云原生已经成为业内云服务的一个趋势。在云原生上支持异构计算有助于提升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等版本随时升级无需适配等特性。

image.png
图1. cGPU容器架构图

cGPU内核驱动为一个自主研发的宿主机内核驱动。它的优点在于:
• 适配开源标准的Kubernetes和NVIDIA Docker方案;
• 用户侧透明。AI应用无需重编译,执行无需CUDA库替换;
• 针对NVIDIA GPU设备的底层操作更加稳定和收敛;
• 同时支持GPU的显存和算力隔离。

使用方式

1 利用阿里云容器服务

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

image.png

快速部署和使用的方式,可以参见阿里云开发者社区的文章:
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的容器服务。

a. 安装:
下载cGPU 安装包

解压后执行 sh install.sh 命令安装。
安装后使用lsmod | grep cgpu 命令验证是否按照成功:
lsmod | grep cgpu
cgpu_km 71355 0

b. 配置:

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

image.png

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

image.png

之后,就可以在每个容器内运行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容器实例都几乎没有性能损失。

image.png
图2. 单容器独占GPU--Resnet50 训练结果对比

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

image.png
图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容器。

image.png
图4. 多容器共享GPU--Resnet50训练结果对比

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

image.png
图5. 多容器共享GPU--Resnet50推理结果对比

总结

阿里云cGPU容器技术,作为业内首创的基于内核虚拟GPU隔离的GPU共享容器方案,在保证性能的前提下,做到了容器之间的GPU显存隔离和任务隔离,为客户充分利用GPU硬件资源进行训练和推理提供的有效保障。
同时, cGPU方案具有多种输出方式:客户既可以选择阿里云GPU容器服务,简单便捷的实现GPU容器服务的共享、调度和监控;又可以选择在阿里云ECS GPU实例上进行手动安装配置,灵活可控,方便的和已有GPU容器进行整合。

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

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
14天前
|
运维 Kubernetes Java
阿里云容器计算服务ACS ,更普惠易用、更柔性、更弹性的容器算力
ACS是阿里云容器服务团队推出的一款面向Serverless场景的子产品,基于K8s界面提供符合容器规范的CPU及GPU算力资源。ACS采用Serverless形态,用户无需关注底层节点及集群运维,按需申请使用,秒级按量付费。该服务旨在打造更普惠易用、更柔性、更弹性的新一代容器算力,简化企业上云门槛,加速业务创新。ACS支持多种业务场景,提供通用型、性能型及BestEffort算力质量,帮助客户更从容应对流量变化,降低综合成本。
|
19天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
14天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
2天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
15 4
|
14天前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
14天前
|
人工智能 Kubernetes Cloud Native
阿里云容器服务,智算时代云原生操作系统
2024云栖大会,阿里巴巴研究员易立分享了阿里云容器服务的最新进展。容器技术已成为云原生操作系统的基石,支持多样化的应用场景,如自动驾驶、AI训练等。阿里云容器服务覆盖公共云、边缘云、IDC,提供统一的基础设施,助力客户实现数字化转型和技术创新。今年,阿里云在弹性计算、网络优化、存储解决方案等方面进行了多项重要升级,进一步提升了性能和可靠性。
|
14天前
|
人工智能 Cloud Native 调度
阿里云容器服务在AI智算场景的创新与实践
本文源自张凯在2024云栖大会的演讲,介绍了阿里云容器服务在AI智算领域的创新与实践。从2018年推出首个开源GPU容器共享调度方案至今,阿里云容器服务不断推进云原生AI的发展,包括增强GPU可观测性、实现多集群跨地域统一调度、优化大模型推理引擎部署、提供灵活的弹性伸缩策略等,旨在为客户提供高效、低成本的云原生AI解决方案。
|
14天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
14天前
|
人工智能 运维 Kubernetes
拥抱智算时代:阿里云容器服务智能、托管、弹性新体验
本文总结了2024云栖大会容器计算专场的演讲内容,重点介绍了阿里云容器服务的新产品体验,包括智能、托管、弹性的特点,以及如何助力客户拥抱智算时代。文中还分享了多项实际案例和技术细节,展示了阿里云容器服务在提升用户体验和解决实际问题方面的努力。
|
24天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
56 3