深度学习模型DAG拓扑排序

ref 

​​​​​​【图论】有向无环图的拓扑排序 - Treant - 博客园

有向无环图(Directed Acyclic Graph, DAG)的拓扑排序简单的说是把图中的节点排序成为一个一维的列表,且每个节点的输入节点在排序中必须位于该节点的前面,跟前序或后序排序的思想有些类似。

一种基于DFS非递归的方法

1,找到所有入度为0的节点(比如placeholder和const节点)入栈

2,元素出栈并标记visited,依次遍历其输出节点,如果某输出节点的所有输入节点都被遍历过,则入栈该输出节点。

3,重复2,直到所有元素visited

朴素的DFS直接入栈节点的所有输出节点,这里的改变是仅仅入栈有效的输出节点(所有输入节点都被遍历过的输出节点)

这里需要获取节点输入节点和输出节点,有的深度学习图模型如tf的graph_def只能从节点获取输入,这可以遍历一次节点进行构建输出关系map。

扫描二维码关注公众号,回复: 15754132 查看本文章

由于深度学习(推理)模型输入个数很多(placeholder和const都是入度为0的输入),输出少,基于上述方法进行反向topo排序(节点输出节点排在该节点前面)更优,即从输出出发进行遍历

1,找到所有出度为0的节点入栈

2,元素出栈标记visited,依次遍历其输入节点,如果某个输入节点的输出都被遍历过则入栈该输入节点

3,重复2,直到所有元素visited

期望特性

图上相邻的算子排序结果最好也是相邻的,上述算法基本能满足该特特性。

特殊场景

针对一个已有基本有序节点列表的图,如何进行快速topo排序?(常规算法时间复杂度跟是否基本有序无关,因此对于基本有序的图排序性能不够好)

如何判断基本有序:可以计算不满足输入节点在其前面的node数量占比。

针对这种场景基于topo排序第一性原理出发的算法

基本思想:

每次迭代依次检查节点的所有输入节点是否在其前面,否则把在其后面的输入节点移动到其前面。直到所有的节点的输入节点都在其前面。

具体实现:

1,每次迭代for循环从头到尾依次从原始node列表取出node(如果该node已经visited则continue,说明被作为其他node的输入节点移动过了),同时访问node所有输入节点并过滤得到没有visited的输入节点(这些输入节点在原始列表排在其后面),将没有visited的输入节点和该node一起标记visited并且拷贝到另一个列表。

2,迭代执行step1直到没有需要移动的node。

可见如果已经排序过的node list仅仅是把node从一个list移动到另一个list而已。

while loop的处理

tf的图里面有Enter, Exit,Merge, Switch,NextIteration, LoopCond等这些算子导致图上实际上可能存在环,如下图所示,这个时候上面的算法会失效,一个简单的处理方法是断开NextIteration的输出。

tf控制流和while loop参考:

读TensorFlow 源码笔记(2): tensorflow的控制流算子(control_flow_op)_fuzi2012的博客-CSDN博客_tensorflow算子开发

猜你喜欢

转载自blog.csdn.net/u013701860/article/details/122841995