雅虎开源的TensorFlowOnSpark环境配置

--------"道路是曲折的,前途是光明的。"
此笔记旨在做备份和记录,也希望为和我一样迷茫的你偶尔点一下睛。欢迎各位深度君一起交流学习:)

参考资料
在开始之前,应该已经熟悉TensorFlow并且可以访问安装了Spark的Hadoop集群,其安装可参考Spark On Yarn集群配置。如果你的集群有GPU节点,那必须在本地安装cuda。
首先请先修改环境变量
vim ~/.bashrc
添加如下变量(请自行修改为自己的路径)
export HADOOP_HOME=/home/ubuntu/workspace/hadoop
export HADOOP_VERSION=2.6.0
export HADOOP_CONF_DIR=/home/ubuntu/workspace/hadoop/etc
可能还需要进一步修改nodemanager(即slaves节点上)的yarn-site.xml。

1. 安装python

这里我在按照教程安装python的时候在之后的执行过程中总是会出现花式错误,调bug你懂的!后来尝试很多方法之后决定换一种方式,采用了Python-Virtualenv,关于它的奇妙之处,请参考文章Python--Virtualenv简明教程。执行操作如下:
pip #先检查你是否有pip
$ sudo apt-get install python-pip python-dev #倘若没有pip,执行此步
$ sudo pip install virtualenv #安装virtualenv
$ cd ~/workspace/spark
$ virtualenv python #创建一个名为python的目录, 并且安装了python/bin/python, 创建了lib,include,bin目录,安装了pip
!我之所以在spark下创建python的目录的目的是一直不清楚TFoS官网上需要安装的python与Spark的python详细关系,这么创建之后发现二者可以共存,所以先如是做以防各种不清不楚的状况。
$ cd ~/workspace/spark/python
$ source ./bin/activate #进行这一步之后你会发现命令行前面出现(python),如若需要关闭使用deactivate,注意运行过程中要一直开着这个
$ pip install pydoop #安装pydoop,以能用python使用hadoop

2.安装TensorFlow

cd到python目录安装
$ git clone [email protected]:yahoo/tensorflow.git
如若git不可用,请移至git clone git@不可用

3. 安装和编译Hadoop InputFormat/OutputFormat for TFRecords

请注意,我把这些都放在了python目录下,等后期搞明白在看看是否需要如此。
这一步主要是为了生成tensorflow-hadoop-1.0-SNAPSHOT.jar,然后放到集群上,以便之后的数据集转换使用。

1) 下载ecosystem

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

2) 下载protoc 3.1.0

注意,一定是3..,之前用的2.5.0,发现在编译生成时会出现版本错误。
protoc3.1.0下载地址
此处protobuffer安装注意下载release版本,不然在make时会出现花式错误。
$ tar -zxf ~/Downloads/protobuf-cpp-3.1.0.tar.gz -C ~/workspace/ #将protoc3.1.0解压至workspace中
$ cd protobuf-3.1.0 #进入protobuf目录下准备进行编译
$ ./configure #默认路径是/usr/local/lib
$ make
此处虚拟机中安装报错关键词virtual memory exhausted cannot allocate memory,解决方案:free -m查看内存使用情况,确实占用过多的情况下,可尝试重启解决,我的是这样解决的。若解决不了需自行增加虚拟机内存。
$ make check
$ sudo make install
make install之后总觉得哪里不对劲,之后protoc -version
发现如下错误protoc: error while loading shared libraries: libprotoc.so.11: cannot open shared object file: No such file or directory
这是因为protobuf的默认路径是/usr/local/lib,而/usr/local/lib不在ubuntu体系默认的LD_LIBRARY_PATH 里,所以就找不到该lib。在环境变量中修改即可。
$ sudo vim ~/.bashrc
增加如下内容:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
$ source ~/.bashrc

3) 下载maven

