当前位置: 首页 > news >正文

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

前言

\\

2月13日,雅虎宣布开源TensorFlowOnSpark。TensorFlowOnSpark 为 Apache Hadoop 和 Apache Spark 集群带来可扩展的深度学习。 通过结合深入学习框架 TensorFlow 和大数据框架 Apache Spark 、Apache Hadoop 的显着特征,TensorFlowOnSpark 能够在 GPU 和 CPU 服务器集群上实现分布式深度学习。

\\

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

\\

正文

\\

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

\\

7f8dbbfffec78fb039f5d0411ec6cfab.png

\\

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

\\

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

\\

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

\\

TensorFlowOnSpark

\\

9bae4abc1c69491d645975b3f88137dc.png

\\

我们的新框架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集群类似的可扩展性。

\\

c7406e478beb085693c0e431f5f53c77.png

\\

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

\\
  1. **TensorFlow QueueRunners:**TensorFlowOnSpark利用TensorFlow的file readers和QueueRunners直接从HDFS文件中读取数据。Spark不涉及访问数据。\\t
  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可扩展性会因不同的型号和超级数而有所不同。

\\

bcf6bf5c80a23598f71c59807d461d5a.png

\\

分布式TensorFlow的RDMA

\\

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

\\

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

\\

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

\\

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

\\

简单的CLI和API

\\

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

\\
\      spark-submit –master ${MASTER} \\ \      ${TFoS_HOME}/examples/slim/train_image_classifier.py \\ \      –model_name inception_v3 \\\      –train_dir hdfs://default/slim_train \\ \      –dataset_dir hdfs://default/data/imagenet \\\      –dataset_name imagenet \\\      –dataset_split_name train \\\      –cluster_size ${NUM_EXEC} \\\      –num_gpus ${NUM_GPU} \\\      –num_ps_tasks ${NUM_PS} \\\      –sync_replicas \\\      –replicas_to_aggregate ${NUM_WORKERS} \\\      –tensorboard \\\      –rdma  \
\\

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

\\
  • TFCluster.reserve() … construct a TensorFlow cluster from Spark executors\\t
  • TFCluster.start() … launch Tensorflow program on the executors\\t
  • TFCluster.train() or TFCluster.inference() … feed RDD data to TensorFlow processes\\t
  • TFCluster.shutdown() … shutdown Tensorflow execution on executors\

开放源码

\\

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

\\

感谢杜小芳对本文的审校。

\\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们。

相关文章:

  • CSS小知识点-1
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • 快速理解 session/token/cookie 认证方式
  • Pivot Table系列之展开/折叠用法 (Expand/Collapse)
  • hadoop 中什么是slots
  • 构建NCBI本地BLAST数据库 (NR NT等) | blastx/diamond使用方法 | blast构建索引 | makeblastdb...
  • 在一个公司待上多久跳槽最合适?
  • MySQLMySql免安装版安装配置
  • C# Json.Net解析实例
  • 第三方模拟器连接Android studio
  • 什么是TKinter
  • POJ3254 Corn Fields
  • CSS颜色大全
  • Elasticsearch之IKAnalyzer的过滤停止词
  • ubuntu 14.04 安装jdk 1.8
  • 【剑指offer】让抽象问题具体化
  • Android 架构优化~MVP 架构改造
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • C++类的相互关联
  • Computed property XXX was assigned to but it has no setter
  • django开发-定时任务的使用
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • exports和module.exports
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • iOS编译提示和导航提示
  • MYSQL 的 IF 函数
  • node-glob通配符
  • Quartz初级教程
  • TypeScript迭代器
  • vue-router 实现分析
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 我建了一个叫Hello World的项目
  • 翻译 | The Principles of OOD 面向对象设计原则
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2)STM32单片机上位机
  • (3)llvm ir转换过程
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (六)Hibernate的二级缓存
  • (五)MySQL的备份及恢复
  • (转)四层和七层负载均衡的区别
  • ./configure,make,make install的作用(转)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .bat批处理(一):@echo off
  • .net 4.0发布后不能正常显示图片问题
  • .net core Swagger 过滤部分Api
  • .NET Micro Framework初体验(二)
  • .NET MVC之AOP
  • .NET程序员迈向卓越的必由之路
  • .Net各种迷惑命名解释