[论文笔记] GAMMA: A Graph Pattern Mining Framework for Large Graphs on GPU

news2024/9/21 12:46:50

GAMMA: A Graph Pattern Mining Framework for Large Graphs on GPU

GAMMA: 基于 GPU 的针对大型图的图模式挖掘框架 [Paper] [Code]
ICDE’23

摘要

提出了一个基于 GPU 的核外(out-of-core) 图模式挖掘框架(Graph Pattern Mining, GPM) GAMMA, 充分利用主机内存来处理大型图.

  • GAMMA 采用对用户透明的自适应隐式主机内存访问方式.
  • 针对 GAMMA 在核心外 GPU 系统中提供的原语提出了一些优化

I. 介绍

GPM 算法通常产生大量中间结果. 本文关注使用硬件加速器 (GPU) 的 GPM 算法的高效计算.

已经提出的 GPM 框架中大多数基于 CPU, 性能不令人满意.

现有基于 GPU 的工作侧重于设计特定的 GPM 算法, 仅 Pangolin 一个基于 GPU 的 GPM 框架. Pangolin 的工作假设是图和中间结果可以驻留 GPU 设备内存中, 但 GPM 算法产生大量中间结果而 GPU 设备内存有限, 这致使其不能处理大型图.
为了在 GPU 上处理大型图, 现有工作将图划分并显示传输到 GPU 进行处理; 但需要特定于任务的划分策略, 会导致冗余内存传输和额外时间重组开销. 最好避免这些开销.

本文目标是为 GPU 设备内存无法容纳的图设计一个核外 GPM 框架.

面临挑战和解决方法:

  1. 挑战: 在 CPU-GPU 异构平台上存储和访问大型图数据和中间结果.
    解决: 采用隐式主机内存访问方法, 将主机内存和设备内存变成统一的地址空间.
    提出了一种基于访问量化模型的自适应访问方法, 以及考虑数据局部性的数据结构.
  2. 挑战: 解决在核外 GPU 系统上处理大型图而导致的计算瓶颈: 线程产生的输出数量的不确定性和大量冗余计算, 以及超过设备内存大小的数据排序.
    解决: 三种原语的优化:
    1. 动态设备内存分配策略, 解决扩展过程中数量的不确定性
    2. 对多个扩展过程进行分组以减少冗余计算
    3. 实现了一个针对超过设备内存大小的数据的高效的排序算法.

GAMMA 是第一个可处理超过设备内存容量的大型图的核外 GPM 框架.

文章贡献:

  • 提出了一个基于 GPU 的 GPM 框架, GAMMA, 其使用主机内存来处理大型图. 为用户算法提供了灵活有效的接口.
  • 构建了一种自适应方法来确定使用不同的访问主机内存的模式(统一和零拷贝), 以消除主机内存和设备内存间的带宽差距.
  • 对现有 GPM 框架原语提出了三种针对大型图的优化.
  • GAMMA 在可扩展性和性能方面有很大提高.

II. 预备知识

A. 异构系统架构

在这里插入图片描述

B. 主机内存访问

在 GPU 上处理大型图的方式:

显示内存转移: 将图的每个部分移至设备内存. 两种实现方式:

  1. 对大型图划分, 使每个分区适合设备内存.
    引入了额外数据传输成本并降低了 GPU 利用率.
    特定于任务的数据划分方案不能支持通用 GPM 框架.
  2. 细粒度数据传输: 在主机内存中收集所需数据, 并重组为压缩结构, 再传输到设备.
    在 CPU 上进行的数据提取和重组开销很大.
    不适用于在核外 GPU 上的大规模 GPM.

