1 概述
TensorFlow架構設計精巧,在后端運行時這一層,除了提供本地運行時外,還提供了分布式運行時。通過分布式訓練,在多臺機器上并行執行,大大提高了訓練速度。前端用戶通過session.run()啟動系統執行時,target默認為空字符串"",對應的是本地運行模式。若target以"grpc://"開頭,則對應的是分布式運行模式,target指定了要連接的TensorFlow執行引擎。
分布式運行時同樣分為client master和worker,只是三者不在同一進程內。分布式運行時同樣是圍繞計算圖Graph來進行的,流程也與本地運行時幾乎相同。client負責圖的構造,并傳遞給master。master接收后,啟動圖的剪枝和分裂,將分裂后的子圖發送給多個worker進程。worker進程負責執行計算子圖,它會先按照自己所在機器包含的設備,先按照設備進行子圖的二次分裂,然后在每個設備上進行子圖執行。所有設備執行完畢后,從計算圖的終止節點sink中取出數據。
本地運行時通過DirectSession同時管理client master和worker,而分布式運行時則不同。client對應GrpcSession,master對應MasterSession,worker對應WorkerSession。三者使用同一個句柄session_handle進行協同工作。
2 數據交換
和本地運行時類似,分布式運行時也存在跨設備的數據依賴。對于跨設備的數據邊,將其分裂,在發送方插入send節點,接收方插入recv節點。如果二者跨進程通信(比如兩臺不同的服務器),則通過GrpcRemoteRendezvous進行數據交換。如果二者是進程內通信(比如同一臺服務器的CPU0和CPU1),則通過IntraProcessRendezvous進行數據交換。上節講過的本地運行時在運行前,就創建了一個IntraProcessRendezvous對象。
3 分布式集群結構
TensorFlow為分布式運行時,設計了一個精巧的結構。共分為三級。
- 集群cluster,可包含多臺服務器,通過ClusterSpec對象描述。它包含多個job,一個job又包含多個Task。一個Task對應一個server。
- Job。將目的相同的Task劃歸為一個job,使用job_id唯一標示。一般存在兩種job。ps將數據發送給worker,待worker運算完畢后再返回給ps,ps再進行數據更新。
- ps:數據存儲,負責存儲和更新模型的參數,比如w和b。比較適合CPU
- worker:數據計算,負責train和inference時的數據計算工作。比較適合GPU - Task。Task是提供服務的最小單位,它一般單獨在一個進程內,通過job_id:task_index唯一標示。一個Task對應一個server,提供MasterService和WorkerService兩種服務。
下面是一個集群配置的例子。
tf.train.ClusterSpec({"worker": ["worker0:1111", # /job:worker/task:0"worker1:2222", # /job:worker/task:1"worker2:3333" # /job:worker/task:2],"ps": ["ps0:1111", # /job:ps/task:0"ps1:2222" # /job:ps/task:1
]})
?
這個集群cluster內包含2個job,一個ps和一個worker。ps又包含2個task,worker則包含3個task,共計5個task。
系列文章,歡迎閱讀
謝楊易:Tensorflow源碼解析1 -- 內核架構和源碼結構?zhuanlan.zhihu.com





