前言:

  好久没更新博客了,添加一篇旧文。该文内容实际有点过时了,DGL最近把data pipeline重构了一下(https://github.com/dmlc/dgl/pull/3665),应该比文中内容更丰富一些了。

导言:

  最近工作需要调研一下DGL社区的一些动态,发现了这篇针对GNN训练的论文: Large Graph Convolutional Network Training with GPU-Oriented Data Communication Architecture,这里对此做一下简单的笔记。

Motivation:

  GNN的主要场景是依据Node的邻居信息来计算得到Node的Embedding。目前GNN模型中常见的mini-batch训练方式主要可以分为两部分:a)当前batch的子图准备,主要包括采样得到子图的结构以及对应子图的特征获取。b)根据得到的子图完成GNN模型的计算。
  通常来讲,完整的Graph(全图)和初始feature(所有结点的特征)是放在主存中的【主要是因为通常显存无法放下全图和对应的所有feature】,由CPU来完成子图采样和对应的特征准备工作,然后将子图和特征传输至GPU中完成GNN模型的计算。在这个过程中,CPU需要收集每个batch所需的sparse feature,会给主机的内存带宽和CPU带来很大的压力。

  本文通过zero-copy技术,使用GPU的线程直接获取host memory中的稀疏特征,从而减轻CPU的负担,并且减少了CPU的feather gather阶段。可以加速GNN训练,减少host资源的消耗。为了提高数据传输的效率,还提出了1)自动的地址对齐来最大化PCIe的packet efficiency。2)异步的零拷贝访问和内核执行来overlap数据传输和训练(pipeline)。

感觉论文思路还是蛮容易理解的,估计难度主要是在工程上。

主要内容:

  • 地址对齐

  • 利用GPU thread来帮助传输feature,CPU不需要再进行feature gather工作,只需将需要的node idx传入gpu即可。这里作者经过实验,在其环境下需要10%左右的GPU资源用于数据传输,剩下的90%用于train。这里需要解决资源分配和同步问题,资源分配用的是MPS(CUDA multiprocessing service),看文中应该是没有那么好用的样子。同步问题主要是避免data transfer阻塞了train(这部分是不是已经有prefetch的意思了?即GPU部分thread来负责数据搬运,同时还不阻塞train的那部分)。这部分论文3.2节有介绍。然后还有pingpong buffer等。没有很理解。估计要结合实现来看一看(ping pong buffer应该是让一个buffer处理的同时准备另一个buffer)。

  • 总流程

  • 多卡训练

实现

  • 官方repo:https://github.com/K-Wu/pytorch-direct_dgl

  • 另外好像已经(部分)合入了DGL-UnifiedTensor,是不是把非修改Pytorch的部分合入了?有时间跑跑这个commit之后的example,看看效果。

在公司怎么都编译不成功,最后在家里来弄了。
家里环境是CPU是AMD3700X,B450的板子,3200频率的内存条16G*2,显卡是2060Super。
编译了dgl的这个版本:git clone --recurse-submodules https://github.com/davidmin7/dgl.git

跑了examples/pytorch/graphsage/train_sampling_unified_tensor.py 和train_sampling.py进行对比。结果如下:

  • 特征在CPU上,原始方式。显存使用大概4G(nvidia-smi)。
(work) maqy@ubuntu:~/work/gnn/dglUnifiedTensor/davidfork/dgl/examples/pytorch/graphsage$ python train_sampling.py --num-epochs 10 --data-cpu
Epoch 00000 | Step 00000 | Loss 6.1428 | Train Acc 0.0300 | Speed (samples/sec) nan | GPU 265.5 MB
...
Eval Acc 0.9465
Test Acc: 0.9468
...
Epoch 00009 | Step 00140 | Loss 0.3134 | Train Acc 0.9180 | Speed (samples/sec) 15294.2769 | GPU 514.7 MB
Epoch Time(s): 10.4865
Avg epoch time: 10.435481643676757
  • 特征在CPU上,zero-copy(论文)方式,感觉这里显存打印应该是不准的,实际需要显存2.7G左右(nvidia-smi命令),为啥会比上一种需要的显存还好呢?是因为手动分配了部分没检测到的显存使用?TODO:需要注意一下。
