分享

TensorFlowOnSpark HDP环境搭建及Mnist部署测试过程

 进门交钱 2017-05-24

TensorFlow是谷歌提供的开源深度学习框架

TensorFlowOnSpark: 是雅虎提供的集成到Spark上的深度学习框架

鉴于我们使用的是Spark核心计算框架,现在搭建TensorFlow ON Hadoop Yarn开发环境

整体搭建步骤,https://github.com/yahoo/TensorFlowOnSpark/wiki/GetStarted_YARN网站上有详细介绍,主要步骤有:

 

安装环境说明:  操作系统Cent OS 7 ,    大数据环境HDP2.5

一 安装配置Python2.7

这里安装的Python并不是系统级用的,而是要准备一个完备的Python环境,然后可以打包提供给Spark使用的,因此需要安装在一个本地目录下。

1.1    下载python2.7

 

# download and extract Python 2.7

export PYTHON_ROOT=~/Python

curl -O https://www./ftp/python/2.7.12/Python-2.7.12.tgz

tar -xvf Python-2.7.12.tgz

rm Python-2.7.12.tgz

 

这个步骤没问题,很顺利!

 

1.2   编译python2.7

 

# compile into local PYTHON_ROOT

pushd Python-2.7.12

./configure --prefix="${PYTHON_ROOT}" --enable-unicode=ucs4

2make

make install

popd

rm -rf Python-2.7.12

 

这个步骤你如果按照这个来的话也没有问题,但是在后续的步骤会产生一系列莫名其妙的问题。我遇到的就两个:

(1)    zlib找不到

(2)    ssl模块找不到

 

最后分析问题原因就是在这一步编译过程中,没有将这两个模块编译进去,导致后面的步骤无法找到模块依赖。

 

幸好有万能的百度。

Yum install zlib-devel

http://blog.csdn.net/woszsj/article/details/16848871

 

yum install openssl-devel -y

http://www.cnblogs.com/yuechaotian/archive/2013/06/03/3115472.html

大致意思 首先要安装完zlib和ssl再去编译python,那么在编译Python之前,要修改Module/Setup文件。修改文件操作是在configure和make命令之间。

Setup内容修改

ZLIB

SSL

1.3    安装pip

这一步是安装pip包管理工具,主要是为了后续安装其他包方便。

# install pip

pushd "${PYTHON_ROOT}"

curl -O https://bootstrap./get-pip.py

bin/python get-pip.py

rm get-pip.py

 

解决了上一个步骤的问题后,这一步也将会很顺利

 

1.4    安装pydoop

Python与hadoop交互的实现包

 

二 安装TensorFlow

https://github.com/yahoo/TensorFlowOnSpark/wiki/GetStarted_YARN

https://github.com/yahoo/tensorflow/blob/22fd3aad2dac96d521b5224519f443cef5269efb/tensorflow/g3doc/get_started/os_setup.md

         在上一个步骤中,已经安装了pip包管理器,Tensorflow也支持这个包管理的安装,因此TensorFlow的安装就很简单了

$ pip install tensorflow

所有依赖一键安装完成。

 

三 安装编译Hadoop Input/OutputFormat for TFRecords

这一步的目的是编译获取TensorFlow中TFRecords格式文本的Input/OutputFormat实现。

官方安装步骤如下:

git clone https://github.com/tensorflow/ecosystem.git

# follow build instructions to generate tensorflow-hadoop-1.0-SNAPSHOT.jar

# copy jar to HDFS for easier reference

hadoop fs -put tensorflow-hadoop-1.0-SNAPSHOT.jar

         最终目的是获取tensorflow-hadoop-1.0-SNAPSHOT.jar包然后将它放置到HDFS目录中去。

那么重点在于编译https://github.com/tensorflow/ecosystem/tree/master/hadoop这个源码。

编译这个源码的前提条件是:

(1)    Protoc3.1.0安装

直接下载编译好的可执行包

         https://github.com/google/protobuf/releases

         可执行目录: /root/tensorflow/ protoc3.1.0/bin/protoc

(2)    下载apache maven

 

(3)    下载TensorFlow项目源码

git clone https://github.com/tensorflow/tensorflow.git

 

开始编译:

(1)    编译TensorFlow Eexample protos

export TENSORFLOW_ROOT=$PWD   //指定tensorflow项目目录

# Suppose $TF_SRC_ROOT is the source code root of TensorFlow project

protoc --proto_path=$TF_SRC_ROOT --java_out=src/main/java/ $TF_SRC_ROOT/tensorflow/core/example/{example,feature}.proto

 

 

/root/tensorflow/protoc3.1.0/bin/protoc --proto_path=$TENSORFLOW_ROOT --java_out=src/main/java/ $TENSORFLOW_ROOT/tensorflow/core/example/{example,feature}.proto

(2)    编译ecosystem/hadoop项目

编译所在目录:/root/tensorflow/ecosystem/Hadoop

编译后会在target目录下找到

tensorflow-hadoop-1.0-SNAPSHOT.jar

将这些jar包放置到hdfs路径去。

四 为Spark打包Python/tensorflow ZIP包

pushd "${PYTHON_ROOT}"

zip -r Python.zip *

popd

 

# copy this Python distribution into HDFS

hadoop fs -put ${PYTHON_ROOT}/Python.zip

 

将之前编译的Python包打包成zip包,并放置到HDFS路径。

 

五 安装TensorFlowOnSpark