隐式内存访问: 将主机内存和设备内存统一到统一地址空间, 所需数据可从 CPU 实时获取. 对用户透明. 数据传输与计算重叠, 发出内存请求的线程将切换到 GPU 直到获取到所需数据. GAMMA 中使用隐式内存访问. 两种隐式内存访问模式:

  • 统一内存(unified memory): 将主机和设备内存视为统一内存空间, 数据驻留在两侧. 设备向驻留在主机内存中的数据发出访问请求时, 会产生页面错误(page fault), 然后数据页面(通常 4KB)迁移至设备并进行缓存. 这会导致页面错误处理和长的迁移延迟, 但后续对该页面的访问可直接引用设备中的缓存.
    对具有良好空间或时间局部性的数据友好.
  • 零拷贝内存(zero-copy memory): 以 128B 为单位的数据传输, 几乎没有额外数据迁移开销, 在设备上没有缓冲区.
    适用于孤立的不频繁访问的数据.

III. GAMMA 设计概览

A. 嵌入表

在这里插入图片描述

B. 执行工作流

GAMMA 采用 “extension-aggregation-filter” 三阶段执行过程.

  • Extension: 扩展一个结点或边
  • Aggregation: 将嵌入表 E T ET ET 映射到模式图表 P T PT PT 中, 并在 P T PT PT 上计算聚合函数.
  • Filtering: 允许用户指定对嵌入的约束条件.

C. 实现 GPM 任务 - 示例

在这里插入图片描述

  1. 子图同构(Subgraph Isomorpism): 最坏情况最优连接(worst-case optimal join, WOJ)子图匹配
    在这里插入图片描述
  2. 频繁模式图挖掘(Frequent Pattern Mining, FPM)
    在这里插入图片描述

IV. 图数据存储和访问

数据图用压缩稀疏行(CSR)表示. 在主机内存中维护数据图.

对于每个页面 p p p, 计算在下一个扩展中访问 p p p 中的数据量:
如果要访问 p p p 的很大一部分(图 4 页面 2), 则对 p p p 采用统一内存访问(多个线程访问同一页面 p p p);否则, p p p 采用零拷贝内存访问(图 4 页面 1).
在这里插入图片描述

  1. 空间局部性(Spatial Locality): 定义了页面中有多少数据将被访问.
    S p a t i a l L o c i ( p ) = ∑ l ( v ) ∈ p ∧ l ( v ) ∈ A i ∣ l ( v ) ∣ × t i m e s i ( l ( v ) ) SpatialLoc_i(p)=\sum_{l(v)\in p\wedge l(v)\in A_i}|l(v)|\times times_i(l(v)) SpatialLoci(p)=l(v)pl(v)Ail(v)×timesi(l(v))
    • A i A_i Ai: 第 i i i 个扩展中所有访问的邻接表
    • l ( v ) l(v) l(v): 结点 v v v 的邻接表
    • t i m e s i ( l ( v ) ) times_i(l(v)) timesi(l(v)): 第 i i i 个扩展中访问 l ( v ) l(v) l(v) 的次数
  2. 空间局部性(Temporal Locality):
    T e m p L o c i ( p ) = ∑ j ≤ i − 1 ∑ l ( v ) ∈ p ∧ l ( v ) ∈ A i ∣ l ( v ) ∣ × t i m e s j ( l ( v ) ) TempLoc_i(p)=\sum_{j\leq i-1}\sum_{l(v)\in p\wedge l(v)\in A_i}|l(v)|\times times_j(l(v)) TempLoci(p)=ji1l(v)pl(v)Ail(v)×timesj(l(v))
  3. 访问热度(Access Heat): 结合空间局部性和时间局部性来建模页面被访问的可能性.
    A c c H e a t i ( p ) = A i ∑ j ≤ i A j × S p a t i a l L o c i ( p ) + ∑ j ≤ i − 1 A j ∑ j ≤ i A j × T e m p L o c i ( p ) AccHeat_i(p)=\frac{A_i}{\sum_{j\leq i}A_j}\times SpatialLoc_i(p)+\frac{\sum_{j\leq i-1}A_j}{\sum_{j\leq i}A_j}\times TempLoc_i(p) AccHeati(p)=jiAjAi×SpatialLoci(p)+jiAjji1Aj×TempLoci(p)