(work) maqy@ubuntu:~/work/gnn/dglUnifiedTensor/davidfork/dgl/examples/pytorch/graphsage$ python train_sampling_unified_tensor.py --num-epochs 10 --data-cpu
Epoch 00000 | Step 00000 | Loss 6.0242 | Train Acc 0.0280 | Speed (samples/sec) nan | GPU 11.1 MB
Eval Acc 0.9467
Test Acc: 0.9458
...
Epoch 00005 | Step 00140 | Loss 0.3690 | Train Acc 0.9130 | Speed (samples/sec) 29736.9992 | GPU 11.6 MB
Epoch Time(s): 5.5860
Avg epoch time: 5.597336053848267
  • 特征在GPU中,理论速度最快的方式。显存使用4.3G。
(work) maqy@ubuntu:~/work/gnn/dglUnifiedTensor/davidfork/dgl/examples/pytorch/graphsage$ python train_sampling.py --num-epochs 10
Epoch 00000 | Step 00000 | Loss 5.9498 | Train Acc 0.0160 | Speed (samples/sec) nan | GPU 829.8 MB
Eval Acc 0.9452
Test Acc: 0.9470
...
Epoch 00009 | Step 00140 | Loss 0.3385 | Train Acc 0.9270 | Speed (samples/sec) 70266.2194 | GPU 1080.4 MB
Epoch Time(s): 2.6766
Avg epoch time: 2.6224377155303955

dgl master(2022.02.16)分支

新分支中重写了example,将UnifiedTensor也可以用于Graph了,因此在服务器上编译了一下想测试性能。目前DGL的采样模式是多种的,具体见下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2TqYptJf-1650020589965)(5DB5CB9422924AA1AC759DE6BB7544E8)]

后续对这块可能会进行简化成:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sKc8pvI-1650020589966)(23EE0B74652845A1BFE36C28413F11CA)]

测试平台:

  • Intel® Xeon Gold CPU 2.10GHz 16核心 x 2
  • Nvidia Tesla T4 x 6 | pcie3.0 x 8
  • 内存376G DDR4 2400 MT/s

测试代码:

  • 单卡graphsage reddit(only train, not used inference, 因为现在master分支代码有点问题)
graph device feature device sampling subgraph construction Host <=> device epoch Time GPU memory(print/nvidia-smi)
gpu gpu gpu gpu NO 3.5s 1079MB/5080MB
uva gpu gpu gpu graph zero-copy host->device 3.9s 1079MB/3090MB
cpu gpu cpu cpu graph host->device 4.3s 1079MB/3570MB
uva uva gpu gpu graph&feature zero-copy host->device 11s 12.8MB/2050MB
cpu uva cpu cpu graph/feature zc host->device 11.4s 12.5MB/1807MB
cpu cpu cpu cpu graph/feature host->device 14.1 515MB/2550MB
  • 单机6卡
graph device feature device sampling subgraph construction Host <=> device epoch Time GPU memory(print/nvidia-smi)
uva uva gpu gpu graph&feature zero-copy host->device 2.54s 13.8MB/1860MB
  • 单机 Unsupervised train TODO(很可能不会再测试了)

