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個多小時。。太慢了。
未完待續