当前位置: 首页 > 编程日记 > 正文

亚马逊马超:如何使用DGL进行大规模图神经网络训练?

640?wx_fmt=png

演讲嘉宾 | 马超(亚马逊应用科学家)
整理 | 刘静
出品 | AI科技大本营(ID:rgznai100)

与传统基于张量(Tensor)的神经网络相比,图神经网络将图 (Graph) 作为输入,从图结构中学习潜在的知识,该方法在近些年已被证明在许多场景可以取得很好的效果。然而,使用传统的深度学习框架(比如 TensorFlow、Pytorch、MXNet)并不能方便地进行图神经网络的开发和训练,而 DGL 作为专门面向图神经网络的框架,可以很好地弥补这一缺陷。该框架在开源后于国内外引起了强烈的反响。

基于此,在CSDN主办的2019 AI开发者大会(AI ProCon 2019)上,亚马逊应用科学家马超,同时也是 DGL 项目的合作作者,发表了《使用 DGL 进行大规模图神经网络训练》的主题演讲。他从 API 使用、系统优化以及系统可扩展性等多个维度深入分享了 DGL 的设计思路。

640?wx_fmt=png

以下为马超演讲全文,AI科技大本营整理(ID:rgznai100):

现场大部分朋友都来自工业界,我想应该对传统的图算法了解更多,比如 PageRank 算法应该是我们学生时代学到的第一个传统图算法。但是突然之间,图神经网络算法火了起来。下面这张图是近些年 GNN 论文发表数量的情况,我们可以看到从 2016 年开始,GNN 论文发表数量呈指数上升趋势。

640?wx_fmt=png

什么是图神经网络?

图神经网络在近年来的发展有目共睹。我们发现,光是去年的 ICML 上有近 50 篇论文都在讲图神经网络。而今年的 KDD 和 NeurIPS 上也有非常多有意思的图神经网络研究。所以我们要问的第一个问题是:为什么要在图上做深度学习?这个问题其实很好回答:因为现实生活中很大一部分数据都可能是图数据,而不是传统深度学习算法里的欧几里得(Euclid)结构数据。

相比之下,我们做语音、图像这类任务,输入数据都是规整的张量,例如图像中的像素一个个排列下来。但是现实生活中很多数据并不是这样子,比如社交网络。在社网络中,如果每个用户都被当作一个节点,用户之间的关系被当作节点之间的边,那么整个数据就是一个图,这是没办法用类似于像素这样的欧几里得结构来表示的;还有知识图谱 (Knowledge Graph)这个例子。

比如,我们使用百度百科时,关键词之间所组成关联图谱,也是图结构;此外,还有一些研究人员在正在尝试在医疗领域进行新药或者以及新化学结构的预测和合成,而化学结构本质上也是图。对整个图而言,没有一个节点的嵌入表示是孤立的,而传统 CNN 和 RNN 分别把空间和时间上的相临节点作为处理对象的方法并不能很好的刻画出整个图上的关系,局限性很大。

640?wx_fmt=png
图神经网络能做什么?
在聊 GNN 之前,我们首先思考一下大家熟悉的卷积神经网络 CNN 在做什么。比如指定一张图片,CNN 帮助我们判断是猫还是狗,本质上是卷积神经网络学习了在某些图像上的嵌入表示。而给定一张图,如果用 GNN 来预测节点之间的关系,本质上是 GNN 学习了在图上的嵌入表示。比如我们有一个 NBA 粉丝社群的关系图,这时给你一个新的用户,那么即使我们本来不知道这个新用户应该属于哪个社群,但是仍然可以通过 GNN 来预测这个新用户是不是勇士队的球迷,因为 GNN 发现该用户很多的关系节点都是勇士队的球迷。

那么 GNN 具体的工作机制是怎样的?大家请看这张图。在这张图里,不同颜色的圆圈代表图上不同的节点。我们做图神经网络训练时,每一个节点会给它相邻的节点发消息 message,消息可以来自于边上的特征,也可以来自于节点上的特征。邻居节点拿到消息之后会进行聚合操作,然后通过一个神经网络的非线性变换,例如 ReLu,并把它的输出可以作为下一次发送消息的输入,然后继续发送给邻居节点,通过这样不断迭代学习最终学会图上的参数表示。

