分享

TensorflowOnSpark系列3:安装部署

问题导读
1.TensorflowOnSpark安装有哪些前提?

2.本文安装遇到了哪些坑?
3.后期遇到了哪些问题,又是如何解决的?



上一篇TensorflowOnSpark系列1:为什么产生TensorFlowOnSpark
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24658

TensorflowOnSpark系列2:TensorFlowOnSpark架构设计
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24659



关于hadoop和spark集群的安装可参考:about云日志分析项目准备6:Hadoop、Spark集群搭建http://www.aboutyun.com/forum.php?mod=viewthread&tid=20620


安装TensorflowOnSpark
这个真是说难也难,说简单真是巨简单,因为步骤github上已经写得好好的了,但是,有些坑,确实会把人坑死的。
雅虎开源的TensorflowOnSpark
1. 啥?你说全是英文看不懂,好吧我也看不懂,不过你想安装TensorflowOnSpark的话,应该拉到底点这里的wiki site


20170313160703496.png

2.由于前面说了,我们用的是自带的standalone集群管理器,所以,就点
2.png

3. 进入了教程之后,第一步复制粘贴,如果没git请按照提示安装git;
第二步不需要,因为你安装好了Spark了;第三步点进去那个instruction,或者你会发现你点不开(我就点不开。。。),你可以选择这里:tensorflow中文网。要注意的一点小坑是,在第三步的最后有一个测试

[mw_shl_code=bash,true]python ${TFoS_HOME}/tensorflow/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py --data_dir ${TFoS_HOME}/mnist
[/mw_shl_code]
如果你下载的是tensorflow1.x的版本,可能会有问题运行不出来,因此我下载的是0.12.1版本,啥,你问我怎么下,就是教程里的这句

pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl

里的0.5.0改成0.12.1就木有问题了。
还有就是那个mnist的数据集可能由于某些原因链接不上那个网址也下载不下来(我也是酱紫的。。。),可以到我的csdn上下载http://download.csdn.net/detail/fishseeker/9779536

4. 第四步就是启动spark了,其实直接启动就行了,底下那些乱七八糟的设置可以自行配置。

5. 第五步,把我坑成狗。。。需要像下面这么改,而这个cv.py其实就是改了文件输入的路径,好像本来是在hdfs上,我给改成本地的路径,噢,对了,这里的输出是输出到hdfs上,所以一定要打开hdfs啊,否则就GG了。
[mw_shl_code=bash,true]${SPARK_HOME}/bin/spark-submit \
--master spark://master:7077 \
${TFoS_HOME}/examples/mnist/cv.py \
--output examples/mnist/csv \
--format csv[/mw_shl_code]
cv.py的改动就是把mnist_data_setup.py第132,133行调用writeMNIST的方法的参数改了。具体见下图

1.png

改动后是这样

1.png

这个代码运行了之后去50070端口的hdfs查看你的文件就有了。

2.png

6. 第六步是train,就是用刚才那个转换的数据进行训练模型,这里也需要改一些东西
[mw_shl_code=bash,true]${SPARK_HOME}/bin/spark-submit \
--master spark://master:7077 \
--py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/spark/mnist_dist.py \
--conf spark.cores.max=4 \
--conf spark.task.cpus=2 \
--conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
${TFoS_HOME}/examples/mnist/spark/mnist_spark.py \
--cluster_size 2 \
--images examples/mnist/csv/train/images \
--labels examples/mnist/csv/train/labels \
--format csv \
--mode train \
--model mnist_model[/mw_shl_code]

注意有几个worker这个cluster_size就至少要设置成几,spark.task.cpu的数量要大于等于worker的数量。虽然都设置好了,也看起来像跑起来了,但是会被卡住不动。这时需要进入8080端口里看看worker的strerr,我这里曾经报错说没有设置 HADOOP_HDFS_HOME,这个需要在spark-env.sh里export一下,就设置成和HADOOP_HOME一样就行了。这只好了还是动,需要改一下mnist_spark.py的第109行,把logdir=logdir –>logdir=None(另外这里119行也同样改动,否则下一步识别的时候也会卡住)

7. 第七步的时候还是照常修改一些数(主要是我没设置这些),然后改一下代码。

[mw_shl_code=bash,true]${SPARK_HOME}/bin/spark-submit \
--master spark://master:7077 \
--py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/spark/mnist_dist.py \
--conf spark.cores.max=4 \
--conf spark.task.cpus=2 \
--conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
${TFoS_HOME}/examples/mnist/spark/mnist_spark.py \
--cluster_size 2 \
--images examples/mnist/csv/test/images \
--labels examples/mnist/csv/test/labels \
--mode inference \
--format csv \
--model mnist_model \
--output predictions[/mw_shl_code]
然后你愉快地发现你的hdfs上有了识别后的结果了
就像这样(强迫症地切割了下图片)

