助力深度学习!阿里开源可插拔 GPU 共享调度工具
根据 Gartner 对全球 CIO 的调查结果显示,人工智能将成为 2019 年组织革命的颠覆性力量。对于人工智能来说,算力即正义,成本即能力,利用 Docker 和 Kubernetes 代表云原生技术为 AI 提供了一种新的工作模式,将 GPU 机器放到统一的资源池进行调度和管理,这避免了GPU 资源利用率低下和人工管理的成本。因此,全球主要的容器集群服务厂商 Kubernetes 都提供了 Nvidia GPU 容器集群调度能力,但是通常都是将一个 GPU 卡分配给一个容器。这虽然可以实现比较好的隔离性,确保使用 GPU 的应用不会被其他应用影响;对于深度学习模型训练的场景也非常适合,但是,针对模型开发和模型预测的场景还是会显得比较浪费。基于此,大家有了共享 GPU 的集群调度需求。
Kubernetes 共享 GPU 集群调度
共享 GPU 的集群调度就是能够让更多的模型开发和预测服务共享同一个 GPU 卡,进而提高集群中 Nvidia GPU 的利用率。而这就需要提供 GPU 资源的划分,而这里 GPU 资源划分的维度指的就是 GPU 显存和 Cuda Kernel 线程的划分。通常在集群级别谈支持共享 GPU 是以下两件事情:
1.调度
2.隔离,我们这里主要讨论的是调度,隔离的方案目前需要用户通过应用限制(比如使用 Tensorflow 的per_process_gpu_memory_fraction 来控制),未来会提供基于 Nvidia 的 MPS 的可选项, 也会考虑 GPU 的方案。
而对于细粒度的 GPU 卡调度,目前 Kubernetes 社区并没有很好的方案,这是由于 Kubernetes 对于 GPU 这类扩展资源的定义仅仅支持整数粒度的加加减减,无法支持复杂资源的分配。比如用户希望使用 Pod A 占用半张 GPU卡,这在目前 Kubernetes 的架构设计中无法实现资源分配的记录和调用。这里挑战是多卡 GPU 共享是实际矢量资源问题,而 Extened Resource 是标量资源的描述。
针对此问题,我们设计了一个 Out Of Tree 的共享 GPU 调度方案,该方案依赖于 Kubernetes 的现有的工作机制:
Extended Resource 定义
Scheduler Extender 机制
Device Plugin 机制
Kubectl 的扩展机制
这个 GPU 共享调度扩展的好处是:利用 Kubernetes 的扩展和插件机制实现,对于 API Server,Scheduler,Controller Manager 以及 Kubelet 等核心组件没有侵入性。这就方便了使用者可以在不同 Kubernetes 版本上应用这个方案,无需 rebase 代码和重新构建 Kubernetes 二进制包。
用户场景
集群管理员:“我想提高集群的 GPU 使用率;在开发过程中,多个用户共享模型开发环境。”
应用开发人员:“我希望能够同时在 Volta GPU 上运行多个推理任务。”
目标
能够让使用者通过 API 描述对于一个可共享资源的申请, 并能实现该种资源的调度
非目标
不支持该共享资源的隔离
不支持超卖设计原则
明确问题简化设计,第一步只负责调度和部署,后续再实现运行时显存管控。
有很多的客户明确的诉求是首先可以支持多AI应用可以调度到同一个 GPU 上,他们可以接受从应用级别控制显存的大小,利用类似gpu_options.per_process_gpu_memory_fraction控制应用的显存使用量。那我们要解决的问题就先简化到以显存为调度标尺,并且把显存使用的大小以参数的方式传递给容器内部。
不做侵入式修改
本设计中不会修改 Kubernetes 核心的 Extended Resource 的设计, Scheduler 的实现,Device Plugin 的机制以及 Kubelet 的相关设计。重用 Extended Resource 描述共享资源的申请 API。这样的好处在于提供一个可以移植的方案,用户可以在原生 Kubernetes 上使用这个方案。
按显存和按卡调度的方式可以在集群内并存,但是同一个节点内是互斥的,不支持二者并存;要么是按卡数目,要么是按显存分配。
详细设计
前提:
依旧延用 Kubernetes Extended Resource 定义,但是衡量维度最小单位从 1 个 GPU 卡变为 GPU 显存的 MiB。如果所节点使用的 GPU 为单卡 16GiB 显存,它对应的资源就是 16276MiB;
由于用户对于共享GPU的诉求在于模型开发和模型预测场景,在此场景下,用户申请的GPU资源上限不会超过一张卡,也就是申请的资源上限为单卡。
而我们的工作首先是定义了两个新的 Extended Resource: 第一个是 gpu-mem, 对应的是 GPU 显存;第二个是 gpu-count,对应的是 GPU 卡数。 通过两个标量资源描述矢量资源, 并且结合这一资源,提供支持共享 GPU 的工作机制。下面是基本的架构图:
核心功能模块:
GPU Share Scheduler Extender: 利用 Kubernetes 的调度器扩展机制,负责在全局调度器 Filter 和 Bind 的时候判断节点上单个 GPU 卡是否能够提供足够的 GPU Mem,并且在 Bind 的时刻将 GPU 的分配结果通过 annotation 记录到 Pod Spec 以供后续 Filter 检查分配结果。
GPU Share Device Plugin: 利用 Device Plugin 机制,在节点上被 Kubelet 调用负责 GPU 卡的分配,依赖 scheduler Extender 分配结果执行。
具体流程:
资源上报
GPU Share Device Plugin 利用 nvml 库查询到 GPU 卡的数量和每张 GPU 卡的显存, 通过ListAndWatch()将节点的 GPU 总显存(数量 显存)作为另外 Extended Resource 汇报给 Kubelet; Kubelet 进一步汇报给 Kubernetes API Server。 举例说明,如果节点含有两块 GPU 卡,并且每块卡包含 16276MiB,从用户的角度来看:该节点的 GPU 资源为 16276 2 = 32552; 同时也会将节点上的 GPU 卡数量 2 作为另外一个 Extended Resource 上报。
2.2 当调度器找到满足条件的节点,就会委托 GPU Share Scheduler Extender 的 bind 方法进行节点和 Pod 的绑定,这里 Extender 需要做的是两件事情
如果此时发现分配节点上没有 GPU 资源符合条件,此时不进行绑定,直接不报错退出,默认调度器会在 assume 超时后重新调度。
调用 Kubernetes API 执行节点和 Pod 的绑定
相关项目
目前项目已经开源到 github.com 上
gpushare-scheduler-extender
gpushare-device-plugin
部署
请参照部署文档
测试样例
首先创建一个使用aliyun.com/gpu-mem的应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: binpack-1
labels:
app: binpack-1
spec:
replicas: 1
selector: # define how the deployment finds the pods it manages
matchLabels:
app: binpack-1
template: # define the pods specifications
metadata:
labels:
app: binpack-1
spec:
containers:
- name: binpack-1
image: cheyang/gpu-player:v2
resources:
limits:MiB
aliyun.com/gpu-mem: 1024
使用
请参照使用文档
构建
请参照如何构建
视频 Demo
Demo 1: 部署多个 GPU Share 的 Pod,发现他们以 binpack 的方式被放置到同一个 GPU 卡上
5
Demo 2: 避免错误调度申请资源超过单个 GPU 可用资源的 Pod
6
Roadmap
在 Device Plugin 中提供 Nvidia MPS 的可选支持;
支持该方案可以在由 kubeadm 初始化的 Kubernetes 集群自动化部署;
提升 Scheduler Extener 的高可用性;
为 GPU, RDMA 和弹性网卡提供通用方案。
转载于:https://blog.51cto.com/14031893/2359674
助力深度学习!阿里开源可插拔 GPU 共享调度工具相关推荐
- react router官方文档_阿里开源可插拔 React 跨端框架 UmiJS
点击上方"开发者技术前线",选择"星标" 18:30 在看 真爱 作者:Tamic | 编辑: 可可 阿里之前开源:阿里闲鱼开源 Flutter 应用框架 ...
- 阿里深度学习框架开源了!无缝对接TensorFlow、PyTorch
阿里巴巴内部透露将开源内部深度学习框架 X-DeepLearning的计划,这是业界首个面向广告.推荐.搜索等高维稀疏数据场景的深度学习开源框架,可以与TensorFlow.PyTorch 和 MXN ...
- MLPerf结果证实至强® 可有效助力深度学习训练
MLPerf结果证实至强® 可有效助力深度学习训练 · 核心与视觉计算事业部副总裁Wei Li通过博客回顾了英特尔这几年为提升深度学习性能所做的努力. · 目前根据英特尔® 至强® 可扩展处理器的ML ...
- ElasticDL:首个基于 TensorFlow 实现弹性深度学习的开源系统
9 月 11 日,蚂蚁金服开源了 ElasticDL 项目,据悉这是业界首个基于 TensorFlow 实现弹性深度学习的开源系统. Google Brain 成员 Martin Wicke 此前在公 ...
- PyTorch-Kaldi 深度学习语音识别开源软件
PyTorch-Kaldi 深度学习语音识别开源软件 论文:Ravanelli M (Mirco Ravanelli), Parcollet T, Bengio Y. The Pytorch-kald ...
- 【深度学习】模型训练过程可视化思路(可视化工具TensorBoard)
[深度学习]模型训练过程可视化思路(可视化工具TensorBoard) 文章目录 1 TensorBoard的工作原理 2 TensorFlow中生成log文件 3 启动TensorBoard,读取l ...
- FPGA在深度学习应用中或将取代GPU
FPGA在深度学习应用中或将取代GPU 本文来源:AI前线 作者 | Ben Dickson 译者 | 大小非 人工智能的兴起触发了市场对 GPU 的大量需求,但 GPU 在 AI 场景中的应用面临使 ...
- 恒源云GPU租用保姆级教程,助力深度学习训练!
文章来源 | 恒源云社区(专注人工智能/深度学习GPU免费加速平台,官方体验网址:https://gpushare.com) 恒源云史上最全的平台使用教程诞生了,用实力证明咱们能唱能跳产品好用,助力大 ...
- 微信正在用的深度学习框架开源!支持稀疏张量,基于C++开发
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 微信正用 ...
最新文章
- 输入输出 原理 java_java输入输出,书写规范,运行原理,跨平台原理(复习)...
- Linux下使用终端调试Python程序:pudb
- 本地图片转base64_从一道面试题说起:GET 请求能传图片吗?
- svn 413 Request Entity Too Large 错误的解决方法
- 一幅图秒懂LoadAverage(转载)
- 【Linux】GCC程序开发工具(上)
- mysql date 默认值_通过Oracle DB了解MySQL
- mpi并行 写同一文件_并行计算调度策略的笔记(001)
- paip.python错误解决14
- 用Java实现多线程下载
- pdf 加深 扫描件_扫描文字字体如何加深 pdf扫描件字体加深
- SMing:2022年中青杯A题思路
- PhotoBulk for Mac(图像批量添加水印工具)
- 浦发银行面试笔试经历
- opencv 数据库裁剪图片
- String类的trim()方法之不能消除的空格
- CSDN积分获取方法(转载,新人多积累财富)
- partition by
- Opencv PNG抠图
- 给力名字作诗,让我们的生活更加诗意盎然
热门文章
- C#中使用Directory实现对文件夹的常用操作
- SpringBoot中自定义消息转化器
- weblogic从入门到起飞(nodemanager)(五)
- 【Python】编程笔记1
- 用户故事的扩展-新的故事类别
- 贴花纸怎么贴_木纹纸怎么贴? 贴木纹纸的方法与详细步骤
- 桑文锋PMCAFF之行:数据驱动产品和运营决策
- Codeforces Round #552 (Div. 3)D、E题解
- linux下C/C++编译时系统搜索 include 和 链接库 文件路径的指定
- NLB网路负载均衡管理器详解