zoukankan      html  css  js  c++  java
  • 安装和配置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个多小时。。太慢了。

    未完待续

  • 相关阅读:
    Springboot之配置定时任务
    Java之随机生成各种类型的数据举例
    docker安装postgresql 12.4
    Java随机生成字符串举例
    Java生成UUID
    Shell case 多选择语句用法举例
    Elasticsearch学习之集群高级网络设置
    交叉熵损失函数
    将博客搬至CSDN
    SonarQube服务搭建
  • 原文地址:https://www.cnblogs.com/zjutzz/p/10182099.html
Copyright © 2011-2022 走看看