安装和配置bazel
2018-12-26 21:56:23
编译和移植tensorflow的C/C++源码时,用到bazel这一构建工具。本篇blog记录遇到的安装、配置问题。
吐槽
构建工具,从make/ant/cmake/gradle一路用下来,各有优劣,只能说用的越熟练越容易上手
编译安装bazel时用到java。为啥不全用C++写?
bazel命名是有补全的,但是ubuntu + zsh + oh-my-zsh + apt的组合下,bazel的补全需要自行安装
为什么编译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个多小时。。太慢了。
未完待续
安装和配置bazel的更多相关文章
- JDK安装与配置
JDK安装与配置 一.下载 JDK是ORACLE提供免费下载使用的,官网地址:https://www.oracle.com/index.html 一般选择Java SE版本即可,企业版的选择Java ...
- Node.js 教程 01 - 简介、安装及配置
系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...
- 烂泥:redis3.2.3安装与配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前一段时间写过一篇codis集群的文章,写那篇文章主要是因为当时的项目不支持redis自 ...
- mysql源码包手动安装、配置以及测试(亲测可行)
笔记编者:小波/qq463431476博客首页:http://www.cnblogs.com/xiaobo-Linux/ 记下这篇mysql笔记,望日后有用! redhat6采用centos yum源 ...
- 环境搭建系列-系统安装之centos 6.5安装与配置
按照国际惯例,系列目录先奉上: 系列一:系统安装之centos 6.5安装与配置 系列二:准备工作之Java环境安装 系列三:数据为先之MySQL读写集群搭建 系列四:谈分布式之RabbitMQ集群搭 ...
- ZooKeeper安装与配置
一. 单机安装.配置: 1. 下载zookeeper二进制安装包下载地址:http://apache.dataguru.cn/zookeeper/zookeeper-3.4.3/zookeeper-3 ...
- mac 下JDK 与 tomcat 的安装与配置
一.Mac下JDK的安装 1.先检测Mac是否已经安装过JDK,在终端中输入java 或者 javac 显示说明,表明已经安装过JDK,JDK版本查询终端键入java -version,终端会返回JD ...
- 烂泥:zabbix3.0安装与配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 这个月又快过完了,最近也比较忙,没时间写文章,今天挤点时间把zabbix3.0安装与配置 ...
- Jenkins入门系列之——02第二章 Jenkins安装与配置
2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...
随机推荐
- 使用git和github管理自己的项目---基础操作学习[转]
原文: https://segmentfault.com/a/1190000003728094 我是通过看廖雪峰的git教程学习的,真的是极好的,以下是我学习过程中的总结,记录下来,方便自己参考以熟悉 ...
- 8.3版本提示未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 提供程序
这个原因是8.3版本推出了64位程序,但是Access驱动在64位系统上默认是没有安装的,需要下载一个组件安装即可. 下载2010 Access 驱动程序:数据连接组件安装 http://www.ba ...
- Pytorch之验证码识别
本文主要实现了两个工作:1.验证码生成 2.Pytorch识别验证码 一. 验证码生成 方法1. 利用PIL库的ImageDraw实现绘图,此法参考博客实现: #!/usr/bin/env pyt ...
- ppp 完全理解(二)【转】
转自:https://blog.csdn.net/tianruxishui/article/details/44057717 ppp 完全理解(二) pppd 协议及代码分析 作者:李圳均 日期:20 ...
- UDP可靠传输那些事
有空来论坛走走,发现讨论udp可靠传输又热了起来,有人认为udp高效率,有人认为udp丢包重传机制容易控制,还有朋友搞极限测试,当然也有人推销自己的东西,这里写一点我个人的看法. udp可靠传输其实非 ...
- 几种 WebP 动态图制作方法
1.RealWorld Paint 目前唯一有图形用户界面的 动态 webp 编辑器, 利用最新版本 libwebp v1.0.0 生成的有损动态图是打不开.这个有两个版本, 推荐使用 2013.1, ...
- centos7 docker使用https_proxy 代理配置
centos7 docker使用https_proxy 代理配置 背景: 内网的centos主机不能上网,通过同网段的windows设置代理上网,yum.conf配置http代理是可以的,但是dock ...
- python2x 和 python 3x的区别
1,大环境: python2x: 大神贡献源码,这些源码有自己语言的特色,源码不规范,源码重复代码太多. python崇尚的是优美清晰简单. python3x: 龟叔重新整理,将源码规范化,简单化,统 ...
- nginx记录post body/payload数据
1. 文档 在nginx中想利用$request_body命令获取post请求的body参数,并落日志,但是发现该变量值为空,查看官网中对$request_body的描述如下: $request_bo ...
- linux命令知识点
1. 例二:列出当前目录中所有以“t”开头的目录的详细内容,可以使用如下命令: 命令:ls -l t* 例六:计算当前目录下的文件数和目录数 命令: ls -l * |grep "^-&qu ...