Apache Maven,这是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。
a、确保已经安装好jdkb、到maven官网下载apache-maven-3.3.9-bin.tar.gzc、解压缩到~/workspace中
$ tar -zxf ~/Downloads/apache-maven-3.3.9-bin.tar.gz -C ~/workspace
d、修改环境变量$ sudo vim ~/.bashrc
在末尾添加
export M2_HOME=/[maven安装目录]/apache-maven-3.3.9
export PATH=$M2_HOME/bin:$PATH
$ source ~/.bashrc #使环境变量生效
e、检测是否安装成功
$ mvn -v
出现如下结果则表示成功:
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)Maven home: /home/ubuntu/workspace/mavenJava version: 1.7.0_79, vendor: Oracle CorporationJava home: /home/ubuntu/workspace/jdk1.7.0_79/jreDefault locale: en_US, platform encoding: UTF-8OS name: "linux", version: "4.2.0-42-generic", arch: "amd64", family: "unix"

4) 生成tensorflow-hadoop-1.0-SNAPSHOT.jar

一定要注意你的路径,官网给出如下protoc --proto_path=$TF_SRC_ROOT --java_out=src/main/java/ $TF_SRC_ROOT/tensorflow/core/example/{example,feature}.proto
--proto_path是你下载的tensorflow的路径,--java_out是ecosystem下的/hadoop/src/main/java。以下是我的路径。
a.$ protoc --proto_path=/home/ubuntu/workspace/spark/python/tensorflow --java_out=/home/ubuntu/workspace/spark/python/ecosystem/hadoop/src/main/java/ /home/ubuntu/workspace/spark/python/tensorflow/tensorflow/core/example/{example,feature}.proto
b.编译
请cd 到你的[ecosystem路径]/hadoop下执行
$ mvn clean package
这样就生成了 tensorflow-hadoop-1.0-SNAPSHOT.jar,位于[ecosystem路径]/hadoop/target下。

5) 将 tensorflow-hadoop-1.0-SNAPSHOT.jar放到集群上

hadoop fs -put [ecpsystem路径]/hadoop/target/tensorflow-hadoop-1.0-SNAPSHOT.jar

4. 为Spark创建Python压缩包,并上传到集群上

$ cd [python路径]
$ zip -r Python.zip *
$ hadoop fs -put ./Python.zip

5. 安装TensorFlowOnSpark

将TFoS安装在workspace下
$ git clone [email protected]:yahoo/TensorFlowOnSpark.git
$ cd /TensorFlowOnSpark/src
$ zip -r ../tfspark.zip *
$ cd .. #在此目录下查看可以看到tfspark.zip文件夹

6. 下载mnist

将mnist下载到~/workspace/mnist文件夹下,并进行压缩。
注意:这个需要在网络情况比较好的情况下下载。
$ mkdir ~/workspace/spark/mnist #mnist的位置自己定义即可
$ cd ~/workspace/spark/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"
$ popd >/dev/null

7. 转换MNIST zip文件成为HDFS文件

1)设置环境变量
export PYTHON_ROOT=/home/ubuntu/workspace/spark/python export LD_LIBRARY_PATH=${PATH} export PYSPARK_PYTHON=${PYTHON_ROOT}/bin/python export SPARK_YARN_USER_ENV="PYSPARK_PYTHON=/home/ubuntu/workspace/spark/python/bin/python2.7" export PATH=$PATH:${PYTHON_ROOT}/bin/ export QUEUE=gpu
CPU模式下的修改请参考官网。
2)进入python目录,安装numpy和tensrflow
a.安装numpy
$ pip install python-numpy #这一步是否需要还有待进一步确定
下载numpy-..*-tar.gz,并解压缩到python目录下,之后

