[关闭]
@sambodhi 2017-03-03T10:05:08.000000Z 字数 7983 阅读 4463

Spark上的深度学习框架再添新兵:Yahoo开源TensorFlowOnSpark

Spark是什么?

Spark是大规模数据处理的事实标准,包括机器学习的操作,希望把ETL和机器学习管道整合。

Spark是伯克利大学2009年开始研发的一个项目,它是大数据时代下的一个快速处理数据分析工作的框架。Spark发展十分迅速,2014年,Hadoop的四大商业机构均宣称全力支持Spark,今后将全面接收基于Spark编写的数据挖掘与分析算法,多家世界顶级的数据企业例如Google、Facebook等现已纷纷转向Spark框架。

Spark使用函数式编程范式扩展了MapReduce模型以支持更多计算类型,可以涵盖广泛的工作流,这些工作流之前被实现为Hadoop之上的特殊系统。Spark使用内存缓存来提升性能,因此进行交互式分析也足够快速(就如同使用Python解释器,与集群进行交互一样)。缓存同时提升了迭代算法的性能,这使得Spark非常适合数据理论任务,特别是机器学习。

由于Spark库提供了Python、Scale、Java编写的API,以及内建的机器学习、流数据、图算法、类SQL查询等模块;Spark迅速成为当今最重要的分布式计算框架之一。与YARN结合,Spark提供了增量,而不是替代已存在的Hadoop集群,它将成为未来大数据重要的一部分,为数据科学探索铺设了一条康庄大道。

近两年,Spark在中国的发展达到了一个前所未有的状态和高度。其中阿里巴巴的搜索和广告业务,最初使用Mahout和MapReduce来解决复杂的机器学习问题,但是在效率和代码维护方面并不理想,现已转向Spark框架。淘宝技术团队使用Spark实现了多次迭代的机器学习算法和一些高计算复杂度的算法,并将其运用在推荐系统上;同时还利用Spark中的一系列组件解决了基于最大连通图的社区发现、基于三角形计数的关系衡量、基于随机游走的用户属性传播等许多生产问题。此外,腾讯也是最早使用Spark的应用之一,借助Spark快速迭代的优势,腾讯提出了大数据精准推荐,并采用“数据+算法+系统”这套技术方案支持每天上百亿的请求量。

Spark上的深度学习框架再添新兵

虽然Spark的机器学习库提供了丰富的算法,但是仍然有不少其他开源机器学习库支持Spark,比如TensorFlow、Caffe、MXNet、Apache Mahout和Intel BigDL等这些主流的开源机器学习库直接或者间接支持Spark,在Spark中的SparkR能够分布式地调用R语言的算法库,另外由于Spark支持Scala、Java和Python等语言,它可以调用支持这些语言接口的机器学习库。

不久前,Spark上的深度学习框架再添新兵,这位新兵就是Yahoo Big ML团队宣布开源的TensorFlowOnSpark,他们用来在大数据集群的分布式深度学习最新的开源框架。

Yahoo Big ML团队成员Lee Yang、Jun Shi、Bobbie Chern和Andy Feng日前合著了一篇文章,详细介绍了他们开源的TensorFlowOnSpark的方方面面。

Yahoo开源的TensorFlowOnSpark使Google发起的TensorFlow深度学习开源框架与Apache Spark集群中的数据集兼容,一些组织为了处理大量不同类型的数据而进行维护,对他们来说无疑是个好消息。

Yahoo开源TensorFlowOnSpark采用了Apache 2.0协议许可,并在GitHub上发布。

深度学习通常涉及大量数据进行人工神经网络训练,比如说照片,然后指导神经网络对新数据做出最佳猜测。深度学习在很多公司非常热门。

差不多就在一年前,Yahoo开源CaffeOnSpark,为Caffe开源深度学习框架提供了Spark支持。而今天,Yahoo正在做同样的工作,但这一次,带来了不同的框架:TensorFlowOnSpark。

该团队评估了SparkNet和TensorFrame等选择,但最终,他们决定建立自己的框架。他们的软件使用Spark工具,如SparkSQL、Mlib和Python notebook连接到Spark集群,但它也将和Hadoop合作。

Yahoo表示,把TensorFlow程序移植到TensorFlowOnSpark相对方便,并经过反公司内部的反复验证。

