tensorflow分佈式運行時組件剖析

本節主要研讀core/distributed_runtime目錄.集中爲分佈式多節點之間通信,全局資源分配/管理,資源調度等問題.

mgr:
base_rendezvous_mgr:
rendezvous_mgr_interface.h
cluster_function_library_runtime

graph_mgr
partial_run_mgr
session_mgr

master_session
master
local_master
worker_session
worker
worker_cache

remote_device
message_wrappers
scheduler
server_lib
tensor_coding
rpc/
executor
call_option

Test:
call_option_test, cluster_function_library_runtime_test, executor_test, master_test, message_wrappler_test, rpcbench_test, tensor_coding_test, remote_device_test, partial_run_mgr_test, session_mgr_test.

call option

CallOptions,用於傳遞給接口調用的配置(選項).這個類提供了適配功能,針對一些平臺特定的機制上層實現跨RPC系統.調用者需要傳遞startconcel函數.

master

master_env是一個環境類,持有一組指向每個master state的指針.包含一個與master協作的本地local_devices_, 提供一個而創建master session的工廠,傳遞一個session option以及一組device.調用者將擁有返回的mastersession.
MasterSession: 一個會話,封裝了一個圖計算(資源分配,配置,執行等等).這個會話封裝了針對一個graph的圖計算.將節點分配到remote_devs中的設備上,並且在這些設備上執行它們.通過Create方法實例化,一旦創建成功,傳遞的GraphDef將失效(計算圖已經被建立並將完成配置).
Extend支持從master.proto中讀取配置對圖進行擴展,但是這個擴展是阻塞的,可能會阻塞調用者很長一段時間.
PartialRunStep設置一個部分運行的調用.Close方法將關閉會話並且刪除申請的資源,同時還提供了一個gc,用於關閉會話並且釋放this的引用,和Close方法不同的是,不會阻塞調用者.
CreateWorkerSessions,支持再所有的worker上創建會話,

MasterSession將ClientGraph封裝到一個引用計數的對象中,這樣,MasterSession可以清理將Run請求映射到編譯圖的緩存,即使這個圖還在被使用.
RegisterPartitions方法將grap劃分成子圖,並註冊到workers上.(local執行方法)

struct Part代表計算圖被劃分之後的子圖.worker名稱,feed的一個map,workerInterface,子圖句柄.
在劃分完計算圖之後,MasterSession中就會包含一個子圖的序列.
目前來看應該是每個子圖對應一個worker,子圖是一個partition. 子圖的分發是通過創建對worker的call,其中封裝了request和response. 如果該子圖所有的feed都提供,那麼一起通過request發送這些數據.在partial的情況,我們只希望在request上提供所需的feed.

MasterSession::Create方法創建一個會話,,同時也會調用CreateWorkerSessions創建worker會話.
一個worker會話只有在動態集羣關係中會被調用.會根據集羣配置,創建所有的worker,
DoRunWithLocalExecution

Master實現了MasterService服務.一個Master負責維護一個活躍計算圖會話的狀態,每個會話協調本地以及遠端設備完成圖的計算任務.Master提前會知道本地哪些設備可用作爲client devices.Master按需查找遠端設備,並保持對遠端設備的統計追蹤. 每個會話均會對圖進行分析,跨設備分配圖節點,並且通過在worker上執RunGraph來驅動圖的計算. 構建Master時,服務必須以及指定到一個特定設備上(備註:同時會啓動一個gc線程負責對資源進行清理)

DeviceFinder類,分別實現GetRemoteDevices GetRemoteWorkers方法,
Start方法,與所有的worker通信,獲得可用的設備列表,Wait方法是設定一個超時,打印出未響應的worker.
通過調用tensorflow::NewServer方法創建一個server, 調用ServerFactory,由工廠方法創建server.

session mgr

WorkerNameFromServerDef方法返回一個完整的server定義,比如:/job:job_name/replica:0/task:task_index
CreateSession方法: 先獲取server定義,創建了一個WorkerSession.

worker session

封裝了一個給定session所有的狀態信息.包括session名稱,worker名稱(/job:mnist/replica:0/task:1), 通過WorkInterface獲取的實例,本地設備的集合,一個graph_mgr(用於索引註冊到該session的圖,可能有多個子圖),

WorkFreeListCache: 一個私有的緩存,封裝了worker_cache並且實現了WorkInteraface對象的複用.

創建一個Works時,首先從全局map workers_中根據target查找,如果已經存在,那麼直接返回,如果沒有那麼纔會根據target創建一個新的,同時加入到全局map workers_中.
worker_env
這是一個worker的環境類,持有一組指向每個worker單例的指針.同樣包含該worker本地的所有設備local_devices_,device_mgr負責管理本地設備(cpu/gpu).WorkService就是爲了管理設備而提供的網絡接口. compute_pool是一個線程池,用於調度計算任務.

WorkerInterface

這是一個負責與tensorflow worker service交互的接口.
Woker實現了這個接口類.裏面提供兩個DoRunGraph/DoPritialRunGraph的方法,分別執行完整圖和部分圖.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章