$ mv numpy-*.*.* numpy
$ cd numpy
$ python setup.py install #此处可能会出现一些红色字体的东西,我是忽略掉了的
$ python
>>>import numpy
b.安装tensorflow
依旧是在python目录下
$ pip install tensorflow #默认安装的是tensorflow1.0.0版本
$ python
>>>import tensorflow as tf
3) 把image和labels转化为CSV文件
注意所需文件存放的位置
cd ~/workspace/spark
./bin/spark-submit \ --master yarn \ --deploy-mode cluster \ --num-executors 4 \ --executor-memory 2G \ --archives hdfs:///user/ubuntu/Python.zip#Python,mnist/mnist.zip#mnist \ --conf spark.executorEnv.LD_LIBRARY_PATH="/usr/local/cuda-7.5/lib64" \ --driver-library-path="/usr/local/cuda-7.5/lib64" \ /home/ubuntu/workspace/TensorFlowOnSpark/examples/mnist/mnist_data_setup.py \ --output mnist/csv \ --format csv
(每次带--queue gpu会报错,待了解中……)

4) 把images和labels转化为TFRecords
./bin/spark-submit \ --master yarn \ --deploy-mode cluster \ --num-executors 4 \ --executor-memory 2G \ --archives hdfs:///user/ubuntu/Python.zip#Python,mnist/mnist.zip#mnist \ --jars hdfs:///user/ubuntu/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" \ /home/ubuntu/workspace/TensorFlowOnSpark/examples/mnist/mnist_data_setup.py \ --output mnist/tfr \ --format tfr
如果3)、4)出现错误且非import numpy/tensorflow错误,可尝试修改num-executors或者executor-memory或者重启。

8. 运行分布式MNIST training

./bin/spark-submit \ --master yarn \ --deploy-mode client \ --conf spark.yarn.executor.memoryOverhead=2048 \ --conf spark.scheduler.minRegisteredResourcesRatio=1.0 \ --conf spark.executor.instances=2 \ --num-executors 2 \ --executor-memory 512M \ --py-files /home/ubuntu/workspace/TensorFlowOnSpark/tfspark.zip,/home/ubuntu/workspace/TensorFlowOnSpark/examples/mnist/spark/mnist_dist.py \ --conf spark.dynamicAllocation.enabled=false \ --conf spark.yarn.maxAppAttempts=1 \ --archives hdfs:///user/ubuntu/Python.zip#Python \ --conf spark.executorEnv.LD_LIBRARY_PATH="/usr/local/cuda-7.5/lib64:$JAVA_HOME/jre/lib/amd64/server" \ --driver-library-path="/usr/local/cuda-7.5/lib64" \ /home/ubuntu/workspace/TensorFlowOnSpark/examples/mnist/spark/mnist_spark.py \ --images mnist/csv/train/images \ --labels mnist/csv/train/labels \ --mode train \ --model mnist_model

9.Run distributed MNIST inference (using feed_dict)

./bin/spark-submit \ --master yarn \ --deploy-mode client \ --conf spark.yarn.executor.memoryOverhead=2048 \ --conf spark.scheduler.minRegisteredResourcesRatio=1.0 \ --conf spark.executor.instances=2 \ --num-executors 2 \ --executor-memory 512M \ --py-files /home/ubuntu/workspace/TensorFlowOnSpark/tfspark.zip,/home/ubuntu/workspace/TensorFlowOnSpark/examples/mnist/spark/mnist_dist.py \ --conf spark.dynamicAllocation.enabled=false \ --conf spark.yarn.maxAppAttempts=1 \ --archives hdfs:///user/ubuntu/Python.zip#Python \ --conf spark.executorEnv.LD_LIBRARY_PATH="/usr/local/cuda-7.5/lib64:$JAVA_HOME/jre/lib/amd64/server" \ --driver-library-path="/usr/local/cuda-7.5/lib64" \ /home/ubuntu/workspace/TensorFlowOnSpark/examples/mnist/spark/mnist_spark.py \ --images mnist/csv/test/images \ --labels mnist/csv/test/labels \ --mode inference \ --model mnist_model \ --output predictions

你可能感兴趣的:(雅虎开源的TensorFlowOnSpark环境配置)