ElasticDL:蚂蚁金服开源基于TensorFlow的弹性分布式深度学习系统

  • 时间:
  • 浏览:0
  • 来源:彩神大发快3官方-彩神app官方

9 月 11 日,蚂蚁金服在2019谷歌开发者大会上海站上开源了 ElasticDL 项目,这是业界首个基于 TensorFlow 实现弹性层厚学习的开源系统。

开源地址为:elasticdl.org

开源中国采访了ElasticDL项目负责人王益,对该层厚学习系统的技术细节进行了全面介绍。

一、基于 TensorFlow 2.0 和 Kubernetes 实现弹性层厚学习

这名 基于 Eager Execution 模式的开源项目名为“ElasticDL”,它是另两个 Kubernetes 原生层厚学习框架,根据介绍,ElasticDL 主要有四大特点:

l 容错性

l 弹性调度

l 易用性

l 高效

其中又以容错与弹性调度社会形态最具特色。

ElasticDL 实现了容错和弹性调度的分布式层厚学习,还也能极大提升集群的总体利用率,并肩显著减少用户提交作业另另两个 守候作业启动的时间(pending time)。

王益介绍:“ElasticDL 是亲们知道的第另两个 基于 TensorFlow 实现弹性层厚学习的开源系统。具体地说,ElasticDL 是基于 TensorFlow 2.0 和 Kubernetes 实现弹性层厚学习的。”

(一)集群效用从 1/N 到 N/N

在层厚学习技术研发的早期,公用另两个 计算集群的人相对少, 计算作业之间的协调还也能通过口头交流实现。开发者更关心缩短运行时间,也什么都有从作业启动到现在开始英语 英语 的这段时间。高性能计算技术(HPC)是除理这名 问题报告 的有效途径,比如 NVIDIA 的 cuBLAS 和 cuDNN 优化高性能数学计算、NCCL 优化 GPU 之间的通信数率单位。

随着层厚学习技术的大规模应用,在什么都有有工程师和研究员公用另两个 集群的请况下,通过商量来协调调度显然不可行,于是亲们现在开始英语 英语 使用集群管理系统调度分布式作业。

Kubernetes 近年来可能逐渐成为集群管理的重要工具,目前可能在各大公有云中广泛采用。要是 ,让 TensorFlow 能更好地运行在 Kubernetes 集群上,并肩提升利用集群进行层厚学习的数率单位和资源利用率(效用),显得非常具有实际意义。

关于提升集群资源利用率,王益举了另两个 比较极端的例子:假设另两个 集群有 N 个 GPU,而另两个 任务只使用其中另两个 ,现在有另两个 任务占用了另两个 GPU。当这样弹性调度机制时,另两个 要求所有 N 个 GPU 的任务需要守候前另两个 任务现在开始英语 英语 也能现在开始英语 英语 ,这名 守候时间可能高达数天甚至数周,在守候期间,集群的效用是 1/N;而拥有弹性调度能力另另两个 ,新的任务还也能在 N-1 个 GPU 上立即运行,要是 Kubernetes 还也能在第另两个 任务完成后将占用的 GPU 赋予这名 任务,这名 请况下,集群整体效用是 1000%。

ElasticDL 在容错与弹性调度上全部都是不错的表现,它的现实意义便是高效除理集群效用问题报告 。

(二)ElasticDL 怎样实现?

前边讲到集群资源利用率提高的前提真是什么都有 ElasticDL 的“弹性调度”社会形态带来的,而弹性调度依赖于容错能力。

容错是指作业不受其中程序运行数量变化的影响,在弹性调度过程中,作业里的程序运行数量会随集群 workload 请况相应增减,什么都有作业需要是容错的,也能配合调度系统,实现弹性调度。

在这名 过程中,容错通常由分布式框架实现,比如 Spark 和 ElasticDL 都还也能做到当有程序运行挂掉,可能新的程序运行加入时,作业我越多 暂停可能重启,什么都有平滑地继续。而弹性调度是由分布式框架和分布式操作系统(集群管理系统)并肩实现的。比如,当有程序运行挂掉的另另两个 ,分布式框架应该通知集群管理系统新启程序运行来补位 —— 至于集群管理系统还也能启动起来,取决于用户剩余 quota 和集群的忙碌请况。

1. 基于 Kubernetes-native

通常使用 Keras 的 model-fit API 和 Estimator,开发者只需要调用 API 即可进行分布式训练或预测,然而 ElasticDL 不依赖于 TensorFlow runtime 实现分布式计算,它的实现在 runtime 之外。

ElasticDL 通过 Kubernetes-native 机制来完成分布式计算,而这也为其带来了容错性与弹性调度的能力。

所谓 Kubernetes-native 指的是另两个 程序运行调用 Kubernetes API 来起止程序运行,它与 Google MapReduce 的机制类事。MapReduce 是另两个 Borg-native 的分布式计算框架,用户通过运行另两个 Borg 客户端程度启动另两个 MapReduce 作业;Borg 客户端调用 Borg API 提交作业,要是 启动另两个 master 程序运行;这名 master 调用 Borg API 启动其它 workers 程序运行。

