用于根据tensorflow图构建编译器中间表示的方法和系统
技术领域
1.本发明涉及一种用于根据tensorflow图构建公用中间表示的方法和系统,该公用中间表示可以转换为多个编译器中间表示。
背景技术:2.tensorflow是一个机器学习平台,该机器学习平台提供用于构建机器学习模型的接口以及用于训练和推理这些模型的设施。tensorflow将机器学习模型表示为有向图(称为tensorflow图),该有向图包含节点和边缘。节点是乘法、加法、除法等运算符,边缘表示数据或控制依赖关系。tensorflow图中没有显式标记循环和分支等控制流;相反,这些控制流由控制流原语集合隐式表示,其中这些控制流原语包括转换、合并、下一次迭代等。这些控制流原语在tensorflow图中表示为节点,并且通过单独和动态的评估产生循环和分支等高级控制流行为。因此,不能高效地以tensorflow图上的循环和分支的粒度应用静态分析和编译器优化。
技术实现要素:3.本发明大体涉及一种用于根据tensorflow图构建公用中间表示的方法和系统,所述公用中间表示可以转换为多个编译器中间表示(intermediate representation,ir)。所述构建的公用ir可以转换为等效编译器中间表示,其中可以按线性时间对所述等效编译器中间表示应用编译器静态分析和优化,包括但不限于支配边界分析(dominance frontier analysis)、公用子表达式消除、循环不变代码外提(loop invariant code motion)和死码消除。
4.根据本发明的一个方面,提供了一种方法,所述方法包括:接收包含一个或多个控制流的tensorflow图;处理所述tensorflow图以从所述tensorflow图中提取控制流,并将所述提取的控制流存储在提取的控制流数据结构中;对所述tensorflow图的输出应用递归跟踪算法,以构建表示分层控制流的公用中间表示。
5.根据上述方面,应用所述递归跟踪算法包括:使用所述tensorflow图的输出作为当前节点;响应于确定所述当前节点不是终端节点,并且所述当前节点不是遍历的节点:将所述当前节点添加到遍历的数据结构中,所述遍历的数据结构指示所述当前节点已遍历;响应于确定所述当前节点包含在所述提取的控制流数据结构中的所述多个控制流中的一个控制流中:对包含所述当前节点的所述控制流的输入应用所述跟踪算法;将包含所述当前节点的所述控制流添加到跟踪的数据结构中;响应于确定所述当前节点不包含在所述提取的控制流数据结构中的所述多个控制流中的一个控制流中:对所述当前节点的输入递归地应用所述跟踪算法;将所述当前节点添加到所述跟踪的数据结构中;输出所述跟踪的数据结构,其中,所述跟踪的数据结构是包含tensorflow图节点和公用中间表示控制流的列表。
6.根据上述方面中的任一项,所述方法还包括:根据所述公用中间表示构建至少一
个编译器中间表示。
7.根据上述方面中的任一项,所述控制流包含多个tensorflow图分支,其中,数据使用两个分支路径中在合并节点处终止的一个分支路径,所述控制流包含多个循环条件节点,其中,每个循环条件节点对应于tensorflow图循环。
8.根据上述方面中的任一项,处理所述tensorflow图以从所述tensorflow图中提取控制流还包括:将所述多个tensorflow图分支和所述多个循环条件节点中的每一个的合并节点存储在收集的节点数据结构中。
9.根据上述方面,所述方法还包括:(a)确定所述收集的节点数据结构是否为空;(b)响应于确定所述收集的节点数据结构不为空:以确保在第二次选择任何节点之前所有节点都被选择了一次的顺序,从所述收集的节点数据结构中选择节点;(c)响应于确定所述选择的节点是合并节点:(i)提取对应的tensorflow图分支;(ii)响应于确定所述tensorflow图分支有效:构建对应于所述tensorflow图分支的公用中间表示分支;将所述公用中间表示分支存储在所述提取的控制流数据结构中;从所述收集的节点数据结构中移除所述合并节点;返回至(a);(iii)响应于确定所述tensorflow图分支无效,返回至(a);(d)响应于确定所述选择的节点是循环条件节点:(i)提取对应的tensorflow图循环谓词和循环体;(ii)响应于确定所述tensorflow图循环谓词和循环体有效:构建对应于所述tensorflow图循环的公用中间表示循环;将所述公用中间表示循环存储在所述提取的控制流数据结构中;从所述收集的节点数据结构中移除所述循环条件节点;返回至(a);(iii)响应于确定所述tensorflow图循环谓词和循环体无效:返回至(a)。
10.根据上述方面,提取对应的tensorflow图分支包括:通过遍历所述合并节点的输入边缘来识别所述合并节点的输入节点;对所述合并节点的所述输入节点递归地应用跟踪算法直到达到分支退出条件,并输出表示所述tensorflow图分支的两个分支路径。
11.根据上述方面,当所述跟踪算法到达进入节点、退出节点、另一合并节点或循环条件节点时,达到所述分支退出条件。
12.根据上述方面,应用跟踪算法包括:使用所述合并节点的输入作为所述当前节点;响应于确定所述当前节点不是终端节点,所述当前节点不是遍历的节点,并且不满足所述分支退出条件:将所述当前节点添加到所述遍历的数据结构中,所述遍历的数据结构指示所述当前节点已遍历;响应于确定所述当前节点包含在所述提取的控制流数据结构中的所述多个控制流中的一个控制流中:对包含所述当前节点的所述控制流的输入应用所述跟踪算法;将包含所述当前节点的所述控制流添加到跟踪的数据结构中;响应于确定所述当前节点不包含在所述提取的控制流数据结构中的所述多个控制流中的一个控制流中:对所述当前节点的所述输入应用所述跟踪算法;将所述当前节点添加到所述跟踪的数据结构中;输出所述跟踪的数据结构,其中,所述跟踪的数据结构是包含tensorflow图节点和公用中间表示控制流的列表。
13.根据上述方面,确定表示所述tensorflow图分支的所述两个分支路径是否有效包括:确定所述两个分支路径满足以下所有条件:所述两个分支路径不包含任何合并节点;所述两个分支路径不包含任何提取的分支,所述提取的分支是tensorflow图循环的一部分;所述跟踪算法输出的所述两个分支路径在同一合并节点处终止,或者至少一个分支路径在终端节点处终止。
14.根据上述方面中的任一项,所述方法包括:移除所述两个分支路径中包含的所有转发节点;响应于确定所述两个分支路径中的第一分支路径在所述两个分支路径中的第二分支路径中包含的转换节点处终止:将所述第二分支路径分成第一切片和第二切片,其中,所述第一切片包含所述转换节点和所述转换节点之前的节点,所述第二切片包含所述转换节点之后的节点,并将所述第二分支路径替换为所述第二切片并丢弃所述第一切片;将对应于所述tensorflow图分支的所述构建的公用中间表示分支存储在所述提取的控制流数据结构中,所述公用中间表示分支包含分支谓词和所述两个分支路径,其中,所述分支谓词是所述转换节点的第一输入;响应于确定所述两个分支路径中的第一分支路径不在转换节点处终止或在所述两个分支路径中的第二分支路径中不包含的转换节点处终止:将对应于所述tensorflow图分支的所述构建的公用中间表示分支存储在所述提取的控制流数据结构中,所述公用中间表示分支包含分支谓词和所述两个分支路径。
15.根据上述方面中的任一项,提取对应的tensorflow图循环包括:对所述循环条件节点的输入节点递归地应用跟踪算法直到达到循环退出条件;达到所述循环退出条件时,输出所述tensorflow图循环的循环谓词;对所述循环条件节点的输出节点应用所述递归跟踪算法直到达到所述循环退出条件;达到所述循环退出条件时,输出所述tensorflow图循环的循环体。
16.根据上述方面中的任一项,当所述跟踪算法到达进入节点、退出节点或其它循环条件节点时,达到所述循环退出条件。
17.根据上述方面中的任一项,递归地应用所述跟踪算法包括:使用所述循环条件节点的输入作为所述当前节点;响应于确定所述当前节点不是终端节点,所述当前节点不是遍历的节点,并且不满足所述循环退出条件:将所述当前节点添加到所述遍历的数据结构中,所述遍历的数据结构指示所述当前节点已遍历;响应于确定所述当前节点包含在所述提取的控制流数据结构中的所述多个控制流中的一个控制流中:对包含所述当前节点的所述控制流的输入应用所述跟踪算法;将包含所述当前节点的所述控制流添加到跟踪的数据结构中;响应于确定所述当前节点不包含在所述提取的控制流数据结构中的所述多个控制流中的一个控制流中:对所述当前节点的所述输入应用所述跟踪算法;将所述当前节点添加到所述跟踪的数据结构中;输出所述跟踪的数据结构,其中,所述跟踪的数据结构是包含tensorflow图节点和公用中间表示控制流的列表。
18.根据上述方面中的任一项,应用跟踪算法包括:使用所述循环条件节点的输出作为所述当前节点;响应于确定所述当前节点不是终端节点,所述当前节点不是遍历的节点,并且不满足所述循环退出条件:将所述当前节点添加到所述遍历的数据结构中,所述遍历的数据结构指示所述当前节点已遍历;响应于确定所述当前节点包含在所述提取的控制流数据结构中的所述多个控制流中的一个控制流中:对包含所述当前节点的所述控制流的输入应用所述跟踪算法;将包含所述当前节点的所述控制流添加到跟踪的数据结构中;响应于确定所述当前节点不包含在所述提取的控制流数据结构中的所述多个控制流中的一个控制流中:对所述当前节点的所述输入应用所述跟踪算法;将所述当前节点添加到所述跟踪的数据结构中;输出所述跟踪的数据结构,其中,所述跟踪的数据结构是包含tensorflow图节点和公用中间表示控制流的列表。
19.根据上述方面中的任一项,基于所述循环谓词和所述循环体确定所述tensorflow
图循环是否有效包括:确定所述循环谓词和所述循环体满足以下所有条件:tensorflow图循环谓词和循环体不包含任何循环条件节点;所述tensorflow图循环谓词和循环体不包含合并节点,所述合并节点不是提取的分支的一部分。
20.根据上述方面中的任一项,所述方法包括:移除所述循环谓词和所述循环体中包含的所有转发节点;对于所述循环谓词和所述循环体中的每个相应的嵌套公用中间表示分支:响应于确定所述相应的嵌套公用中间表示分支具有空分支谓词:将所述公用中间表示分支中的所有节点转移到包含所述分支的所述循环谓词或所述循环体中;从所述循环谓词或所述循环体中移除所述公用中间表示分支;将对应于所述tensorflow图循环的所述构建的公用中间表示循环存储在所述提取的控制流数据结构中,其中,所述公用中间表示循环是包含所述循环谓词和所述循环体的对象。
21.根据本发明的一个方面,提供了一种非瞬时性计算机可读介质,所述非瞬时性计算机可读介质存储计算机可读指令,所述计算机可读指令在由处理系统的处理器执行时,使得所述处理系统执行以下操作:接收包含一个或多个控制流的tensorflow图;处理所述tensorflow图以从所述tensorflow图中提取控制流;将所述提取的控制流存储在提取的控制流数据结构中;利用所述提取的控制流数据结构,对所述tensorflow图的输出应用递归跟踪算法,以构建表示分层控制流的公用中间表示。
22.根据上述方面,所述计算机可读介质存储进一步的计算机可读指令,所述计算机可读指令在由处理系统的处理器执行时,使得所述处理系统根据所述构建的公用中间表示构建至少一个编译器中间表示。
23.根据本发明的一个方面,提供了一种处理系统,所述处理系统包括:处理器;存储器,存储计算机可读指令,所述计算机可读指令在由所述处理器执行时,使得所述处理系统执行以下操作:接收包含一个或多个控制流的tensorflow图;处理所述tensorflow图以从所述tensorflow图中提取控制流;将所述提取的控制流存储在提取的控制流数据结构中;利用所述提取的控制流数据结构,对所述tensorflow图的输出应用递归跟踪算法,以构建表示分层控制流的公用中间表示。
附图说明
24.结合以下附图描述了本发明的一些实现方式。
25.图1示出了本发明的一个示例性实施例提供的用于根据tensorflow图生成编译器中间表示的系统的框图;
26.图2示出了本发明的一个示例性实施例提供的用于根据tensorflow图构建公用中间表示的方法的流程图;
27.图3示出了本发明的一个示例性实施例提供的用于从tensorflow图中提取控制流的方法的流程图;
28.图4示出了本发明的一个示例性实施例提供的图1中的公用中间表示生成器和控制流提取器执行的跟踪算法的流程图;
29.图5示出了图3中的方法提供的用于从tensorflow图中提取分支的示例性工作流程;
30.图6a和图6b示出了图3中的方法提供的tensorflow图中的循环的示例性工作流
程;
31.图7示出了执行图2中的方法的示例性计算机的框图。
具体实施方式
32.在整个附图中,相同的附图标记表示相似但不一定相同的元素。附图未必是按比例绘制的,某些部件的尺寸可能较大,以便更清楚地说明所示的示例。此外,附图提供了与描述一致的示例和/或实现方式;然而,描述不限于附图中提供的示例和/或实现方式。
33.在整个附图中,术语“中间表示”缩写为“ir”。
34.在本发明中,除非上下文中另有明确说明,使用术语“一个”和“所述”包括复数含义。此外,在本发明中使用的术语“包含”、“包括”或“具有”用于说明存在所述元素,但并不排除存在或添加其它元素。
35.在本发明中,tensorflow图是具有节点和边缘的有向图,其中所述节点表示计算或操作,所述边缘表示数据或控制依赖关系。所述有向图中的每个节点接收输入,并对输入数据执行操作以生成输出,所述输出可以用作其它操作的输入。
36.在本发明中,中间表示(intermediate representation,ir)是指数据结构,所述数据结构被组织成表示使用编程语言或中间表示构建器接口构建的源程序。
37.在本发明中,编译器中间表示(intermediate representation,ir)是指底层虚拟机(low level virtual machine,llvm)和gnu编译器集(gnu compiler collection,gcc)等提前编译器基础设施使用的中间表示设计。编译器中间表示的示例包括以下各项的任意或某些组合:静态单赋值(static single assignment,ssa)、管理范式(administrative normal form,anf)、持续传递式样(continuation passing style,cps)等。这些编译器中间表示可以使用已知转换算法成对地相互转换。换言之,上述编译器中间表示中的每一个可以转换为上述编译器中间表示中的任何其它一个,反之亦然。
38.在本发明中,递归是指解决问题的方法,该方案依赖于同一问题的较小实例的方案。递归算法是指一种算法,所述算法使用更小或更简单的输入自行调用,直到达到基本条件。
39.在本发明中,终端节点是指没有任何输入的tensorflow图节点。通常,终端节点是类型为常量和占位符的tensorflow图节点。
40.在本发明中,转发节点是指tensorflow控制流原语,所述控制流原语将其输入中的一个转发到其输出节点。通常,转发节点是除合并节点之外的类型为转换、进入、退出和下一次迭代的tensorflow图节点。
41.在本发明中,收集的节点数据结构由方法300(参见图3)的所有实例共享。所述收集的数据结构是无序的,并且在tensorflow图中包含合并节点和循环条件节点。所述收集的节点数据结构与操作相关联,所述操作包括:添加新的tensorflow图节点;移除现有的tensorflow图节点;选择现有的tensorflow图节点;检查所述收集的节点数据结构是否为空。
42.在本发明中,提取的控制流数据结构由方法300(参见图3)和跟踪算法400(参见图4)的所有实例共享,下面将进一步详细描述。所述提取的控制流数据结构是无序的,并且包含构建的公用中间表示分支和循环。所述提取的控制流数据结构与操作相关联,所述操作
包括:添加新的公用中间表示分支或循环;列举现有的公用中间表示分支和循环。
43.在本发明中,遍历的数据结构由来自同一递归调用的所述跟踪算法400(参见图4)的实例共享。所述遍历的数据结构是无序的,并且包含由所述跟踪算法400(如图4)的实例遍历的tensorflow图节点。所述遍历的数据结构与操作相关联,所述操作包括:添加tensorflow图节点;检查数据结构中是否存在tensorflow图节点。
44.在本发明中,跟踪的数据结构由来自同一递归调用的跟踪算法400(参见图4)的实例共享。所述跟踪的数据结构是有序的,并且包含由所述跟踪算法的实例记录的tensorflow图节点。所述数据结构与操作相关联,所述操作包括:将tensorflow图节点附加到所述数据结构的末尾;列举现有的tensorflow图节点;在给定的tensorflow图节点处对所述数据结构进行切片。所述切片操作在给定的tensorflow图节点处对所述数据结构进行切片,并获得两个切片:第一切片,包含所述给定的tensorflow图节点及其之前的节点;第二切片,包含所述给定的tensorflow图节点之后的节点。
45.本发明大体涉及一种用于根据tensorflow图构建公用中间表示的方法和系统,所述公用中间表示可以转换为任何编译器中间表示(intermediate representation,ir)。
46.图1示出了根据tensorflow图构建一个或多个编译器中间表示的系统的框图。所述系统100包括若干软件模块或子系统,所述软件模块或子系统包括:控制流提取器102;公用中间表示生成器104,可操作地耦合至所述控制流提取器102;编译器中间表示生成器106,可操作地耦合至所述公用中间表示生成器104。所述控制流提取器102接收tensorflow图,处理所述tensorflow图以从所述tensorflow图中提取控制流,并输出提取的控制流数据结构。所述公用中间表示生成器104从所述控制流提取器102中接收所述tensorflow图和所述提取的控制流数据结构,并利用所述提取的控制流数据结构,对所述tensorflow图的输出应用递归跟踪算法,以构建明确表示分层控制流的公用中间表示。所述编译器中间表示生成器106接收所述构建的公用中间表示,并根据所述公用中间表示构建一个或多个编译器中间表示,下面将进一步详细描述。
47.所述公用中间表示生成器104构建的所述公用中间表示可以采用可转换为各种不同编译器中间表示中的任何一个的形式。
48.参考图2,示出了根据tensorflow图构建一个或多个编译器中间表示的方法200的示例性实施例。
49.所述方法200从步骤202开始,在该步骤中接收tensorflow图。所述tensorflow图的节点和边缘中的一个或多个用于指示控制流,包括循环和分支。然后,所述方法200转到步骤204,其中通过处理所述tensorflow图使用下面将进一步详细描述的方法300(图3)提取所述tensorflow图中的控制流。然后,所述方法200转到步骤206,在该步骤中利用提取的控制流数据结构,对所述tensorflow图的输出应用递归跟踪算法400(图3)以构建公用中间表示,并从所得到的公用中间表示中移除所有转发节点。然后,所述方法200转到步骤208,在该步骤中根据所述公用中间表示构建一个或多个编译器中间表示。
50.现在参考图3,图3中描述了本发明实施例提供的从tensorflow图中提取控制流的方法300。所述方法300从步骤304开始。在步骤304中,从所述tensorflow图中收集循环条件节点和合并节点。通过使用tensorflow python api、c/c++api或protocol buffer api循环访问所述tensorflow图中的所述节点并检查每个节点的操作类型字段,从所述
tensorflow图中收集循环条件节点和合并节点;然后,将任何循环条件节点或合并节点存储在收集的节点数据结构中加以记录。在步骤304中收集所述循环条件节点和所述合并节点之后,所述方法300转到步骤306。
51.在步骤306中,确定所述收集的节点数据结构是否为空。如果所述收集的节点数据结构为空,所述方法300结束。如果所述收集的节点数据结构不为空,所述方法300转到步骤308。
52.在步骤308中,以确保在第二次选择任何节点之前所有节点都被选择了一次的顺序,从所述收集的节点数据结构中选择节点。然后,所述方法300转到步骤310。
53.在步骤310中,确定所述选择的节点是否为合并节点以及所述选择的节点是否为循环条件节点。如果所述选择的节点是合并节点,所述方法300转到步骤312。如果所述选择的节点是循环条件节点,所述方法300转到步骤318和步骤320。
54.在步骤312中,在当前节点是进入节点、退出节点、合并节点(并非所述选择的合并节点)或循环条件节点时满足退出条件的情况下,对所述合并节点的输入节点递归地应用跟踪算法400(参见图4)以获得两个分支路径。然后,所述方法转到步骤314。
55.在步骤314中,确定所述分支路径是否有效。在以下条件下,确定所述两个分支路径是否有效:所述两个分支路径不包含任何合并节点;所述两个分支路径不包含任何提取的分支,所述提取的分支是循环谓词或循环体的一部分;所述跟踪算法输出的所述两个分支路径在同一合并节点处终止,或者至少一个分支路径在终端节点处终止。如果在步骤314中确定所述两个分支路径有效,所述方法300转到步骤316。如果在步骤310中确定所述两个分支路径无效,所述方法300返回至步骤306。
56.在步骤316中,从所述有效分支路径中移除所有转发节点。如果一个分支路径在另一个分支路径中包含的转换节点处终止,将所述另一个分支路径分成两个切片:第一切片和第二切片,其中,所述第一切片包含所述转换节点及其之前的节点,所述第二切片包含所述转换节点之后的节点;然后,将所述另一个分支路径替换为所述第二切片并丢弃所述第一切片。根据所述有效分支路径和分支谓词(如果适用)构建公用中间表示分支。如果两个分支均在同一转换节点处终止,所述转换节点的第一输入是所述分支谓词。然后,将所述构建的公用中间表示分支添加到所述提取的控制流数据结构中。然后,所述方法300转到步骤326。
57.在步骤318中,在所述当前节点是进入节点、退出节点或循环条件节点(并非所述选择的循环条件节点)时满足所述退出条件的情况下,对所述循环条件节点的输出节点应用递归跟踪算法400(参见图4)以获得所述循环体。然后,所述方法300转到步骤322。
58.在步骤320中,在所述当前节点是进入节点、退出节点或循环条件节点(并非所述选择的循环条件节点)时满足所述退出条件的情况下,对所述循环条件节点的输入节点应用递归跟踪算法400(参见图4)以获得所述循环谓词。然后,所述方法300转到步骤322。
59.在步骤318和步骤320完成之后,步骤322开始。在步骤322中,确定所述循环谓词和所述循环体是否有效。在以下条件下,确定所述循环谓词和所述循环体是否有效:所述循环谓词和所述循环体不包含任何循环条件节点;所述循环谓词和所述循环体不包含合并节点,所述合并节点不是提取的分支的一部分。如果在步骤322中确定所述循环谓词和所述循环体有效,所述方法300转到步骤324。如果在步骤322中确定所述循环谓词和所述循环体无
效,所述方法300返回至步骤306。
60.在步骤324中,从所述有效循环谓词和循环体中移除所有转发节点;对于所述循环谓词和所述循环体中的所有嵌套公用中间表示分支:如果所述公用中间表示分支具有空分支谓词,将所述分支中的所有节点转移到包含所述分支的所述循环谓词或所述循环体中;从所述循环谓词或所述循环体中移除所述公用中间表示分支。根据所述有效循环谓词和循环体构建公用中间表示循环。然后,将所述构建的公用中间表示循环添加到所述提取的控制流数据结构中。然后,所述方法300转到步骤326。
61.在步骤326中,从所述收集的节点数据结构中移除所述选择的节点。然后,所述方法300返回至步骤306。
62.现在参考图4,图4中示出了图1中的公用中间表示生成器和控制流提取器执行的跟踪算法400的示例性实施例。所述跟踪算法从步骤402开始,然后转到步骤404。在404中,接收所述tensorflow图的节点和退出条件。将所述接收的节点指定为所述当前节点。然后,所述跟踪算法400转到步骤406。
63.在步骤406中,确定所述当前节点是否为终端节点或遍历的节点,或者是否已满足退出条件。如果在步骤406中确定所述当前节点是终端节点或遍历的节点,或者已满足退出条件,所述跟踪算法400转到步骤410,然后所述跟踪算法400结束。否则,如果在步骤406中确定所述当前节点不是终端节点、不是遍历的节点且未满足退出条件,所述跟踪算法400转到步骤408。
64.在步骤408中,将所述当前节点添加到遍历的数据结构中。然后,所述跟踪算法400转到步骤412。在步骤412中,确定所述当前节点是否包含在提取的控制流数据结构中的任何控制流中。
65.如果在步骤412中确定所述当前节点包含在所述提取的控制流数据结构中的任何控制流中,所述跟踪算法400转到步骤414。如果在步骤412中确定所述当前节点不包含在所述提取的控制流数据结构中的任何控制流中,所述跟踪算法400转到步骤420。
66.在步骤414中,对包含所述当前节点的所述控制流的每个输入递归地应用所述跟踪算法400的实例。在对包含所述当前节点的所述控制流的输入应用所述跟踪算法400的所有实例之后,所述跟踪算法400结束。然后,所述跟踪算法400转到步骤416。
67.在步骤416中,将包含所述当前节点的所述提取的控制流数据结构中的所述控制流添加到跟踪的数据结构中,然后所述跟踪算法400结束。
68.在步骤420中,对所述当前节点的每个输入递归地应用所述跟踪算法400的实例。在对所述当前节点的输入递归地应用所述跟踪算法400的所有实例之后,所述跟踪算法400结束。然后,所述跟踪算法400转到步骤422。
69.在步骤422中,将所述当前节点添加到所述跟踪的数据结构中,然后所述跟踪算法400结束。
70.参考图5,图5中描述了从包含分支的示例性tensorflow图500中提取控制流的方法300。图5所示的示例性tensorflow图500包含2个类型为转换和合并的tensorflow控制流原语;附加地,图5包含5个类型为更大、relu、最大池化和平均池化的tensorflow运算。
71.对所述示例性tensorflow图500应用所述方法300。在所述方法300的步骤304中,将合并节点504存储在收集的节点数据结构中。然后,所述方法300转到步骤306。
72.只要尚未处理所述合并节点504并且尚未将其从所述收集的节点数据结构中移除,所述方法300就从步骤306转到步骤308。
73.在所述方法300的步骤308中,从所述收集的节点数据结构中选择所述合并节点504。然后,所述方法300转到步骤312。
74.在所述方法300的步骤312处,对所述合并节点504的每个输入节点递归地应用所述跟踪算法400的实例。最大池化节点508是所述合并节点504的第一输入,对所述最大池化节点508应用的所述跟踪算法400的所述实例跟踪到常量节点512、常量节点514和常量节点516,其中到达终端节点。根据所述跟踪的数据结构获得第一分支路径,所述跟踪的数据结构是在所述跟踪算法400的所述实例结束时产生的。平均池化节点510是所述合并节点504的第二输入,对所述平均池化节点510应用的所述跟踪算法400的所述实例跟踪到转换节点502,其中所述跟踪在到达遍历的节点时结束。根据所述跟踪的数据结构获得第二分支路径,所述跟踪的数据结构是在所述跟踪算法400的所述实例结束时产生的。所述方法300转到步骤314。
75.在所述方法300的步骤314中,确定两个分支路径有效。所述方法300转到步骤316。
76.在所述方法300的步骤316中,移除转发节点;在这种情况下,不存在转发节点。如果一个分支路径在另一个分支路径中包含的转换节点处终止,将所述另一个分支路径分成两个切片:第一切片和第二切片,其中,所述第一切片包含所述转换节点及其之前的节点,所述第二切片包含所述转换节点之后的节点;然后,将所述另一个分支路径替换为所述第二切片并丢弃所述第一切片。在这种情况下,对根据跟踪所述转换节点502之后的所述最大池化节点508获得的分支路径进行切片,并将其替换为所述第二切片。公用中间表示分支的构建形式是分支600,其中,更大节点506(即作为两个分支路径终端节点的所述转换节点504的所述第一输入)作为分支谓词。将所述分支600添加到提取的控制流数据结构中。然后,所述方法300转到步骤326。
77.在所述方法300的步骤326中,从所述收集的节点数据结构中移除所述合并节点504。所述方法300返回至步骤306,在该步骤中所述收集的节点数据结构为空。然后,所述方法300结束。
78.参考图6a,图6a中描述了从包含循环的示例性tensorflow图700中提取控制流的方法300。图6a所示的示例性tensorflow图700包含10个类型为进入、下一次迭代、退出、循环条件、转换和合并的tensorflow控制流原语;附加地,图6a包含8个类型为常量、乘法、加法和减法的tensorflow运算。
79.对所述示例性tensorflow图700应用所述方法300。在所述方法300的步骤304中,将合并节点(706、704)和循环条件节点702存储在收集的节点数据结构中。然后,所述方法300转到步骤306。
80.只要尚未处理所述合并节点(706、704)和所述循环条件节点702中的任何节点并且尚未将其从所述收集的节点数据结构中移除,所述方法300就从步骤306转到步骤308。
81.在所述方法300的步骤308中,从所述收集的节点数据结构中选择节点。以下描述说明了以所述合并节点706、所述合并节点704和所述循环条件节点702的顺序选择和处理节点时的场景。可以确保在第二次选择任何节点之前所有节点都被选择了一次的任何顺序选择节点;然而,如果在所述合并节点706或所述合并节点704之前选择所述循环条件节点
702,所得循环谓词和循环体无效,因为所述循环谓词和所述循环体包含嵌套的合并节点(706、704);然后,所述方法300返回至步骤306。因此,确保始终在所述循环条件节点702之前处理所述嵌套的合并节点(706、704)。
82.选择所述合并节点706。然后,所述方法300转到步骤310,在该步骤中确定所述选择的节点是合并节点。然后,所述方法300转到步骤312。
83.在所述方法300的步骤312中,对所述合并节点706的每个输入节点递归地应用所述跟踪算法400的实例。下一次迭代节点708是所述合并节点706的第一输入,对所述下一次迭代节点708应用的所述跟踪算法400的所述实例跟踪到所述合并节点706和常量节点712,其中分别通过到达所述选择的合并节点以及通过到达终端节点来满足退出条件。根据所述跟踪的数据结构获得分支路径,所述跟踪的数据结构是在所述跟踪算法400的所述实例结束时产生的。进入节点710是所述合并节点706的第二输入,对所述进入节点710应用的所述跟踪算法400的所述实例在到达进入节点时满足所述退出条件时立即结束。根据所述跟踪的数据结构获得第二分支路径,所述跟踪的数据结构是在所述跟踪算法400的所述实例结束时产生的。所述方法300转到步骤314。
84.在所述方法300的步骤314中,确定两个分支路径有效。所述方法300转到步骤316。
85.在所述方法300的步骤316中,移除下一次迭代节点708等转发节点。公用中间表示的构建形式是分支802,其中,因为所述分支路径不在转换节点处终止,所以分支谓词为空。将所述分支802添加到提取的控制流数据结构中。然后,所述方法300转到步骤326。
86.在所述方法300的步骤326中,从所述收集的节点数据结构中移除所述合并节点706。然后,所述方法300返回至步骤306。
87.选择所述合并节点704。然后,所述方法300转到步骤310,在该步骤中确定所述选择的节点是合并节点。然后,所述方法300转到步骤312。
88.在所述方法300的步骤312中,对所述合并节点704的每个输入节点递归地应用所述跟踪算法400的实例。下一次迭代节点714是所述合并节点704的第一输入,对所述下一次迭代节点714应用的所述跟踪算法400的所述实例跟踪到所述合并节点704、循环条件节点702、退出节点718和常量节点720,其中分别通过到达所述选择的合并节点、循环条件节点和退出节点以及通过到达终端节点来满足退出条件。根据所述跟踪的数据结构获得分支路径,所述跟踪的数据结构是在所述跟踪算法400的所述实例结束时产生的。进入节点716是所述合并节点704的第二输入,对所述进入节点710应用的所述跟踪算法400的所述实例在到达进入节点时满足所述退出条件时立即结束。根据所述跟踪的数据结构获得第二分支路径,所述跟踪的数据结构是在所述跟踪算法400的所述实例结束时产生的。所述方法300转到步骤314。
89.在所述方法300的步骤314中,确定两个分支路径有效。所述方法300转到步骤316。
90.在所述方法300的步骤316中,移除下一次迭代节点714等转发节点。公用中间表示的构建形式是分支804,其中,因为所述分支路径不在转换节点处终止,所以分支谓词为空。将所述分支804添加到提取的控制流数据结构中。然后,所述方法300转到步骤326。
91.在所述方法300的步骤326中,从所述收集的节点数据结构中移除所述合并节点704。然后,所述方法300返回至步骤306。
92.选择所述循环条件节点702。然后,所述方法300转到步骤310,在该步骤中确定所
述选择的节点是循环条件节点。然后,所述方法300转到步骤318和步骤320。
93.在所述方法300的步骤318中,对所述循环条件节点702的每个输出节点递归地应用所述跟踪算法400的实例。转换节点722是所述循环条件节点702的唯一输出,对所述转换节点722应用的所述跟踪算法400的所述实例跟踪到所述进入节点716、所述转换节点722和所述循环条件节点702,其中分别通过到达进入节点、遍历的节点和选择的循环条件节点来满足退出条件。所述跟踪算法400的所述实例还遇到提取的分支804,并将所述提取的分支804添加到所述跟踪的数据结构中。根据所述跟踪的数据结构获得循环体,所述跟踪的数据结构是在所述跟踪算法400的所述实例结束时产生的。所述方法300转到步骤322。
94.在所述方法300的步骤320中,对所述循环条件节点702的输入节点递归地应用所述跟踪算法400的实例。减法节点724是所述循环条件节点702的输入,对所述减法节点724应用的所述跟踪算法400的所述实例跟踪到进入节点726和进入节点710,其中通过到达进入节点来满足退出条件。所述跟踪算法400的所述实例还遇到提取的分支802,并将所述提取的分支802添加到所述跟踪的数据结构中。根据跟踪的数据结构获得循环谓词,所述跟踪的数据结构是在所述跟踪算法400的所述实例结束时产生的。所述方法300转到步骤322。
95.在所述方法300的步骤322中,确定所述循环谓词和所述循环体有效。所述循环谓词和所述循环体目前采用循环800的形式。所述方法300转到步骤324。
96.在所述方法300的步骤324中,从循环谓词和循环体中移除所有转发节点;在这种情况下,不存在转发节点。对于所述循环谓词和所述循环体中的所有嵌套公用中间表示分支(802、804):如果所述公用中间表示分支具有空分支谓词,将所述分支中的所有节点转移到包含所述分支的所述循环谓词或所述循环体中;从所述循环谓词或所述循环体中移除所述公用中间表示分支;在这种情况下,所述嵌套分支(802、804)均具有空分支谓词。公用中间表示循环的构建形式是循环900。将所述循环900添加到提取的控制流数据结构中。然后,所述方法300转到步骤326。
97.在所述方法300的步骤326中,从所述收集的节点数据结构中移除所述循环条件节点702。所述方法300返回至步骤306,在该步骤中所述收集的节点数据结构为空。然后,所述方法300结束。
98.参考图6b,图6b是图6a的延续,其中根据对示例性tensorflow图700应用方法300来获得示例性公用中间表示循环900。下面描述了将所述公用中间表示循环900转换为有效ssa中间表示的过程。
99.定义ssa跟踪算法的公用中间表示。给定公用中间表示节点,所述跟踪算法将递归地遍历所述给定节点的输入。所述跟踪算法还将基本块作为输入,其中所述基本块包含指令列表以及连接到其它基本块的输入边缘和输出边缘,如示例性ssa循环1000所示。如果所述给定节点不是合并节点,将与所述给定节点操作等效的指令添加到所述给定基本块的开始处,并将所述给定基本块提供给递归跟踪算法作为输入,其中所述递归跟踪算法应用于所述给定节点的输入。如果所述给定节点是合并节点,将与所述给定合并节点等效的ssa phi节点添加到所述给定基本块的开始处,并创建2个新的基本块作为所述给定基本块的输入;将所述新的基本块提供给对应的递归跟踪算法作为输入,其中所述对应的递归跟踪算法应用于所述给定合并节点的输入。如果先前已遍历所述给定节点,将包含所述给定节点的基本块作为输入添加到所述给定基本块中,然后所述跟踪算法结束。如果所述给定节点
是终端节点,所述跟踪算法结束。
100.下面描述了示例性公用中间表示循环900到等效ssa中间表示1000的转换。通过对减法节点906(即循环谓词902的输出)应用ssa跟踪算法的所述公用中间表示,获得包含所述减法节点906和合并节点908的等效ssa表达式的基本块1006;然后,通过递归地跟踪加法节点910(即所述合并节点908的第一输入),获得基本块1002;然后,通过递归地跟踪常量节点912(所述合并节点908的第二输入),获得基本块1004。通过对合并节点914(即循环体904的输出)应用ssa跟踪算法的所述公用中间表示,获得基本块1012;然后,通过递归地跟踪乘法节点916(即所述合并节点914的第一输入),获得基本块1008;然后,通过递归地跟踪常量节点918(即所述合并节点914的第二输入),获得基本块1010。最后,在所述基本块1006(即通过查找包含所述循环谓词902的输出节点的基本块而标识的循环谓词的输出块)与所述基本块1008(即通过查找包含循环体904中的终端节点的基本块而标识的循环体的输入块)之间添加控制边缘;将指示循环退出的输出边缘添加到所述基本块1006中;在所述基本块1012(即通过查找包含所述循环体904的输出节点的基本块而标识的循环体的输出)与所述基本块1002(即通过查找包含循环谓词906中的终端节点的基本块而标识的循环谓词的输入块)之间添加指示下一次迭代的后边缘。
101.图7示出了示例性计算设备1100的框图,所述示例性计算设备可以用于实现本文公开的方法的实施例。所述计算设备1100包括多个组件,所述组件包括控制所述计算设备1100的整体操作的一个或多个处理器1102。所述一个或多个处理器1102耦合至所述计算设备1100的其它组件并与其进行交互,所述其它组件包括:一个或多个非瞬时性存储器/存储单元1104;一个或多个易失性存储器1106;一个或多个输入/输出(input/output,i/o)接口1108,其可以实现与一个或多个可选输入设备1110和/或输出设备1112的连接;一个或多个网络接口1114。
102.所述一个或多个处理器1102可以包括微处理器、中央处理单元(central processing unit,cpu)、硬件加速器、专用集成电路(application-specific integrated circuit,asic)、现场可编程门阵列(field-programmable gate array,fpga)、专用逻辑电路或其组合。
103.所述一个或多个非瞬时性存储器/存储单元1104可以包括大容量存储单元(例如,固态磁盘、硬盘驱动器、磁盘驱动器和/或光盘驱动器)以及一个或多个非易失性存储器(例如,闪存和/或只读存储器(read-only memory,rom))。所述一个或多个易失性存储器1106可以包括随机存取存储器(random access memory,ram)。所述一个或多个非瞬时性存储器/存储单元1104可以存储由所述一个或多个处理器1102执行的软件(例如,实现本发明中描述的方法(200、300、400)的软件),以及其它软件指令(例如,用于实现操作系统和其它应用/功能的软件指令)。实现所述方法(200、300、400)的所述软件包括可由所述一个或多个处理器1102执行的计算机可读指令。实现所述方法(200、300、400)的所述软件的编码在本发明中提供的本领域普通技术人员的范围内。所述方法(200、300、400)可以包含比图2、图3和图4所示步骤和/或上述步骤更多或更少的步骤,所述步骤可以按照不同的顺序执行。在一些示例中,存储在所述非瞬时性存储器/存储单元1104中的指令可以临时加载到所述一个或多个易失性存储器1106中,以便由所述处理器1102执行。
104.所述一个或多个网络接口1114用于与网络(例如,内联网、因特网、p2p网络、wan
和/或lan)或其它节点进行有线或无线通信。所述一个或多个网络接口1114可以包括用于网络内和/或网络间通信的有线链路(例如以太网线)和/或无线链路(例如一个或多个天线)。
105.在一些其它示例中,一个或多个数据集和/或模块可以由外部存储器(例如,与所述计算设备1100进行有线或无线通信的外部驱动器)提供,或可以由瞬时性或非瞬时性计算机可读介质提供。非瞬时性计算机可读介质的示例包括ram、rom、可擦除可编程rom(erasable programmable rom,eprom)、电可擦除可编程rom(electrically erasable programmable rom,eeprom)、闪存、cd-rom或其它便携式存储器。
106.所述计算设备1100还包括总线1116,以提供所述计算设备1100的组件之间的通信,包括所述一个或多个处理器1102、所述一个或多个可选i/o接口1108、所述一个或多个网络接口1114、所述非瞬时性存储器/存储单元1104和/或所述一个或多个易失性存储器1106。所述总线1116可以是任何合适的总线架构,例如,包括存储器总线、外围总线或视频总线。
107.在图7中,一个或多个可选输入设备1110(例如,键盘、鼠标、麦克风、集成在显示设备中或覆盖在显示设备上的触摸屏和/或按键)和一个或多个可选输出设备1112(例如,显示设备、扬声器和/或打印机)示出为所述计算设备1100的外部设备。在其它示例中,所述一个或多个输入设备1110和/或所述一个或多个输出设备1112中的一个或多个可以是所述计算设备1100的内部组件。所述一个或多个输入设备1110可以包括:显示设备,具有显示屏;用户界面(user interface,ui)导航输入设备(例如,触摸屏、鼠标、触控板、语音接口或其它接口设备),用于允许用户与由所述显示设备显示的项目进行交互。
108.尽管图7示出了物理计算设备1100,但应当理解的是,本文公开的方法和系统的实施例可以在云服务提供商或分布式计算系统实例化的一个或多个虚拟机上实现。可替代地,本文公开的方法和系统可以实现为云计算提供商提供的服务。
109.在上述描述中,阐述了许多细节以便提供对本文公开的主题的理解。然而,可以在没有这些细节的情况下实施实现方式。其它实现方式可以包括对上述细节的修改和变化。所附权利要求涵盖所有这些修改和变化。
110.有利地,本发明的方法和系统将tensorflow图转换为等效编译器中间表示。可以按线性时间对所述等效编译器中间表示应用编译器静态分析和优化,包括但不限于支配边界分析、公用子表达式消除、循环不变代码外提和死码消除。此外,对编译器中间表示应用的现有分析、库、算法和技术还可以等效地应用于所述tensorflow图表示的程序,从而降低工程成本。