《图处理加速架构研究》第二章【阅读笔记及思考】

第 2 章 图处理应用加速架构的研究背景与现状

(吐槽:对事不对人,文章定位很迷——要说是给小白看吧,各种省略,零基础恐怕要吐血了;要说是给已经有基础的人看吧,里面会出现一些特别低端的细节) 吐槽归吐槽,对我还是有很大帮助滴。

主要内容是:

  1. 图计算典型算法+编程模型
  2. 图神经网络模型
  3. (图计算加速架构+图神经网络加速架构)研究现状

2.1 图与其广泛的应用

泛泛而谈。

2.2 图的特征与存储格式

2.2.1 图的特征

  1. 无结构特性:形状不规则,邻居数量不确定
  2. 极度稀疏:A是稀疏矩阵
  3. 幂律度分布:存在极少量度很高的节点,大量节点的度都很低——“名人效应”
  4. 强群体结构:群体或社区结构

2.2.2 图的存储格式

邻接矩阵可以用来存储图,但是因为稀疏性,很多位置都是0,浪费空间。
解决方案:CSR或CSC的方法。
以CSR(压缩稀疏行)为例,它很像是数据结构中的块索引方法,专门用一个offset数组记录节点邻居在edge数组中的偏移量,以便查edge表得到邻居节点的ID。节点属性在图计算中一般是标量,而在图神经网络中是嵌入表示向量。这样,我们就用更小的空间将节点和邻居关系存储到了内存中,起到了数据压缩的目的。

在这里插入图片描述

这一部分对我的启发还挺大的,图画的也挺好。

2.3 图计算应用

不知道我理解的对不对,图计算就可以理解为使用某种算法对图中的节点或边进行遍历,不同的算法有不同的遍历顺序。

2.3.1 典型算法

文章中把图计算应用算法分为2类:

  1. 全节点遍历算法
  2. 激活节点遍历算法

我感觉激活结点的概念其实就是回溯法、分支限界法中的活节点+扩展节点,就是这一轮马上要进行遍历并展开邻居的节点。
在激活节点遍历算法中,每次只有部分节点被激活;而在全节点遍历算法中,每次所有节点都是激活节点。

扫描二维码关注公众号,回复: 12661470 查看本文章

全节点遍历算法:

  1. PageRank(PR)。很著名的算法,也是图表示学习中随机游走方法的基石。

激活节点遍历算法:

  1. BFS
  2. DFS
  3. SSSP:单源最短路(Dijkstra、Bellman-Ford)
  4. SSWP:单源最宽路。从一个节点出发到某个节点,找到这样一条路径——这条路径中weight最小的边在和其他路径中weight最小的边相比是最大的。
    https://en.wikipedia.org/wiki/Widest_path_problem
  5. CC:寻找强连通分量(子图)。

2.3.2 编程模型

图计算应用算法的编程模型,感觉是为了能够将图算法应用于加速架构而设计出的一种通用框架,只需要实例化其中的函数就可以实现不同的图算法。编程模型主要分2类:

  1. VCPM(以节点为中心)
  2. ECPM(以边为中心)

编程模型又可以分为2个阶段:(感觉这里文章中的图是对的,但是表述上有点问题)和MP-GNN框架惊人的相似!

  1. Scatter(扩散):将自身的属性等信息扩散给邻居节点
  2. Apply(更新):邻居节点根据“消息”更新自身的属性

在这里插入图片描述
大概流程:

  1. 对于每个激活节点,通过offset数组找到偏移量,再通过偏移量找到邻居节点ID,然后通过Process_Edge函数对边进行处理得到边处理中间结果,最后通过Reduce函数归约得到节点的临时属性。
  2. 遍历每个节点,使用Apply函数更新并激活节点。

在这里插入图片描述
吐槽一下,文章里面并没有写出各种符号的含义,只能自己猜测,差评!
Process_Edge、Reduce和Apply三个是自定义函数,不同的算法需要定义不同的函数。图计算编程模型通过对节点属性进行变换巧妙地控制了节点的遍历顺序!!!比如说,对于BFS来说,如果v.Prop越小就会越早被访问(如果已经被遍历过了则不会再被激活了,这点有点类似visit[]数组的作用)。

在这里插入图片描述