git clone git@github.com:yahoo/TensorFlowOnSpark.git

pushd TensorFlowOnSpark/src

zip -r ../tfspark.zip *

popd

构建ZIP包

 

六 运行MNIST 样例

6.1 下载 MNIST数据集

mkdir ${HOME}/mnist

pushd ${HOME}/mnist >/dev/null

curl -O "http://yann./exdb/mnist/train-images-idx3-ubyte.gz"

curl -O "http://yann./exdb/mnist/train-labels-idx1-ubyte.gz"

curl -O "http://yann./exdb/mnist/t10k-images-idx3-ubyte.gz"

curl -O "http://yann./exdb/mnist/t10k-labels-idx1-ubyte.gz"

zip  -r mnist.zip *

popd >/dev/null

6.2 将MNIS ZIP文件转换到HDFS文件

 

设置一系列环境变量:

指导命令

# set environment variables (if not already done)

export PYTHON_ROOT=~/Python

export LD_LIBRARY_PATH=${PATH}

export PYSPARK_PYTHON=${PYTHON_ROOT}/bin/python

export SPARK_YARN_USER_ENV="PYSPARK_PYTHON=Python/bin/python"

export PATH=${PYTHON_ROOT}/bin/:$PATH

export QUEUE=gpu

 

# for CPU mode:

# export QUEUE=default

# remove --conf spark.executorEnv.LD_LIBRARY_PATH \

# remove --driver-library-path \

实际执行命令

[root@138 tensorflow]# export PYTHON_ROOT=/root/Python/

[root@138 tensorflow]# export LD_LIBRARY_PATH=${PATH}

[root@138 tensorflow]# export PYSPARK_PYTHON=${PYTHON_ROOT}/bin/python

[root@138 tensorflow]# export SPARK_YARN_USER_ENV="PYSPARK_PYTHON=Python/bin/python"

[root@138 tensorflow]# export PATH=${PYTHON_ROOT}/bin/:$PATH

[root@138 tensorflow]# export QUEUE=gpu

[root@138 tensorflow]# export QUEUE=default

 

将图片和标签转换成TFRecords

指导命令

# save images and labels as TFRecords

${SPARK_HOME}/bin/spark-submit \

--master yarn \

--deploy-mode cluster \

--queue ${QUEUE} \

--num-executors 4 \

--executor-memory 4G \

--archives hdfs:///user/${USER}/Python.zip#Python,mnist/mnist.zip#mnist \

--jars hdfs:///user/${USER}/tensorflow-hadoop-1.0-SNAPSHOT.jar \

--conf spark.executorEnv.LD_LIBRARY_PATH="/usr/local/cuda-7.5/lib64" \

--driver-library-path="/usr/local/cuda-7.5/lib64" \

TensorFlowOnSpark/examples/mnist/mnist_data_setup.py \

--output mnist/tfr \

--format tfr

 

实际命令

spark-submit --master yarn --deploy-mode cluster --queue ${QUEUE} --num-executors 4 --executor-memory 4g --archives hdfs:///user/${USER}/Python.zip#Python,mnist/mnist.zip#mnist --jars hdfs:///user/${USER}/tensorflow-hadoop-1.0-SNAPSHOT.jar TensorFlowOnSpark/examples/mnist/mnist_data_setup.py --output mnist/tfr --format tfr

 

6.3 训练数据生成模型

spark-submit --master yarn --deploy-mode cluster --queue ${QUEUE} --num-executors 6 --executor-memory 18g --py-files TensorFlowOnSpark/tfspark.zip,TensorFlowOnSpark/examples/mnist/tf/mnist_dist.py --conf spark.dynamicAllocation.enabled=false --conf spark.yarn.maxAppAttempts=1 --archives hdfs:///user/${USER}/Python.zip#Python --conf spark.executorEnv.LD_LIBRARY_PATH=" /usr/hdp/2.4.0.0-169/usr/lib/:$JAVA_HOME/jre/lib/amd64/server" TensorFlowOnSpark/examples/mnist/tf/mnist_spark.py --images mnist/tfr/train --format tfr --mode train --model mnist_model

此处有两个坑:

(1) 需要在YARN中配置HADOOP_HDFS_HOME环境变量,否则报如下错

(2) 需要添加依赖动态库,官方文档介绍了如果使用CDH的时候需要添加lib库依赖

由于我使用的是HDP,所以相应的也要加上这个lib库依赖,因为这个问题被坑坏了!!!

 

训练完成后,终于生成了模型:

 

 

6.4 应用模型来测试测试数据

spark-submit --master yarn --deploy-mode cluster --queue ${QUEUE} --num-executors 6 --executor-memory 18g --py-files TensorFlowOnSpark/tfspark.zip,TensorFlowOnSpark/examples/mnist/tf/mnist_dist.py --conf spark.dynamicAllocation.enabled=false --conf spark.yarn.maxAppAttempts=1 --archives hdfs:///user/${USER}/Python.zip#Python --conf spark.executorEnv.LD_LIBRARY_PATH=" /usr/hdp/2.4.0.0-169/usr/lib/:$JAVA_HOME/jre/lib/amd64/server" TensorFlowOnSpark/examples/mnist/tf/mnist_spark.py --images mnist/tfr/test --mode inference

--model mnist_model –output predictions

执行完成后生成预测结果数据集:

 

 

OK到此为止环境,用例算是测试通过了,总共陆续花了两天时间。 

 

接下来就是要学以致用了。

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多