阿里云 cGPU 容器技术白皮书

 

凌云时刻 · 技术

导读:阿里云异构计算推出的 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云栖大会:技术的今生与未来尽收眼底

阿里云配额中心正式发布

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值