最近在用源码安装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使用它来构建内部大多数的软件。它的功能有诸多亮点:

  • 多语言支持:目前Bazel默认支持Java、Objective-C和C++,但可以被扩展到其他任何变成语言。
  • 高级构建描述语言:项目是使用一种叫BUILD的语言来描述的,它是一种简洁的文本语言,它把一个项目视为一个集合,这个集合由一些互相关联的库、二进制文件和测试用例组成。相反,像Make这样的工具,需要去描述每个文件如何调用编译器。
  • 多平台支持:同一套工具和相同的BUILD文件可以用来为不同的体系结构构建软件,甚至是不同的平台。在Google,Bazel被同时用在数据中心系统中的服务器应用和手机端的移动应用上。
  • 可重复性:在BUILD文件中,每个库、测试用例和二进制文件都需要明确指定它们的依赖关系。当一个源码文件被修改时,Bazel凭这些依赖来判断哪些部分需要重新构建,以及哪些任务可以并行进行。这意味着所有构建都是增量的,并且相同构建总是产生一样的结果。
  • 可伸缩性:Bazel可以处理大型项目;在Google,一个服务器软件有十万行代码是很常见的,在什么都不改的前提下重新构建这样一个项目,大概只需要200毫秒。

      对于为什么要重新发明一个构建工具而不直接使用Make,Google认为Make控制得太细,最终的结果完全依靠开发人员能正确编写规则。很久以前,Google使用自动生成的臃肿的Makefile来构建他们的软件,速度太慢,结果不可靠,最终影响了研发人员的效率和公司的敏捷性。所以他们做了Bazel。Bazel的规则层次更高,比如,对于“Java测试”、“C++二进制文件”,它都有定义好的内建规则,而这些规则都已经被无数的测试证明是正确和稳定的。

2)安装

(1) 添加bazel包源

$ echo "deb [arch=amd64] http://storage.googleapis/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list

***如果没有安装curl需要执行命令:sudo apt-get install curl ***

$ curl https://storage.googleapis/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/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!'

 

更多推荐

源码安装tensorflow