TensorFlow的Bazel構建文件結構

原本是想理解一下TF源碼編譯過程的,後來發現功力和時間有限,就只分析了兩個入口級文件$TF_ROOT/WORKSPACE$TF_ROOT/tensorflow/workspace.bzlpython

說明

  • 只考慮Bazel,不考慮CMake。
  • 只考慮WORKSPACE,BUILD,*.bzl,不考慮configureconfigure.py
  • 本人對Bazel不甚瞭解,不保證分析過程正確性

分析

假定tf源碼目錄是$TF_ROOTandroid

全局設定文件:$TF_ROOT/WORKSPACE

$TF_ROOT/WORKSPACE是執行Bazel系列命令後第一個解析的文件,設定各類全局的設置,根據其內容,它主要作了這幾件事情:git

  1. 設定WORKSPACE名字。可選github

    workspace(name = "org_tensorflow")sql

  2. 加載http_archive函數。新版bazel中須要手動load,而後再使用docker

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

  3. 利用http_archive函數,加載若干bazel相關的包,例如:apache

    • io_bazel_rules_closure
    • io_bazel_rules_docker
    • Apple和Swift的bazel支持
  4. 檢查bazel版本,來確保BUILD文件正確解析編程

    當前要求至少0.18版本

不過彷佛0.18版本的bazel有問題,後來我用apt裝了0.21版本的是OK的。

  1. 加載tensorflow/workspace.bzl文件,用來加載各類依賴項:

    全部的依賴項都寫在"*.bzl"文件中了

  2. 從谷歌雲盤下載幾個流行的模型,包括:

    • 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個包。

相關文章
相關標籤/搜索