zero-copy加速GNN训练笔记相关推荐

  1. 机器学习笔记 - 加速神经网络训练的 7 个技巧

    更快地训练神经网络是深度学习的重要因素之一.我们通常发现神经网络的这些困难在于其复杂的架构和使用的大量参数.随着数据量.网络和权重的增加,模型的训练时间也会增加,这对建模者和从业者来说都是不利的.在本 ...

  2. 【图神经网络】图神经网络(GNN)学习笔记:基于GNN的图表示学习

    图神经网络GNN学习笔记:基于GNN的图表示学习 1. 图表示学习 2. 基于GNN的图表示学习 2.1 基于重构损失的GNN 2.2 基于对比损失的GNN 参考资料 本文主要就基于GNN的无监督图表 ...

  3. GNN学习笔记(四):图注意力神经网络(GAT)节点分类任务实现

    目录 0 引言 1.Cora数据集 2.citeseer数据集 3.Pubmed数据集 4.DBLP数据集 5.Tox21 数据集 6.代码 嘚嘚嘚,唠叨小主,闪亮登场,哈哈,过时了过时了,闪亮登场换 ...

  4. 可由一个尾指针唯一确定的链表有_极客算法训练笔记(三),链表详细图解,别再逃避了朋友...

    目录 缓存引爆链表 链表单链表双向链表循环链表双向循环链表 LinkedHashMap实现LRU缓存,源码解析(JDK1.8) 算法 爬楼梯 算法 反转链表 算法 链表环检测 缓存引爆链表 存储结构 ...

  5. ICLR2020满分论文 | 为什么梯度裁剪能加速模型训练?

    一只小狐狸带你解锁 炼丹术&NLP 秘籍 作者:苏剑林(来自追一科技,人称"苏神") 前言 需要许多时间步计算的循环神经网络,如LSTM.GRU,往往存在梯度爆炸的问题.其 ...

  6. 严蔚敏算法约瑟夫环_极客算法训练笔记(三),链表详细图解,别再逃避了朋友...

    目录 缓存引爆链表 链表 单链表 双向链表 循环链表 双向循环链表 LinkedHashMap实现LRU缓存,源码解析(JDK1.8) 算法 爬楼梯 算法 反转链表 算法 链表环检测 缓存引爆链表 存 ...

  7. 【图神经网络】图神经网络(GNN)学习笔记:图分类

    图神经网络GNN学习笔记:图分类 1. 基于全局池化的图分类 2. 基于层次化池化的图分类 2.1 基于图坍缩的池化机制 1 图坍缩 2 DIFFPOOL 3. EigenPooling 2.2 基于 ...

  8. 极客算法训练笔记(六),十大经典排序之希尔排序,快速排序

    目录 抛砖引玉 希尔排序 快速排序 抛砖引玉 十大经典排序算法江山图 十大经典排序算法江山图 排序算法的衡量指标我这里不再重复,上一篇我已经列举分析的很清楚了,但是非常重要,没看到我上一篇的小伙伴墙裂 ...

  9. GNN学习笔记(二)表征学习基本介绍

    GNN学习笔记(二)表征学习基本介绍 一.表征学习(Representation Learning) 1.什么是表征学习 2.传统表征学习(特征工程)的局限性 3.表征学习的分类 4.如何判断表征学习 ...

最新文章

  1. python 销量预测模型_如何做电商的销量预测模型?
  2. 8-7-Exercise
  3. 计算机安全靠,市计算机:网络安全进校园,网络安全靠人人
  4. C语言二月天数计算,关于计算两个日期间天数的代码,大家来看看
  5. python 堆栈_利用Python列表实现堆栈(二):实现
  6. php能实现前台的页面吗,thinkphp 能实现前台后台登录吗?
  7. iPhone 13 Pro全新配色曝光:全新“磨砂黑”致敬经典
  8. 【jQuery】实现QQ联系人分组动画
  9. 去除img未加载到的默认边框问题
  10. vue 源码 断点调试
  11. 如何区别文本是BIG5还是GB
  12. Python 根据起始时间和结束时间计算时长
  13. IDEA插件系列(67):ReadHub插件——新闻阅读器
  14. 多线程 join 钉钉考勤
  15. 精简系统登录页模板html+vue+elementui
  16. CNCC2019第三天 | 传统产业如何进行智能化升级?你踩雷了吗?
  17. PyG搭建GAT实现节点分类
  18. Android 面试真题收录~
  19. Address localhost:1099 is already in use
  20. 【JVM】<Java虚拟机>JVM架构各种**虚拟机

热门文章

  1. Python学习笔记16:爬取百度搜索图片的缩略图
  2. 使用R语言进行生存分析
  3. linux c t添加arp表,Ubuntu下C语言+libnet实现ARP数据包广播
  4. React实现浏览器阅读PDF文件
  5. 计算机研究生开发岗_在读非计算机专业研究生的困惑:如何转行互联网开发?...
  6. sandboxie的使用方法
  7. nvidia-docker容器迁移导致GPU启动失败解决方案
  8. joomla学习 报错处理
  9. 財報中的HoH, YoY, MoM, QoQ是什麼意思?
  10. k阶矩、原点矩、中心距