安裝和配置bazel


2018-12-26 21:56:23

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

吐槽

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

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

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

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

安裝bazel

方法1:手動從github下載預編譯bazel二進制包
從這里下載預編譯好的二進制:https://github.com/bazelbuild/bazel/releases

我這里下載bazel 0.19,因為tf r1.13版不支持bazel 0.18(但是tf master分支的一些文件的commit message里又說了這個bug,tf和bazel的組合看起來有點腦殘)

然后chmod +x , 以及放到PATH中的某個路徑下。需要的話設置個軟鏈接。

實際測試發現,這種方法裝的0.19版本bazel,編譯tf r1.13時,出現一些錯誤:比如TMP目錄不存在、cpu被設定為了k8s,導致沒進入編譯。

方法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個多小時。。太慢了。

未完待續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM