Tensorflow 离线安装跳坑总结

2023-05-16

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的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow 离线安装跳坑总结 的相关文章

随机推荐

  • python serial模块

    安装注意 xff1a 1 easy install 是无法安装 提示找不到serial 2 可以通过exe文件安装 xff0c 不过网上的exe多数是针对win32操作系统的 3 最保险的安装方式 https pypi python org
  • libcurl长连接高并发高性能

    libcurl长连接高并发高性能 自己开发了一个股票智能分析软件 xff0c 功能很强大 xff0c 需要的点击下面的链接获取 xff1a https www cnblogs com bclshuai p 11380657 html 目录
  • 树莓派3B使用mavlink串口连接PIXHAWK_V5

    参考网址 xff1a http ardupilot org dev docs raspberry pi via mavlink html https dev px4 io en robotics dronekit html https do
  • C++ 通过TCP Socket实现简单Http服务器

    实现一个简单的Http服务器 xff0c 基于windows 平台 总共五个文件 HttpServer hpp HttpServer cpp Utils hpp Utils cpp main cpp Utils hpp span class
  • Java并发编程--自旋锁的实现和使用

    1 自旋锁介绍 自旋锁是这样一类锁 xff1a 当线程等待加锁时 xff0c 不会阻塞 xff0c 不会进入等待状态 xff0c 而是保持运行状态 大致的思路是 xff1a 让当前线程不停地的在循环体内执行 xff0c 当循环的条件被其他线
  • [Ubuntu] 可用云盘-尝试记录

    Ubuntu可用云盘 xff1a https github com Aruelius cloud189 说明 xff1a 这是一个调用天翼云API的开源命令行工具 xff0c 基于Python编写 xff1b 天翼云官方没有客户端支持Lin
  • 【无人机】基于遗传算法实现无人机编队位置规划附matlab代码

    1 内容介绍 现代社会的无人机成本造价低 不易损耗 轻巧灵便 易躲藏 能精确打击 目标这些特点 xff0c 使其在一些高危任务中发挥了不可替代的作用 5 无人机的用处主要有两种 xff1a 民用和军事 在民用方面 xff0c 我们可以运用无
  • 【路径规划】基于DWA实现机器人动态避障附matlab代码

    1 内容介绍 DWA 算法是基于机器人运动学与动力学理论的一种局部避障算法 xff0c 它将对机器人的位置控制转换为对机器人的速度控制 DWA 算法可以概括为三步 一是根据机器人自身的限制以及环境制约将速度的采样空间约束在一定范围内 二是根
  • 飞控pixhawk硬件框架

    本文转载于 xff1a https blog csdn net csshuke article details 78952026 xfeff xfeff 1 Phxhawk连接线路 2 Phxhawk硬件芯片列表 处理器 STM32F427
  • PCB_layout_misc

    AD的规则设置参考 https blog csdn net geek monkey article details 80249217 一些PCB厂家的工艺 嘉立创https www jlc com portal vtechnology ht
  • 怎样把经纬度坐标转换为空间直角坐标

    怎样把经纬度坐标转换为空间直角坐标 假设你的空间直角坐标以地球球心为原点 原点到北极为正z轴 原点到经纬度 0 0 为正x轴 那么纬度a 北正南负 经度b 东正西负 的空间直角坐标为 x 61 Rcos a cos b y 61 Rcos
  • APM添加参数

    APM添加参数 参考 https ardupilot org dev docs code overview adding a new parameter html 添加应用参数模块 例如 battery Parameters h k par
  • pixhawk6x/5x 电源插座/插头的型号

    型号 xff1a molex CLIK Mate 5024430670 5024390600
  • intellij idea: git tag操作 及 master branch相互合并操作

    git tag和git branches区别 xff1f tag就像是里程碑标志的一个点 branch是一个新的征程的一条线 tag是静态的 是只读的 不能修改 而branch是要往前走的 稳定版本备份用tag 新功能开发多人用branch
  • C++之STL和Boost

    最近一年我电话面试了数十位 C 43 43 应聘者 xff0c 惯用的暖场问题是 工作中使用过 STL 的哪些组件 xff1f 使用过 Boost 的哪些组件 xff1f 得到的答案大多集中在 vector map 和 shared ptr
  • ubuntu 下安装intel realsense驱动

    在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 重要的事情说
  • windows下安装numpy,scipy遇到的问题总结

    最近开始研究3D手势识别 xff0c 下载的源码包是基于python的 xff0c 需要用到扩展包numpy scipy等 xff0c 安装过程汇总遇到的问题总结如下 xff1a 1 安装numpy 下载numpy编译包 xff0c 进入该
  • Linux大数据处理踩坑实录

    最近开发需要在linux服务器上做大数据处理 xff0c 由于对Linux开发并不是很熟悉 xff0c 因此踩了很多坑 xff0c 先作如下记录 xff1a 1 bash shell实现多进程 背景如下 需要从hadoop的hdfs上向服务
  • Deep Compression阅读理解及Caffe源码修改

    更新 xff1a 没想到这篇文章写出后有这么多人关注和索要源码 xff0c 有点受宠若惊 说来惭愧 xff0c 这个工作当时做的很粗糙 xff0c 源码修改的比较乱 xff0c 所以一直不太好拿出手 最近终于有时间整理了一下代码并开源出来了
  • Tensorflow 离线安装跳坑总结

    TensorFlow作为目前最被看好的深度学习开源框架 xff0c 又顶着Google爸爸的光环 xff0c 使得很多CNN网络的部署都基于此框架 最近开始研究GAN xff08 生成对抗网络 xff09 xff0c 鉴于大部分源码都基于T