2018-12-26 21:56:23html
编译和移植tensorflow的C/C++源码时,用到bazel这一构建工具。本篇blog记录遇到的安装、配置问题。java
构建工具,从make/ant/cmake/gradle一路用下来,各有优劣,只能说用的越熟练越容易上手git
编译安装bazel时用到java。为啥不全用C++写?github
bazel命名是有补全的,可是ubuntu + zsh + oh-my-zsh + apt的组合下,bazel的补全须要自行安装web
为何编译tensorflow而不是pip install tensorflow-gpu?这也许就是framework dev和普通训模师的区别吧。shell
方法1:手动从github下载预编译bazel二进制包
从这里下载预编译好的二进制:https://github.com/bazelbuild/bazel/releasesubuntu
我这里下载bazel 0.19,由于tf r1.13版不支持bazel 0.18(可是tf master分支的一些文件的commit message里又说了这个bug,tf和bazel的组合看起来有点脑残)vim
而后chmod +x , 以及放到PATH中的某个路径下。须要的话设置个软连接。api
实际测试发现,这种方法装的0.19版本bazel,编译tf r1.13时,出现一些错误:好比TMP目录不存在、cpu被设定为了k8s,致使没进入编译。xcode
方法2:添加google的bazel源而后apt安装bazel
来吧,从官方文章抄一段,反正确实管用:
Step 1: Install the JDK Install JDK 8: sudo apt-get install openjdk-8-jdk On Ubuntu 14.04 LTS you must use a PPA: sudo add-apt-repository ppa:webupd8team/java sudo apt-get update && sudo apt-get install oracle-java8-installer Step 2: Add Bazel distribution URI as a package source Note: This is a one-time setup step. echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - If you want to install the testing version of Bazel, replace stable with testing. Step 3: Install and update Bazel sudo apt-get update && sudo apt-get install bazel Once installed, you can upgrade to a newer version of Bazel with the following command: sudo apt-get install --only-upgrade bazel
这种方法是在家里面的1080Ti机器上配置的,测试后发现能够运行。不知道是否是由于半年前编译过一次tf有关。
查看bazel版本
bazel version
若是是Mac OSX上的zsh+oh-my-zsh+brew的组合,默认就能够bazel补全。
若是是ubuntu上的zsh+oh-my-zsh+apt的组合,须要手动添加_bazel
文件:
mkdir -p ~/.zsh/completion/ vim ~/.zsh/completion/_bazel
其中_bazel
文件从github网页上复制下来贴到文件中便可:https://github.com/bazelbuild/bazel/blob/master/scripts/zsh_completion/_bazel
而后配置~/.zshrc
,追加内容为:
fpath[1,0]=~/.zsh/completion/ compinit
如今执行source ~/.zshrc
,或从新登陆shell,bazel相关的命令就有补全了。
注意:bazel的tab提示,不提示(仍然须要手动输入)冒号:。好比整个工程根本没有子目录的状况,输入bazel build
后输入tab,半天没有反应,此时手动应该输入":",不然直接执行的话全部target都被忽略的。(说的就是你,abseil的hello-world程序。。)
#查看bazel版本 bazel version #执行构建 bazel build #构建清除 bazel clean
报错提示说Xcode SDK版本啥的有问题,须要这么搞一下:
bazel clean --expunge sudo xcode-select -s /Applications/Xcode.app/Contents/Developer sudo xcodebuild -license bazel clean --expunge
地址: https://docs.bazel.build/versions/master/tutorial/cpp.html
下载代码:
mkdir -p ~/work/bazel_examples cd $_ git clone https://github.com/bazelbuild/examples .
就像tensorflow喜欢造不少新概念同样,bazel也造新概念。
WORKSPACE
存放名为WORKSPACE
的文件的目录,是整个工程的根目录。换言之,整个工程的根目录由WORKSPACE
来标识。整个工程的根目录也被叫作workspace。
WORKSPACE
文件为空便可
BUILD
在workspace下,考虑每个子目录:若是存放了名为BUILD
的文件,那么这个目录就是一个package,意思是一个包。
BUILD
文件内容:它的内容包括你设定的编译target,好比cc_binary
表示一个可执行,cc_library
表示一个库;每一个target里又包括name
等字段:
cc_library( name = "hello-greet", srcs = ["hello-greet.cc"], hdrs = ["hello-greet.h"], ) cc_binary( name = "hello-world", srcs = ["hello-world.cc"], deps = [ ":hello-greet", ], )
执行bazel构建
在工程根目录,也就是包含WORKSPACE
文件的那个目录,执行:
bazel build //main:hello-library
表示让bazel去构建main
这个package下的hello-library
这一target。
随后,会在当前_workspace_下,生成bazel-bin bazel-genfiles bazel-out bazel-stage2 bazel-testlogs
这几个文件。它们是~/.cache/bazel/_bazel_XXX
下的目录的软连接。
平台:ubuntu16.04, NVidia 1080Ti, cuda9.0, cudnn7, gcc5-4, i7 CPU。
步骤:
./configure #根据状况,每一交互问题作回答,或选择no bazel shutdown # 可选,由于直接bazel build提示让我stop server,因此执行了这一步 bazel build tensorflow:all # 执行构建,让机器怒吼吧!
结果:
Target //tensorflow/tools/pip_package:build_pip_package up-to-date:
bazel-bin/tensorflow/tools/pip_package/build_pip_package
INFO: Elapsed time: 7998.615s, Critical Path: 381.92s
INFO: 15139 processes: 15139 local.
INFO: Build completed successfully, 18985 total actions
一共花了2个多小时。。太慢了。
未完待续