奇虎360今日宣布开源深度学习调度平台XLearning,项目开源地址:https://github.com/Qihoo360/XLearning。
\\XLearning由360系统部大数据团队与人工智能研究院联合开发,基于Hadoop Yarn完成了对TensorFlow、MXNet、Caffe、Theano、PyTorch、Keras、XGBoost等常用深度学习框架的集成。平台上线运行近一年时间,经多次版本迭代更新,为各类深度学习框架的使用者提供了统一、稳定的作业提交平台,实现了资源共享,极大的提高了资源利用率,并且具有良好的扩展性和兼容性,在公司搜索、人工智能研究院、商业化、数据中心等业务部门得到广泛使用。
\\我们第一时间采访了XLearning项目负责人李远策,了解平台建设背景和设计思想。李远策,2013 年加入奇虎 360,先后参与公司 Hadoop、Spark 、深度学习等平台的建设,历经公司 Hadoop 平台高速发展及Spark 平台从无到大规模实践及深度学习平台的落地。曾主持 数据仓库索引、MPI on Yarn、XLearning 等多个项目。工作中专注于解决平台中的各种 Bug 及用户遇到的各类问题,爱好开源,乐于学习和分享。目前主要关注 大数据索引、大数据+深度学习等领域。
\\AI前线:请问XLearning在360公司的研发历史是什么样的?起初是为了解决什么问题?目前在360公司有哪些应用场景?为什么会在现在选择开源?
\\李远策:人工智能技术最近两年发展迅速,以Google开源的TensorFlow为代表的各种深度学习框架层出不穷。为了能让人工智能技术更好的在公司落地,我们大数据基础机构团队联合公司人工智能研究院共同开发了XLearning平台。XLearning从今年(2017)4月份正式开始开发,经过3个版本的迭代,目前已经在公司的搜索、人工智能研究院、商业化、大数据中心等业务线广泛使用。深度学习技术平台化可以有效的提升GPU等硬件资源的利用率,节省硬件投入的成本。另外,可以让算法工程师更方便的使用各类深度学习技术,从繁杂的诸如运行环境运维等工作中解脱出来。
\\XLearning的设计思路是采用Hadoop Yarn来调度深度学习框架,是典型的“AI on Hadoop”的实现,同行业的公司都会有类似的需求,所以我们选择开源,希望能给大家建设大数据+人工智能平台做个参考。
\\AI前线:为什么会考虑在大数据平台的基础上集成各种深度学习框架?XLearning可满足哪些要求,减轻哪些工作量?
\\李远策:在建设公司人工智能平台的架构设计上确实有多个方案可以选择,我们主要是从如下几个方面考虑的:
\\(1)跟现有平台的融合;公司已有的机器学习作业多数采用Spark MLLib和MPI框架,都是采用Hadoop Yarn进行统一调度,如果将深度学习框架也集成到Yarn上同时数据由HDFS存储,则可以实现平台的统一。
\\(2)运维复杂度;重新建设一个新的平台会引入新的运维工作;
\\(3)公司程序员的使用习惯;公司很多开发人员对Hadoop生态比较熟悉,直接在Hadoop上提交深度学习作业更容易推广;
\\(4)开发工作量;我们团队对Hadoop生态系统的组件比较熟悉,再次之前曾经实现了“MPI on Yarn”系统。可以说具备实现“AI on Hadoop”的技术储备。
\\XLearning开源版本兼容社区的Hadoop,同行公司如果有Hadoop平台则可以直接使用它来调度深度学习作业。如果还没有Hadoop平台则需要提前部署。深度学习的训练往往依赖海量的样本数据,一个可靠的大数据存储系统是训练平台的必备条件,Hadoop部署简单、稳定可靠,是大数据平台的行业标准,推荐使用。
\\AI前线:XLearning功能设计和架构设计要点是什么?
\\李远策:XLearning的系统架构图如下:
\\ \\- Client:XLearning客户端,负责启动作业及获取作业执行状态;\
- ApplicationMaster(AM):负责输入数据分片、启动及管理Container、执行日志保存等; \
- Container:作业的实际执行者,负责启动Worker或PS(Parameter Server)进程,监控并向AM汇报进程状态,上传作业的输出等。对于TensorFlow类型作业,还负责启动TensorBoard服务。\
XLearning虽然架构简洁,但具有丰富的功能方便用户进行模型训练,并依托于Yarn提供有作业资源的统一管理。
\\(1)支持多种深度学习框架
\\XLearning支持TensorFlow、MXNet分布式和单机模式,支持所有的单机模式的深度学习框架,如Caffe、Theano、PyTorch等。对于同一个深度学习框架支持多版本和自定义版本,满足用户个性化需求,不受限于集群机器上各学习框架的安装版本。
\\(2)基于HDFS的统一数据管理
\\XLearning提供多种模式用于数据的输入、输出,包括数据的流式读写、直接HDFS读写等,可根据作业处理的数据量与集群机器硬盘容量,视情况决定所采用的读写方式。
\\(3)可视化界面
\\为方便用户查看作业信息,XLearning提供可视化界面用于展示作业执行进度和输出日志等内容。作业执行完毕后,亦可查看日志内容,便于分析训练过程进展。对于TensorFlow类型作业,支持TensorBoard服务。作业运行界面大致分为三部分(如下图所示):
\\- All Containers:显示当前作业所含Container列表及各Container对应信息,如Contianer ID、所在机器(Container Host)、所属类型(Container Role)、当前执行状态(Container Status)、开始时间(Start Time)、结束时间(Finish Time)、执行进度(Reporter Progress);\
- View TensorBoard:当作业类型为TensorFlow时,可点击该链接直接跳转至TensorBoard页面;\
- Save Model:用户可在作业执行过程中,可以将当前训练模型的输出结果上传至HDFS,并显示目前已上传的模型列表。\
(4)原生代码兼容
\\XLearning支持TensorFlow分布式模式的ClusterSpec自动分配构建,单机模式和其他深度学习框架代码不用做任何修改即可迁移到XLearning上,便于用户快速使用。
\\(5)Checkpoint功能
\\利用深度学习框架本身的Checkpoint机制和直接读写HDFS数据功能,XLearning方便用户实现训练恢复继续执行。
\\AI前线:XLearning在性能上有哪些优势?平台设计时考虑到了哪些易用性方面的需求?
\\李远策:XLearning主要负责调度和监控工作,从原理上讲训练性能跟原生的TensorFlow、Caffe等框架保持一致。平台的易用性是推广的关键因素,XLeanring做了如下考虑:
\\(1)与原生框架的兼容性,除了刚才说的性能保持一致外,代码也保持兼容,可以有效降低业务作业迁移的成本;
\\(2)Web展示;XLearnin调度的作业主页上会展示必要的调度信息、作业进度、日志等,同时还额外提供了随时保存中间结果的功能,方便工程师根据实际情况提前终止自己的作业;
\\(3)集成TensorBoard;对于TensorFlow作业XLearning会自动拉起TensorBoard服务,相比之前手动启动会更简单;
\\(4)自动构建TensorFlow的ClusterSpec;对于分布式模式的TensorFlow作业,工程师不再需要手动指定worker、ps的host信息,仅需要告知XLearning需要的worker和ps节点数即可;
\\这些在刚才的架构设计要点环节里也都有提到。
\\AI前线:您们在开发XLearning有哪些经验和心得值得和大家分享的呢?
\\李远策:除了刚才提到的架构选型之外最想分享的经验就是:所有功能的设计都要以实际需求出发,空想出来的功能往往华而不实。XLearning设计之初和新版本的规划过程中,都会跟公司实际用户做充分的功能需求讨论,明确大家工作的痛点,安排好优先级和deadline再做架构设计和开发。
\\AI前线:XLearning的开源版本和公司在使用的版本功能上是否存在差异?
\\李远策:坦白讲开源的XLearning是一个简化的版本,主要是因为受限于对Yarn功能的依赖。公司的Yarn版本,是我们在社区版本上做了不少增强。比如支持GPU的资源调度、GPU通信亲和性的感知、DockerContainer支持等。依赖于这些特性公司在用的版本多出了GPU资源调度支持、作业Docker化、临时GPU虚拟机、Container Metrics可视化图表展示等功能。这些功能我们后续会通过提供Yarn Patch或者开源自用Yarn版本来分享给大家,也欢迎大家随时跟我们沟通。
\\AI前线:我们知道您不仅负责了XLearning深度学习平台,也是Spark早期研究者和布道者,历经360公司 Hadoop 平台高速发展及Spark 平台从无到大规模实践和落地,能否结合您的经历给大家讲述下从通用大数据平台到深度学习平台的演进历程?
\\李远策:MR、Spark这些计算框架在大多数互联网公司都有广泛的使用,能满足大多数的数据处理需求。受限于Spark MLLib的性能和扩展性,公司还有不少MPI类型的作业跑在专用的调度系统(名为Euler)上。为了实现调度的统一和服务器资源的复用,我们团队开发了Euclid(MPI on Yarn)系统,初步统一了机器学习作业和大数据作业的统一调度。然后到了深度学习阶段,我们最初也走了些弯路。比如我们最早在2016年下半年开发了一款名为SparkFlow(TensorFlow on Spark)的系统,可以把TensorFlow集成到Spark中,通过RDD完成数据的交互。后来Yahoo研究院也开源一个“TensorFlowOnSpark”,实现原理基本类似。受限与Spark本身的问题,并不适合做PS架构,另外与原生TensorFlow代码兼容性也很难做到完全兼容,在推广过程中遇到了很多的问题。重新考虑后我们开发了“TensorFlow on Yarn”,试行成功后为了兼容其他的深度学习框架就演化成了现在的XLearning。后续我们会继续沿着统一调度的方案前行。目前平台还有很多问题需要继续探索,比如我们正在设计的更高性能的算法库,希望能无缝替换现在的Spark MLLib,进一步提升公司AI平台的计算能力。关于这方面的工作希望能有机会跟同行的技术专家多多交流。谢谢大家!