本来是想理解一下TF源码编译过程的,后来发现功力和时间有限,就只分析了两个入口级文件$TF_ROOT/WORKSPACE$TF_ROOT/tensorflow/workspace.bzl

说明

  • 只考虑Bazel,不考虑CMake。
  • 只考虑WORKSPACE,BUILD,*.bzl,不考虑configureconfigure.py
  • 本人对Bazel不甚了解,不保证分析过程正确性

分析

假定tf源码目录是$TF_ROOT

全局设定文件:$TF_ROOT/WORKSPACE

$TF_ROOT/WORKSPACE是执行Bazel系列命令后第一个解析的文件,设定各种全局的设置,根据其内容,它主要做了这几件事情:

  1. 设定WORKSPACE名字。可选

workspace(name = "org_tensorflow")

  1. 加载http_archive函数。新版bazel中需要手动load,然后再使用

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")

  1. 利用http_archive函数,加载若干bazel相关的包,例如:
  • io_bazel_rules_closure
  • io_bazel_rules_docker
  • Apple和Swift的bazel支持
  1. 检查bazel版本,来确保BUILD文件正确解析

当前要求至少0.18版本

不过似乎0.18版本的bazel有问题,后来我用apt装了0.21版本的是OK的。

  1. 加载tensorflow/workspace.bzl文件,用来加载各种依赖项:

所有的依赖项都写在"*.bzl"文件中了

  1. 从谷歌云盘下载几个流行的模型,包括:
  • 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构建文件结构的更多相关文章

  1. 为什么google bazel构建工具流行不起来

    作者Jack47 转载请保留作者和原文出处 之前博主写了系列文章Google软件构建工具Bazel原理及使用方法介绍.最近使用了一段时间后,觉得这个东西不是一种通用的构建工具,很难对接到情况复杂的大的 ...

  2. 使用Bazel构建C/C++项目

    目录 前提 基本概念 速查链接汇总 stage1: 一个package, 一个target stage2: 一个package,多个target stage3: 多package,多target st ...

  3. 使用TensorFlow v2.0构建多层感知器

    使用TensorFlow v2.0构建一个两层隐藏层完全连接的神经网络(多层感知器). 这个例子使用低级方法来更好地理解构建神经网络和训练过程背后的所有机制. 神经网络概述 MNIST 数据集概述 此 ...

  4. 使用TensorFlow v2.0构建卷积神经网络

    使用TensorFlow v2.0构建卷积神经网络. 这个例子使用低级方法来更好地理解构建卷积神经网络和训练过程背后的所有机制. CNN 概述 MNIST 数据集概述 此示例使用手写数字的MNIST数 ...

  5. Tensorflow在CIFAR-10构建CNN

    使用Tensorflow在CIFAR-10二进制数据集上构建CNN 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow机器学习实战指南 利用Tensorflow读取 ...

  6. TensorFlow入门——bazel编译(带GPU)

    这一系列基本上是属于我自己进行到了那个步骤就做到那个步骤的 由于新装了GPU (GTX750ti)和CUDA9.0.CUDNN7.1版本的软件,所以希望TensorFlow能在GPU上运行,也算上补上 ...

  7. Bazel构建工具的安装

    官方Doc:https://docs.bazel.build/versions/master/install-ubuntu.html 使用Bazel定制的APT存储库 (recommended) 1. ...

  8. Tensorflow[源码安装时bazel行为解析]

    0. 引言 通过源码方式安装,并进行一定程度的解读,有助于理解tensorflow源码,本文主要基于tensorflow v1.8源码,并借鉴于如何阅读TensorFlow源码. 首先,自然是需要去b ...

  9. Bazel 编译工具; tensorflow 编译

    什么是bazel https://docs.bazel.build/versions/master/bazel-overview.html 使用 bazel 构建 c++ 工程 https://git ...

随机推荐

  1. 面试题(一GC)

    参考https://blog.csdn.net/m0_38110132/article/details/74542143 6.详谈一下Java内存模型以及GC算法: (1). jvm结构 JVM的内部 ...

  2. elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...

  3. Google Translation Via Python

    没什么好说的,直接送包   https://github.com/mouuff/mtranslate

  4. 不用Ajax时的传参方法

    不用Ajax时的怎么传参 创建一个form表单 function test(){ var params = { "参数名": "参数值" }; postExce ...

  5. P2837 晚餐队列安排

    此题可能用动规不太好做,主要是状态转移方程很难想个人认为,思维发散的大佬们忽视. 我看了这位大佬的dp题解后才想到了方程,在此受我一膜%%% 嗯,说下思路: 先用a[i]数组存一下输入的编号: 然后用 ...

  6. Magento 2 Error: A technical problem with the server created an error. Try again to continue what you were doing. If the problem persists, try again later.

    有时在Magento上进行调试会很烦人,特别是如果出现了一些问题,而不是在你实际编写代码时. 这是Magento管理面板上发生的事情.截至目前,它可能是三个原因之一,让我们讨论一下: 1.管理员密码 ...

  7. Java EE之表达式语言EL(上)

    1.了解表达式语言 表达式语言(EL)用于在不使用脚本.声明或者表达式的情况下,在JSP页面中渲染数据. EL曾是JSTL 1.0规范(与JSP 1.2)中的一部分,并且只可以用作JSTL标签的特性. ...

  8. vue实战记录(一)- vue实现购物车功能之前提准备

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(一) GitHub:sue ...

  9. Web请求相关

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  10. Hbase 元数据一致性检查(转)

    最近在学习HBase先关的知识,顺便做一下笔记,以加深知识的了解和掌握. Hbase常用工具 文件检测修复工具 hbase hbck -help 常用选项: -details 显示所有region检查 ...