最近在用源码安装tensorflow,因为编译的问题踩了好多坑,所以特意整理出该文,以便日后查看。文中绿色字体部分是终端输入过的命令;红色字体是告警信息。
一、准备工作
准备工作有: 1、ubuntu 14.04操作系统(其他系统也可以,只是我用的是ubuntu系统)
2、JDK 8
3、python3.4(系统自带有python2.7和python3.4)
4、Bazel编译工具(编译tensorflw源码为whl文件用)
5、git工具(从github上克隆文件用)
1、ubuntu14.04系统安装(略)
2、安装JDK 8
***如果环境是Ubuntu15.10,跳过此步骤。但在Ubuntu14.04,执行此步骤,安装Oracle JDK 8.***
***如果没有安装add-apt-repository命令,需要执行sudo apt-get install software-properties-common命令***
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
3、python配置
tensorflow最适合的版本是python3.5,而ubuntu14.04系统会自带python2.7和python3.4。不同版本的python可以共存在一个系统上。
1)安装python3.5
(1)$sudo add-apt-repository ppa:fkrull/deadsnakes #PPA(Personal Package Archives)个人软件包集
(2)$sudo apt-get update
(3)$sudo apt-get install python3.5
(4)$sudo cp /usr/bin/python /usr/bin/python_bak,先备份
(5)$sudo rm /usr/bin/python,删除
(6)$sudo ln -s /usr/bin/python3.5 /usr/bin/python,默认设置成python3.5,重建软链接这样在终端中输入python默认就是 3.5版本了
(7)$sudo apt install python3.5-dev //这句命令是为了解决一会儿编译存在的坑的,因为系统中存在三个python版本,所以这一步必须指明python版本
4、Bazel编译工具
1)简介
Bazel是一个类似于Make的工具,是Google为其内部软件开发的特点量身定制的工具,如今Google使用它来构建内部大多数的软件。它的功能有诸多亮点:
对于为什么要重新发明一个构建工具而不直接使用Make,Google认为Make控制得太细,最终的结果完全依靠开发人员能正确编写规则。很久以前,Google使用自动生成的臃肿的Makefile来构建他们的软件,速度太慢,结果不可靠,最终影响了研发人员的效率和公司的敏捷性。所以他们做了Bazel。Bazel的规则层次更高,比如,对于“Java测试”、“C++二进制文件”,它都有定义好的内建规则,而这些规则都已经被无数的测试证明是正确和稳定的。
2)安装
(1) 添加bazel包源
$ echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
***如果没有安装curl需要执行命令:sudo apt-get install curl ***
$ curl https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg | sudo apt-key add -
(2) 更新安装bazel
$ sudo apt-get update && sudo apt-get install bazel
$ sudo apt-get upgrade bazel
#这有个小插曲,如果执行完上面的语句后报错的话按照下边的方法解决,如果没有报错不用管:Sorry,a problem occurred while installing software.Package:libglib2.0-dev 2.40.2-0ubuntu1
E: Sub-process /usr/bin/dpkg returned an error code (1)错误解绝E: Sub-process /usr/bin/dpkg returned an error code (1)
办法如下:
1.$ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old //现将info文件夹更名
2.$ sudo mkdir /var/lib/dpkg/info //再新建一个新的info文件夹
3.$ sudo apt-get update,再$sudo apt-get -f install //不用解释了吧
4.$ sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old //执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下
5.$ sudo rm -rf /var/lib/dpkg/info //把自己新建的info文件夹删掉
6.$ sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info //把以前的info文件夹重新改回名字
到此问题顺利解决
5、安装git
#安装git ,通过它下载源码
$sudo apt-get install git
#利用git下载源码;其中–recurse-submodules是获取tensorflow所需要的protobuf库(加该选项运行成功的话,可以不单独安装protobuf)
进入tensorflow文件跟目录中
$git clone --recurse-submodules https://github.com/tensorflow/tensorflow
二、源码编译
1、进入tensorflw文件夹,你将会看到如下文件
2、执行configure
$sudo ./configure
接下来,配置系统会给出各种询问,以确认编译时的配置参数,下面挑选比较重要的几个参数解释如下:
yhilly@ubuntu:~/tensorflow$ ./configure
You have bazel 0.9.0 installed.
Please specify the location of python. [Default is /home/yhilly/anaconda3/envs/tensorflow/bin/python]:
上面的提示是Bazel让我们选择Python的安装路径,只要确保是Anaconda的Python路径即可,直接按一系列的回车键(Enter)表示使用默认值。
Do you wish to build TensorFlow with jemalloc as malloc support? [Y/n]:
jemalloc as malloc support will be enabled for TensorFlow.
上面的选项表示是否使用jemalloc代替传统的malloc来管理内存?Jemalloc是杰森·埃文斯(Jason Evans)于2006年开发的用以取代传统低性能的malloc内存管理模块而开发的一款内存管理模块[4]。埃文斯并非等闲之辈,他是FreeBSD项目(一种类UNIX操作系统)的重要维护者之一。
Jemalloc先被Firefox浏览器采用,后来又被Facebook在其自己的各类应用上广泛使用,一战成名。好技术当然要用!直接按回车,确认默认值Y(默认值通常就是被大写的选项)。
Do you wish to build TensorFlow with Google Cloud Platform support? [Y/n]: n
No Google Cloud Platform support will be enabled for TensorFlow.
这个选项是询问是否采用Google云平台来支持TensorFlow。这个云平台国内通常无法访问,建议输入“n”。有条件的读者,可直接按回车确认使用。
Do you wish to build TensorFlow with Hadoop File System support? [Y/n]: n
No Hadoop File System support will be enabled for TensorFlow.
这个选项是询问是否使用Hadoop 文件系统(HDFS)来支持TensorFlow。如果搭建了Hadoop集群,有读取HDFS数据需求的用户,可以回车确认。如果没有需求,手动输入“n”。
Do you wish to build TensorFlow with Amazon S3 File System support? [Y/n]: n
No Amazon S3 File System support will be enabled for TensorFlow.
类似的,这个选项是询问TensorFlow是否支持亚马逊的S3文件系统。读者根据自己的需要来确定“Y”或“n”。如果用不着,建议选择“n”。
Do you wish to build TensorFlow with Apache Kafka Platform support? [y/N]:
No Apache Kafka Platform support will be enabled for TensorFlow.
Kafka是由Apache软件基金会开发的一个开源流处理平台,是一种高吞吐量的分布式发布订阅消息系统。如果没有这个需要,建议选择默认值“N”。
Do you wish to build TensorFlow with XLA JIT support? [y/N]: n
No XLA JIT support will be enabled for TensorFlow.
这个选项是询问是否开启XLA JIT编译支持。XLA(Accelerated Linear Algebra/加速线性代数)目前还是TensorFlow的实验项目,XLA 使用 JIT(Just in Time,即时编译)技术来分析用户在运行时(runtime)创建的 TensorFlow 图,专门用于实际运行时的维度和类型。作为新技术,这项编译技术还不成熟,爱折腾的“极客”读者可以选“y”,否则选择默认值“N”。
Do you wish to build TensorFlow with CUDA support? [y/N]:
No CUDA support will be enabled for TensorFlow.
这个选项是询问是否使用CUDA。CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。如果用户配备有NVIDIA的GPU,可以选择“y”,如果仅使用TensorFlow的CPU版本,回车确认“N”。
Do you wish to build TensorFlow with MPI support? [y/N]:
No MPI support will be enabled for TensorFlow.
这个选项是询问是否使用MPI。MPI(Message-Passing-Interface 消息传递接口)是实现进程级别的并行程序的通信协议,它通过在进程之间进行消息传递。如果不是基于TensorFlow做并行程序开发,建议回车确认选择默认值“N”。
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]:
这个选项是指定CPU编译优化选项。默认值就是“-march=native”。这里“m”表示“machine(机器)”,“arch”就是“architecture”简写。“march”合在一起表示机器的结构,如果选择“-march=native”,则表示选择本地(native)CPU,如果本地CPU比较高级,就可以支持SSE4.2、AVX等选项。这里建议选择默认值。
Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]:
这个选项是问是否进入Android的工作空间配置,如果不用手机版的TensorFlow开发,则选择默认值“N”。
之后,当显示“Configuration finished”(配置完成)字样,则表示配置顺利完成。
在配置完毕Bazel的编译选项之后,接下来在tensonflow文件夹下通过 bazel 来编译tensonflow源码:
$ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
编译过程耗时较长 ,可能需要若干小时。编译成功后,在TensorFlow文件夹下,多了若干个与Bazel相关的文件夹。到此,工作还没有完毕,我们还需要构造一个Python的安装包(pip)。
在“bazel-bin”文件夹下,有我们需要的打包工具build_pip_package。假设我们把这个打包的位置定位为当前路径(TensorFlow的源文件)的“/temp”文件夹下,则使用如下指令:
bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/tensorflow_pkg
当然,上述指令后面的打包生成路径(“~/tensorflow_pkg”,这里的“~”表示笔者的家目录“/home/tangqing/”),实际上是可以任意指定的。比如说,如果是直接放到系统根目录下的临时文件夹(/tmp/tensorflow_pkg)。当然,如果放在根目录下,则需要加sudo权限,否则可能会因为权限不足而导致创建文件夹失败。
在打包完毕后,下面我们可以在打包生成路径(如“~/tensorflow_pkg”),查看到我们的劳动成果(用“ls”命令查看),其中“tensorflow-1.6.0rc1-cp34-cp34m -linux_x86_64.whl”就是我们折腾半天的回报。它就是支持本地CPU优化适配的Python 3.4编译版本。
三、测试编译结果
在编译完毕之后,我们还得安装上述“轮文件”(wheel file,以.whl为扩展名)。这里稍微简单介绍一下这个所谓的“轮文件”。“轮文件”是Python用以取代“蛋文件(egg file)”的一类新式安装包,支持pip 1.4或setuptools 0.8以上版本。
之所以Python不再扯“蛋”,自然是因为“轮文件”能带来更多便利。最直观的便利是,对于纯Python文件或C扩展文件(比如Objective-C)的编译“作品”,它的安装速度更快。它还能创建一个“.pyc”的文件,集成到安装文件中,用以确保与Python解释器更加匹配,并能在跨平台、跨机器的安装中保证软件的一致性。“wheel”本身还有“方向盘”的含义,或许之所以取这样的名字,可能因为它的存在,能给用户更大的“掌控感”吧。
下面我们要做的工作就是,利用pip来安装我们亲手编译的TensorFlow二进制文件:
pip install ~/tensorflow_pkg/tensorflow-1.6.0-cp36-cp36m-linux_x86_64.whl
当出现下面的字样,则表明安装成功
Installing collected packages: tensorflow
Successfully installed tensorflow-1.6.0
一旦TensorFlow安装成功之后,接下来我们要做的就是,重新进入Python的交互式环境,测试运行一下前文提到的“Hello World”版本的TensorFlow程序,看有没有警告信息。这里需要介绍一下一个经验之谈,不要在TensorFlow的源文件目录下进入Python,否则,Python可能会因为误以为当前目录中的Tensorflow就是要导入的模块,从而导致装载失败。换一个目录进入Python,就可以解决此类问题。
tangqing@ubuntu:~$ python
ython 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:51:32)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant("Hello, TensorFlow!")
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello World, TensorFlow!'