一、引言
Yahoo在2016年2月左右开源了基于Spark/Hadoop的分布式深度学习框架—CaffeOnSpark,CaffeOnSpark被设计成为一个Spark深度学习包,Spark MLlib支持各种非深度学习算法用于分类、回归、聚类、推荐等,但目前缺乏深度学习这一关键能力,而CaffeOnSpark旨在填补这一空白。CaffeOnSpark API支持dataframes,以便易于连接准备使用Spark应用程序的训练数据集,以及提取模型的预测或中间层的特征,用于MLLib或SQL数据分析。
那对于那些使用TensorFlow框架的人怎么办?。于是近期,Yahoo又开源了 TensorFlowOnSpark,这是一个大数据集群的分布式深度学习,将 TensorFlow 带到 Apache Spark 集群上。Yahoo 在博客上表示,深度学习(DL)近年来发展迅速,为了从大量的数据中挖掘价值,需要部署分布式深度学习。现有的深度学习框架,往往需要设立单独的深度学习数据组。这强迫我们为同一个机器学习流水线创建多个程序。维护多个独立的数据组,要求我们在它们之间传输海量数据集——这导致不必要的系统复杂性和端到端的学习延迟。
TensorFlowOnSpark 支持所有类型的 TensorFlow 程序,实现异步和同步训练和推理。它支持模型并行性和数据并行性,以及 TensorFlow 工具,如 Spar k集群上的 TensorBoard。任何 TensorFlow 程序都可以轻松地移植到 TensorFlowOnSpark 上。通常,只需要修改十行以内的 Python 代码。TFoS 支持张量(tensor)在 TensorFlow 处理过程中(计算节点和参数服务节点)信息的直接沟通。过程到过程(Process-to-process)的直接沟通机制使 TFoS 项目很容易在增加的机器上进行扩展。TFoS 不需要 Spark 驱动器(driver)参与到张量沟通中来,因此也就与具备类似于独立 TensorFlow 群集的扩展能力。
TensorFlowOnSpark 支持对 Apache Spark 集群进行分布式 TensorFlow 训练和推断。它试图最小化在共享网格上运行现有 TensorFlow 程序所需的代码更改量。 它的 Spark 兼容 API 通过以下步骤来管理 TensorFlow 集群:
TensorFlowOnSpark 支持对 Apache Spark 集群进行分布式 TensorFlow 训练和推断。它试图最小化在共享网格上运行现有 TensorFlow 程序所需的代码更改量。 它的 Spark 兼容 API 通过以下步骤来管理 TensorFlow 集群:
1、预留 - 为每个执行程序保留 TensorFlow 进程的端口,并启动数据/控制消息的侦听器。
2、启动 - 在执行器上启动 Tensorflow 主函数。
3、数据摄取
1)Readers & QueueRunners - 利用 TensorFlow 的 Reader 机制直接从 HDFS 读取数据文件。
2)Feeding - 使用 feed_dict 机制将 Spark RDD 数据发送到 TensorFlow 节点。 请注意,需利用 Hadoop 输入/输出格式访问 HDFS 上的 TFRecords。
4、关闭 - 关闭执行器上的 Tensorflow 工作线程和 PS 节点。
2、启动 - 在执行器上启动 Tensorflow 主函数。
3、数据摄取
1)Readers & QueueRunners - 利用 TensorFlow 的 Reader 机制直接从 HDFS 读取数据文件。
2)Feeding - 使用 feed_dict 机制将 Spark RDD 数据发送到 TensorFlow 节点。 请注意,需利用 Hadoop 输入/输出格式访问 HDFS 上的 TFRecords。
4、关闭 - 关闭执行器上的 Tensorflow 工作线程和 PS 节点。
二、standalone模式安装部署
本节解释如何在一个standalone模式的spark集群上部署TensorFlowOnSpark。关于saprk的安装和启动就不多做解释了。
2.1 Clone
TensorFlowOnSpark 代码
首先我们从github上cloneTensorFlowOnSpark源代码
git clone --recurse-submodules https://github.com/yahoo/TensorFlowOnSpark.git
cd TensorFlowOnSpark
git submodule init
git submodule update --force
git submodule foreach --recursive git clean -dfx
cd TensorFlowOnSpark
export TFoS_HOME=$(pwd)
pushd src
zip -r ../tfspark.zip *
popd
2.2 安装spark
下载&安装Apache Spark 1.6.0以上的版本,安装过程可以参考http://spark.apache.org/downloads.html
2.3 安装TensorFlow
使用TensorFlowOnSpark,则必须要安装TensorFlow,具体的安装方式见![](https://www.tensorflow.org/get_started/os_setup)
三、测试
3.1 启动 Spark集群
启动 master
${SPARK_HOME}/sbin/start-master.sh
3.2 测试集准备
我们使用examples下的MNIST数据集进行测试,转换下MNIST的格式
rm -rf examples/mnist/csv
${SPARK_HOME}/bin/spark-submit \
--master ${MASTER} \
${TFoS_HOME}/examples/mnist/mnist_data_setup.py \
--output examples/mnist/csv \
--format csv
ls examples/mnist/csv/*/*
3.3 训练分布式数据集MNIST(使用feed_dict)
# rm -rf mnist_model
${SPARK_HOME}/bin/spark-submit \
--master ${MASTER} \
--py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/spark/mnist_dist.py \
--conf spark.cores.max=${TOTAL_CORES} \
--conf spark.task.cpus=${CORES_PER_WORKER} \
--conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
${TFoS_HOME}/examples/mnist/spark/mnist_spark.py \
--cluster_size ${SPARK_WORKER_INSTANCES} \
--images examples/mnist/csv/train/images \
--labels examples/mnist/csv/train/labels \
--format csv \
--mode train \
--model mnist_model
ls -l mnist_model
3.4 测试MNIST(使用feed_dict)
# rm -rf predictions
${SPARK_HOME}/bin/spark-submit \
--master ${MASTER} \
--py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/spark/mnist_dist.py \
--conf spark.cores.max=${TOTAL_CORES} \
--conf spark.task.cpus=${CORES_PER_WORKER} \
--conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
${TFoS_HOME}/examples/mnist/spark/mnist_spark.py \
--cluster_size ${SPARK_WORKER_INSTANCES} \
--images examples/mnist/csv/test/images \
--labels examples/mnist/csv/test/labels \
--mode inference \
--format csv \
--model mnist_model \
--output predictions
less predictions/part-00000
3.5 结果
2017-02-10T23:29:17.009563 Label: 7, Prediction: 7
2017-02-10T23:29:17.009677 Label: 2, Prediction: 2
2017-02-10T23:29:17.009721 Label: 1, Prediction: 1
2017-02-10T23:29:17.009761 Label: 0, Prediction: 0
2017-02-10T23:29:17.009799 Label: 4, Prediction: 4
2017-02-10T23:29:17.009838 Label: 1, Prediction: 1
2017-02-10T23:29:17.009876 Label: 4, Prediction: 4
2017-02-10T23:29:17.009914 Label: 9, Prediction: 9
2017-02-10T23:29:17.009951 Label: 5, Prediction: 6
2017-02-10T23:29:17.009989 Label: 9, Prediction: 9
2017-02-10T23:29:17.010026 Label: 0, Prediction: 0