在 ElasticDL 中,用户调用 ElasticDL 的命令行客户端程序运行启动作业;这名 客户端程序运行调用 Kubernetes API 启动 master 程序运行,master 程序运行继续调用 Kubernetes API 启动其它程序运行。

“ElasticDL 的整个容错和弹性调度机制都依赖于 Kubernetes-native 架构”,王益介绍:“可能 worker 挂了,按照分布式层厚学习训练算法的数学社会形态,还也能我越多 除理, 即可确保训练过程继续。可能另两个 parameter server 程序运行挂了,master 会选择 另两个 worker 程序运行,让它转换角色替补上挂掉的 parameter server 程序运行。”

在这有一种请况下,master 全部都是调用 Kubernetes API,请它再启动另两个 额外的 worker 程序运行。可能启动成功,master 会带其加入到与其它程序运行的相互协作中。master 程序运行的请况(主什么都有另两个 task queues:todo、doing 与 done)还也能保留在 Kubernetes 集群的 etcd 存储系统中。

“另另两个 ,万一 master 挂了,重启的 master 程序运行还也能从 etcd 继承前世的请况。任何程序运行挂了,master 全部都是请 Kubernetes 去启动另两个 新的程序运行代替挂掉的程序运行。而 Kubernetes 是有无能完成使命取决于用户剩余 quota 和集群剩余资源请况。”

2. 基于 TensorFlow 2.0 Eager Execution

为哪些 ElasticDL 又基于 TensorFlow 2.0 呢?王益介绍,这是可能 TensorFlow 2.0 带来了 Eager Execution 社会形态,正是针对这名 社会形态的尝试,让开发团队实现了 Kubernetes-native 的调度办法,从而让 ElasticDL 支持容错和弹性调度。

分布式学习需要了解每个程序运行根据局部训练数据计算得到的 gradients,也能汇总哪些 gradients 来更新模型。

TensorFlow 1.x 的执行办法被称为 Graph Mode —— 层厚学习计算步骤被表示成另两个 graph 数据社会形态,TensorFlow runtime 会解释执行这名 graph。其中,gradients 的计算过程是 graph 的一累积,什么都有为了得到 gradients,分布式层厚学习系统需要 hack 进入 graph 的执行过程“偷取”gradients。

这名 做法需要用户写程序运行的另另两个 写什么都有有帮助“偷取”的代码,增加了程序运行的繁杂度,也增加了对编程者的要求。

TensorFlow 2.0 提供的 Eager Execution Mode 中,通过另两个 叫 tape 的数据社会形态,它还也能把获取 gradients 的能力以 API 的办法暴露给开发者,ElasticDL 正是以另另两个 的办法将真是现。

通过这名 对比,真是也反映了业界基于 TensroFlow 进行分布式层厚学习的不同设计思路。王益介绍,当前基于 TensorFlow 的分布式训练系统大致还也能分为四类:

其中需要修改 TensorFlow runtime 的工作主要由 Google TensorFlow 团队完成。可能 TensorFlow runtime 是用 C++ 写的,把网络通信和同步功能实现在这名 层次里,运行数率单位很高。要是 ,理论上 C++ 代码还也能通过感知 TCP/IP 链接是有无中断,来判断程序运行是有无挂掉,从而实现容错。

“要是 TensorFlow runtime 应该是平台无关的,什么都有不应该包含访问特定集群管理系统,请它重启挂掉的程序运行的代码,什么都有不易实现弹性调度”,王益指出了二者的区别:“与之相对应的,通过调用 TensorFlow API 实现分布式计算的思路,通信性能往往受到 Python 语言性能以及只有在 runtime 内部内部结构实现‘微操作’的限制。但它的好处是还也能自由调用集群管理系统 API 来管理程序运行。”

很明显,ElasticDL 通过 TensorFlow 2.0 带来的新社会形态实现了 TensorFlow runtime 外直接调用集群管理 API 而完成了弹性调度。

二、ElasticDL 替代 Kubeflow 的使用

Kubernetes 另另两个 是另两个 用来管理无请况应用的容器平台,要是 当前越多公司用它来运行各种各样的工作负载,不得劲是使用它来运行机器学习相关任务。

Kubeflow 基于 Kubernetes,它把模型训练、超参数训练与模型部署等机器学习任务类型进行组合并以容器化的办法部署,提供了整个机器学习流程各个系统的高可用与便捷性,使用 Kubeflow 就还也能进行各种各样的机器学习任务。

目前 Kubeflow 是在 Kubernetes 上启动分布式 TenosrFlow 作业的主流操作,这可能也是开发者更为熟悉的模式。

“具体来讲,Kubeflow 会询问 Kubernetes 计划分配哪几台机器来运行另两个 分布式作业中的各个程序运行,要是 告知每个程序运行所有其它程序运行的 IP 地址和 port,从而保证另两个 作业里各个程序运行之间互相知道对方。”

为哪些需要让所有程序运行互相知道对方呢?这是 TensorFlow ps-based distribution 办法要求的。(也什么都有前边提到的对比基于 TensorFlow 的分布式训练系统表格中左上角的类型)