1.png

然后你打开个就看见了和网站上差不多的美妙结果。

==============2017.4.15更新==================
今天在运行程序的时候发生了莫名其妙的bug,主要症状就是task会卡在某个地方不再进行了,点进去看详细的task会发现是在某个slave上的某个task卡住了,调试无果。关机重启之后再次运行不再卡顿,原因大概是系统要求的资源没有达到,以后遇到这种情况,建议重新调小运行需要的cpu数量以及内存数量等资源配置选项再试试,实在不行就关机重启,一般都可以解决

==============2017.7.28更新====================
又踩到一个坑是,还是在识别的时候可能会卡住,可能是因为其他的worker中的namenode忘记format了。
另外还有识别的准确率很低的问题,可能是因为python找不到Jar包了,使用以下方法可以:
原来python在写hdfs文件的时候,找不到对应的jar包,在提交的时候添加如下的配置信息

[mw_shl_code=bash,true]--conf spark.executorEnv.LD_LIBRARY_PATH="${JAVA_HOME}/jre/lib/amd64/server" \
--conf spark.executorEnv.CLASSPATH="$($HADOOP_HOME/bin/hadoop classpath --glob):${CLASSPATH}" [/mw_shl_code]

这里致谢评论区中的“她说巷尾的樱花开了 2017-07-13 10:10发表 [回复]“ 提供解决方法
相关链接:

利用IDEA查看和修改spark源码
http://blog.csdn.net/fishseeker/article/details/63741265

修改spark源码并编译部署
http://blog.csdn.net/fishseeker/article/details/68957206



参考链接:
https://blog.csdn.net/fishseeker ... utm_medium=referral
作者:FishSeeker





已有(1)人评论

跳转到指定楼层
yuwenge 发表于 2018-6-13 20:07:12
分享另外一篇:


基于Hadoop分布式群YARN模式的搭建
  官方指导链接:https://github.com/yahoo/TensorFlowOnSpark/wiki/GetStarted_YARN,这篇文章过于简略,很多地方都没有说明白,初学者会绕很多弯路,也许是因为这个项目刚刚开源不久,很多指导性的说明都没有。简言之,官网的 Instructions 略坑,搭建成功与否靠人品。
  以下是本人实践成功的步骤:
环境准备
  已经安装了 Spark 的 Hadoop 分布式集群环境(安装于 Ubuntu Server 系统),下表显示了我的集群环境( Spark 已经开启):
安装了 Spark 的 Hadoop 分布式集群环境
主机名ip用途
master192.168.0.20
ResourceManager
NameNode
SecondaryNameNode
Master
node1192.168.0.21
DataNode
NodeManager
Worker
node2192.168.0.22
DataNode
NodeManager
Worker


2 在 Master 节点上进行:
(1) 安装 Python 2.7
  这一步的是在本地文件夹里下载安装 Python ,目的是在进行任务分发的时候能够把这个 Python 和其他依赖环境(这里指的是包含 TensorFlow)同时分发给对应的 Spark executor ,所以这一步不是单纯的只安装 Python 。
[mw_shl_code=bash,true]#下载解压 Python 2.7
export PYTHON_ROOT=~/Python
curl -O https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz
tar -xvf Python-2.7.12.tgz
rm Python-2.7.12.tgz

#在编译 Python 之前,需要完成以下工作,否则编译产生的 python 会出现没有 zlib 、没有 SSL 模块等错误
#安装 ruby , zlib , ssl 相关包
sudo apt install ruby
sudo apt install zlib1g,zlib1g.dev
sudo apt install libssl-dev

#进入刚才解压的 Python 目录,修改 Modules/Setup.dist文件,该文件是用于产生 Python 相关配置文件的
cd Python-2.7.12
sudo vim Modules/Setup.dist
#去掉 ssl , zlib 相关的注释:
#与 ssl 相关:
#SSL=/usr/local/ssl
#_ssl _ssl.c \
# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
# -L$(SSL)/lib -lssl -lcrypto
#与 zlib 相关:
#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

#编译 Python 到本地文件夹 ${PYTHON_ROOT}
pushd Python-2.7.12
./configure --prefix="${PYTHON_ROOT}" --enable-unicode=ucs4
#./configure 这一步如果提示 "no acceptable C compiler" , 需要安装 gcc : sudo apt install gcc
make
make install
popd
rm -rf Python-2.7.12

