本文討論tensorflow如何執行您的機器學習模型。我們將簡要概述tensorflow graph的組件,然後深入研究如何跨單個和多個設備執行此圖。
tensorflow graph具有以下特性。每個節點都有零個或多個輸入,並表示一個操作的實例化。
從圖的邊緣流出的值稱為張量。這些張量在經過這些節點時會經歷各種變換。
張量是任意維度數組 ,其中在圖形構建時間內推斷出基礎元素類型。這使得Tensorflow非常快,因為它通過這個圖表知道未來會發生什麼操作。因此,這些知識允許進行各種編譯時優化。
特殊的邊稱為控制依賴—沒有數據流通過這些邊,但是它們表明,控制依賴的源節點必須在目標節點執行之前完成執行
此屬性允許客戶端在關係發生之前執行。例如,這對於控制峰值內存使用非常有用。
操作和內核
一個操作定義了一個計算:例子可能是 -
- 加
- 矩陣乘法
操作可以具有屬性。屬性的一個用例是使操作具有多態性(在相同數據類型的元素之間執行操作)
內核定義為:可以在特定類型的設備(CPU,GPU,TPU)等上運行的操作的實現。
會話(Sessions)
客戶端通過創建會話(Session)與Tensorflow系統交互。
- 會話接口有一個名為Extend的方法。這允許我們用附加的節點和邊來修改計算圖。
- 會話接口有另一個方法Run。
- 此函數計算所有必須執行的節點的傳遞閉包,以便計算所請求的輸出。
- 然後,它按照尊重節點依賴關係的順序排列節點
通常,Tensorflow的用途是
- 使用圖表設置一次會話。
- 通過運行圖或不同的子圖的時間數以百萬計的運行
注意:圖的傳遞閉包是一個矩陣,它定義了圖中每個節點之間的可達性。這個矩陣將被填入0和1。0定義不可達,1定義可達
變量
變量是持久張量。大多數張量運行後都無法生存。變量在運行操作後存活。變量的用例是存儲神經網絡的參數。在圖形上調用Run時,將更新這些變量。
設備
工作人員處理一個或多個設備。這些設備可以是CPU內核、GPU等。它們通過設備名稱和設備類型進行標識。設備名稱可以是
/job:localhost/device:cpu:0
在分佈式設置中,作業名稱是指設備執行的作業。每個設備對象有兩個功能:
- 分配/釋放內存
- 安排高級層請求的內核的執行
張量(Tensors)
類型化多維數組 ,這些張量是Tensorflow的基本數據類型。張量可以是各種類型,範圍從:
- 8位到64位
- IEEE浮點和雙精度類型
- 複數數據類型
- 字符串類型(任意字節數組)
執行圖:實施視角
概觀
客戶端與主程序和一個或多個工作進程聯繫。
工作進程處理comptation設備如gpu和CPU核心。
在Tensorflow中有兩個設置:
- 本地設置——客戶機、主服務器和工作人員都在同一臺計算機中。
- 分佈式設置——客戶機、主設備和工作人員都可以位於不同的設備中。在分佈式環境中,我們在容器中運行這些不同的組件。這些容器通過像Kubernetes這樣的集群調度系統進行調度。
單一設備設置
運行Tensorflow的最簡單方案。
- 單個工作進程
- 單個設備
以尊重節點之間的依賴關係的方式處理節點。進一步來說
- 每個節點都保留需要處理多少個從屬節點的計數。每次執行依賴項時,此計數都會遞減。
- 當count為0時 ,節點被放入就緒隊列,隨後進行處理。
請注意:未指定就緒隊列如何處理節點
多設備設置
一旦我們有多個設備。我們有兩件事需要擔心:
- 確定為每個節點放置計算的設備
- 管理這些設備之間的通信。
節點放置
節點放置算法計算出給予哪個設備的節點。該算法使用成本模型來做出決策。根據白皮書,節點放置算法使用貪婪啟發式算法 ,通過成本模型和其他參數來決定放置節點的設備。這種貪婪的啟發式算法考慮到了
- 執行計算的成本。
- 從其他設備向此節點傳輸輸入的成本。
選擇最快完成此計算的設備作為設備。遵循這個放置過程直到放置節點。
由於該論文是在2016年編寫的,因此該算法現在可能已經改變。
將節點放入設備後,需要在這些設備之間建立通信協議。
設備間通信
Tensorflow刪除不同設備中節點之間的邊緣,並用發送和接收調用替換它們。在運行時,發送和接收調用協調一致地跨設備傳輸數據。
該方法具有以下優點:
- 數據僅通過接收調用發送一次,並且內存僅針對單個張量分配一次。因此,張量的所有用戶都不需要單獨的接收/發送呼叫。
- 通過這種方式處理通信,我們讓設備中不同節點的調度分散到工作者中。主設備無需跟蹤此情況,因為發送和接收呼叫處理不同工作人員和設備之間的同步。
在分佈式設置中執行
分佈式設置與多設備設置非常相似。因為發送和接收調用是通過TCP或RDMA調用實現的,以跨機器邊界移動數據。分佈式設置中的執行需要容錯。通過兩件事檢測到故障:
- 發送和接收呼叫之間的通信出錯。
- 從主進程到每個工作進程的定期運行狀況檢查。
檢測到故障時,將中止整個圖形執行並從頭開始。
然而,Tensorflow系統支持重啟後的檢查點和恢復。
變量值通過名為Save節點的東西進行檢查點
這些保存節點與變量連接。可以將這些節點配置為定期執行。在每N次迭代之後,或者在N秒之後。
同樣,這些變量也與還原節點連接,以便在重新啟動後恢復它們的值。
多設備訓練技術
同步SGD
這個SGD依賴一個主服務器來跟蹤模型的參數,以及幾個執行一些計算的工作線程。然後這些worker會將數據發回給master,以更新參數。一旦master從worker接收到所有的參數,它就會積累這些梯度,然後將新的梯度的副本發送給每個worker,這樣worker就可以處理下一批梯度了
異步SGD
上述方法很好,但我們可以做得更好。異步SGD只是意味著主機在接收到一些參數後,執行更新並將梯度推送給所有工作人員。它不等待所有worker完成任務。
模型並行訓練
用於訓練深LSTMS。這種類型的訓練是對於同一批示例,在不同的計算設備上同時完成模型計算的不同部分。
模型計算流水線的併發步驟
另一種更好地利用訓練深度神經網絡的常用方法是在同一設備中管道模型的計算。它與ASGD完全相同,但是在同一設備中執行相同的模型而不是多個設備,以更好地使用設備並行操作的能力。
結論
總之,Tensorflow是一個系統,支持
- 多種設備的訓練和推理,非常適合在分佈式環境中使用。
- 其設計方式可以通過數據流圖結構實現未來的優化。
- 通過使用壓縮技術使設備之間的通信更簡單。
- 放置算法特別有趣,作者說它有可能被深度學習算法取代。
閱讀更多 不靠譜的貓 的文章