王益解释:“TenosrFlow 1.x 原生的分布式训练功能让另两个 作业中所有程序运行都执行 TensorFlow 1.x runtime 程序运行。哪些程序运行互相通信,互相协调成为另两个 ‘分布式 runtime’来解释执行表示层厚学习计算过程的 graph。在现在开始英语 英语 分布式训练之初,graph 被 TensorFlow runtime 拆解成若干子 graph;每个程序运行负责执行另两个 子 graph —— 任何另两个 程序运行失败 (可能是被更高优先级作业抢占),则整个大 graph 的执行就失败了。什么都有 TensorFlow 原生的分布式训练能力全部都是容错的(fault-tolerant)。”

不过,TensorFlow Python API 提供了 checkpoint 的能力:可能另两个 作业失败了,还也能重启作业,从最近的 checkpoint 现在开始英语 英语 继续执行。什么都有它还也能从错误中恢复(fault-recoverable)。

Kubeflow 还也能在 Kubernetes 上发挥 TensorFlow 原生的分布式计算能力,要是 可能后者我越多 能容错,什么都有 Kubeflow 我越多 能无中生有。只有容错,也是因为只有弹性调度,而这正是 ElasticDL 的特长。

三、与 SQLFlow 联动

前边介绍了 ElasticDL 的实现机制与现实意义,总结起来主什么都有可能 ElasticDL 通过 TensorFlow 2.0 提供的新社会形态 Eager Execution 实现了 TensroFlow runtime 外直接调用集群管理 API,从而实现了 Kubernetes-native 机制来完成分布式计算,继而实现容错与弹性调度,最终达到极大提升集群总体利用率的目标。

除此之外,ElasticDL 还有另两个 重要的社会形态——易用性。ElasticDL 的易用性与另另两个 工具密不可分。

几只月前,蚂蚁金服开源了另两个 机器学习工具 SQLFlow,这名 工具旨在让开发者调用 AI 像写 SQL 一样简单。据介绍,SQLFlow 也能抽象出端到端从数据到模型的研发过程,配合底层的引擎及自动优化,具备基础 SQL 知识的开发者即可完成大累积机器学习模型训练及预测任务。

通过与 SQLFlow 联动,开发者还也能用扩展后的 SQL 语法,非常精炼地描述整个数据流和 AI 流程。SQLFlow 把另两个 SQL 程序运行翻译成另两个 实现整个 end-to-end machine learning 的程序运行,这名 程序运行还也能调用 xgboost、PyTorch,可能 ElasticDL、TensorFlow 实现训练任务。

王益举例,在有 SQLFlow 另另两个 ,可能要为另两个 电子商务网站构造另两个 推荐系统,需要开发日志整理、在线数据清洗、社会形态工程、模型训练、验证与预测等模块,每个模块可能需要投入另两个 团队数周甚至数月的时间。

而 SQLFlow 老出另另两个 ,这名 流程还也能用 SQL 语言描述成另两个 很简短的程序运行,SQLFlow 还也能把它翻译成上述数据和 AI 流。

可能 SQL 是有一种只描述意图,不描述过程的语言,什么都有 SQL 程序运行通常都很简短。要是 也可能这名 是因为,SQL 程序运行里包含的信息量有限。比如,用户我越多 通过 SQL 指定分布式调度和训练算法。“哪些累积需要 ElasticDL 根据模型特点自主决定”,王益补充:“这也是为哪些说 ElasticDL 也还也能反过来为 SQLFlow 提供易用性。”

四、ElasticDL 开源的下一步计划

关于开源后接下来的发展,王益表示,ElasticDL 项目目前地处早期探索阶段,API 还在演化过程中。“此次开源的版本,尚不包括自动选择 分布策略和算法的代码,相比在 TensorFlow runtime 中实现分布式计算,基于 TensorFlow 2.0 Eager Mode 的 Python API 实现的分布式训练性能差距还很大”,他介绍:“ElasticDL 团队在和 Google Brain 团队相互协作,开发上述 asynchronous SGD + delayed model update 能力、以及 Kubernetes-native AllReduce,希望在下另两个 版本中还也能提供给亲们使用。”

要是 王益又具体介绍,上述有一种分布式训练策略,有一种会用于模型包含较大的参数的请况,比如分布式 embedding table,另有一种用于模型参数较小的请况。而这也是 ElasticDL 自动决断分布式训练算法的另两个 例子。

被委托人面,在 SQLFlow 中,可能要让用户能提供尽量少的参数,AI 引擎还需要更加智能,提供包括 AutoML 等功能。

王益感叹:“ElasticDL 项目任重道远。”

五、受访嘉宾

王益,目前在蚂蚁金服负责 AI 基础架构工作。他于 10007 年从清华大学计算机系博士毕业,先后在 Google(中国)、腾讯、LinkedIn(美国总部)与百度硅谷研究院工作,期间在硅谷和北京各有一次创业经历。参加工作以来,王益突然 专注于 AI 基础架构工作,参与和领导了多个核心 AI 系统的研发。