2019独角兽企业重金招聘Python工程师标准>>>
DirectSession::Run// 1. 依据feed/fetch/full_graph来创建一个executor,负责图的运行GetOrCreateExecutorsCreateExecutors// 1.1 先依据创建一个可执行的graph--client_graphCreateGraphs// 1.1.1 创建 client_graph ---- 剪枝GraphExecutionState.BuildGraph// 1.1.2 使用place算法来分割graph,将graph中的node分配到不同的device上GetStatefulPlacements ---- 分割// 1.1.3 将client_graph分类成子图partition_graphPartition// 1.2 创建一个优化器,用于优化graph,一般使用 const floding/ CSEGraphOptimizer optimizer ---- 优化// 1.3 为每个子图(partition_graph)创建一个executorNewExecutor//2. 创建FunctionCallFrame 负责单进程内部不同device上的数据传输FunctionCallFrame call_frame// 3. graph的真正执行RunInternal// 4. 收集各个子图的执行结果(各个子图可能并行运行在不同的设备上)
梳理整个run的主线流程,发现,run的过程涉及graph的剪枝(prune)、分裂(spilt)、优化。期间涉及算法有:DFS/simple place、cost model / constant folding、 CSE.
整体流程就是将graph依据feed与fetch剪枝后,依据设备情况,将可执行的graph的拆成几部分,每个设备运行相应的sub_graph,即将node分配到多个device上执行。