项目介绍

MindSpore是华为自研的深度学习框架,其中的计算图模式是一种业界主流的用来进行数据传递与计算的形式。计算图主要包含节点和有向边,节点表示计算和控制操作,边表示数据的流向和控制等关系。计算图的高效合理展示,有助于用户更好的理解模型结构、发现和调试模型训练过程中出现的问题。然而,大型深度学习模型往往有着复杂的计算图结构,包含有成千上万个节点和更多的边。在这些点和边之中,包含有许多结构相同或高度相似的子结构,这些子结构不仅从图的拓扑结构上,甚至从深度学习语义上具有高度的相似性。快速识别大型计算图中上述的相同子结构,能够支持后续用收折、重叠等方式大幅减少页面中同时呈现的节点和边的数目,从而大幅改善计算图的展示效果。

本项目致力于识别深度学习模型计算图中的相同子结构,其主要难度在于改进现有的频繁子图挖掘算法,以更好的适应上述需求。目前现有的频繁子图挖掘算法主要是用来解决项集之间关联问题的,在化学、生物、数据挖掘等领域大量使用:如在化学领域中通过频繁子图挖掘算法找出构成有毒物质的分子结构,以及通过对网站浏览日志的挖掘分析出最频繁的浏览模式等。

想要将频繁子图挖掘的算法思想应用于计算图中,需要对算法进行一些改进和调整。与大部分现有算法的应用场景相比,差异主要体现在:

  • 度量:大部分现有算法都是基于支持度的,即以子图在输入图中出现的次数来作为度量,而在当前应用情景下,支持度变得不那么重要,而应该以压缩输入图的程度来度量,即MDL(Minimum description length),MDL越大,算法效果越好,也即计算图的展示效果提升越显著。

  • 单图:大部分现有算法都是transaction型的,所处理的输入数据是由许多图构成的,每个图可能只包含几十到几百个顶点;而适用与计算图挖掘的large graph型算法所处理的输入数据有且只有一个大图,这个大图通常包含成千上万个顶点。

  • 无环:在一般情况下,计算图是无环的,这一特性使得计算图中的子图挖掘可能存在一些更快捷的算法。

  • 边相同:在一般情况下,计算图的所有边都是相同的,这一特性使得计算图在子图挖掘时可能可以不保存边权等边的相关信息。

  • 并行:现有的频繁子图挖掘算法大多未考虑并行运算,为了提高性能,并尽可能降低通信开销,需要对算法进行调整和创新,使得在并行场景下能快速稳定执行。

  • 层次化:计算图中的各个算子节点是具有层级的,也就是说,每个节点都分属其各自的命名空间。

据上所述,由于计算图中的子图挖掘与大部分现有算法的应用场景具有巨大的差异,为了优化算法的效果,同时减少空间和时间占用,我们基于Apriori思想改进了现有的频繁子图挖掘算法,并使用Python进行了编码实现。