TensorFlow的Bazel构建文件结构
本来是想理解一下TF源码编译过程的,后来发现功力和时间有限,就只分析了两个入口级文件$TF_ROOT/WORKSPACE和$TF_ROOT/tensorflow/workspace.bzl
说明
- 只考虑Bazel,不考虑CMake。
- 只考虑
WORKSPACE,BUILD,*.bzl,不考虑configure和configure.py - 本人对Bazel不甚了解,不保证分析过程正确性
分析
假定tf源码目录是$TF_ROOT
全局设定文件:$TF_ROOT/WORKSPACE
$TF_ROOT/WORKSPACE是执行Bazel系列命令后第一个解析的文件,设定各种全局的设置,根据其内容,它主要做了这几件事情:
- 设定WORKSPACE名字。可选
workspace(name = "org_tensorflow")
- 加载http_archive函数。新版bazel中需要手动load,然后再使用
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
- 利用http_archive函数,加载若干bazel相关的包,例如:
- io_bazel_rules_closure
- io_bazel_rules_docker
- Apple和Swift的bazel支持
- 检查bazel版本,来确保BUILD文件正确解析
当前要求至少0.18版本
不过似乎0.18版本的bazel有问题,后来我用apt装了0.21版本的是OK的。
- 加载
tensorflow/workspace.bzl文件,用来加载各种依赖项:
所有的依赖项都写在"*.bzl"文件中了
- 从谷歌云盘下载几个流行的模型,包括:
- inception_v1
- mobile_ssd
- mobile_multibox
- stylize
- speech_commands
可以看到,tensorflow/workspace.bzl是重点解析的文件,它里面定义的tf_workspace()函数加载了各种依赖项
外部依赖项入口:tensorflow/workspace.bzl
主要考虑这个文件中定义的tf_workspace(),它通过http下载(tf_http_archive())的外部依赖包括:
- mkl_dnn: intel CPU上的矩阵加速库
- com_google_absl: google开源的abseil库,类似于boost的G家升级版。移植tf源码时容易和abseil纠缠在一块
- eigen_archive: eigen矩阵计算加速库
- arm_compiler: 树莓派编译相关
- libxsmm_archive: Intel CPU平台上矩阵运算相关的一个库。不了解
- com_googlesource_code_re2: google家开源的正则库
- com_github_googlecloudplatform_google_cloud_cpp: 谷歌云相关
- com_github_googleapis_googleapis:google api,看起来比较通用常见基础的一个东西
- gemmlowp:矩阵乘法加速
- farmhash_archive:各种hash函数,google家开源的
- png_archive: 处理.png图片格式库
- org_sqlite: sqlite,麻雀虽小但五脏俱全的数据库
- gif_archive: 处理.gif格式图片的库
- protobuf: 使用protobuf似乎是G家代码的必备,然而其实这货往往容易带来问题,2333
- nsync: nsync是google的非官方同步原语库。然而其实nsync也是Justin Timberlake早年所在团体的名字, 2333
- googletest:没的说,没的说,谷歌自家的测试框架,标配
- gflags: 解析命令行参数,G家开源的,半标配
- pcre: Perl的一个正则库。说实话,我出了fddb-eval就没见过在用户层面用perl脚本的地方
- swig: SWIG: A code generator for connecting C/C++ with other programming languages。不明觉厉的一个库。
- curl:下载库
- gRPC:远程调用库。
- nanopb:protobuf已经很讨厌了,又来一个nanopb,说是给嵌入式系统用的pb,2333
- llvm: 编译器,不明觉厉
- lmdb: caffe用lmdb是压缩数据集,tf你也这样用吗??
- jsoncpp: 解析json的C++库。protobuf都有了,怎么还要用json?2333
- boringssl: ssl库,fork自openssl,google家的定制版。google也不是完全自己造轮子啊
- zlib: 压缩库
- fft2d: 傅里叶变换库
- snappy: snappy库在Caffe中被用到。tf你也用到了吗?
- nccl: 多gpu通信
- librdkafka: apache kafka的C实现。分布式通信相关?我不太了解
- pprof: google开源的profiling(性能排查)的可视化工具
- cub:cub是NVidia家的cuda编程相关的一个库
- cython: python加速用的
- bazel_toolchains: bazel自个儿的东西,构建相关
- arm_neon_2_x86_sse: 计算加速相关
- double_conversion: 高效的IEEE double浮点数“2进制-10进制”相互转化工具
- tbb:tbb是Intel家开源的CPU并行加速库,anyway,编译OpenCV的时候遇到过它
- ngraph: ngraph是图(graph)编译器,用于深度学习加速
- nlohmann_json_lib: json库。已经有jsoncpp了为啥还要一个?
- ngraph-tf: 有ngraph了为啥还要ngraph-tf。。
以及,一堆python包(不是很懂,直接pip装不就好了吗?写个requirements.txt不好吗?)
- six
- astor
- gast
- termcolor
- absl_py: abseil库的python接口
- backports_weakref:弱引用/GC相关
以及,若干java maven仓库里的jar包(java生态我不了解,不查了):
- junit:java代码单元测试框架
- hamcrest
- google test
- google truth
- checkerframework
- javapoet
以及,一堆tensorflow官方训练好的模型与相关的文件:
- tflite_mobilenet_float
- tflite_mobilenet_quant
- tflite_mobilenet_ssd
- tflite_mobilenet_ssd_quant
- tflite_mobilenet_ssd_quant_protobuf
- tflite_conv_actions_frozen
- tflite_smartreply
- tflite_ovic_testdata
- build_bazel_rules_android
看看有多少package?
既然是Bazel构建,那就得用java工程目录结构的思路来思考。
zz@zz-B360-HD3 /home/zz/work/tensorflow master
⚡ find . -name 'BUILD' | wc -l
464
可以看到,一共有464个包。
TensorFlow的Bazel构建文件结构的更多相关文章
- 为什么google bazel构建工具流行不起来
作者Jack47 转载请保留作者和原文出处 之前博主写了系列文章Google软件构建工具Bazel原理及使用方法介绍.最近使用了一段时间后,觉得这个东西不是一种通用的构建工具,很难对接到情况复杂的大的 ...
- 使用Bazel构建C/C++项目
目录 前提 基本概念 速查链接汇总 stage1: 一个package, 一个target stage2: 一个package,多个target stage3: 多package,多target st ...
- 使用TensorFlow v2.0构建多层感知器
使用TensorFlow v2.0构建一个两层隐藏层完全连接的神经网络(多层感知器). 这个例子使用低级方法来更好地理解构建神经网络和训练过程背后的所有机制. 神经网络概述 MNIST 数据集概述 此 ...
- 使用TensorFlow v2.0构建卷积神经网络
使用TensorFlow v2.0构建卷积神经网络. 这个例子使用低级方法来更好地理解构建卷积神经网络和训练过程背后的所有机制. CNN 概述 MNIST 数据集概述 此示例使用手写数字的MNIST数 ...
- Tensorflow在CIFAR-10构建CNN
使用Tensorflow在CIFAR-10二进制数据集上构建CNN 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow机器学习实战指南 利用Tensorflow读取 ...
- TensorFlow入门——bazel编译(带GPU)
这一系列基本上是属于我自己进行到了那个步骤就做到那个步骤的 由于新装了GPU (GTX750ti)和CUDA9.0.CUDNN7.1版本的软件,所以希望TensorFlow能在GPU上运行,也算上补上 ...
- Bazel构建工具的安装
官方Doc:https://docs.bazel.build/versions/master/install-ubuntu.html 使用Bazel定制的APT存储库 (recommended) 1. ...
- Tensorflow[源码安装时bazel行为解析]
0. 引言 通过源码方式安装,并进行一定程度的解读,有助于理解tensorflow源码,本文主要基于tensorflow v1.8源码,并借鉴于如何阅读TensorFlow源码. 首先,自然是需要去b ...
- Bazel 编译工具; tensorflow 编译
什么是bazel https://docs.bazel.build/versions/master/bazel-overview.html 使用 bazel 构建 c++ 工程 https://git ...
随机推荐
- SpringCloud学习笔记:声明式调用Feign(4)
1. Feign简介 Feign采用声明式API接口的风格,将Java HTTP客户端绑定到它的内部. Feign的首要目标是简化Java HTTP客户端调用过程. 2.Feign客户端示例 Feig ...
- 使用Node.js搭建数据爬虫crawler
0. 通用爬虫框架包括: (1) 将爬取url加入队列,并获取指定url的前端资源(crawler爬虫框架主要使用Crawler类进行抓取网页) (2)解析前端资源,获取指定所需字段的值,即获取有价值 ...
- tensorflow函数/重要功能实现
一.基础函数 1.1 .tf.reduce_sum(input_tensor, axis) Computes the sum of elements across dimensions of a ...
- 如何使用Excel表格状态栏动态查看统计
该文是以前的博文,本文中有一列是快递单号,其实这一列根本不需要,一般快递几天就到,在excel表中存快递单号,纯属浪费时间,快递单号一般都会有客户留存联,而且也登入了网上的表格,所以个人用的excel ...
- restfull规范、DRF视图和路由
一.restfull规范的简单介绍 1.介绍 REST:表述性状态转移,是一种web交互方案 资源:在web中只要有被引用的必要都是资源 URI: URI 统一资源标识符 URL 统一资源定位符 统一 ...
- Flask 模板系统
模板 基本数据类型 可以执行python语法,如:dict.get(), list['xx'] 比django 更加亲近于 python 传入函数 - django,自动执行 - flask,不自动执 ...
- 【mysql】mysql存储引擎
了解存储引擎我们先看下mysql的体系架构. 上图是mysql的逻辑架构图,可以看到分了几层. 第一层是大部分网路客户端工具,比如php,python ,JDBC等,主要功能就是连接处理,授权认证等 ...
- 来了解质量管理工具——质量屋(HOQ)
质量屋(The House Of Quality),又名HOQ,它是质量功能配置(QFD)的核心.一般QFD的学习会涉及到.同时HOQ也是项目管理十大知识领域领域中质量管理工具中的一种,今天我们就来了 ...
- SQL随记(一)
1.关于define表示定义 2.sql%rowcount用于记录修改的条数,必须放在一个CUD语句后面执行,无法在select中使用. 3.两种调用过程的关键字:exec和call 两者区别: (1 ...
- GO语言系列(四)- 内置函数、闭包与高级数据类型
一.内置函数.递归函数.闭包 内置函数 1. close:主要用来关闭channel 2. len:用来求长度,比如string.array.slice.map.channel 3. new:用来分配 ...