Tensorflow的一個特點就是分佈式計算。分佈式Tensorflow是由高性能的gRPC框架做爲底層技術來支持的。這是一個通訊框架gRPC(google remote procedure call),是一個高性能、跨平臺的RPC框架。RPC協議,即遠程過程調用協議,是指經過網絡從遠程計算機程序上請求服務。算法
Tensorflow分佈式是由多個服務器進程和客戶端進程組成。有幾種部署方式,列如單機多卡和多機多卡(分佈式)。服務器
單機多卡是指單臺服務器有多塊GPU設備。假設一臺機器上有4塊GPU,單機多GPU的訓練過程以下:網絡
在單機單GPU的訓練中,數據是一個batch一個batch的訓練。 在單機多GPU中,數據一次處理4個batch(假設是4個GPU訓練), 每一個GPU處理一個batch的數據計算。架構
變量,或者說參數,保存在CPU上。數據由CPU分發給4個GPU,在GPU上完成計算,獲得每一個批次要更新的梯度app
在CPU上收集完4個GPU上要更新的梯度,計算一下平均梯度,而後更新。框架
循環進行上面步驟機器學習
而分佈式是指有多臺計算機,充分使用多臺計算機的性能,處理數據的能力。能夠根據不一樣計算機劃分不一樣的工做節點。當數據量或者計算量達到超過一臺計算機處理能力的上上限的話,必須使用分佈式異步
當咱們知道的基本的分佈式原理以後,咱們來看看分佈式的架構的組成。分佈式架構的組成能夠說是一個集羣的組成方式。那麼通常咱們在進行Tensorflow分佈式時,須要創建一個集羣。一般是咱們分佈式的做業集合。一個做業中又包含了不少的任務(工做結點),每一個任務由一個工做進程來執行。分佈式
通常來講,在分佈式機器學習框架中,咱們會把做業分紅參數做業(parameter job)和工做結點做業(worker job)。運行參數做業的服務器咱們稱之爲參數服務器(parameter server,PS),負責管理參數的存儲和更新,工做結點做業負責主要從事計算的任務,如運行操做。性能
參數服務器,當模型愈來愈大時,模型的參數愈來愈多,多到一臺機器的性能不夠完成對模型參數的更新的時候,就須要把參數分開放到不一樣的機器去存儲和更新。參數服務器能夠是由多臺機器組成的集羣。工做節點是進行模型的計算的。Tensorflow的分佈式實現了做業間的數據傳輸,也就是參數做業到工做結點做業的前向傳播,以及工做節點到參數做業的反向傳播。
在訓練一個模型的過程當中,有哪些部分能夠分開,放在不一樣的機器上運行呢?在這裏就要接觸到數據並行的概念。
數據並總的原理很簡單。其中CPU主要負責梯度平均和參數更新,而GPU主要負責訓練模型副本。
每個設備的計算速度不同,有的快有的滿,那麼CPU在更新變量的時候,是應該等待每個設備的一個batch進行完成,而後求和取平均來更新呢?仍是讓一部分先計算完的就先更新,後計算完的將前面的覆蓋呢?這就由同步更新和異步更新的問題。
更新參數分爲同步和異步兩種方式,即異步隨機梯度降低法(Async-SGD)和同步隨機梯度降低法(Sync-SGD)
同步隨即梯度降低法的含義是在進行訓練時,每一個節點的工做任務須要讀入共享參數,執行並行的梯度計算,同步須要等待全部工做節點把局部的梯度算好,而後將全部共享參數進行合併、累加,再一次性更新到模型的參數;下一個批次中,全部工做節點拿到模型更新後的參數再進行訓練。這種方案的優點是,每一個訓練批次都考慮了全部工做節點的訓練狀況,損失降低比較穩定;劣勢是,性能瓶頸在於最慢的工做結點上。
異步隨機梯度降低法的含義是每一個工做結點上的任務獨立計算局部梯度,並異步更新到模型的參數中,不須要執行協調和等待操做。這種方案的優點是,性能不存在瓶頸;劣勢是,每一個工做節點計算的梯度值發送回參數服務器會有參數更新的衝突,必定程度上會影響算法的收斂速度,在損失降低的過程當中抖動較大。