VCPM和ECPM的区别:

  1. 访存行为:VCPM对offset和节点属性均存在细粒度访存,而ECPM只存在对于节点属性的细粒度访存。
  2. 计算效率:VCPM每次只遍历激活节点,而ECPM每次都要遍历所有的边,效率低。

2.4 图神经网络

这一部分很多地方不严谨!!!建议直接去看Hamilton的《GRL_Book》和清华大学的那几篇GNN综述。

2.4.1 图神经网络模型

在这里插入图片描述

内容就不说了,直接说几个我认为不太严谨的地方吧,感觉作者也是为了写文章没办法了。

  1. Aggregation阶段直接简化为了逐元素比较操作,这样真的好吗?!空域卷积的聚合函数通常都是含有参数的,很多模型为了提高表达能力,会用到RNN核、注意力机制等,很少有模型会直接简单的element-wise了。
  2. Aggregate函数的公式之间简化为了self-loop,但实际上并不是这样的,这只是简化策略之一,不能够以偏概全。
  3. Combine阶段其实就是Update阶段,正因为2.中提到的self-loop才能将更新函数写成一种比较简单的形式。
  4. 关于Pool和Readout的内容感觉也不太准确,不过不是我关注的重点。
  5. 术语不规范,读者两行泪。

2.4.2 典型图神经网络模型

介绍了GCN、GraphSAGE(原文提出了3种聚合函数,然而本文再次断章取义地简化了。。)、GINConv(聚合函数引入了可学习的参数)、DiffPool等模型。

2.5 图计算应用与图神经网络的比较

相同点:都是用了类似消息传递的框架——聚合+更新。
不同点:

  1. 节点属性:标量 V.S. 向量、张量。图计算中节点属性一般是标量,而GNN中节点属性是向量或张量,并且维度还可以不断变化。
  2. 聚合、更新操作:正因为节点属性的表示方式不同,相应的操作也不相同(GNN的计算访存比很高)。

2.6 传统神经网络与图神经网络的比较

相同点:学习+推断
不同点:

  1. 输入:GNN是不规则的非欧空间,并且具有排列不变性
  2. 应用场景:GNN的样本并不要求是i.i.d.
  3. 数学理论模型:GNN可以通过联系进行推理,可解释性好一些

2.7 图处理应用加速架构的研究现状

主要讲了图计算应用加速框架+GNN加速框架的研究现状,看的我是一脸懵逼,完全是全新的领域。

2.7.1 图计算应用的加速架构

这一部分介绍了几种主流的加速平台。可能是因为完全没有接触过,所以也只是看到一些表象。
看完之后,我感觉很多都是在解决访存的问题。之前学过程序的空间局部性原理,但是感觉在图计算中这一点并不容易做到。因为你在取数据的时候并不知道邻居关系(到底该缓存哪些节点的信息),遍历的时候需要在有限的片上存储空间中存放节点信息,然后根据实际访问的顺序不断地替换/淘汰节点的信息(有点类似于cache),当然,这种操作越频繁,延迟也就越大,速度当然就上不去。因此,盲目地访存可能会导致cache命中率很低,成为图计算的瓶颈。

  1. 基于FPGA的平台。可配置性强、部署快,主要用来提供通用性的框架,但是性能不太行(硬件资源有限)。
  2. 基于ASIC的平台。性能高,但是依赖大容量的片上存储和分块方法,伸缩性差。有个问题:分块指的是什么?类似于cache的组相联只能从某一分块中进行淘汰吗?
  3. 基于NDP的平台。工艺还不成熟……
  4. 基于NSP的平台。在SSD上加上额外的访存处理单元,以减少在处理大规模图的时候cache不命中所导致的频繁的数据替换,但是带宽及其利用率比较低。
  5. 基于PIM的平台。通用性较差。

在这里插入图片描述

2.7.2 图神经网络的加速架构

这一部分我直呼“好家伙”!
大概意思是说,本文提出了第一个图神经网络加速架构HyGCN,并在此基础上提出了可重配置图神经网络加速架构UFlowGCN。文章中说,HyGCN解决了图遍历中的不规则性对性能的影响,还能利用规则性提高神经网络变换的执行效率,并能融合图遍历和神经网络变换的执行。
这部分内容在第四章会进行详细的阐述。

猜你喜欢

转载自blog.csdn.net/weixin_41650348/article/details/111940937