Tensorflow 离线安装跳坑总结

TensorFlow作为目前最被看好的深度学习开源框架,又顶着Google爸爸的光环,使得很多CNN网络的部署都基于此框架。最近开始研究GAN(生成对抗网络),鉴于大部分源码都基于TensorFlow,theano,torch等Python框架,为了顺应时代潮流,开始学习Tensorflow,此篇记录了一下安装过程中的坑,供以后翻阅。
其实总体来说,Tensorflow作为Google荣誉出品的框架,并不像caffe一样需要在很多依赖库上踩坑,毕竟作为一个Python框架,所需的Python依赖包有很多一键安装的方式,如pip,conda等。之所以会有这篇踩坑记录,是因为我是在公司的开发服务器上部署的,而公司服务器无法连接外网,这就导致了安装过程中无法自动下载所需的依赖包,因此我选择了从源码来安装。

1.下载TensorFlow源码

https://github.com/tensorflow/tensorflow上下载源码,目前的版本是0.11

2.安装bazel

2.1下载bazel https://github.com/google/bazel/

bazal是Google出的一款编译工具,后续编译TensorFlow源码需用到。目前下载的是0.4版本。

2.2编译bazel

直接进入解压的根目录,执行

$ ./compile.sh

然后发现错误:JDK not found
编译bazel需要JDK1.8支持

2.3安装JDK1.8

在oracle官网下载jdk1.8的rpm包,下载时需要在网站上登录oracle账户并同意条款。
下载完成后执行

 $ rpm -ivh jdk-8u45-linux-x64.rpm

安装完成后,将安装目录添加至环境变量JAVA_HOME中

$ export JAVA_HOME=/usr/java/jdk1.8.0_45/
2.4完成bazel安装

安装完JDK后,再次进入bazel源码目录,执行compile.sh,完成安装。
为了能找到bazel命令,将执行路径 output/bazel 添加到 $PATH 环境变量中
我的bazel安装比较顺利,没有遇到什么坑,如果有相关的问题可以参考这篇博客,这个博主在安装中遇到的问题比较多,总结比较全面。
http://www.cnblogs.com/Jack47/p/install-bazel-on-redhat-enterprise-5.html

3.源码安装Tensorflow

3.1配置Tensorflow

解压进入下载的TensorFlow源码目录中,执行

$ ./configure

会弹出一些询问python相关路径以及是否需要支持OpenCL,Cuda等选项的问题,依照系统自身条件进行选择即可,我这里只选择了支持Cuda,如果选择支持Cuda,后续会确认相关的cuda和cudnn的安装路径。
确定完相关目录配置后,配置脚本会自动执行相关的下载命令从配置文件中找到需要下载的网站并下载所需的依赖包。由于服务器上无法连外网,故这里出现错误,显示网络无法连接,配置中断。
没办法,只能先找到要下载的依赖包然后下好后传到服务器上。利用grep命令搜索可定位到所需的包和网址在WORKSPACE和./tensorflow/workspace.bzl中。统计了这两个文件中需要下载的依赖包,大大小小总共近90个,我把网址统计到了一张表里,然后批量下载了这些包,传到了服务器上。
然后需要改动WORKSPACE和workspace.bzl中的路径,使得他们能够找到下载的包,这里有两种改法,比较直接的是将下载好的依赖包放在本地某个路径中,然后将workspace中的new_http_archive()改成local_repository(),然后将路径指向本地路径,如下:

workspace.bzl looks like below

def tf_workspace(path_prefix = "", tf_repo_name = ""):
native.new_local_repository(
name = "eigen_archive",
path = "/usr/local/tf/tensorflow/local_repos/eigen-eigen-5f86b31739cd",
build_file = path_prefix + "eigen.BUILD",
)

native.local_repository(
name = "re2",
path = "/usr/local/tf/tensorflow/local_repos/re2",
)

native.local_repository(
name = "gemmlowp",
path = "/usr/local/tf/tensorflow/local_repos/gemmlowp",
)

native.new_local_repository(
name = "farmhash_archive",
path = "/usr/local/tf/tensorflow/local_repos/farmhash-34c13ddfab0e35422f4c3979f360635a8c050260",
build_file = path_prefix + "farmhash.BUILD",
)
...

webcomponentjs settings in WORKSPACE

new_local_repository(
name = "webcomponentsjs",
build_file = "/usr/local/tf/tensorflow/bower.BUILD",
path = "/usr/local/tf/tensorflow/local_repos/webcomponentsjs",
)

我采用的是第二种方法,因为我们有一个自己搭建的内网http服务器,开发服务器是可以直接访问该地址并下载东西的,所以我将下载的依赖包都放在了这个服务器上,然后只是简单地将两个文件中的new_http_arvhive()中的url改成了自己的服务器地址,如下

new_http_archive(                                                                
name = "inception5h",                                                           build_file = "models.BUILD",                                                   
url = "http://10.50.85.20:8080/upload/data/tensorflow_3rd/inception5h.zip ",    
sha256 = "d13569f6a98159de37e92e9c8ec4dae8f674fbf475f69fe6199b514f756d4364" 
)

