Bader D A, Li F, Ganeshan A, et al. Triangle counting through cover-edges[C]//The 27th Annual IEEE High Performance Extreme Computing Conference (HPEC), Virtual. 2023.
文章目录
Abstract
在现实世界的分析中,经常使用计算和寻找图中的三角形来描述凝聚力和识别图中的社区。在本文中,我们提出了一个新的概念,可以用来更有效地寻找三角形。我们使用宽度优先搜索(BFS)来快速生成一个紧凑的覆盖边集。提出了一种基于覆盖边集的序列和并行三角形计数算法。序列算法避免了不必要的三角形检查操作,并行算法具有通信效率。该并行算法可以渐近地减少在大量图上的通信,如来自真实的社交网络和来自图500基准的合成图。在我们对大规模图500图的估计中,我们新的并行算法可以将36图上的通信减少1156倍,在42图上减少2368倍。
I. INTRODUCTION
三角形计数[1]是图分析中的一个基本问题,它涉及到寻找图中唯一三角形的数量。它在各种图分析技术中,如聚类系数[2]、k-桁架[3]和三角形中心性[4]中起着至关重要的作用。三角形计数的重要性在其在高性能计算基准测试中的应用,如图形500[5]和MIT/[5]/Amazon/IEEE图形挑战[6],以及在未来架构系统的设计中(如IARPA敏捷[7])。
自1977年[8]以来,序列和平行三角形计数算法都得到了广泛的研究。Latapy [9]提供了序列三角形计数和各种发现算法的全面概述。现有的技术,包括列表交集、矩阵乘法和子图匹配[10],都是用于计算三角形的技术。
为了提高三角形计数的性能,Cohen [11]引入了一种新的映射简化并行化技术,可以在图中的三个顶点之间生成开楔。它确定是否存在一个闭合边来完成一个三角形,从而避免了在保持负载平衡的同时对同一三角形的冗余计数。许多并行方法的三角形计数[12],[13]划分稀疏跨多个计算节点的图形数据结构,并采用生成开楔的策略,并将其发送到其他计算节点,以确定是否存在闭合边。因此,这些开放楔形的通信时间往往支配着平行三角形计数的运行时间。
在传统的基于边的三角形计数方法中,所有的三角形都是通过累积每条边的端点对之间的交点大小来识别的。面向方向的方法可以避免多次计算同一个三角形。然而,在本文中,我们提出了一种新的方法,有效地识别所有三角形使用一个简化的边集称为覆盖边集。通过利用基于超切边的三角形计数方法,可以跳过不必要的边检查,同时确保没有遗漏三角形。与现有的方法相比,这大大减少了计算操作的数量。此外,对于分布式并行算法,基于覆盖边的方法可以大大降低整体通信需求。因此,我们提出的方法提高了三角形计数的效率和可伸缩性。
我们的贡献包括:
- 提出了一种新的覆盖边缘集来支持有效的三角形计数。其基本思想是,我们可以从一个显著减少的覆盖边集中识别所有的三角形,而不是完整的边集。一个简单的宽度优先搜索(BFS)用于将图的顶点定向到级别中,并生成覆盖边缘集。
- 基于覆盖-边缘集的概念,提出了一种新的三角形计数和查找算法CETC。CETC运行在O(m·dmax)时间和O(n + m)空间中,其中dmax是一个顶点v-∈V的最大度。
- 基于覆盖边缘集的概念,提出了一种高效通信的三角计数和查找分布式并行算法Comm-CETC。Comm-CETC可以渐近地减少通信,以提高整体性能。
本文的其余部分组织如下。第二节介绍了我们的三角形计数的新方法。在第三节中,我们在分布式并行三角形计数中使用了我们的想法来减少通信。第五节讨论了相关的工作。最后,在第六节中,我们总结了该论文。
II. COVER-EDGE SET BASED TRIANGLE COUNTING
A. Notations and Basic Idea
设G =(V,E)是一个具有n个= |V |顶点和m个= |E|边的无向图。图中的三角形是三个顶点的集合{va, vb, vc}⊆V,{(va, vb),(va, vc),(vb, vc)}⊆E,我们将使用N(v)== {u|u ∈V ∧((v, u) ∈ E)}来表示顶点v∈V的邻居集合。顶点v∈V的度是d(v)=|N(v)|,dmax是图G中一个顶点的最大度。
定义1(覆盖边和覆盖边集)。对于图G中三角形∆的任何边e,e被称为∆的覆盖边。对于给定的图G,如果边集S⊆E在G中每个三角形至少包含一个覆盖边,则称为覆盖边集。
基于给定的定义,很明显,整个边缘集E可以作为覆盖边缘集S图G。然而,我们提出的方法旨在有效地计算所有三角形使用更小的边缘子集而不是E。因此,主要的挑战在于生成一个紧凑的覆盖边缘集,形成最初的问题要解决在我们的方法。让k = |S|/|E|。我们的目标是识别具有最小k的边界集。在本文中,我们提出使用宽度优先搜索(BFS)来生成一个紧凑的覆盖边集。
定义2(BFS-Edge)。设r是一个无向图g的根顶点。一个顶点v的水平L (v)被定义为通过路径优先搜索(BFS)得到的从r到v的最短距离。从BFS中,我们将边缘分为三种类型:
Tree边:这些边属于BFS树。
Strut边:这些是非树边,具有在BFS遍历中两个相邻级别上的端点。
Horizontal边:这些是BFS遍历中端点相同的非树边。
图1给出了这些不同的边缘类型的一个例子。
引理1。图中的每个三角形{u、v、w}至少包含一条水平边。
“证明”。(矛盾证明)三角形是一条长度为3的路径,它的起止于同一顶点。假设在三角形中没有水平边。在这种情况下,路径中的每条边(即树边或支柱边)要么增加级别1,要么降低级别1。
由于路径必须以与起始顶点在相同的级别结束,因此路径中降低级别的边数必须等于增加级别的边数。因此,路径的长度必须是均匀的,以保持水平奇偶校验。然而,这与一个三角形的奇数路径长度为3的事实相矛盾。
因此,我们得出结论,在每个三角形中必须至少有一条水平边。
定理3(覆盖边集的生成)。所有的水平边形成一个有效的覆盖边集。
证明。根据定义1,对于图G中的任何三角形∆,我们总是可以找到至少有一条水平边作为∆的覆盖边。因此,所有水平边的集合构成了一个覆盖边集。
因此,我们可以通过选择宽度优先搜索(BFS)过程中获得的所有水平边来构建一个覆盖边集,表示为BFS-CES。很明显,BFS-CES是E的一个子集,通常比完全的边集E要小得多。
B. Cover-Edge based Triangle Counting
在本小节中,我们提供了对使用通过宽度优先搜索生成的覆盖边集来识别所有三角形所涉及的过程的全面描述。
引理2。每个三角形{u、v、w}必须包含一条或三条水平边。
证明。通过参考引理1的证明,我们知道与三角形的三条边所对应的路径由偶数条树边和支柱边组成。这意味着在每个三角形中可以有0或2条树边或支柱边。
在有0个树边或支柱边的情况下,三角形的所有三条边都必须是水平边。这是因为没有树边或支柱边意味着整个路径都是由水平边组成的。
在有两个树边或支柱边的情况下,三角形只包含一条水平边。这是因为在路径中有两个树边或支柱边意味着有一个水平边连接其余的两个顶点。因此,我们得出结论,每个三角形{u,v,w}必须包含一条或三条水平边。
我们的三角形计数方法,在算法1中描述使用覆盖边集有效地计数三角形。在第1行中,我们将计数器T初始化为0,它将存储三角形的总数。为了生成覆盖边缘集,我们执行一个宽度优先搜索(BFS)从任何未访问的顶点开始,识别每个顶点v在其各自组件中的级别(L (v)),如第2到第3行所示。在第4行到第8行,算法迭代每条边,在第5行以面向方向的方式选择水平边缘(u,v)。对于u和v的邻域的交集上的每个顶点w(第6行),我们检查以下两个条件,以确定(u,v,w)是否是一个要计数的唯一三角形(第7行)。如果L (u) = L (w),则边(u,v)是三角形(u、v,w)中唯一的水平边。如果L (u)≡L (w),则该边(u、v)是三角形(u、v、w)中三条水平边中的一条。为了确保唯一性,算法然后检查添加的约束,v < w。如果满足约束条件,我们在第8行中增加三角形计数器T。
该方法可以有效地计数了图中的三角形,同时避免了冗余计数。
定理4(正确性)。算法1可以准确地计算出图G中的所有三角形。
证明。引理2确定了图中的一个三角形属于以下两种情况: 1)水平边的两个端点顶点在同一层次上,而顶点顶点在不同的层次上;2)该三角形的所有三个顶点都在同一层次上。
考虑G中的一个三角形{va,vb,vc}。不失一般性,假设(va,vb)是一个水平边,这意味着L(va)≡L(vb)。设vc为顶点。这两种情况可以区分如下:
对于第一种情况,每个三角形都由水平边和顶点顶点的水平边顶点顶点唯一定义。每当算法1标识这样一个三角形{va,vb,vc},它将总三角形计数T增加1。
在第二种情况下,所有三个顶点都在同一层(L(vc)≡L(va)≡L(vb)),Alg。1确保只有当va < vb < vc时T增加1。这个条件确保了三角形{va,vb,vc}只被计数一次,防止了三次计数,并确保了三角形计数的正确性。
因此,算法1被证明可以准确地计算图G中的所有三角形。
Alg的时间复杂度。算法1可以分析如下。宽度优先搜索的计算,包括确定每个顶点的水平和标记水平边,需要O(n + m)时间。
由于最多有O (m)个水平边,因此可以在O(dmax)时间内分别找到每个水平边的共同邻居。这里,dmax表示图中一个顶点的最大度。
因此,Alg的整体时间复杂度。1为O(m·dmax)。
III. COMMUNICATION EFFICIENT TRIANGLE COUNTING ALGORITHM
本节介绍了我们在处理器分布式内存并行计算机上计算大量图中的三角形的高效通信并行算法。我们将利用覆盖边缘集的概念来显著提高三角计数方法的通信性能。由于分布式三角形计数是基于通信边界的[12],因此该算法有望提高整体运行时间。输入图G以压缩的稀疏行(CSR)格式存储。这些顶点被不均匀地划分到p个处理器上,这样每个处理器就可以存储大约2m/p个的边缘端点。这个图的输入遵循大多数并行图算法实现和基准测试所使用的格式,如图500和图的挑战。
A. Parallel Algorithm Description
我们的通信高效并行算法(见算法2)是基于第二节中提出的相同的覆盖边缘方法。第9行中使用的二进制操作符⊕是位排他OR(XOR)。
基线CETC算法类似,覆盖边集S=∪p−1i=0Si是通过在第1行中标记来自平行BFS的水平边来确定的。
每个处理器并行地运行第2行到第13行,它由两个主要的子步骤组成。在第4到第7行计算局部三角形数,在第8到第13行执行每对处理器之间的覆盖边的总交换以计算三角形数。注意,在for循环的每次迭代结束时,处理器pi可以丢弃覆盖边缘集Sj。在第5行和第11行中,处理器pi为每个覆盖边(u,v)确定所有与u和v相邻的局部顶点顶点。
在第6行和第12行中计算三角形的逻辑类似于算法1,因为只计算唯一的三角形。最后,第14行中的缩减运算通过累积整个系统的三角形计数器来计算三角形的总数,即T=Pp−1i=0ti。
B. Cost Analysis
- 空间:除了输入图数据结构外,每条边还需要一个额外的位(用于标记一个水平边)和每个顶点的O(logD)位来存储其级别,其中D是图的直径。这是p处理器最多日志+位的总数。保持图需要为图提供额外的O(n + m)空间。
2)计算:BFS代价为O((n + m)/p)[14],修改后的邻居集取O(m/p)。使用二进制搜索,与顶点邻接列表中的一条覆盖边对应的搜索最多需要O(log(dmax))个时间,而使用哈希表只需要O (1)个预期时间。设di为顶点vi的度,其中为0≤i < n。在所有顶点的邻接列表中搜索km边需要O(kmPn−1i=0log(di))=O(kmlog(Πn−1i=0di))时间。由于Pn−1i=0di=2m,我们知道日志(Πn−1i=0di)在0<≤下的二= 2m/n时达到最大值。因此,O (km对数(Πn−1i=0di))≤O (km对数((2m/n)))≤O (kmn对数(2n2/n))=O(mn对数(n))。
3)总通信:在我们对BFS的通信成本分析中,我们测量独立于处理器数量的总通信量。因此,这是对通信的保守高估,因为一部分(例如,1/p)的访问将在同一计算节点上,而不是节点之间的消息流量。同时,我们不考虑与计算成本重叠的节省。
宽度优先搜索的代价是m个边遍历,每边遍历级别信息、对log+和顶点度,产生m·(logD+3logn)位。传输km水平边需要kmplogn位,其中p是处理器的数量。找到三角形总数的最终缩减需要(p−1)logn位。
因此,总通信量为m·(日志D+3logn)+kmp对数n+(p−1)对数n=m·(日志D+(kp+3)日志n)+(p−1)对数n位。因此,由于单词的大小是Θ(log n)和D≤n,所以通信是O(pm)单词。
IV. COMMUNICATION ANALYSIS ON REAL AND SYNTHETIC GRAPHS
在本节中,我们分析了平行三角形计数算法在实图和合成图上的性能。我们使用Python实现了我们新的三角形计数算法,以精确计算精确的通信量,并基于图的大小和处理器的数量,以及BFS中覆盖边的比率或百分比(k)确定分析模型。表一中给出的结果是来自我们的新算法的精确通信量所有的图,除了两个大的RMAT图,我们从经过验证的解析模型中计算通信量。为了与之前的方法[15]-[17]进行比较,我们从楔形的数量来估计通信量,这是除最后两个大的RMAT图之外的所有图,我们使用图论来估计楔形的数量。
对于真实的图,我们找到k的实际值,即覆盖边的百分比,对于任意宽度优先搜索,并将处理器的数量p设置为给定图大小的合理数字。合成图,我们使用大图500 RMAT图[18]参数=0.57,b=0.19,c=0.19,d=0.05,规模36和42n=2规模和m = 16n,类似于IARPA敏捷基准图,并设置p根据估计潜在系统大小有足够的内存持有这些大实例。
为了进行比较,大多数先前的三角形计数并行算法在图上操作如下。在顶点v∈v上的并行循环产生所有的2条路径(楔形),其中(v,v1)、(v,v2)∈E和(w.l.o.g)。v1 < v2.生成此楔形的处理器将向拥有顶点v1的处理器的顶点id发送包含v1和v2的开放楔形查询消息。如果接收到此查询消息的消费者处理器找到了一条边(v1,v2)∈E,则一个本地三角形计数器将会递增。在生产者和消费者完成所有工作后,p三角形计数的全局约简计算出G中三角形的总数。
A. Graph500 RMAT Graphs
对于500 RMAT图,三角形的数量是根据文献[18]-[21]中RMAT图中发现的三角形的。拟合方程为#三角形=77.422n1.125,r2=为1.0,其中n为顶点总数。尺度36和42 RMAT图估计的三角形数分别为1.20×1014和1.30×1016。
根据所给出的定理,我们估计了尺度36和42图500 RMAT图的楔形数他等人在[22]。根据他们的公式,我们可以估计一个给定的出度d的期望顶点数N (d)。具有此程度的顶点可以形成的楔形数计算为
通过将从最小度(e ln n)产生的所有这些楔形相加到最大度(√n),这是公式的假设,我们可以近似出给定图中楔形的总数,其中n是顶点的总数。这是一个保守的估计,因为它只考虑出度,而不是出度和失度的和。利用该公式,我们计算出36尺度的楔数为2.73×1016,42尺度的楔数为5.8×1018。对于2 log n位/楔形,对于第36和42比例的RMAT图,楔形检查的总体积分别为218PB和52.8EB。
Beamer等人[23]发现一个典型的BFS 27500图500 RMAT图有7个级别,所以在我们对36和42图的分析中,4位是对log D的合理估计。
估计RMAT图的k值的方法如下。生成从6到23的RMAT图,通过在宽度优先搜索后计算水平边来确定每个图的k的精确值。数据拟合为指数模型k = 1.1773e−0.036·尺度,R2 = 0.9956非常高(见图2)。对于尺度36,k估计为0.311,而对于尺度42,k估计为0.260。
在我们的36级规模的新方法中,其中通信成本为m·(logD+(kp+3)logn)+(p−1)logn位。使用logD=4,假设p = 128处理器,我们的总通信量为192TB,通信减少为1156×。对于规模42,并假设p = 256处理器,我们估计我们的新的三角形计数算法的通信为22.8PB,通信减少为2368×。
V. RELATED WORK
A. Sequential Algorithms
三角形计数的简单方法使用强力:找到所有的三联体{va,vb,vc},即图中任意三个顶点的排列,并检查三联体中的每条边是否存在。时间复杂度为Ω。
三个主要的基于交集的三角形计数算法是: 1)节点迭代器算法迭代所有顶点和测试每一对邻居是否连接的边,2)边缘迭代器算法迭代所有边缘和搜索共同邻居的每个边的两个端点,和3)向前算法的改进边缘迭代器算法通过使用图的方向计算社区的子集的交集。节点迭代器和边缘迭代器的时间复杂度均为O(m·dmax),前向算法为Om 3 2,,在dmax≫√m [9]时性能显著提高。
当执行两个列表的交集时,常用的技术是合并路径、二值搜索和基于哈希的算法。
合并路径算法(例如,[25],[26])使用两个指针从头到尾扫描两个端点的邻居列表,以找到列表的交集。在扫描期间,指向较小值的指针将会递增。如果两个指针都在递增(即,它们都指向同一顶点),则会枚举一个三角形。二进制搜索算法(例如,[19],[27])将较长的列表组织为二进制树,并使用较短的列表作为搜索键。对于每个搜索键,它通过二元搜索树向下搜索,以找到相等的条目,这是一个三角形。基于哈希的算法(例如,[10]、[26])为一个列表构造一个哈希表并使用其他列表作为搜索键,以查找哈希表中的公共元素。这里使用哈希表来查找两个邻接列表的交点,因此不需要对所有的邻接列表进行排序来找到所有的三角形。运行时间与两个邻接列表的大小成正比。
使用矩阵乘法的三角形计数[28]依赖于三角形计数的线性代数公式。该方法可以通过矩阵分解来优化[29],将A分解为上下三角矩阵L和U,然后计算(L×U)⊙L,或(L×L)⊙L来确定三角形的数量。二进制算子⊙表示阿达玛乘积。
一种基于子图的三角形计数方法,它搜索在输入图中出现的所有查询图,该查询图是一个三角形。Wang和Owens [30]使用宽度优先搜索来更新子图匹配方法,通过基于邻域编码信息修剪更多的无效顶点,并使用k步前瞻性优化来减少不必要的中间结果。Alon等[31]提出了一种Om1.41在图中找到长度为3个循环(三角形)的算法,这是对Itai和Rodeh顺序Om 3 2算法[8]的改进。
B. Parallel Algorithms
地图减少是大规模分布式计算的标准平台。Cohen [11]首先演示了映射简化解决三角形计数的能力,这种方法在图中的三组顶点之间生成开放的楔形,并确定是否存在一个完成三角形的闭合边。Suri等人[32]使用地图减少实现三角计数,对顶点按程度排序,并将它们分布在主机上。Pearce [12]开发了一种基于创建增强度有序有向图的算法,其中原始无向边从低度向高度,并在分布式异步图处理框架HavoqGT中实现了该方法。DistTC [19]是一种用于多台机器的分布式三角形计数实现,它在每个分区上使用镜像代理来消除几乎所有的内部主机通信。TriCore [27]将保存在压缩稀疏行(CSR)数据结构中的图进行分区,并使用流缓冲区将边缘列表从CPU内存加载到GPU内存,然后使用二进制搜索来找到交集。Hu等人[33]采用了“复制-同步-搜索”模式来提高GPU的并行线程效率,并将计算和内存密集型的工作负载混合在一起,以提高资源效率。Pandey等人[10]采用了一种基于顶点为中心的散列设计,将三角形计数扩展到超过1000个gpu。TriC [13]利用基于顶点的分布式三角形计数,发送顶点而不是边(顶点对),然后远程处理器可以将顶点id序列改为顶点组合,以减少通信。然后向TriC [34]提出了一个增强,添加了用户定义的缓冲区,以提高控制大数据集内存使用的灵活性,并使用了概率数据结构通过权衡精度来优化边缘查找。Strausz等人。[35]使用CLaMPI,这是一个软件缓存层,可以缓存通过MPI远程内存访问操作检索到的数据,以降低总体通信成本。Zeng等[36]提出了一种自适应选择顶点平行和边平行范式的三角形计数算法。
潘杜兰加等人[37]和Dolev等人[15]的工作集中在通信成本上。与我们的工作相比,有两个主要的区别。首先,他们使用通信轮数来衡量具有带宽限制的总通信量。但是,我们使用消息的总量来评估通信。其次,它们是概率算法,但我们的算法是一个确定性算法(Dolev等人,[15]也包含一个确定性版本)。概率方法不能在具有精确结果要求的场景下使用。Uhl [17],[38]还专注于降低三角形计数的通信成本。本文的基本思想是只需要通信来计算由切边组成的三角形。如果分区产生许多切边,该方法不能显著减少通信。相比之下,我们的方法识别了独立于划分的总边集的一个子集,并且在三角形计数期间只传输这个较小的边集,以显著减少总通信。
VI. CONCLUSIONS
在本文中,我们提出了一种新的基于计数和寻找图中三角形的顺序和并行算法。该并行算法是第一个通信效率高的三角形计数算法,利用BFS水平边显著减少了实际关注的大量图上的通信量。我们的方法使用宽度优先搜索来显著减少被检查的边的数量,并最小化三角形检查所需的通信。由于通信是分布式内存系统上三角形计数的主要瓶颈,因此并行算法对大图的通信量减少了一个数量级或更多的通信量。
VII. REPRODUCIBILITY
用于确定并行算法的通信量的顺序三角形计数的源代码和Python代码都是开源的,可以在https://github.com/Bader-Research/triangle-counting.的GitHub上获得输入图来自http://snap.stanford.edu/提供的斯坦福网络分析项目(SNAP)。