輕松配置分布式TensorFlow


4.5  配置分布式TensorFlow
在大型的數據集上進行神經網絡的訓練,往往需要更大的運算資源,而且還要花上若干天才能完成運算量。
TensorFlow提供了一個可以分布部署的模式,將一個訓練任務拆成多個小任務,分配到不同的計算機上來完成協同運算,這樣使用計算機群運算來代替單機計算,可以時訓練時間大大變短。
4.5.1  分布式TensorFlow的角色及原理
要想配置TensorFlow為分布訓練,需要先了解TensorFlow中關於分布式的角色分配。
●  ps:作為分布式訓練的服務端,等待各個終端(supervisors)來連接;
●  worker:在TensorFlow的代碼注釋中被稱作supervisors,作為分布式訓練的運算終端;
●  chief supervisors:在眾多運算終端中必須選擇一個作為主要的運算終端。該終端是在運算終端中最先啟動的,它的功能是合並各個終端運算后的學習參數,將其保存或載入。
每個具體的角色的網絡標識都是唯一的,即,分布在不同IP的機器上(或者同一個機器,但是不同端口)。
在實際運行中,各個角色的網絡構建部分代碼必須100%的相同。三者的分工如下:
●  服務端作為一個多方協調者,等待各個運算終端來連接;
●  chief supervisors會在啟動時統一管理全局的學習參數,進行初始化或從模型載入。
●  其他的運算終端只是負責得到其對應的任務並進行計算,並不會保存檢查點,用於TensorBoard可視化中的summary日志等任何參數信息。
整個過程都是通過RPC協議來通信的。
4.5.2  分布部署TensorFlow的具體方法
配置過程中,首先需要建一個server,在server中會將ps及所有worker的IP端口准備好。接着,使用tf.train.Supervisor中的managed_session來管理一個打開的session。Session中只是負責運算,而通信協調的事情就都交給Supervisor來管理了。
4.5.3  實例20:使用TensorFlow實現分布式部署訓練
下面就開始實現一個分布式訓練的網絡模型。本例以“4-8線性回歸的TensorBoard可視化.py”為原型,在其中添加代碼將其改成分布式。
案例描述
在本機通過3個端口來建立3個終端,分別為一個ps,兩個worker,實現TensorFlow的分布式運算。
具體步驟如下:
1.為每個角色添加IP地址和端口,創建server
在一台機器上開3個不同的端口,分別代表ps、chief supervisors 、worker。角色的名稱用strjob_name表示。以ps為例,代碼如下:

代碼4-15  ps



2. 為ps角色添加等待函數
ps角色使用server.join()函數進行線程掛起,開始接收連接消息。

代碼4-15  ps(續)


3 .創建網絡結構
與正常的程序不同,在創建網絡結構時,使用tf.device函數將全部的節點都放在當前任務下。
在tf.device中的任務是通過tf.train.replica_device_setter來指定的。
在tf.train.replica_device_setter中使用worker_device來定義具體任務名稱;使用cluster的配置來指定角色及對應的IP地址,從而實現管理整個任務下的圖節點。

代碼4-15  ps(續)




4.創建Supervisor,管理session
在tf.train.Supervisor中,is_chief表明了是否為chief supervisors角色。這里將task_index=0的worker設置成chief supervisors。
Logdir為檢查點文件和summary文件保存的路徑。
init_op表示使用初始化變量的函數。
saver需要將保存檢查點的saver對象傳入,Supervisor就會自動保存檢查點文件。如果不想自動保存,可以設為None。
同理,summary_op也是自動保存summary文件。這里設為None,表示不自動保存。
save_model_secs為保存檢查點文件的時間間隔。這里設為5,表示每5秒自動保存一次檢查點文件。

代碼4-15  ps(續)



如上代碼,為了讓分布運算的效果明顯一些,將迭代次數改成了2200,使其運算時間變長。

5.迭代訓練
Session中的內容與以前一樣,直接迭代訓練即可。由於使用了Supervisor管理session,將使用sv.summary_computed函數來保存summary文件。同樣,如想要手動保存檢測點文件,也可以使用sv.saver.save。代碼如下:

代碼4-15  ps(續)



6.建立worker文件
將文件復制2份,分別起名為“4-16 worker.py”與“4-17  worker2.py”,將角色名稱修改成worker,並將“4-16 worker2.py”中的task_index設為1。

代碼4-16  worker 


代碼4-17  worker2 



7.部署運行
(1)在Spyder中先將“4-15ps.py”運行起來,單擊菜單“Consoles/Open an IPython console”來新打開一個consoles,如圖4-7所示。
 
                                                           圖4-7 consoles菜單
(2)在面板的右下角出現一個consoles框(consoles2/A),單點擊新建的consoles窗口,確保為激活狀態,如圖4-8所示。
 
                                                         圖4-8 consoles框
(3)運行“4-17worker2.py”文件。最后按照“4-17worker2.py”啟動的方式,再將“4-16worker.py”啟動,這時3個窗口顯示內容分別如下:

“4-16worker.py”對應窗口會顯示正常的訓練信息。



可以看到循環的次數並不是連續的,跳過的步驟被分配到worker2中去運算了。

● “4-17worker2.py”窗口顯示的信息。



顯示結果中有警告輸出,這是因為在構建Supervisor時沒有填寫local_init_op參數,該參數的意思是在創建worker實例時,初始化本地變量。由於例子中沒有填,系統就會自動初始化,並給個警告提示。

從日志中可以看到worker2 與chief supervisors的迭代序號近似互補,為什么沒有絕對互補呢?
分析可能是與Supervisor中的同步算法有關。
分布運算目的是為了提高整體運算速度,如果同步epoch的准確度需要以犧牲總體運算速度為代價,自然很不合適。所以更合理的推斷是因為單機單次的運算太快迫使算法使用了更寬松的同步機制。
重要的一點是對於指定步數的學習參數b和w是一致的(比如第8040步,學習參數是相同的,都為W= [ 2.01313496] b= [ 0.01954099]),這表明兩個終端是在相同的起點上進行運算的。

● 對於“4-15ps.py”窗口則是一直靜默着只顯示打印的那句wait,因為它只負責連接不參與運算。

更多章節請購買《深入學習之 TensorFlow 入門、原理與進階實戰》全本




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com