另外在workspace.bzl中有个linenose的git,原本是new_git_repository,这里也改成new_http_archive,直接下载压缩包而非clone git

native.new_http_archive(                                                       
name = "linenoise",                                                          
url = "http://10.50.85.20:8080/upload/data/tensorflow_3rd/linenoise-master.tar.gz",
strip_prefix = "linenoise-master",                                           
build_file = str(Label("//:linenoise.BUILD")),                               
)   

另外还有个问题是我下载的zlib压缩包的sha256秘钥与原始的不一致,安装的时候报错,这里就直接把原始的秘钥改成下载包的秘钥就可以了。
一切下载包都部署好后,再次执行./configure,脚本会将所需的依赖包都下载到一个缓存文件夹external中,并自动解压,当所有包都下载完毕后,可以看到输出成功的信息,万里长征总算迈开了第一步。

INFO: Starting clean (this may take a while). Consider using --expunge_async if the clean takes more than several minutes.
.................                                                          
INFO: All external dependencies fetched successfully.                      
Configuration finished 

这里不得不吐槽一下:TensorFlow的standalone安装真是体验太差。。。。

3.2编译目标程序, 开启 GPU 支持

在源码树的根路径执行

$ bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer

出现错误:
Could not find platform independent libraries
Could not find platform dependent libraries
Consider setting $PYTHONHOME to [:]
ImportError: No module named site
这个错误出现的莫名其妙,因为site是个基础module,只要正常安装python就会有,而且我试了下独立运行python,在命令交互行上import site是没有问题的,查找了一下site.py都是存在的,所以在这个问题上僵持了好久。
在Google上搜索了好久,有说要重装python的,有说要设置PYTHONHOME环境变量的,都试了下没有用。这里要说明一点,我们的python不是安装在系统路径/usr/local下的,所以后来我又下载了python源码包然后安装在了默认路径/usr/local下。但是我在configure的时候还是选择了非系统路径下的原来的python。
再次执行编译命令,这次出现的错误变成了
ImportError: /usr/local/lib/python2.7/lib-dynload/operator.so: undefined symbol: PyUnicodeUCS2_FromEncodedObject
这个错误之前见过,是因为编译operator.so时使用了2-byte Unicode字符版本的python,而当前系统使用的python是4-byte Unicode字符,这说明了我原始的python版本是4字节Unicode字符的而系统默认路径下新安装的是2字节Unicode的。
这个问题的出现,说明import site的问题解决了,但让我更奇怪的是,我明明在configure的时候设置了使用非系统路径下的python和相关的库路径,可是在bazel编译的时候还是会去系统默认路径下搜索。
大概清楚了问题根源后,在系统路径/usr/local下重新安装了python和所有相关包。
再次执行bazel编译命令,经过了较长的编译过程,终于成功了!!!

编译成功后,可以执行自带的例子进行测试

$ bazel-bin/tensorflow/cc/tutorials_example_trainer --use_gpu
# 大量的输出信息. 这个例子用 GPU 迭代计算一个 2x2 矩阵的主特征值 (major eigenvalue).
# 最后几行输出和下面的信息类似.
000009/000005 lambda = 2.000000 x = [0.894427 -0.447214] y = [1.788854 -0.894427]
000006/000001 lambda = 2.000000 x = [0.894427 -0.447214] y = [1.788854 -0.894427]
000009/000009 lambda = 2.000000 x = [0.894427 -0.447214] y = [1.788854 -0.894427]
3.3 创建pip包并安装
$ bazel build -c opt //tensorflow/tools/pip_package:build_pip_package

$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

pip创建过程很成功,顺利的在tmp/tensorflow_pkg文件夹下生成了tensorflow的whl包。
接下来,就是最后一步,马上就能看到胜利了!
执行:

# .whl 文件的实际名字与你所使用的平台有关
$ pip install /tmp/tensorflow_pkg/tensorflow-0.11.0-cp27-none-linux_x86_64.whl

Could not find a version that satisfies the requirement mock>=2.0.0 (from tensorflow==0.11.0rc0) (from versions: )
又是因为无法联外网的问题,在安装tensorflow时pip会从pip源自动搜索需要的版本的依赖包,没办法,我还是只能先下下来安装好。这里要感谢这篇博客http://blog.csdn.net/kkk584520/article/details/51476816
他在这篇文章中贴出了安装的日志,才让我知道需要下载这些版本的包:
funcsigs-1.0.2 mock-2.0.0 numpy-1.11.1 pbr-1.10.0 protobuf-3.1.0 setuptools-0.9.8 six-1.3.0 tensorflow-0.11.0rc0 wheel-0.29.0
直接搜索这些包的whl包,然后用pip install命令方便地安装,值得注意的时候有些包的安装要依赖其他包,所以要注意包的安装顺序。
最后安装完以上这几个包后,再次执行pip install安装TensorFlow包,没有任何问题!
成功!撒花!!

4.测试

最简单的测试方法就是进入Python命令交互行,输入

>>> import tensorflow as tf

如果没有任何问题,说明成功安装,可以开香槟庆祝了!

总结

最后还是要吐槽一下,TensorFlow的离线安装真是让人吐血,花了将近两天时间才搞定。希望开发者也考虑一下standalone的情况。

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值