1. 程式人生 > >tf 原理二

tf 原理二

計算圖反覆執行多次,tensor不會持續保留,只是在計算圖中過一遍。
variable是一類特殊的運算操作,可以將需要保留的tensor儲存在記憶體或視訊記憶體中,如weight

實現原理

tf的client通過session的介面與master和多個worker相連。其中每一個worker可以與多個硬體裝置(device)相連,比如cpu和gpu,並負責管理這些硬體。而master則負責指導所有worker按流程執行計算圖。

  • 單機版:client,master,worker全部在一臺機器的同一個程序中
  • 分散式多機版:允許client,master,worker在不同機器的不同程序中,同時由叢集排程系統統一管理各項任務
    tf為cpu和gpu提供了管理裝置的物件介面,每一個物件負責分配、釋放裝置的記憶體,以及執行節點的運算核

tensor定義

tensor是多維陣列,資料型別支援int,float,double和複數以及字串。
每一個裝置有單獨的allocator負責儲存各種資料型別的tensor,同時tensor的引用次數會被記錄,當引用次數為0時,記憶體將會被釋放。

單裝置

在只有一個硬體裝置的情況下,計算圖會按照依賴關係順序執行。當一個節點的所有上游依賴都被執行完時(依賴數為0),這個節點就會被加入ready queue等待執行。同時他下游所有節點的依賴數減1。

分散式排程

  1. 每一個節點該讓什麼裝置執行
    tf設計一套為節點分配裝置的策略。這個策略首先需要計算一個代價模型,這個代價模型估算每一個節點的輸入、輸出tensor的大小,以及所需要的計算時間,將綜合時間最短的裝置作為節點的運算裝置。使用簡單的貪婪策略以較快的速度找到一個不錯的節點運算裝置的分配方案。
  2. 如何管理節點間的資料通訊
    當節點分配方案確定後,整個圖被劃分為許多子圖,使用同一個裝置且相鄰的節點會被劃分到同一個子圖。計算圖中從x到y的邊會被取代為傳送端的傳送節點(send node)、接收端的接收節點(receive node)以及從傳送節點到接收節點的邊。底層實現了單機的cpu到gpu的通訊或多機之間的tcp傳輸資料等資料通訊問題。

容錯

故障會在兩種情況下檢測出:
1. 資訊從傳送節點傳輸到接收節點失敗時
2. 週期性worker心跳檢測失敗
variable node(儲存引數) 可以被持久化,連結到save node和restore node。出錯後計算圖會終止並重啟,訓練從上一個checkpoint恢復資料不需要重來。

其他拓展功能

  • 自動求導
  • 單獨執行子圖,使用者選擇任意子圖,沿某邊輸入,同時從另一些邊獲取結果
  • 支援計算圖的if-condition 和 while-loop控制流
  • 支援使用檔案路徑讀取資料,提高效率減少分散式讀取的網路開銷
  • 佇列支援不同節點的非同步執行
  • 容器是tf長期變數的管理機制,如variable

Anaconda

python的科學計算髮行版,內建了python經常使用的庫,提供了一個編譯好的環境。