[圖解tensorflow源碼] 入門準備工做

 tensorflow使用了自動化構建工具 bazel、腳本語言調用c或cpp的包裹工具 swig、使用 EIGEN做爲矩陣處理工具、Nvidia-cuBLAS GPU加速計算庫、結構化數據存儲格式protobuf
Swig
    
1. Simplified Wrapper and Interface Generator (SWIG) ,基本思想就是向腳本語言接口公開 C/C++ 代碼。SWIG 容許您向普遍的腳本語言公開 C/C++ 代碼,包括 Ruby、Perl、Tcl 和 Python。
 
Bazel
1. bazel假定每一個目錄爲[package]單元,目錄裏面包含了源文件和一個描述文件BUILD,描述文件中指定了如何將源文件轉換成構建的輸出。

 


1. name屬性來命名規則,deps屬性來描述規則之間的依賴關係
2. 使用冒號來分隔包名和規則名;若是某條規則所依賴的規則在其餘目錄下,就用"//"開頭,若是在同一目錄下,能夠忽略包名而用冒號開頭。
依賴關係:
graphical_dep

 

3. bazel命令:
     > bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
4. 調試模式:
     >  bazel build -c dbg
參考:
   > yum install java-1.8.0-openjdk
   > yum install java-1.8.0-openjdk-devel
   > https://github.com/google/bazel/ 下載最新版本bazel_xxx.sh安裝
 
 
 
 
EIGEN
1. Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms.  http://eigen.tuxfamily.org/  
  • 支持整數、浮點數、複數,使用模板編程,能夠爲特殊的數據結構提供矩陣操做。好比在用ceres-solver進行作優化問題(好比bundle adjustment)的時候,有時候須要用模板編程寫一個目標函數,ceres能夠將模板自動替換爲內部的一個能夠自動求微分的特殊的double類型。而若是要在這個模板函數中進行矩陣計算,使用Eigen就會很是方便。
  • 支持逐元素、分塊、和總體的矩陣操做。
  • 內含大量矩陣分解算法包括LU,LDLt,QR、SVD等等。
  • 支持使用Intel MKL加速
  • 部分功能支持多線程
  • 稀疏矩陣支持良好,到今年新出的Eigen3.2,已經自帶了SparseLU、SparseQR、共軛梯度(ConjugateGradient solver)、bi conjugate gradient stabilized solver等解稀疏矩陣的功能。同時提供SPQRUmfPack等外部稀疏矩陣庫的接口。
  • 支持經常使用幾何運算,包括旋轉矩陣、四元數、矩陣變換、AngleAxis(歐拉角與Rodrigues變換)等等。
  • 更新活躍,用戶衆多(Google、WilliowGarage也在用),使用Eigen的比較著名的開源項目有ROS(機器人操做系統)、PCL(點雲處理庫)、Google Ceres(優化算法)。OpenCV自帶到Eigen的接口。
2. 經常使用的矩陣計算工具備blas,  cublas(caffe)、atlas、 openblas(mxnet)、 eigen,還有lapack、mkl(intel)、Armadillo(matlab)

 

3. Eigen庫包含 Eigen模塊和unsupported模塊,其中Eigen模塊爲official module,unsupported模塊爲開源貢獻者開發的,沒有official support。

protobuf
 
1. Protocol Buffers 是一種輕便高效的結構化數據存儲格式,能夠用於結構化數據串行化,或者說序列化。它很適合作數據存儲或 RPC 數據交換格式。可用於通信協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。
2. 使用
      > 編寫.proto文件,編譯後生成 .pb.h / .pb.cc文件
      >  Writer: SerializeToOstream(),    Reader: ParseFromIstream()
      > required:一個格式良好的消息必定要含有1個這種字段;
      > optional:消息格式中該字段能夠有0個或1個值(不超過1個)。
      > repeated:在一個格式良好的消息中,這種字段能夠重複任意屢次(包括0次)。至關於java中的List。
3. 

 

4. grpc須要理解4個方面(service,stub,channel,observer)
  • service,
  • stub:客戶端調用 stub 對象,所謂 stub 對象就是具備聲明好的方法的 fake object。stub 對象將請求用 protobuf 方式序列化成字節流,用於線上傳輸,到 server 端後調用真正的實現對象處理。
  • channel,指定鏈接的服務器地址和端口,用於stub鏈接到service
  • observer,服務端,觀察處理返回和關閉通道
 
Stream
Executor 

> google stream executor team: work on parallel programming models for CPUs, GPUs and other platforms.
StreamExecutor is a unified wrapper around the CUDA and OpenCL host-side programming models (runtimes). 
>StreamExecutor and libomptarget are libraries that are both meant to solve the problem of providing runtime support for offloading computational work to an accelerator device. The libomptarget library is already hosted within the OpenMP LLVM subproject, and there is currently a proposal to create another LLVM subproject containing StreamExecutor. 
> StreamExecutor is currently used as the runtime for the vast majority of Google's internal GPGPU applications, and a snapshot of it is included in the open-source TensorFlow project, where it serves as the GPGPU runtime.html

 
 
TF C++

1. TF源碼安裝: following the instructions herejava

2. example:  tensorflow/cc/tutorials/example_trainer.ccc++

3. 自定義的op Kernel tutorial for adding a new op in C++.git

4. TF c++ 調試: debugging Tensorflow's C++ code behind the SWIG interfacegithub

         > The simplest interface between Python and C++ is the pure-C API in tensor_c_api.h算法

    
相關文章
相關標籤/搜索