TensorFlow 的系統結構以 C API 爲界,將整個系統分爲前端和後端兩個子系統:前端
前端系統:提供編程模型,負責構造計算圖;python
後端系統:提供運行時環境,負責執行計算圖,後端系統的設計和實現能夠進一步分解爲 4 層;算法
1. 運行層:分別提供本地模式和分佈式模式,並共享大部分設計和實現;編程
2. 計算層:由各個 OP 的 Kernel 實現組成;在運行時,Kernel 實現執行 OP 的具
體數學運算;後端3. 通訊層:基於 gRPC 實現組件間的數據交換,並可以在支持 IB 網絡的節點間實
現 RDMA 通訊;網絡4. 設備層:計算設備是 OP 執行的主要載體,TensorFlow 支持多種異構的計算設備
類型。架構
從圖操做的角度看待系統行爲,TensorFlow 運行時就是完成計算圖的構造、編排、及
其運行。併發
1. 表達圖:構造計算圖,但不執行圖;異步
2. 編排圖:將計算圖的節點以最佳的執行方案部署在集羣中各個計算設備上執行;分佈式
3. 運行圖:按照拓撲排序執行圖中的節點,並啓動每一個 OP 的 Kernel 計算。
前端系統主要組成部分,用於構造計算圖,支持多種語言,python 的 API 最爲完善。
注意本部僅僅構造計算圖,不執行計算圖,後面和後臺計算引擎創建 Session 後,以之爲橋樑,創建 Client 與 Master 的通道,將 Protobuf 格式的 GraphDef 序列化後傳給 Master,才能啓動圖的執行計算過程。
Client 執行 Session.run 時,傳遞整個計算圖給 Master,完整的計算圖稱爲Full Graph,隨後, Master 根據 fetches、feeds 參數列表,反向遍歷 Full Graph,按照依賴關係,剪枝圖,獲得最小依賴子圖,稱爲 Client Graph。
接着,Master 負責將 Client Graph 按照任務的名稱分裂 ( SplitByTask ) 爲多個 GraphPartition;其中,每一個 Worker 對應一個 Graph Partition。隨後,Master 將 Graph Partition分別註冊到相應的 Worker 上,以便在不一樣的 Worker 上併發執行這些 Graph Partition。最後,Master 將通知全部 Work 啓動相應 Graph Partition 的執行過程。
其中,Work 之間可能存在數據依賴關係,Master 並不參與二者之間的數據交換,它們兩兩之間互相通訊,獨立地完成交換數據,直至完成全部計算。
對於每個任務,TensorFlow 都將啓動一個 Worker 實例。Worker 主要負責以下 3 個方面的職責:
1. 處理來自 Master 的請求;
2. 對註冊的 Graph Partition 按照本地計算設備集實施二次分裂 ( SplitByDevice ) ,並通知各個計算設備併發執行各個 Graph Partition;
3. 按照拓撲排序算法在某個計算設備上執行本地子圖,並調度 OP 的 Kernel 實現;
4. 協同任務之間的數據通訊。
首先,Worker 收到 Master 發送過來的圖執行命令,此時的計算圖相對於 Worker 是完整的,也稱爲 Full Graph,它對應於 Master 的一個 Graph Partition。隨後,Worker 根據當前可用的硬件環境,包括 (GPU/CPU) 資源,按照 OP 設備的約束規範,再將圖分裂(SplitByDevice)爲多個 Graph Partition;其中,每一個計算設備對應一個 Graph Partition。
接着,Worker 啓動全部的 Graph Partition 的執行。最後,對於每個計算設備,Worker將按照計算圖中節點之間的依賴關係執行拓撲排序算法,並依次調用 OP 的 Kernel 實現,完成 OP 的運算 ( 一種典型的多態實現技術 ) 。
其中,Worker 還要負責將 OP 運算的結果發送到其餘的 Worker 上去,或者接受來自其餘 Worker 發送給它的運算結果,以便實現 Worker 之間的數據交互。TensorFlow 特化實現了源設備和目標設備間的 Send/Recv。
1. 本地 CPU 與 GPU 之間,使用 cudaMemcpyAsync 實現異步拷貝;
2. 本地 GPU 之間,使用端到端的 DMA 操做,避免主機端 CPU 的拷貝。
對於任務間的通訊,TensorFlow 支持多種通訊協議。
1. gRPC over TCP;
2. RDMA over Converged Ethernet。