#安装 pip
pushd "${PYTHON_ROOT}"
curl -O https://bootstrap.pypa.io/get-pip.py
bin/python get-pip.py
rm get-pip.py
#安装 pydoop
${PYTHON_ROOT}/bin/pip install pydoop
#这里安装 pydoop,若是提示错误:LocalModeNotSupported,直接下载资源包通过 setup 安装:
#资源包下载:https://pypi.python.org/pypi/pydoop
#tar -xvf pydoop-1.2.0.tar.gz
#cd pydoop-1.2.0
#python setup.py build
#python setup.py install
#安装 TensorFlow
${PYTHON_ROOT}/bin/pip install tensorflow
#这里安装 tensorflow ,不需要从源码进行编译安装,除非你需要 RDMA 这个特性
popd[/mw_shl_code]

(2) 安装 TensorFlowOnSpark
[mw_shl_code=bash,true]git clone https://github.com/yahoo/TensorFlowOnSpark.git
git clone https://github.com/yahoo/tensorflow.git
#从 yahoo 下载的 TensorFlowOnSpark 资源包里面 tensorflow 是空的文件夹,git 上该文件夹连接到了 yahoo/tensorflow ,这里需要我们将 tensorflow 拷贝到 TensorFlowO#nSpark 下面:
sudo rm -rf TensorFlowOnSpark/tensorflow/
sudo mv tensorflow/ TensorFlowOnSpark/
#上面 tensorflow 和 TensorFlowOnSpark 文件目录根据自己的实际情况修改,我的是在根目录下面,所以如上[/mw_shl_code]

(3) 安装编译 Hadoop InputFormat/OutputFormat for TFRecords
[mw_shl_code=bash,true]#安装以下依赖工具:
sudo apt install autoconf,automake,libtool,curl,make,g++,unzip,maven

#先安装 protobuf
# git 上有详细说明:github上有详细的安装说明:https://github.com/google/protobuf/blob/master/src/README.md
#也可以参考链接:http://www.itdadao.com/articles/c15a1006495p0.html
 #编译 TensorFlow 的 protos:
 git clone https://github.com/tensorflow/ecosystem.git
 cd ecosystem/hadoop
 protoc --proto_path=/opt/TensorFlowOnSpark/tensorflow/ --java_out=src/main/java/ /opt/TensorFlowOnSpark/tensorflow/tensorflow/core/example/{example,
 feature}.proto
 mvn clean package
 mvn install
 #将上一步产生的 jar 包上传到 HDFS
 cd target
 hadoop fs -put tensorflow-hadoop-1.0-SNAPSHOT.jar[/mw_shl_code]

(4) 为 Spark 准备 Python with TensorFlow 压缩包
[mw_shl_code=bash,true]pushd "${PYTHON_ROOT}"
zip -r Python.zip *
popd
#将该压缩包上传到 HDFS
hadoop fs -put ${PYTHON_ROOT}/Python.zip[/mw_shl_code]

(5) 为 Spark 准备 TensorFlowOnSpark 压缩包
[mw_shl_code=bash,true]pushd TensorFlowOnSpark/src
zip -r ../tfspark.zip *
popd[/mw_shl_code]

环境基本搭建完成。

测试[5]
1)准备数据

下载、压缩mnist数据集
[mw_shl_code=bash,true]mkdir ${HOME}/mnist
pushd ${HOME}/mnist >/dev/null
curl -O "http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz"
curl -O "http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz"
curl -O "http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz"
curl -O "http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz"
zip -r mnist.zip *
popd >/dev/null[/mw_shl_code]

2)feed_dic方式运行,步骤如下
[mw_shl_code=bash,true]# step 1 设置环境变量
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=default

# step 2 上传文件到hdfs
hdfs dfs -rm /user/${USER}/mnist/mnist.zip
hdfs dfs -put ${HOME}/MLdata/mnist/mnist.zip /user/${USER}/mnist/mnist.zip

