除了使用向外扩展的分布式图计算系统来处理规模超出单机内存的图数据,也有一些解决方案通过在单台机器上高效地使用外存来完成大规模图计算任务,其中的代表有GraphChi、X-Stream、FlashGraph、GridGraph、Mosaic等 。
0.2 图关键技术0.2.1 图数据的组织由于实际图的稀疏性,图计算系统通常使用稀疏矩阵的存储方法来表示图数据,其中最常用的两种是CSR(Compressed Sparse Row)和CSC(Compressed Sparse Column),分别按行(列)存储每行(列)非零元所在列(行),每一行则(列)对应了一个顶点的出边(入边) 。
0.2.2图数据的划分将一个大图划分为若干较小的子图,是很多图计算系统都会使用的扩展处理规模的方法;此外,图划分还能增强数据的局部性,从而降低访存的随机性,提升系统效率 。对于分布式图计算系统而言,图划分有两个目标:
- 每个子图的规模尽可能相近,获得较为均衡的负载 。
- 不同子图之间的依赖(例如跨子图的边)尽可能少,降低机器间的通信开销 。
- 顶点划分将每个顶点邻接的边都放在一台机器上,因此计算的局部性更好,但是可能由于度数的幂律分布导致负载不均衡 。
- 边划分能够最大程度地改善负载不均衡的问题,但是需要将每个顶点分成若干副本分布于不同机器上,因此会引入额外的同步/空间开销 。
0.2.3顶点程序的调度在以顶点为中心的图计算模型中,每个顶点程序可以并行地予以调度 。大部分图计算系统采用基于BSP模型的同步调度方式,将计算过程分为若干超步(每个超步通常对应一轮迭代),每个超步内所有顶点程序独立并行地执行,结束后进行全局同步 。顶点程序可能产生发送给其它顶点的消息,而通信过程通常与计算过程分离 。
同步调度容易产生的问题是:
- 一旦发生负载不均衡,那么最慢的计算单元会拖慢整体的进度 。
- 某些算法可能在同步调度模型下不收敛 。
0.2.4 计算与通信模式图计算系统使用的通信模式主要分为两种,推动(Push)和拉取(Pull):
- 推动模式下每个顶点沿着边向邻居顶点传递消息,邻居顶点根据收到的消息更新自身的状态 。所有的类Pregel系统采用的几乎都是这种计算和通信模式 。
- 拉取模式通常将顶点分为主副本和镜像副本,通信发生在每个顶点的两类副本之间而非每条边连接的两个顶点之间 。GraphLab、PowerGraph、GraphX等采用的均为这种模式 。
- 推动模式可能产生数据竞争,需要使用锁或原子操作来保证状态的更新是正确的 。
经验总结扩展阅读
- 谣言检测《Rumor Detection with Self-supervised Learning on Texts and Social Graph》
- TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下
- pytorch、paddlepaddle等环境搭建 深度学习环境搭建常用网址、conda/pip命令行整理
- PaddleOCR-EAST
- GLA 论文解读《Label-invariant Augmentation for Semi-Supervised Graph Classification》
- paddle&蜜度 文本智能较对大赛经验分享(17/685)
- GGD 论文解读《Rethinking and Scaling Up Graph Contrastive Learning: An Extremely Efficient Approach with Group Discrimination》
- Nebula Graph介绍和SpringBoot环境连接和查询
- 谣言检测《Data Fusion Oriented Graph Convolution Network Model for Rumor Detection》
- ClaHi-GAT 谣言检测《Rumor Detection on Twitter with Claim-Guided Hierarchical Graph Attention Networks》