當我們在大型的數據集上面進行深度學習的訓練時,往往需要大量的運行資源,而且還要花費大量時間才能完成訓練。
1.分布式TensorFlow的角色與原理
在分布式的TensorFlow中的角色分配如下:
PS:作為分布式訓練的服務端,等待各個終端(supervisors)來連接。
worker:在TensorFlow的代碼注釋中被稱為終端(supervisors),作為分布式訓練的計算資源終端。
chief supervisors:在眾多的運算終端中必須選擇一個作為主要的運算終端。該終端在運算終端中最先啟動,它的功能是合并各個終端運算后的學習參數,將其保存或者載入。
每個具體的網絡標識都是唯一的,即分布在不同IP的機器上(或者同一個機器的不同端口)。在實際的運行中,各個角色的網絡構建部分代碼必須100%的相同。三者的分工如下:
服務端作為一個多方協調者,等待各個運算終端來連接。
chief supervisors會在啟動時同一管理全局的學習參數,進行初始化或者從模型載入。
其他的運算終端只是負責得到其對應的任務并進行計算,并不會保存檢查點,用于TensorBoard可視化中的summary日志等任何參數信息。
在整個過程都是通過RPC協議來進行通信的。
2.分布部署TensorFlow的具體方法
配置過程中,首先建立一個server,在server中會將ps及所有worker的IP端口準備好。接著,使用tf.train.Supervisor中的managed_ssion來管理一個打開的session。session中只是負責運算,而通信協調的事情就都交給supervisor來管理了。
3.部署訓練實例
下面開始實現一個分布式訓練的網絡模型,以線性回歸為例,通過3個端口來建立3個終端,分別是一個ps,兩個worker,實現TensorFlow的分布式運算。
1. 為每個角色添加IP地址和端口,創建sever,在一臺機器上開3個不同的端口,分別代表PS,chief supervisor和worker。角色的名稱用strjob_name表示,以ps為例,代碼如下:
# 定義IP和端口strps_hosts = 'localhost:1681'strworker_hosts = 'localhost:1682,localhost:1683'# 定義角色名稱strjob_name = 'ps'task_index = 0# 將字符串轉數組ps_hosts = strps_hosts.split(',')worker_hosts = strps_hosts.split(',')cluster_spec = tf.train.ClusterSpec({'ps': ps_hosts, 'worker': worker_hosts})# 創建serverserver = tf.train.Server({'ps':ps_hosts, 'worker':worker_hosts}, job_name=strjob_name, task_index=task_index)
2為ps角色添加等待函數
ps角色使用server.join函數進行線程掛起,開始接受連續消息。
# ps角色使用join進行等待if strjob_name == 'ps': print("wait") server.join()
3.創建網絡的結構
與正常的程序不同,在創建網絡結構時,使用tf.device函數將全部的節點都放在當前任務下。在tf.device函數中的任務是通過tf.train.replica_device_setter來指定的。在tf.train.replica_device_setter中使用worker_device來定義具體任務名稱;使用cluster的配置來指定角色及對應的IP地址,從而實現管理整個任務下的圖節點。代碼如下:
新聞熱點
疑難解答