【TensorFlow源碼系列】【二】DirectSession::Run

DirectSession::Run
	// 1. 依據feed/fetch/full_graph來建立一個executor,負責圖的運行
	GetOrCreateExecutors
		CreateExecutors
			// 1.1 先依據建立一個可執行的graph--client_graph
			CreateGraphs
				// 1.1.1 建立 client_graph ---- 剪枝
				GraphExecutionState.BuildGraph
				
				// 1.1.2 使用place算法來分割graph,將graph中的node分配到不一樣的device上
				GetStatefulPlacements  ---- 分割
				
				// 1.1.3 將client_graph分類成子圖partition_graph
				Partition
			// 1.2 建立一個優化器,用於優化graph,通常使用 const floding/ CSE
			GraphOptimizer optimizer  ---- 優化
			
			// 1.3 爲每一個子圖(partition_graph)建立一個executor
			NewExecutor
			
	//2. 建立FunctionCallFrame 負責單進程內部不一樣device上的數據傳輸
	FunctionCallFrame call_frame
	
	// 3. graph的真正執行
	RunInternal
	
	// 4. 收集各個子圖的執行結果(各個子圖可能並行運行在不一樣的設備上)

梳理整個run的主線流程,發現,run的過程涉及graph的剪枝(prune)、分裂(spilt)、優化。期間涉及算法有:DFS/simple place、cost model / constant folding、 CSE.node

總體流程就是將graph依據feed與fetch剪枝後,依據設備狀況,將可執行的graph的拆成幾部分,每一個設備運行相應的sub_graph,即將node分配到多個device上執行。算法

相關文章
相關標籤/搜索