其他支持Spark的开源机器学习库各有什么优势?

Yahoo开源了TensorFlowOnSpark,那么除了这个深度学习框架外,其他支持Spark的开源机器学习库各有什么优势呢?让我们来看看。

TensorFlow

在过去的一年时间里,TensorFlow已经成功地帮助研究人员、工程师、艺术家、学生以及许许多多其他人,在各个领取取得成功。从语言翻译,到皮肤癌的早期检测、预防糖尿病致盲,TensorFlow应用于超过6000个在线开源代码仓库。

TensorFlow是Google在2015年发布的第二代开源机器学习系统,目前已被广泛应用。随着它自身的不断完善,不断地增加功能,包括支持分布式训练、支持Hadoop分布式文件系统(HDFS)、较好的Parsey MxParseFace语言解析器等等。

TensorFlow可以通过Yahoo TensorFlowOnSpark实现TensorFlow深度学习开源框架与Spark兼容,TensorFlow是可移植的机器学习和神经网络库,有良好的执行和伸缩性,它支持多种语言、较为丰富的文档和实例,相对其他学习库较为成熟。

值得一提的是,TensorFlow的作者之一是加州大学伯克利的贾扬清博士,他也是Caffe的作者,中国人。曾工作于MSRA、NEC和Google Brain,目前就职于Facebook FAIR实验室。

Caffe

Caffe全称为Convolutional Architecture for Fast Feature Embedding,是一个被广泛使用的开源深度学习框架(在TensorFlow出现之前一直是深度学习领域GitHub star最多的项目),目前由伯克利视觉学中心(Berkeley Vision and Learning Center,BVLC)进行维护。Caffe是全球最普遍使用的图像识别开源软件,Caffe可以通过Yahoo CaffeOnSpark实现分布式版本,Caffe有强大的图像分类算法,不过由于Caffe发展停滞不前,选用需要慎重。

Caffe的主要优势包括如下几点:

  1. 容易上手,网络结构都是以配置文件形式定义,不需要用代码设计网络。
  2. 训练速度快,能够训练state-of-the-art的模型与大规模的数据。
  3. 组件模块化,可以方便地拓展到新的模型和学习任务上。

MXNet

MXNet是DMLC(Distributed Machine Learning Community)开发的一款开源的、轻量级、可移植的、灵活的深度学习库,它让用户可以混合使用符号编程模式和指令式编程模式来最大化效率和灵活性,目前已经是AWS官方推荐的深度学习框架。

MXNet是一个可移植的、可伸缩的深度学习库,支持Python、R、Scala、Julia和C++等语言的API,不过缺乏文档和实例。

它上层的计算图优化算法可以让符号计算执行得非常快,而且节约内存,开启mirror模式会更加省内存,甚至可以在某些小内存GPU上训练其他框架因显存不够而训练不了的深度学习模型,也可以在移动设备(Android、iOS)上运行基于深度学习的图像识别等任务。

此外,MXNet的一个很大的优点是支持非常多的语言封装,比如C++、Python、R、Julia、Scala、Go、MATLAB和JavaScript等,可谓非常全面,基本主流的脚本语言全部都支持了。在MXNet中构建一个网络需要的时间可能比Keras、Torch这类高度封装的框架要长,但是比直接用Theano等要快。

Mahout

Mahout是Apache Software Foundation(ASF)旗下的一个开源项目,计算引擎由之前的MapReduce迁移到Spark,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现,包括聚类、分类、推荐过滤、频繁子项挖掘。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。Mahout是一个可靠、文档较为翔实的机器学习库。

Mahout主要缺点是:

  1. 对于初学者来说,目前关于Mahout的学习资料比较少,官网提供的相关文档并没有很详细的关于每个算法的使用教程。
  2. 对于Mahout的二次开发者来说,不仅要求开发者对算法有一定的了解,同时对于编写符合MapReduce流程的伪代码算法以及把伪代码转换为实际代码的能力都有很高的要求。最后,如果对于算法在性能上有要求,还应该做到提高算法运行的效率,这个也是难点。

BigDL

BigDL是Intel开源的基于Apache Spark的高效大规模分布式深度学习框架,使大数据用户和数据科学家更容易借助现有的Spark集群来运行深度学习,并简化存储在Hadoop中的大数据集的数据加载。BigDL使得AI专家能够像在数百个领域的数千个应用程序中工作的数据科学家一样研究数据。