640?wx_fmt=png

相信这个过程会让大家联想起 PageRank 算法的流程,其实 PageRank 算法和这里演示的 GNN 算法过程类似,只不过在 PageRank 里没有特征向量和神经网络的概念。

我们之前提到,从 2016 年开始出现了大量关于图神经网络的研究论文。但是即使你是一个图神经网络的专家,如果没有好的工具,想要去复现已有的论文工作或者创造新的算法,仍然十分困难。比如遇到内存泄露或者内存爆掉的问题时,大部分研究人员都束手无策。除此之外,还有一个问题就是现在的深度学习框架,无论是Tensorflow、Pytorch 还是 MXNet,默认都是基于稠密的 Tensor 表示。

对于稠密张量的计算和自动求导,目前的框架已经可以做的很好了,而实现一个图神经网络程序却不是遵循这样的范式,大部分时间开发者都是在对稀疏数据进行操作。开发者从稠密数据的编程模式迁移到稀疏数据的编程模式上需要跨越巨大的 Gap。如果用户现在想编写图神经网络程序,可能需要花费很多时间进行程序上的优化,并且效果还不一定好。

正是因为存在这些问题,去年我们亚马逊 AWS 联合 NYU 以及 NYU上海,一起推出了 DGL 这个平台,用来帮助用户解决上述的这些问题。DGL 希望既能方便研究人员进行在图神经网络领域进行研究,又可以帮助工业界的用户进行业务部署。

DGL:专门面向图神经网络的框架

