1 主流深度學習框架對比
當今的軟件開發基本都是分層化和模塊化的,應用層開發會基於框架層。好比開發Linux Driver會基於Linux kernel,開發Android app會基於Android Framework。深度學習也不例外,框架層爲上層模型開發提供了強大的多語言接口、穩定的運行時、高效的算子,以及完備的通訊層和設備層管理層。所以,各大公司早早的就開始了深度學習框架的研發,以便能佔領市場。當前的框架有數十種之多,主流的以下(截止到2018年11月)前端
顯然TensorFlow是獨一無二的王者。第二名Keras,它是對TensorFlow或Theano接口的二次封裝,嚴格意義上並非一個獨立的深度學習框架。TensorFlow目前也已經集成了Keras,使得安裝了TensorFlow的用戶就能夠直接使用Keras了。編程
TensorFlow之因此可以從數十種框架中脫穎而出,主要優勢有後端
- 出身高貴,是谷歌出品的。但其餘不少框架出身也不差,例如PyTorch之於Facebook,MXNET之於Amazon
- 2015年就開源了,比較早的俘獲了一大批開發者。這個確實是tf的一大先發優點,但PyTorch的前身Caffe,以及MXNET開源時間都不晚,並且Caffe流行時間比tf早,後來才被趕超的。更有Theano這樣的絕對老前輩。因而可知,軟件開源是多麼重要。目前流行的深度學習框架也基本都開源了。
- 支持的開發語言多,支持Python Java Go C++等多種流行語言。相比某些框架,確實是優點很大。相比MXNET則小巫見大巫了。MXNET早期發展的一個主要方向就是前端多語言的支持,連MATLAB R Julia等語言都支持了。
- 運行效率高。早期的時候,其實tf的運行效率比不少框架都要低一些的。
- 安裝容易,用戶上手快,文檔齊全,社區活躍。這個是tf的一個較大優點,特別是社區方面,也就是咱們常說的生態優點。互聯網頭部集中效應十分明顯,體如今開源軟件上也是同樣。這也是我認爲最大的一個優點。
總結起來,TensorFlow雖然每一個方面都不是絕對領先的優點,但貴在每一個方面都作的不錯,所以最終可以一騎絕塵,獨領風騷。session
學習Tensorflow框架內核,能夠理解前端接口語言的支持,session生命週期,graph的構建、分裂和執行,operation的註冊和運行,模塊間數據通訊,本地運行和分佈式運行模式,以及CPU GPU TPU等異構設備的封裝支持等。學習這些,對於模型的壓縮 加速 優化等都是大有裨益的。
架構
2 TensorFlow系統架構
TensorFlow設計十分精巧,基於分層和模塊化的設計思想進行開發的。框架以下圖app
整個框架以C API爲界,分爲前端和後端兩大部分。框架
- 前端:提供編程模型,多語言的接口支持,好比Python Java C++等。經過C API創建先後端的鏈接,後面詳細講解。
-
後端:提供運行環境,完成計算圖的執行。進一步分爲4層編程語言
- 運行時:分爲分佈式運行時和本地運行時,負責計算圖的接收,構造,編排等。
- 計算層:提供各op算子的內核實現,例如conv2d, relu等
- 通訊層:實現組件間數據通訊,基於GRPC和RDMA兩種通訊方式
- 設備層:提供多種異構設備的支持,如CPU GPU TPU FPGA等
模型構造和執行流程
TensorFlow的一大特色是,圖的構造和執行相分離。用戶添加完算子,構建好整圖後,纔開始進行訓練和執行,也就是圖的執行。大致流程以下分佈式
- 圖構建:用戶在client中基於TensorFlow的多語言編程接口,添加算子,完成計算圖的構造。
- 圖傳遞:client開啓session,經過它創建和master之間的鏈接。執行session.run()時,將構造好的graph序列化爲graphDef後,以protobuf的格式傳遞給master。
- 圖剪枝:master根據session.run()傳遞的fetches和feeds列表,反向遍歷全圖full graph,實施剪枝,獲得最小依賴子圖
- 圖分裂:master將最小子圖分裂爲多個Graph Partition,並註冊到多個worker上。一個worker對應一個Graph Partition。
- 圖二次分裂:worker根據當前可用硬件資源,如CPU GPU,將Graph Partition按照op算子設備約束規範(例如tf.device('/cpu:0'),二次分裂到不一樣設備上。每一個計算設備對應一個Graph Partition。
- 圖運行:對於每個計算設備,worker依照op在kernel中的實現,完成op的運算。設備間數據通訊可使用send/recv節點,而worker間通訊,則使用GRPC或RDMA協議。
3 前端多語言實現 - swig包裝器
TensorFlow提供了不少種語言的前端接口,使得用戶能夠經過多種語言來完成模型的訓練和推斷。其中Python支持得最好。這也是TensorFlow之因此受歡迎的一大緣由。前端多語言是怎麼實現的呢?這要歸功於swig包裝器。模塊化
swig是個幫助使用C或者C++編寫的軟件能與其它各類高級編程語言進行嵌入聯接的開發工具。在TensorFlow使用bazel編譯時,swig會生成兩個wrapper文件
- pywrap_tensorflow_internal.py:對接上層Python調用
- pywrap_tensorflow_internal.cc:對接底層C API調用。
pywrap_tensorflow_internal.py 模塊被導入時,會加載_pywrap_tensorflow_internal.so動態連接庫,它裏面包含了全部運行時接口的符號。而pywrap_tensorflow_internal.cc中,則註冊了一個函數符號表,實現Python接口和C接口的映射。運行時,就能夠經過映射表,找到Python接口在C層的實現了。
4 tensorflow 源碼結構
TensorFlow源碼基本也是按照框架分層來組織文件的。以下
其中core爲tf的核心,它的源碼結構以下
5 總結
TensorFlow框架設計精巧,代碼量也很大,咱們能夠從如下部分逐步學習
- TensorFlow內核架構和源碼結構。先從全局上對框架進行理解。
- 先後端鏈接的橋樑--Session,重點理解session的生命週期,並經過相關源碼能夠加深理解Python前端如何調用底層C實現。
- TensorFlow核心對象—Graph。圖graph是TensorFlow最核心的對象,基本都是圍繞着它來進行的。graph的節點爲算子operation,邊爲數據tensor。
- TensorFlow圖的節點 -- Operation。operation是圖graph的節點,承載了計算算子。
- TensorFlow圖的邊 -- Tensor。Tensor是圖graph的邊,承載了計算的數據。
- TensorFlow本地運行時。
- TensorFlow分佈式運行時。和本地運行時有一些共用的接口,但區別也很大。
- TensorFlow設備層。主要了解設備層的定義規範,以及實現。
- TensorFlow隊列和並行運算。
- TensorFlow斷點檢查checkpoint,模型保存Saver,以及可視化tensorboard。這三個爲TensorFlow主要的工具。
原文連接本文爲雲棲社區原創內容,未經容許不得轉載。