BigDL还可以作为用于数据存储、处理和挖掘、特征工程以及机器和深度学习工作量等的统一数据分析平台(Hadoop/Spark)。它允许开发人员将深度学习应用程序编写为在现有Spark或Hadoop集群之上运行的标准Spark程序,以使深度学习工作量与他们使用的数据更直接地接触。BigDL已经在Databricks Spark平台上运行。

BigDL适用的应用场景主要为以下三种:

  1. 直接在Hadoop/Spark框架下使用深度学习进行大数据分析(即将数据存储在HDFS、HBase、Hive等数据库上);
  2. 在Spark程序中/工作流中加入深度学习功能;
  3. 利用现有的 Hadoop/Spark集群来运行深度学习程序,然后将代码与其他的应用场景进行动态共享,例如ETL(Extract、Transform、Load,即通常所说的数据抽取)、数据仓库(data warehouse)、功能引擎、经典机器学习、图表分析等。

Intel BigDL是运行在Spark上的分布式深度学习库,它与Spark实现了无缝衔接,用户可以像编写Spark程序编写深度学习应用,并运行在Spark集群中,BigDL库目前支持Spark的1.5、1.6和2.0版本,不过由于产生时间不长,社区开放程度有待提高。

TensorFlowOnSpark介绍

深度学习(DL)在最近几年快马加鞭地发展。在Yahoo,Yahoo Big ML发现,为了从海量数据中获得洞察力,需要部署分布式深度学习。现有的DL框架通常需要为深度学习设置单独的集群,迫使他们为机器学习流程创建多个程序(见图1)。拥有独立的集群需要他们在它们之间传递大型数据集,从而引起不必要的系统复杂性和端到端的学习延迟。

去年Yahoo通过开发和发布CaffeOnSpark来解决scaleout问题,Yahoo的开源框架,支持在相同的Spark和Hadoop集群进行分布式深度学习和大数据处理。Yahoo Big ML在Yahoo使用CaffeOnSpark来改善NSFW图像检测,比如自动从现场直播等自动识别电竞比赛等。借助社区的宝贵意见和贡献,CaffeOnSpark已经升级,支持LSTM,带有一个新的数据层,可用于训练和测试交错,还有一个Python API以及在Docker容器上的部署。对Yahoo Big ML来说,这些极大提升了用户体验。但对于那些使用深层学习框架TensorFlow的用户怎么办呢 ?于是他们仿效之前的做法,开发了TensorFlowOnSpark。

在TensorFlow的首次发布后,谷歌在2016年4月发布了增强的TensorFlow与分布式深度学习功能。在2016年10月,TensorFlow宣布支持HDFS。然而,在Google云之外,用户仍然需要一个专用于TensorFlow应用程序的集群。TensorFlow程序不能部署在现有的大数据集群上,从而增加了那些希望大规模利用这种技术的成本和延迟。

为了打破这个限制,一些社区项目将TensorFlow连接到Spark集群。SparkNet在Spark执行器添加了运行TensorFlow网络的能力。DataBricks提出TensorFrame,用来使用TensorFlow程序操纵Apache Spark的DataFrames(数据帧)。虽然这些方法是在正确的方向迈出了一步,但Yahoo Big ML检查其代码后,发现他们无法使多个TensorFlow进程直接相互通信,也无法实现异步分布式学习,还必须花费大量精力来迁移现有的TensorFlow程序。

Yahoo Big ML的新框架TensorFlowOnSpark(TFoS),支持TensorFlow在Spark和Hadoop集群上分布式执行。如上图2所示,TensorFlowOnSpark被设计为与SparkSQL、MLlib和其他Spark库一起在一个单独流水线或程序(如Python notebook)中运行。

TensorFlowOnSpark支持所有类型的TensorFlow程序,可以实现异步和同步的训练和推理。它支持模型并行性和数据的并行处理,以及TensorFlow工具(如Spark集群上的TensorBoard)。

任何TensorFlow程序都可以轻松地修改为在TensorFlowOnSpark上运行。通常情况下,需要改变的Python代码少于10行。许多Yahoo平台使用TensorFlow的开发人员很容易迁移TensorFlow程序,以便在TensorFlowOnSpark上执行。