# step 3 将图像文件(images)和标签(labels)转换为CSV文件
hdfs dfs -rm -r /user/${USER}/mnist/csv
${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,hdfs:///user/${USER}/mnist/mnist.zip#mnist \
TensorFlowOnSpark/examples/mnist/mnist_data_setup.py \
--output mnist/csv \
--format csv


# step 4 训练(train)
hadoop fs -rm -r mnist_model
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue ${QUEUE} \
--num-executors 3 \
--executor-memory 8G \
--py-files ${HOME}/TensorFlowOnSpark/tfspark.zip,${HOME}/TensorFlowOnSpark/examples/mnist/spark/mnist_dist.py \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.yarn.maxAppAttempts=1 \
--conf spark.yarn.executor.memoryOverhead=6144 \
--archives hdfs:///user/${USER}/Python.zip#Python \
--conf spark.executorEnv.LD_LIBRARY_PATH="$JAVA_HOME/jre/lib/amd64/server" \
${HOME}/TensorFlowOnSpark/examples/mnist/spark/mnist_spark.py \
--images mnist/csv/train/images \
--labels mnist/csv/train/labels \
--mode train \
--model mnist_model


# step 5 推断(inference)
hadoop fs -rm -r predictions
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue ${QUEUE} \
--num-executors 3 \
--executor-memory 8G \
--py-files ${HOME}/TensorFlowOnSpark/tfspark.zip,${HOME}/TensorFlowOnSpark/examples/mnist/spark/mnist_dist.py \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.yarn.maxAppAttempts=1 \
--conf spark.yarn.executor.memoryOverhead=6144 \
--archives hdfs:///user/${USER}/Python.zip#Python \
--conf spark.executorEnv.LD_LIBRARY_PATH="$JAVA_HOME/jre/lib/amd64/server" \
${HOME}/TensorFlowOnSpark/examples/mnist/spark/mnist_spark.py \
--images mnist/csv/test/images \
--labels mnist/csv/test/labels \
--mode inference \
--model mnist_model \
--output predictions


# step 6 查看结果(可能有多个文件)
hdfs dfs -ls predictions
hdfs dfs -cat predictions/part-00001
hdfs dfs -cat predictions/part-00002
hdfs dfs -cat predictions/part-00003

#网页方式,查看spark作业运行情况,这里的 ip 地址是 master 节点的 ip
http://192.168.0.20:8088/cluster/apps/[/mw_shl_code]

3) queuerunner方式运行,步骤如下
[mw_shl_code=bash,true]# step 1 设置环境变量
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=default

# step 2 上传文件到hdfs
hdfs dfs -rm /user/${USER}/mnist/mnist.zip
hdfs dfs -rm -r /user/${USER}/mnist/tfr
hdfs dfs -put ${HOME}/MLdata/mnist/mnist.zip /user/${USER}/mnist/mnist.zip

# step 3 将图像文件(images)和标签(labels)转换为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,hdfs:///user/${USER}/mnist/mnist.zip#mnist \
--jars hdfs:///user/${USER}/tensorflow-hadoop-1.0-SNAPSHOT.jar \
${HOME}/TensorFlowOnSpark/examples/mnist/mnist_data_setup.py \
--output mnist/tfr \
--format tfr

# step 4 训练(train)
hadoop fs -rm -r mnist_model
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue ${QUEUE} \
--num-executors 4 \
--executor-memory 4G \
--py-files ${HOME}/TensorFlowOnSpark/tfspark.zip,${HOME}/TensorFlowOnSpark/examples/mnist/tf/mnist_dist.py \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.yarn.maxAppAttempts=1 \
--conf spark.yarn.executor.memoryOverhead=4096 \
--archives hdfs:///user/${USER}/Python.zip#Python \
--conf spark.executorEnv.LD_LIBRARY_PATH="$JAVA_HOME/jre/lib/amd64/server" \
${HOME}/TensorFlowOnSpark/examples/mnist/tf/mnist_spark.py \
--images mnist/tfr/train \
--format tfr \
--mode train \
--model mnist_model

# step 5 推断(inference)
hadoop fs -rm -r predictions
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--queue ${QUEUE} \
--num-executors 4 \
--executor-memory 4G \
--py-files ${HOME}/TensorFlowOnSpark/tfspark.zip,${HOME}/TensorFlowOnSpark/examples/mnist/tf/mnist_dist.py \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.yarn.maxAppAttempts=1 \
--conf spark.yarn.executor.memoryOverhead=4096 \
--archives hdfs:///user/${USER}/Python.zip#Python \
--conf spark.executorEnv.LD_LIBRARY_PATH="$JAVA_HOME/jre/lib/amd64/server" \
${HOME}/TensorFlowOnSpark/examples/mnist/tf/mnist_spark.py \
--images mnist/tfr/test \
--mode inference \
--model mnist_model \
--output predictions

# step 6 查看结果(可能有多个文件)
hdfs dfs -ls predictions
hdfs dfs -cat predictions/part-00001
hdfs dfs -cat predictions/part-00002
hdfs dfs -cat predictions/part-00003

#网页方式,查看spark作业运行情况,这里的 ip 地址是 master 节点对应的 ip
http://192.168.0.20:8088/cluster/apps/[/mw_shl_code]

参考:
https://www.cnblogs.com/heimianshusheng/p/6768019.html

作者:1010

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条