每次扩展后更新每个页面的 A c c H e a t i ( p ) AccHeat_i(p) AccHeati(p), 并以此确定接下来扩展的内存访问方法:
通过统一内存访问的页面最大数量 N u N_u Nu 由设备缓冲区大小确定.
A C C H e a t ACCHeat ACCHeat 最大的 N u N_u Nu 个页面采用统一内存方式访问, 其余数据采用零拷贝内存方式访问.

V. GAMMA: 实现和优化

A. 嵌入表

数据结构:
使用前缀树存储嵌入, 并在 “filtering” 阶段后压缩嵌入表.
在这里插入图片描述

嵌入表压缩操作:

  1. 分别标记有效嵌入和无效嵌入.
  2. 对所有标记进行前缀扫描, 从而确定有效嵌入在压缩后的新位置.
  3. 并行收集有效嵌入构成压缩嵌入表.

数据布局:
嵌入表以列优先的方式存储: 结点(或边)的每一列连续存储; 每个顶点(或边)都有指向同一嵌入中前一结点的指针.
嵌入表驻留主机内存中, 采用统一内存访问方式.
设备保留一个缓冲区写入扩展结果, 扩展后再刷新(flush)数据至主机内存.

B. 原语优化

挑战 1: 并行写冲突
每个线程产生的结果数量不确定, 并行线程不知道开始写入的位置.
优化 1: 动态内存分配策略: 内存被分成许多内存块, 构成内存池.
在这里插入图片描述

wrap 间写冲突: 每个 wrap 被分配 1 个内存块用于写入嵌入扩展结果, 内存块写满后再请求新内存块.
wrap 内线程间写冲突: warp 级前缀扫描 (可借助 wrap 的 SIMT 特性).
GPU 内核仅有几百个活动的 wrap 且每个 wrap 每次只请求一个新内存块, 从而限制了由于 warp 间内存块分配竞争产生的额外时间开销.

挑战 2: 冗余计算
多个列表交集中的冗余计算.
优化 2: 预先对多个邻接表求交集获得交集列表, 利用 GPU 共享内存(shared memory)来存储交集列表
在这里插入图片描述