TensorFlowOnSpark支持TensorFlow进程(计算节点和参数服务节点)之间的直接张量通信。过程到过程的直接通信机制使TensorFlowOnSpark程序能够在增加的机器上很轻松的进行扩展。如图3所示,TensorFlowOnSpark不涉及张量通信中的Spark驱动程序,因此实现了与独立TensorFlow集群类似的可扩展性。

TensorFlowOnSpark提供两种不同的模式来提取训练和推理数据:

  1. TensorFlow QueueRunners: TensorFlowOnSpark利用TensorFlow的file readersQueueRunners直接从HDFS文件中读取数据。Spark不涉及访问数据。
  2. Spark Feeding :Spark RDD数据被传输到每个Spark执行器里,随后的数据将通过feed_dict传入TensorFlow图。

图4说明初始图像分类中同时进行的分布式训练如何使用TFoS中通过QueueRunners的一个简单设置进行扩展:每个节点一个GPU、一个读入以及批处理为32。四个TFoS工作同时进行,训练100,000步。两天后,当这些工作完成时,这些工作的前5个准确度分别为0.730、0.814、0.854和0.879。精确度达到0.730的单计算节点工作需要46小时,对于双计算节点则需要22.5小时,4计算节点需要13小时,8计算节点工需要7.5小时。TFoS因此实现了接近模型训练的近线性可扩展性。这是非常令人鼓舞的,虽然TFoS可扩展性会因不同的型号和超级数而有所不同。

分布式TensorFlow的RDMA

在Yahoo的Hadoop集群上,GPU节点通过以太网和Infiniband连接。Infiniband提供更快的连接,并支持通过RDMA直接访问其他服务器的内存。然而,当前TensorFlow版本仅支持使用gRPC}通过以太网的分布式学习。为了加快分布式学习,Yahoo Big ML增强了TensorFlow C ++层,以支持Infiniband上的RDMA。

为结合此次发布的TFoS,他们除了默认的“GRPC”协议外,还引入了新的TensorFlow服务器协议。任何分布式TensorFlow程序可以通过指定利用tf.train.ServerDef()tf.train.Server()中的protocol="grpc_rdma"来使用增强版的TensorFlow。

使用此新协议,就需要创建RDMA汇集管理器以确保张量直接写入远程服务器的内存。他们最小化张量缓冲区的创建:Tensor缓冲区在开始时分配一次,然后在一个TensorFlow作业的所有训练步骤中重复使用。从他们早期的实验与大型模型(如VGG-19网络)来看,业已证明,与现有GRPC相比,Yahoo Big ML的TDMA实现在训练时间上显著加速了。

由于支持RDMA是一个高度要求的能力(见TensorFlow issue#2916),Yahoo Big ML决定把现有的实现版本作为一个alpha版向TensorFlow社区开放。在接下来的几周内,他们将进一步优化RDMA实现,并分享一些详细的基准测试结果。

简单的CLI和API

TFoS程序由标准的Apache Spark命令spark-submit来启动。如下图所示,用户可以在CLI中指定Spark执行器的数目,每个执行器的GPU数量和参数服务器的数目。用户还可以指定是否要使用TensorBoard(-tensorboard)和/或RDMA(-rdma)。

  1. spark-submit master ${MASTER} \
  2. ${TFoS_HOME}/examples/slim/train_image_classifier.py \
  3. model_name inception_v3 \
  4. train_dir hdfs://default/slim_train \
  5. dataset_dir hdfs://default/data/imagenet \
  6. dataset_name imagenet \
  7. dataset_split_name train \
  8. cluster_size ${NUM_EXEC} \
  9. num_gpus ${NUM_GPU} \
  10. num_ps_tasks ${NUM_PS} \
  11. sync_replicas \
  12. replicas_to_aggregate ${NUM_WORKERS} \
  13. tensorboard \
  14. rdma

TFoS提供了一个高层次的Python API(在我们示例Python notebook说明):

开放源码

TensorFlowOnSparkTensorFlow的RDMA增强包、多个示例程序(包括MNIST,cifar10,创建以来,VGG)来说明TensorFlow方案TensorFlowOnSpark,并充分利用RDMA的简单转换过程。亚马逊机器映像也对AWS EC2应用TensorFlowOnSpark。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注