1.自動求導java
2.子圖的執行node
3.計算圖控制流python
4.隊列/容器算法
當計算tensor C關於tensor W的梯度時,會先尋找從W到C的正向路徑,而後從C回溯到W,對這條回溯路徑上的每個節點增長一個對應的求解梯度的節點,根據鏈式法則計算總的梯度。這就是反向傳播算法。這些新增的節點會計算梯度函數,好比[db,dW,dx]=tf.gradients(C,[b,w,x])性能優化
自動求導雖然對用戶很方便,但伴隨而來的是Tensorflow對計算的優化(好比節點分配設備的策略)變得很麻煩,尤爲是內存使用問題。如上圖在反向傳播過程當中,咱們仍須要用到計算圖開頭的tensor如W,x這些數據,所以它們仍需佔用內存。服務器
Tensorflow支持單獨執行子圖,用戶能夠選擇計算圖的任意子圖,並沿着某些邊輸入數據,同時從另外一些邊獲取輸出結果。session
Tensorflow用節點名加port的形式指定數據。例如,bar:0表示名爲bar的節點的第一個輸出。在調用Session的run方法執行子圖時,用戶能夠選擇一組輸入數據的映射,好比name:port->tensor;同時,用戶必須指定一組輸出數據,好比name[:port],來選擇執行哪些節點,若是port也被選擇,那麼這些port輸出的數據將會做爲Run函數調用的結果返回。機器學習
當你指定好一個輸入輸出的子圖時,震哥哥計算圖就會根據新指定的輸入輸出進行調整,輸入數據的節點會鏈接一個feed_node,輸出數據的節點會鏈接一個fetch_node。Tensorflow會根據輸出數據自動推導出哪些節點須要被執行。異步
大部分的機器學習算法須要大量的邏輯判斷和反覆迭代,因此計算圖的執行控制方式顯得很是重要。分佈式
Tensorflow提供Switch Merge兩種operator,能夠根據某個布爾值跳過某段子圖,而後把兩段子圖的結果合併,實現if-else的功能。
Tensorflow還提供了Enter,Leave以及NextIteration來實現循環和迭代。在使用高階語言如python,java的if-else,while.for循環設計計算圖的執行流程時,這些控制流會被自動編譯爲上述那些operator。Loop的每一次循環,會有惟一的tag。它的執行結果會輸出成frame,這樣用戶能夠方便的查詢結果日誌。
Tensorflow的控制流支持分佈式,每一輪循環中的節點可能不一樣機器的不一樣設備上。分佈式控制流的實現方式也是經過對計算圖進行重構改寫,循環內的節點會被劃分到不一樣的小的子圖上。每一個子圖鏈接控制節點,實現本身的循環。循環完成後,循環終止信號會被髮送到其餘子圖。
隊列是Tensorflow任務調度的一個重要特性。這個特性可讓計算圖的不一樣節點異步的執行。使用隊列的目的是當一個batch的數據運算時,提早從磁盤讀取下一個數據,減小磁盤I/O的阻塞時間。同時還能夠異步的計算許多梯度,在組合成一個更復雜的總體梯度。
除了傳統的先進先出(FIFO)隊列。Tensorflow還實現了洗牌隊列(shuffling quene),用來知足某些機器學習算法對隨機性的要求,對損失函數優化以及模型收斂會有幫助。
容器是TensorFlow中一種特殊的管理長期變量的機制,例如Variable變量對象就存放在容器中。每個進程會有一個默認的容器一直存在,直到進程結束。使用容器還可以在不一樣的計算圖的不一樣session之間共享一些狀態變量。
1.運算操做調度
2.異步計算支持
3.第三方計算庫
4三種並行計算模式
Tensorflow中有不少高度抽象的運算操做,這些運算操做可能由不少複雜的計算組合而成。當有多個高階運算操做同時存在時,他們的前幾層多是徹底一致的重複計算(輸入與運算內容一致)。TensorFlow會自動識別這些重複計算,同時改寫計算圖,只執行一次重複的計算,而後把這些高階運算的後續計算所有鏈接到這些共有的計算上,避免冗餘計算。
同時,巧妙地安排運算地順序也能夠極大地改善數據傳輸與內存佔用地問題。好比,適當調整順序以錯開某些大塊數據同時在內存中地時間,對於顯存容量比較小的GPU來講,相當重要。
TensorFlow也會精細的安排接受節點的執行時間,若是接受節點過早的接受數據,那麼數據會過早的堆積在設備內存中,因此,Tensorflow設計了接受策略,在恰好須要數據時詞彙接收數據
TensorFlow提供異步計算支持。這樣線程執行時就無需一直等待某個計算節點完成。有一些節點,好比receive,enqueue,dequeue就是異步的實現。這些節點沒必要因等待I/O而阻塞一個線程繼續執行其餘任務
(1)數據並行模式
(2)模型並行模式
(3)流水線並行模式
經過把一個mini-batch的數據放在不一樣設備上計算,實現梯度計算的並行化。例如把1000個樣本的mini-batch拆分紅10份,每份100個樣本,進行並行計算。完成後,把這10份梯度數據合併獲得最終梯度並更新到共享的參數服務器。這樣的操做會產生許多徹底同樣的子圖的副本,在client上能夠用一個線程同步控制這些副本運算的循環。
數據並行模式能夠用異步方式來實現,使用多個線程控制梯度計算,每個線程計算完成後,異步地更新模型參數。同步的方式至關於用一個較大的mini-batch,優勢是沒有梯度干擾,缺點是容錯性差。一臺機器出問題,就須要重頭再來。異步的方式優勢是容錯性好,可是由於梯度干擾的問題,每組的梯度利用率降低
模型並行就是將計算圖的不一樣部分放在不一樣的設備上運算,能夠實現簡單的模型並行,其目標在於減小每一輪訓練迭代的時間,不一樣於數據並行同時進行多份數據的訓練。模型並行須要模型自身有大量的互不依賴或者依賴程度不高的子圖。在不一樣硬件環境上性能損耗不一樣。
和異步數據並行很像。只不過是在同一個硬件設備上實行並行。大體思路是將計算作成流水線,在一個設備上連續的並行執行,提升設備利用率。
參考文獻:http://www.studyai.com/article/2caa27c6bcbe4add99faa4fdf4d02106