TensorFlow学习系列之七:TensorFlow的源码编译
为了编译TensorFlow的源代码,除了要有gcc(版本不低于4.8)⽀持之外,还需要安装Google⾃产的编译⼯具Bazel。
1.安装Bazel
安装Bazel,需要Java JDK 8或更⾼版本的⽀持,所以接下来我们要的第⼀件⼯作,就是要确定Java 8/9是否已经安装(可⽤“java -version”来查询)。如果没有安装,则可以通过如下流程安装。
(1)利⽤Ubuntu的PPA(Personal Package Archives个⼈软件包仓库(PPA),)安装Java 8。
sudo add-apt-repository ppa:webupd8team/java #添加PPA
sudo apt-get update && sudo apt-get install oracle-java8-installer #安装Java8
在安装过程中,需要选择同意Oracle公司的许可协议(⽤TAB键选择<YES>,并按回车确认)。待上述流程安装完毕后,输⼊如下命令检查Java 8是否成功安装。
yhilly@ubuntu:~$ java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
从提⽰信息中,可以看出Java 8已成功安装。需要注意的是,虽然Java 9已经⾯世,但和Java 9相关的软件⽣态还没有形成,盲⽬“追新”会让很多软件运⾏不了。⽐如说,Bazel暂时还没有“与时俱进”发布与jdk 1.9相匹配的版本,所以,我们选择让“Java 9飞⼀会⼉”,暂时还使⽤稳定版本jdk 1.8。
(2)将Bazel发布版的URI设置为软件包源
输⼊如下两条指令可设置软件源:
echo "deb [arch=amd64] leapis/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl bazel.build/bazel-release.pub.gpg | sudo apt-key add -
(3)安装并更新Bazel
使⽤下⾯的指令更新并安装Bazel(下⾯的指令实际上是两条,⽤“&&”连接⼀下,可让多条命令同处⼀⾏)。
sudo apt-get update && sudo apt-get install bazel
在命令⾏输⼊“bazel version”,如果有正常的反馈信息输出,则表明Bazel安装完毕。
Extracting
Build label: 0.9.0
Build target: bazel-out/k8-fastbuild/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Tue Dec 19 09:31:58 2017 (1513675918)
Build timestamp: 1513675918
Build timestamp as int: 1513675918
2 .下载TensorFlow的源码
在编译⼯具准备好之后,下⾯我们要做的⼯作就是下载TensorFlow的源代码。为了获取在GitHub上的TensorFlow源码,⽐较⽅便的⽅式就是使⽤git⼯具(⼀款免费开源的分布式版本控制系统),Ubuntu中并没有预装这个⼯具,需要我们利⽤下⾯的命令安装:
sudo apt install git
在输⼊root密码后,apt就会⾃动安装git⼯具。这⾥稍微说明⼀点的是,对于较新版本的Ubuntu⽽⾔,通常可使⽤简化版的“apt”命令来代替“apt-get”,事实上,为了兼容性,⽼版本指令的“apt-get”在新版本Ubuntu中依然有效,不过是新命令更加简单好记罢了。
接下来,我们利⽤git命令把远程的TensorFlow代码“克隆”(复制)到本地,如图11-15所⽰。
图11-15 远程克隆TensorFlow源代码
然后进⼊家⽬录下的TensorFlow下载路径。
cd ~/tensorflow
然后可利⽤“ls”命令查看⼀下TensorFlow的相关⽂件,如图11-16所⽰
图11-16 TensorFlow的源码⽂件夹
源代码电影讲解接下来,我们进⼊tensorflow源码⽂件夹,利⽤“git checkout”(检出)TensorFlow版本1.6。
yhilly@ubuntu:~/tensorflow$ git checkout r1.6
Branch r1.6 set up to track remote branch r1.6 from origin.
Switched to a new branch 'r1.6'
3 配置编译⽂件
在⽤Bazel编译源代码之前,我们还需要在TensorFlow源代码路径下,运⾏configure⽂件,做⼀些必要的配置:
./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”(配置完成)字样,则表⽰配置顺利完成。
4 编译源⽂件
在配置完毕Bazel的编译选项之后,接下来就可以使⽤如下指令编译TensorFlow的源代码:
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
如果想获得GPU⽀持,则需要加⼊编译选项“--config=cuda”。上述指令将在“/tensorflow/tools/pip_package”路径下,构建⼀个pip包⽂件。
倘若上述命令导致编译失败,⼀个可能的失败原因是,Bazel作为并⾏编译器,会耗费⾮常多的系统资源,特别是对利⽤虚拟机安装Ubuntu 的⽤户,⼀旦系统资源耗尽,编译⾃然难成。
下⾯的编译指令是对线程数、内存等资源做了限制,且⼀旦编译失败,让Bazel给出详细的错误信息。
bazel build -c opt --jobs 1 --local_resources 2048,0.5,1.0 --verbose_failures //tensorflow/tools/pip_package:build_pip_package
不过,⼀旦对编译资源做了限制,编译速度将会⾮常缓慢,可能耗时若⼲⼩时!当显⽰“INFO: Build completed successfully, 2173 total actions”字样时,表⽰编译成功。之后,在TensorFlow⽂件夹下,多了若⼲个与Bazel相关的⽂件夹。到此,⼯作还没有完毕,我们还需要构造⼀个Python的安装包(pip)。
图11-17 编译成功后的TensorFlow⽂件夹
在“bazel-bin”⽂件夹下,有我们需要的打包⼯具build_pip_package。假设我们把这个打包的位置定位为当前路径(TensorFlow的源⽂件)的“/temp”⽂件夹下,则使⽤如下指令:
bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/tensorflow_pkg
当然,上述指令后⾯的打包⽣成路径(“~/tensorflow_pkg”,这⾥的“~”表⽰笔者的家⽬录“/home/yhilly/”),实际上是可以任意指定的。⽐如说,如果是直接放到系统根⽬录下的临时⽂件夹(/tmp/tensorflow_pkg)。当然,如果放在根⽬录下,则需要加sudo权限,否则可能会因为权限不⾜⽽导致创建⽂件夹失败。
在打包完毕后,下⾯我们可以在打包⽣成路径(如“~/tensorflow_pkg”),查看到我们的劳动成果(⽤“ls”命令查看),其
中“tensorflow-1.6.0rc1-cp36-cp36m -linux_x86_64.whl”就是我们折腾半天的回报。它就是⽀持本地CPU优化适配的Python 3.6编译版本。
5 .测试编译结果
在编译完毕之后,我们还得安装上述“轮⽂件”(wheel file,以.whl为扩展名)。这⾥稍微简单介绍⼀下这个所谓的“轮⽂件”。“轮⽂件”是Python⽤以取代“蛋⽂件(egg file)”的⼀类新式安装包,⽀持pip 1.4或setuptools 0.8以上版本。
之所以Python不再扯“蛋”,⾃然是因为“轮⽂件”能带来更多便利。最直观的便利是,对于纯Python⽂件或C扩展⽂件(⽐如Objective-C)的编译“作品”,它的安装速度更快。它还能创建⼀个“.pyc”的⽂件,集成到安装⽂件中,⽤以确保与Python解释器更加匹配,并能在跨平台、跨机器的安装中保证软件的⼀致性。“wheel”本⾝还有“⽅向盘”的含义,或许之所以取这样的名字,可能因为它的存在,能给⽤户更⼤的“掌控感”吧。
图11-18 Python的“盘⽂件”⽰意图
下⾯我们要做的⼯作就是,利⽤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,就可以解决此类问题。
yhilly@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的安装版本和路径:
>>> tf.__version__ #单词version左右各两个下划线,下同。
'1.6.0'
6.卸载TensorFlow
如果我们不想再使⽤TensorFlow,或者想更新⼀个新的运⾏环境,可以利⽤pip3(或pip)命令卸载掉之前的TensorFlow,具体指令如下所⽰:
pip3 uninstall tensorflow #卸载TensorFlow
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论