LinkedIn开源TonY,让Hadoop原生支持TensorFlow

LinkedIn开源TonY项目,让用户可在单节点或是大型Hadoop集群上,基于YARN构建TensorFlow应用的解决方案,TonY其运行方式就像是在Hadoop中的MapReduce,执行Pig和Hive脚本的方式类似,提供TensorFlow任务第一层级的支持。 TonY由三个主要组件组成,分别是客户端、ApplicationMaster以及TaskExecutor,主要提供四大特色GPU调度、精度资源请求、TensorBoard支持以及容错。

LinkedIn平台会员接近6亿人,随着深度学习技术的发展,LinkedIn的人工智能工程师,努力在众多像是摘要或是回复等功能中应用人工智能,而其中有许多使用案例,皆使用Google开发的深度学习框架TensorFlow构建。一开始LinkedIn内部TensorFlow用户都只在小型和非托管的裸机上执行应用,但随着发展,他们逐渐意识到必须要让TensorFlow连接并使用Hadoop大数据平台上的运算以及存储资源。 LinkedIn的Hadoop集群拥有数百PB的数据,很适合适于开发深度学习应用。

虽然TensorFlow支持分布式训练,但要编排TensorFlow必非一件简单的事,LinkedIn调查了市面上现存的解决方案,但终究没能符合需求。有一个Apache Spark运算引擎TensorFlow的开源解决方案,能够在框架上执行一些LinkedIn内部深度学习应用程序,但其缺乏GPU调度和异构容器调度是最后不被采用的致命伤。而另一个TensorFlowOnYARN独立函数库则较接近LinkedIn的需求,但是其容错以及可用性较差,且该项目已经停止维护更新。

基于这些原因,LinkedIn只好开始动手开发自家基于Hadoop YARN的TensorFlow解决方案TonY,以便可以完全控制Hadoop集群资源,TonY直接在YARN上运行,并以轻量相依执行,因此除了可以在YARN中使用堆栈较低级的部分,也能使用TensorFlow中堆栈高端的部分。

LinkedIn提到,TonY运行TensorFlow的方法,类似在Hadoop中MapReduce引擎执行Pig与Hive脚本,或是在Spark中以API执行Scala程序代码,TonY通过处理资源沟通或是容器环境设置等任务,支持TensorFlow的工作。 TonY主要有3个组件,客户端、ApplicationMaster和TaskExecutor。用户向客户端提交TensorFlow模型训练程序代码、参数以及Python虚拟环境,并由客户端设置ApplicationMaster将其交付给YARN集群,ApplicationMaster会根据用户的资源要求,与YARN的资源管理器进行资源协商,当ApplicationMaster收到确定的资源分配,便会在分配的节点上创建TaskExecutors,由TaskExecutors启动用户的训练程序代码并等待工作完成。

TonY除了可以完成基本在Hadoop上执行分布式TensorFlow的工作外,也实例了用来支持大规模训练的功能。 TonY支持GPU调度,能够利用Hadoop的API向集群请求GPU资源。另外,还支持高精度的资源请求,由于TonY能请求不同的实体作为单独的组件,因此用户可以针对每种实体类型请求不同的资源,也就是说,用户可以良好的控制应用程序使用的资源,同时也有助于集群管理员避免浪费硬件资源。

TonY现在可以将应用程序关注的URL重定向TensorBoard上,让用户方便通过TensorBoard理解、调校和优化TensorFlow应用程序。而TonY重要的特色之一便是容错,可以让深度学习训练更可靠。即便使用大量的机器,TensorFlow训练仍可能需要数小时甚至数天,但长时间运行的TensorFlow任务比短期的任务,更容易受到暂时性错误或抢占的问题影响。 TensorFlow拥有容错API,可以将检查点存储成HDFS,还能从先前保存的检查点恢复继续训练。 TonY则通过提供弹性分布式基础架构,来从节点故障中恢复,因此当Worker错误、或是ApplicationMaster失去回应等情况,TonY将会重新启动应用程序,并恢复到之前的检查点。

现在LinkedIn在GitHub上开源他们在Hadoop和TensorFlow上的努力,让其他用户也能方便的构建分布式机器学习应用。