如果大家有关注我们的官网的话(https://www.dgl.ai/),可以在上面找到 dgl 的源代码、文档教程,博客资源,论坛讨论等等。我们的代码目前已获得 3000+ stars,450+ forks,60k+下载量,目前已经持续迭代到 0.4 版本。

DGL 发布之后,用户的主要构成来自中国和美国,这和我们团队构成是一样的。到目前为止,市面上也有了其他的图神经网络框架竞争者,那么DGL的目标是什么?其实主要是两个方面:1. 我们要对已有深度学习框架的向前和向后兼容做到最好;2.在第一个目标基础上尽可能提高框架的性能和可扩展性。

对于第一个目标,或者说是挑战。在面对各种各样的 GNN 算法需求是,DGL 框架能否提供一套灵活易用的 API 让研究人员在框架上面可以快速不断尝试新的想法。经过大量研究现有的图神经网络论文以及代码,DGL 最终选择使用 message passing 作为底层的API 抽象。

640?wx_fmt=png

图神经网络框架最核心部分就是在处理 message passing,因此 DGL 把消息通信放在了最底层的API,用来适应广泛的算法需求,对于大部分 GNN 算法而言,无论算法如何变化,通常都很难脱离 message passing 的表示。下面这张图展示 DGL 为 message Passing API 提供了不同层级底层的封装。

当然,光有 message passing 是不够的,DGL 可以让用户实现自己需要的 UDF(用户定义函数)。下图是一个简单的 GCN 的 demo,展示了如何用 DGL 编写 GNN 程序。

640?wx_fmt=png

DGL 另一个重要的设计是,我们从一开始就把 DGL 设计成 “框架上的框架”。为了避免重复造轮子,DGL 在设计上采用了类似 Keras 的做法,基于已有的主流深度学习框架之上进行开发,目前 DGL 已经可以很好的支持 MXNet 和 Pytorch 两个主流深度学习框架。

考虑到很大一部分用户可能就是想利用现成的代码把已有的算法拿来玩一玩,所以最近我们一口气写了很多现成的 NN moudule,方便大家可以直接调用。此外 DGL 还提供多种 GNN 模型的完整实现和运行脚本,欢迎大家都来玩一玩。包括我们在 0.4 版本即将推出的 Knowledge Graph model zoo.

DGL的性能优势

DGL 在性能上做了很多系统优化。例如消息融合,DGL 通过稀疏矩阵乘法的转化来做 message fusion。此外,为了让系统在稀疏数据上的性能达到最好,DGL还专门启动了一个名为 mini-Gun 的项目来做 kernel 优化。除此之外, DGL 内部还会通过 auto-batching 技术来加速批量图的并行处理过程。

640?wx_fmt=png

谈论了单机上的性能,那么遇到大图怎么办?比如微博有好几亿用户,用户的关系可能是百亿级别,这样的图无论是对 GPU 还是单机来说都装不下。因此 DGL 做了分布式的架构。

640?wx_fmt=png

这个架构有三层,最底层是采样器,中间这层的 trainer 是训练器,最上面是DGL-PS参数服务器。如果图非常大,我们就先把大图切分成很多小图,再把它分到不同的机器或者不同的GPU上,每次训练时只使用一小部分的 miini-batch 数据,并且通过参数服务器来存储训练过程中需要的模型参数,trainer 和参数服务器之间通过我们自己实现的网络协议进行数据交互。

最后我想说的是,现在深度学习的主要数据结构是 Tensor,但是 Tensor 是真正的数据结构吗?大家可以思考一下这个问题,如果把程序=算法+数据结构这句话扩展到深度学习领域中,会不会Graph就是深度学习的重要Date Structure?这也是为什么说一定要抓住图神经网络这个机会。黑盒式的神经网络一定不是长久走下去的道路,神经网络的发展在某一天可能会遇到可解释问题的瓶颈,图神经网络是否能为我提供一个神经网络可解释性的有效方法,值得我们思考。

(*本文为 AI科技大本营原创文章,转载请微信联系 1092722531


精彩推荐


640?wx_fmt=jpeg
640?wx_fmt=png


推荐阅读

640?wx_fmt=png

你点的每个“在看”,我都认真当成了AI

相关文章:

Python学习系列(六)(模块)

Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块。 引入模块的几种方式: i&#xf…

Ubuntu14.04 64位上配置终端显示git分支名称

之前在Ubuntu14.04上在终端上显示git分支名称基本上都使用oh-my-zsh,可以参考 https://blog.csdn.net/fengbingchun/article/details/77803322 ,由于限制了权限,使得不能安装oh-my-zsh,显示错误如下:在 https://githu…

创建UITextField对象

//创建UITextField对象 UITextField * tf[[UITextField alloc]init];//设置UITextField的文字颜色tf.textColor[UIColor redColor];//设置UITextField的文本框背景颜色tf.backgroundColor[UIColor grayColor];//设置UITextField的边框的风格tf.borderStyleUITextBorderStyleRou…

non-local神经网络:通过非局部操作解决深度神经网络核心问题

译者 | 李杰出品 | AI科技大本营(ID:rgznai100)回想一下我们熟悉的CNN、RNN。如下图所示,这些神经网络模型都是基于局部区域进行操作,属于local operations。为了获得长距离依赖,也就是图像中非相邻像素点之间的关系&a…

fgets()用法笔记

为了避免缓冲区溢出,从终端读取输入时应当用fgets()代替gets()函数。但是这也将带来一个问题,因为fgets()的调用格式是: fgets (buf, MAX, fp)fgets (buf, MAX, stdin) buf是一个char数组的名称,MAX是字符串的最大长度&#xff0c…

iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘

原文地址:http://blog.csdn.net/xiaotanyu13/article/details/7711954 iOS上面对键盘的处理很不人性化,所以这些功能都需要自己来实现, 首先是点击return和屏幕隐藏键盘 这个首先引用双子座的博客 http://my.oschina.net/plumsoft/blog/42545…

深度学习可解释性问题如何解决?图灵奖得主Bengio有一个解

作者 | Yoshua Bengio, Tristan Deleu等译者 | 刘畅,编辑 | Just出品 | AI科技大本营(ID:rgznai100)自 2012 年以来,深度学习的发展有目共睹,今年 3 月,为此做出巨大贡献的 Yoshua Bengio、Yann Lecun和Geo…

zepto打造一款移动端划屏插件

效果图 样式1 样式2 调用 正常情况下应该是后台生成的html代码&#xff0c;但还是写了一套操作tab页的方法 调用简便如下&#xff1a; <link rel"stylesheet" href"kslider.css" type"text/css"/> <script type"text/javascript&q…

swift使用xib绘制UIView

目标&#xff1a;用xib绘制一个UIView&#xff0c;在某个ViewController中调用。 三个文件&#xff1a;ViewController.swift DemoView.swift DemoView.xib 首先&#xff0c;可以专心将DemoView.xib画出来&#xff0c;别忘记DemoView.xib中UIView的一处设置 然后&#x…

吴恩达老师深度学习视频课笔记:深度卷积网络

Why look at case studies?&#xff1a;过去几年&#xff0c;计算机视觉研究中的大量研究都集中在如何把卷积层、池化层以及全连接层这些基本构件组合起来形成有效的卷积神经网络。找感觉最好的方法之一就是去看一些案例&#xff0c;就像很多人通过看别人的代码来学习编程一样…

测试工程师的好日子来啦?Testin发布AI测试产品,提升易用性和自动化效率

2019年10月26日&#xff0c;以"AI未来"为主题的第二届NCTS中国云测试行业峰会在北京国际会议中心正式开幕。在本次大会上&#xff0c;Testin 总裁徐琨正式发布测试业务Testin云测的全新AI产品iTestin。作为 Testin 人工智能战略中的重要一环&#xff0c;iTestin 融合…

Discuz DB层跨库映射关系表名前缀BUG修复后产生的新bug

新的逻辑引入了新的bug&#xff0c;会导致在跨多库连接时&#xff0c;产生表名前缀映射混乱&#xff0c;需要再做逻辑上的修复。 function table_name($tablename) {if(!empty($this->map) && !empty($this->map[$tablename])) {$id $this->map[$tablename];…

swift语言的Block

[cpp] view plaincopy// // blockDemo.swift // swiftDemo // // Created by apple on 14-6-29. // Copyright (c) 2014年 fengsh. All rights reserved. // import Foundation //无参无返回值 typealias funcBlock () -> () //或者 () -> …

吴恩达老师深度学习视频课笔记:目标检测

目标定位&#xff1a;如下图,图像分类任务就是算法遍历图像&#xff0c;判断其中的对象是不是car。图像定位分类(classification with localization)不仅要用算法判断图像中的是不是car&#xff0c;还要在图像中标记出car的位置。图像分类的思路可以帮助学习分类定位&#xff0…

国际顶级学界业界大咖云集,9 场技术论坛布道,2019 嵌入式智能国际大会强势来袭!...

2019 嵌入式智能国际大会即将来袭&#xff01;购票官网&#xff1a;https://dwz.cn/z1jHouwE2019年12月6日-8日&#xff0c;2019嵌入式智能国际大会将在深圳华侨城洲际大酒店举行。本次大会由哈尔滨工业大学&#xff08;深圳&#xff09;、清华大学国际研究生院、CSDN、嵌入式视…

Linux简介总结

1. Linux 就是Unix, 但是Unix 并不一定是Linux.2. 三种软件模式&#xff1a;商业软件&#xff0c;共享软件&#xff0c;自由软件。3. 为什么使用Linux? 它是一个自由软件。第一&#xff1a;可免费提供给任何用户使用。第二&#xff1a;它的源代码公开和可自…

Swift中编写单例的正确方式

本文由CocoaChina译者leon(社区ID)翻译自krakendev 原文&#xff1a;THE RIGHT WAY TO WRITE A SINGLETON 转载请保持所有内容和链接的完整性。 在之前的帖子里聊过状态管理有多痛苦&#xff0c;有时这是不可避免的。一个状态管理的例子大家都很熟悉&#xff0c;那就是单例。使…

C语言中的弱符号与强符号介绍

弱符号(Weak symbol)是链接器(ld)在生成ELF(Executable and Linkable Format,缩写为ELF&#xff0c;可执行和可链接格式&#xff0c;是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。ELF文件有两种索引&#xff1a;程序标头中记载了运行时所需的段&#xff0…

Simple Transformer:用BERT、RoBERTa、XLNet、XLM和DistilBERT进行多类文本分类

作者 | Thilina Rajapakse译者 | Raku编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】本文将介绍一个简单易操作的Transformers库——Simple Transformers库。它是AI创业公司Hugging Face在Transformers库的基础上构建的。Hugging Face Transfor…

StarUML中时序图添加小人

转载于 http://blog.csdn.net/longyuhome/article/details/9011629 在看时序图的例子的时候&#xff0c;发现有些的时序图上有小人的图标&#xff0c;可是一些UML工具却没有找到小人的图标&#xff0c;这让我很闹心&#xff0c;一直没解决&#xff0c;今天终于将该问题给解…

Swift学习: 从Objective-C到Swift

作者&#xff1a;方秋枋&#xff08;GitHub&#xff09; 这篇文章是自己学习Swift的笔记与深化。希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift。同时也品味到Swift的精妙之处。 结论放在开头:我认为Swift比Objective-C更优雅,更安全同时也更现代,更性感…

C/C++中static关键字用法汇总

1. 函数内static局部变量&#xff1a;变量在程序初始化时被分配&#xff0c;直到程序退出前才被释放&#xff0c;也就是static是按照程序的生命周期来分配释放变量的&#xff0c;而不是变量自己的生命周期。多次调用&#xff0c;仅需一次初始化。2. cpp内的static全局变量&…

CornerNet: 成对关键点物体检测 | CSDN博文精选

作者 | 贾小树来源 | CSDN博客文章目录1、论文总述2、使用锚定框的两个缺点3、角点检测比边界框中心或 proposals效果好的两个原因4、corner pooling5、用于Grouping Corners的 embedding vector的工作原理6、正负样本的分配方式&#xff08;改进的focal loss&#xff09;7、角…

PHP创建日志记录(已封装)

1 <?php2 3 class Logs{4 private $_filepath; //文件路径5 private $_filename; //文件名6 private $_filehandle; //文件引擎7 8 9 public function Logs($dir null,$filename null){ 10 11 $this->_filepath empty($dir) ? : $d…

如何用Swift实现一个好玩的弹性动画

本文由CocoaChina译者浅夏旧时光翻译自Raywenderlich 原文&#xff1a;How To Create an Elastic Animation with Swift 每个像样的iOS应用程序一定会有自定义元素、自定义UI以及自定义动画等等很多自定义的东西。 假如你想让你的应用脱颖而出&#xff0c;你必须花费一些时间为…

深入探讨Python的import机制:实现远程导入模块 | CSDN博文精选

来源 | Python编程时光&#xff08;ID:Python-Time&#xff09;所谓的模块导入&#xff0c;是指在一个模块中使用另一个模块的代码的操作&#xff0c;它有利于代码的复用。也许你看到这个标题&#xff0c;会说我怎么会发这么基础的文章&#xff1f;与此相反。恰恰我觉得这篇文章…

吴恩达老师深度学习视频课笔记:人脸识别

什么是人脸识别&#xff1a;人脸验证和人脸识别的区别&#xff0c;如下图&#xff1a;One-shot learning&#xff1a;人脸识别所面临的挑战就是需要解决一次学习(one-shot learning)问题。这意味着在绝大多数人脸识别应用中你需要通过单单一张图像或者单单一个人脸图像就能去识…

用小白鼠喝毒药

题设&#xff1a;有N瓶水&#xff0c;其中有一瓶水有剧毒&#xff0c;如果小白鼠喝了会在24小时的时候死亡。 问&#xff1a;用多少只小白鼠能够检测出哪瓶水有剧毒&#xff1f; 要求&#xff1a;用的小白鼠数量少并且用时要短&#xff0c;并给出合理的过程与结论。 我的解题思…

怎样在swift中创建CocoaPods

本文由yake_099&#xff08;博客&#xff09;翻译自raywenderlich&#xff0c;作者&#xff1a;Joshua Greene 原文&#xff1a;How to Create CocoaPods with Swift 你可能对一些比较著名的开源的CocoaPods框架比较熟悉&#xff0c;比如Alamofire、MBProgressHUD。但是有时你…

吴恩达老师深度学习视频课笔记:神经风格迁移(neural style transfer)

什么是神经风格迁移(neural style transfer)&#xff1a;如下图&#xff0c;Content为原始拍摄的图像&#xff0c;Style为一种风格图像。如果用Style来重新创造Content照片&#xff0c;神经风格迁移可以帮你生成Generated图像。深度卷积网络在学什么&#xff1a;如下图&#xf…