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上執行。算法