安裝和配置bazel

2018-12-26 21:56:23html

編譯和移植tensorflow的C/C++源碼時,用到bazel這一構建工具。本篇blog記錄遇到的安裝、配置問題。java

吐槽

  1. 構建工具,從make/ant/cmake/gradle一路用下來,各有優劣,只能說用的越熟練越容易上手git

  2. 編譯安裝bazel時用到java。爲啥不全用C++寫?github

  3. bazel命名是有補全的,可是ubuntu + zsh + oh-my-zsh + apt的組合下,bazel的補全須要自行安裝web

  4. 爲何編譯tensorflow而不是pip install tensorflow-gpu?這也許就是framework dev和普通訓模師的區別吧。shell

安裝bazel

方法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

配置bazel自動補全

若是是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版本
bazel version

#執行構建
bazel build

#構建清除
bazel clean

mac上第一次使用bazel就報錯

報錯提示說Xcode SDK版本啥的有問題,須要這麼搞一下:

bazel clean --expunge
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license
bazel clean --expunge

bazel官方cpp對應的構建教程過一遍

地址: 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下的目錄的軟連接。

編譯tensorflow

平臺: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個多小時。。太慢了。

未完待續

相關文章
相關標籤/搜索