讓TensorFlow們飛一會兒
前一篇文章說過了TensorFlow單機多卡情況下的分布式部署,畢竟,一台機器勢單力薄,想叫兄弟們一起來算神經網絡怎么辦?我們這次來介紹一下多機多卡的分布式部署。
其實多機多卡分布式部署在我看來相較於單機多卡分布式更容易一些,因為一台機器下需要考慮我需要把給每個device分配哪些操作,這個過程很繁瑣。多台機器雖然看起來更繁瑣,然而我們可以把每一台機器看作是一個單卡的機器,並且谷歌爸爸已經把相對復雜的函數都給封裝好了,我們直接拿來用就行。為什么這么說呢?我們首先介紹兩個概念In-graph模式和Between-graph模式:
In-graph模式: 這個模式跟單機單卡是差不多的,我們需要把不同的節點分配給不同的設備,比如說我讓某台機器的某個GPU做一部分卷積,另外某台機器的某個GPU做另外一部分卷積,這樣大家都有活干。想象總是美好的,在實際情況中會出現什么問題呢?數據搬移量太大,會有相當一部分時間耗費再數據搬移之下,Tensor翻山越嶺,穿過網線,來到一個設備中,凳子還沒坐熱,有出發去另外一個設備。在大量訓練數據的情況下,這種方法往往是不可取的。
Between-graph模式: 這個模式下每一個設備都相當於獨立的完成整個卷積神經網絡的操作,只是在開始時從參數服務器中取到參數,然后結束的時候送回參數。所以除了chief節點以外,所有人都可以在訓練過程中隨時退出,隨時加入,但是剛開始時,大家都要響應一下chief節點的號召。這樣顯然更合理一點,在大量數據的情況下我們會選用這個方法,下面的代碼也會以Between-graph模式作為例子。
上文提到在Between-graph模式下我們需要在訓練過程中從參數服務器中獲取參數,那么問題來了,什么是參數服務器?接下來我們再引入兩個概念(忍一下忍一下,很簡單):
參數服務器:顧名思義,參數服務器嘛,保存參數用的服務器,簡稱ps(paramEter severs)。參數服務器可以不止一個,如果參數量過大的話,我們可以多叫幾台計算機過來充當參數服務器,用來更新參數。
工作服務器: 顧名思義,工作服務器嘛,干活的,簡稱worker。一般為GPU們,能夠進行快速並行計算的設備,它可以從參數服務器中把參數盪下來,然后計算出來以后在傳上去。
基礎的介紹完了,同樣的每個工作模式下都會有參數同步更新和異步更新,下面放張就是那么個意思的圖(現在沒圖都不好寫博客了…)。
好,總結一下,我們可以設置多個參數服務器(ps)用來存儲更新參數,同時我們也可以設置多個工作服務器(worker)用來進行計算。這樣就組成了一個多機多卡分布式的Tensorflow開發環境。