挑战 3: 基于 GPU 的外部排序
大多数基于 GPU 的排序算法都假设输入适合 GPU 内存, 且超过 GPU 内存的两种方法没有充分利用 GPU 并行性.
优化 3: 优化的核外 GPU 排序算法.
首先将模式图表 P T PT PT 划分为片段 S i ( i = 1 , . . . , n ) S_i(i=1,...,n) Si(i=1,...,n), 使每个片段 S i S_i Si 可通过核内 GPU 排序算法进行排序. n n n 个排序后的片段 S i S_i Si 写回主机内存后, 使用多路归并算法(Algorithm 3)合并.
在这里插入图片描述

  • Line 2: 将每个片段 S i S_i Si 由检查点(checkpoint) C i C_i Ci 分成数量相同的 p s i z e p_{size} psize 大小的两部分. Ω = { C 1 , . . . C i , . . . , C ∣ Ω ∣ }   ( ∣ Ω ∣ ≤ n ) \Omega=\{C_1,...C_i,...,C_{|\Omega|}\}\ (|\Omega|\leq n) Ω={C1,...Ci,...,C∣Ω∣} (∣Ω∣n)
  • Line 4: 对每个检查点 x = C i ∈ Ω x=C_i\in\Omega x=CiΩ 找对应的匹配索引 § i \S_i §i. 并利用 ∣ Ω ∣ |\Omega| ∣Ω∣ 个检查点的匹配索引 § i \S_i §i将每个片段 S i S_i Si 分成 ∣ Ω ∣ + 1 |\Omega|+1 ∣Ω∣+1 大小的小片段列表 S i o , o = 0 , . . . , ∣ Ω ∣ S_i^o, o=0,...,|\Omega| Sio,o=0,...,∣Ω∣.
    § i   of   x = { 0 < § i < ∣ S i ∣ , S i [ § i − 1 ] < x ≤ S i [ § i ] 0 , x ≤ S i [ 0 ] ∣ S i ∣ , x > S i [ ∣ S i ∣ − 1 ] \S_i\ \ \text{of}\ \ x=\begin{cases} 0 < \S_i < |S_i|, & S_i[\S_i-1] < x \leq S_i[\S_i]\\ 0, & x\leq S_i[0]\\ |S_i|, & x > S_i[|S_i|-1] \end{cases} §i  of  x= 0<§i<Si,0,Si,Si[§i1]<xSi[§i]xSi[0]x>Si[Si1]
  • Line 6-28: 每个子任务将 S i o , i = 1 , . . . , n S_i^o, i=1,...,n Sio,i=1,...,n 小片段合并为有序列表 S m o S_m^o Smo, 由第 o o o 个 wrap 处理.
    对于元素 x ∈ S i o ( S i o [ i ] = x ) x\in S_i^o(S_i^o[i]=x) xSio(Sio[i]=x), 其在 S m O S_m^O SmO 的位置为 i + ∑ t = 1 o − 1 I t x + ∑ t = o + 1 n I t x i+\sum_{t=1}^{o-1}I_t^x+\sum_{t=o+1}^nI_t^x i+t=1o1Itx+t=o+1nItx, 其中 I t x I_t^x Itx 表示元素 x x x 在小片段 S t o S_t^o Sto 中的匹配索引.
  • Line 10-23: 遍历第 o o o 个子任务的所有小片段对 ( S j o , S k o ) , k < j (S_j^o,S_k^o), k<j (Sjo,Sko),k<j:
    • Line 15: 计算每个元素 p ∈ S j o p\in S_j^o pSjo S k o S_k^o Sko 的匹配索引 p o s pos pos.
    • Line 19: I t x I_t^x Itx 由小片段对 ( S i o , S t o ) , t < i (S_i^o,S_t^o), t < i (Sio,Sto),t<i 时对 x x x 计算匹配索引位置的列表 m a t c h e d _ i d x matched\_idx matched_idx 得到.
    • Line 20-21: I t x I_t^x Itx 由小片段对 ( S t o , S i o ) , t > i (S_t^o,S_i^o), t > i (Sto,Sio),t>i 时统计 x x x 匹配索引数目的列表 m a t c h e d _ c n t matched\_cnt matched_cnt 得到.
      在这里插入图片描述

C. 复杂度分析

以 SM 算法来计算:

  • Pangolin 组合枚举: O ( n k − 1 d m a x ( k − 2 ) l o g ( d m a x ) ) O(n^{k-1}d_{max}(k-2)log(d_{max})) O(nk1dmax(k2)log(dmax))
  • GAMMA 组合枚举: O ( n k − 2 ( k − 2 ) d m a x + n k − 1 d m a x log ⁡ ( d m a x ) ) O(n_{k-2}(k-2)d_{max}+n^{k-1}d_{max}\log(d_{max})) O(nk2(k2)dmax+nk1dmaxlog(dmax))
    GAMMA 组合枚举+同构检测: O ( n k − 2 ( k − 2 ) d m a x + n k − 1 d m a x ( log ⁡ ( d m a x ) + e k log ⁡ k ) ) O(n_{k-2}(k-2)d_{max}+n^{k-1}d_{max}(\log(d_{max})+e^{\sqrt{k\log k}})) O(nk2(k2)dmax+nk1dmax(log(dmax)+eklogk ))
    GAMMA 并行: O ( n k − 2 ( k − 2 ) d m a x + n k − 1 d m a x ( log ⁡ ( d m a x ) + e k log ⁡ k ) w ) O(\frac{n_{k-2}(k-2)d_{max}+n^{k-1}d_{max}(\log(d_{max})+e^{\sqrt{k\log k}})}{w}) O(wnk2(k2)dmax+nk1dmax(log(dmax)+eklogk ))

VI. 实验

性能: Figure 11, Figure 12, Figure 14
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

扩展性: Figure 15, Figure 16
各种优化的性能提升: Figure 17, Figure 18, Figure 19, Figure 20


笔者总结

本文的核心在于通过自适应隐式主机内存访问方式实现了一个针对大型图的基于 GPU 的图模式挖掘框架, 并围绕核外 GPU 系统带来的计算瓶颈进行了优化.
GAMMA 系统属于通用图挖掘系统, 采用以嵌入为中心(Embedding-Centric)的图挖掘模式, 支持结点诱导(vertex-induced)和边诱导(edge-induced)的子图扩展方式.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1316608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spark精讲】Spark五种JOIN策略

目录 三种通用JOIN策略原理 Hash Join 散列连接 原理详解 Sort Merge Join 排序合并连接 Nested Loop 嵌套循环连接 影响JOIN操作的因素 数据集的大小 JOIN的条件 JOIN的类型 Spark中JOIN执行的5种策略 Shuffle Hash Join Broadcast Hash Join Sort Merge Join C…

ffmpeg踩坑之手动编译报错Unrecognized option ‘preset‘及rtsp/rtmp推流

本文解决的问题记录&#xff1a; 报错1&#xff1a;Unrecognized option preset. Error splitting the argument list: Option not found 报错2&#xff1a;ERROR: x264 not found using pkg-config 报错3&#xff1a;ffmpeg: error while loading shared libraries: libavd…

【Linux】文件系统、文件系统结构、虚拟文件系统

一、文件系统概述 1. 什么是文件系统&#xff1f;2. 文件系统&#xff08;文件管理系统的方法&#xff09;的种类有哪些&#xff1f;3. 什么是分区&#xff1f;4. 什么是文件系统目录结构&#xff1f;5. 什么虚拟文件系统Virtual File System &#xff1f;6. 虚拟文件系统有什…

Unity中 URP Shader 的纹理与采样器的分离定义

文章目录 前言一、URP Shader 纹理采样的实现1、在属性面板定义一个2D变量用于接收纹理2、申明纹理3、申明采样器4、进行纹理采样 二、申明纹理 和 申明采样器内部干了什么1、申明纹理2、申明采样器 三、采样器设置采样器的传入格式1、纹理设置中&#xff0c;可以看见我们的采样…

〖大前端 - 基础入门三大核心之JS篇(55)〗- 内置对象

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

C# 获取Windows所有窗口句柄

写在前面 在做录屏或截屏操作时&#xff0c;需要获取当前正在运行中的桌面程序句柄&#xff0c;在网上查找资源的的时候&#xff0c;发现了一个工具类还不错&#xff0c;这边做个验证记录。 参考代码 public class WindowApi{//寻找目标进程窗口 [DllImport("USER…

前端桌面通知(Desktop Notifications)API

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

antd+vue:tree组件:父级节点禁止选择并不展示选择框——基础积累

antdvue:tree组件&#xff1a;父级节点禁止选择并不展示选择框——基础积累 1.判断哪些是父节点&#xff0c;给父节点添加disabled属性——this.permissionList是数据源2.通过css样式来处理disabled的父节点3.完整代码如下&#xff1a; 最近在写后台管理系统的时候&#xff0c;…

【linux】图形界面Debian的root用户登陆

图形界面Debian默认不允许以root用户登录。这是出于安全考虑&#xff0c;以防止用户使用root权限执行可能损害系统的操作。 如果需要使用root用户&#xff0c;可以通过以下步骤进行登录&#xff1a; 打开终端&#xff0c;使用su命令切换到root用户。修改/etc/gdm3/daemon.con…

2023年中国法拍房用户画像和数据分析

法拍房主要平台 法拍房主要平台有3家&#xff0c;分别是阿里、京东和北交互联平台。目前官方认定纳入网络司法拍卖的平台共有7家&#xff0c;其中阿里资产司法拍卖平台的挂拍量最大。 阿里法拍房 阿里法拍房数据显示2017年&#xff0c;全国法拍房9000套&#xff1b;2018年&a…

CentOS 7系统加固详细方案SSH FTP MYSQL加固

一、删除后门账户 修改强口令 1、修改改密码长度需要编译login.defs文件 vi /etc/login.defs PASS_MIN_LEN 82、注释掉不需要的用户和用户组 或者 检查是否存在除root之外UID为0的用户 使用如下代码&#xff0c;对passwd文件进行检索&#xff1a; awk -F : ($30){print $1) …

基于vue+element-plus+echarts制作动态绘图页面(柱状图,饼图和折线图)

前言 我们知道echarts是一个非常强大的绘图库&#xff0c;基于这个库&#xff0c;我们可以绘制出精美的图表。对于一张图来说&#xff0c;其实比较重要的就是配置项&#xff0c;填入不同的配置内容就可以呈现出不同的效果。 当然配置项中除了样式之外&#xff0c;最重要的就是…

Mr. Cappuccino的第66杯咖啡——解决MacOS中终端下的中文乱码问题

解决MacOS中终端下的中文乱码问题 中文乱码问题解决方法 中文乱码问题 解决方法 查看Mac使用的是哪个shell echo $SHELL我这里使用的是zsh&#xff0c;将配置添加到.zshrc配置文件中 vi ~/.zshrc 输入i进入编辑模式 esc退出编辑模式 :wq# UTF-8 export LANGen_US.UTF-8加载配…

k8s-1.23版本安装

一、主机初始化 1、修改主机名 hostnamectl set-hostname master hostnamectl set-hostname node1 hostnamectl set-hostname node2 hostnamectl set-hostname node32、主机名解析 echo 192.168.1.200 master >> /etc/hosts echo 192.168.1.201 node1 >>…

CSS 基础

文章目录 CSS 常见的属性CSS 常见样式行内样式内嵌样式导入样式 CSS 选择器标签选择器id选择器类选择器全局选择器属性选择器组合选择器 CSS 常见应用表格列表导航栏下拉菜单提示工具图片廊 CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;是一种用…

《工程数值计算Python教程》笔记

文章目录 [toc]第一章&#xff1a;绪论 1.1 1.1 1.1|数值计算在工程科学中的重要性 1.2 1.2 1.2|数值计算方法 1.3 1.3 1.3|程序设计盒图计算方法的选取减少运算次数避免相近的数相减 1.4 1.4 1.4|误差的来源、表示及传递误差的来源和分类模型误差观测误差截断误差舍入误差 误差…

【 某景点舆情分析:Python、Echarts、Flask、文本处理技术的应用】

某景点舆情分析&#xff1a;Python、Echarts、Flask、文本处理技术的应用 前言技术栈数据获取与准备景点数据统计分析评论数据处理与分析词频统计分词与文本处理情感分析 数据可视化Web应用搭建结语 前言 随着旅游行业的蓬勃发展&#xff0c;越来越多的人通过网络平台获取关于…

vue3 setup语法糖写法基本教程

前言 官网地址&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)下面只讲Vue3与Vue2有差异的地方&#xff0c;一些相同的地方我会忽略或者一笔带过与Vue3一同出来的还有Vite&#xff0c;但是现在不使用它&#xff0c;等以后会有单独的教程使用。目前仍旧使用v…

opencv 十六 python下各种连通域处理方法(按面积阈值筛选连通域、按面积排序筛选连通域、连通域分割等方法)

本博文基于python-opencv实现了按照面积阈值筛选连通域、按照面积排序筛选topK连通域、 连通域细化(连通域骨架提取)、连通域分割(基于分水岭算法使连通域在细小处断开)、按照面积排序赛选topK轮廓等常见的连通域处理代码。并将代码封装为shapeUtils类,在自己的python代码…

Llama 架构分析

从代码角度进行Llama 架构分析 Llama 架构分析前言Llama 架构分析分词网络主干DecoderLayerAttentionMLP 下游任务因果推理文本分类 Llama 架构分析 前言 Meta 开发并公开发布了 Llama系列大型语言模型 (LLM)&#xff0c;这是一组经过预训练和微调的生成文本模型&#xff0c;参…