TensorFlowOnSpark分析
TensorFlowOnSpark(https://github.com/yahoo/TensorFlowOnSpark)项目是由Yahoo开源的一个软件包,能将TensorFlow(https://github.com/tensorflow/tensorflow)与Spark结合在一起使用,为ApacheHadoop和ApacheSpark集群带来可扩展的深度学习功能。使Spark能够利用TensorFlow拥有深度学习和GPU加速计算的能力。传统情况下处理数据需要跨集群(深度学习集群和Hadoop/Spark集群),Yahoo为了解决跨集群传递数据的问题开发了TensorFlowOnSpark项目。TensorFlowOnSpark目前被用于雅虎私有云中的Hadoop集群,主要进行大规模分布式深度学习使用。
TensorFlowOnSpark在内部实现了与Tensorflow集群类似的可扩展性。在下图中可以看出,SparkDriver端程序并不会参与TensorFlow内部相关的计算和处理,其设计思路像是一个TensorFlow集群运行在了Spark上,在每个Sparkexecutor中启动TensorFlow组件,然后通过gRPC或RDMA 方式进行数据传递与交互。
TensorFlowOnSpark程序运行时会通过如下步骤创建并管理TensorFlow集群(Spark程序会创建一个TensorFlow集群,TensorFlow的相关组件运行在Sparkexecutor内):
Reservation–为每个TensorFlowexecutor预留端口,并启动“数据/控制消息”的监听程序。
Startup–启动TensorFlow的主程序
Data ingestion
Readers&QueueRunners –利用TensorFlow的Reader机制直接从HDFS读取数据文件。
Feeding-使用HadoopInputFormat/OutputFormat 访问HDFS上的TFRecords数据,然后利用feed_dict机制将SparkRDD数据发送到TensorFlow节点。
Shutdown -关闭executor上的Tensorflowworker上的线程和ParameterServer节点。
官方给出TensorFlowOnSpark目前支持的特性如下:
轻松迁移所有现有的TensorFlow程序,修改代码小于10行;
支持所有TensorFlow功能:同步/异步训练,模型/数据并行,inferencing和TensorBoard;
Server端到Server端直接通信提升处理速度(RDMA启用时);
允许由Spark分发或由TensorFlow拉取HDFS和其他资源上的数据;
轻松整合现有的数据处理流程和机器学习算法(如MLlib,CaffeOnSpark);
轻松在云或内部部署:CPU& GPU, Ethernet and Infiniband.
我们可以使用两种方法来提取训练数据和预测:
TensorFlowQueueRunners:TensorFlowOnSpark利用TensorFlow的文件读取器和QueueRunners直接从HDFS文件读取数据。Spark不涉及访问数据。
Spark Feeding:通过SparkRDD将数据传输到每个Sparkexecutor,然后通过feed_dict将数据传输到TensorFlowgraph中。
开发的TFoS(TensorFlowOnSpark)程序可以直接使用Spark的Spark-submit命令提交到集群上,在提交时程序时,用户可以指定Sparkexecutor的个数,每个executor上有几个GPU,“参数服务器(ParameterServer)”的个数。另外用户还可以指定TensorBoard和RDMA是否使用,命令如下:
sparksubmit
–master${MASTER} \
${TFoS_HOME}/examples/slim/train_image_classifier.py\
–model_nameinception_v3 \
–train_dirhdfs://default/slim_train \
–dataset_dirhdfs://default/data/imagenet \
–dataset_nameimagenet \
–dataset_split_nametrain \
–cluster_size${NUM_EXEC} \
–num_gpus${NUM_GPU} \
–num_ps_tasks${NUM_PS} \
–sync_replicas\
–replicas_to_aggregate${NUM_WORKERS} \
–tensorboard\
–rdma另外TFoS还提供了更高级的PythonAPI
reserve() … construct aTensorFlow cluster from Sparkexecutors
start() … launch Tensorflowprogram on the executors
train() or TFCluster.inference()… feed RDD data to TensorFlowprocesses
TFCluster.shutdown() … shutdown Tensorflow execution onexecutors
优点
Yahoo已经在自己的云上实践并使用,可以用于生产
轻松整合现有的数据处理流程和机器学习算法
支持所有TensorFlow功能
轻松移植现有TensorFlow程序到Spark集群上
学习成本较低
缺点
缺少相关文档与使用教程
代码刚开源,社区反馈与支持力度未知