Li Xinqi
Li Xinqi
删除python代码和c++代码里的scope_proto.symbol_id,那是一个败笔。
ssp partition不同于auto placement,后者的问题更复杂,前者只需将前向训练网络划分成确定的顺序执行的阶段(stage)就行。另外,此处的顺序化是软顺序化,前后两个op之间不需要连控制边。 为了上述目的,对给定深度学习训练网络M,首先我们定义它的两个子图Trainable(M)和Backbone(M),其中,Backbone(M)又是Trainable(M)的子图。 ### Trainable(M) 该子图中每个op都上可达某个trainable variable,下可达某个loss op。此处的可达包含自身可达自身。 Trainable(M)确定了待插入Ssp variable proxy op和buffer op的范围。 ### Backbone(M) 包含于Trainable(M)。该子图中的每个op在Trainable(M)中要么有两个输入,要么有一个输入来自Backbone(M)。 通俗地讲,Backbone(M)是Trainable(M)的主干网。 相较于Trainable(M),在Backbone(M)上的bfs更加符合直觉。不失一般性,Trainable(M)可以大致被理解为一颗树,树的根是loss op,树的叶子是variable op。这是一颗倒着的树,如果不加任何处理,bfs对其遍历的结果是首先遍历所有的variable节点,这种操作对后续的阶段化非常不利,因为那样会把所有的variable op认为是stage0中的节点。 ### M / Backbone(M) 另一方面,Backbone(M)可以被认为是M的核,按照简单的就近原则,M可以被划分成Sizeof(Backbone(M))份,每一分组的op都归到邻近的op。 ### 阶段化 基于上述划分原则,同时约定每个分组一定同属于一个stage,于是,最终的朴素顺序阶段化算法(naive...