原本是想理解一下TF源碼編譯過程的,後來發現功力和時間有限,就只分析了兩個入口級文件$TF_ROOT/WORKSPACE
和$TF_ROOT/tensorflow/workspace.bzl
python
說明
- 只考慮Bazel,不考慮CMake。
- 只考慮
WORKSPACE
,BUILD
,*.bzl
,不考慮configure
和configure.py
- 本人對Bazel不甚瞭解,不保證分析過程正確性
分析
假定tf源碼目錄是$TF_ROOT
android
全局設定文件:$TF_ROOT/WORKSPACE
$TF_ROOT/WORKSPACE
是執行Bazel系列命令後第一個解析的文件,設定各類全局的設置,根據其內容,它主要作了這幾件事情:git
設定WORKSPACE名字。可選github
workspace(name = "org_tensorflow")sql
加載http_archive函數。新版bazel中須要手動load,而後再使用docker
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")數據庫
利用http_archive函數,加載若干bazel相關的包,例如:apache
- 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個包。