5分钟掌握开源图神经网络框架DGL使用

简介: 近几年神经网络在人工智能领域的成功应用,让它备受关注和热捧。但是,它自身依然具有本质上的局限性,以往的神经网络都是限定在欧式空间内,这和大多数实际应用场景并不符合,因此,也阻碍了它在很多领域的实际落地应用。

前言

近几年神经网络在人工智能领域的成功应用,让它备受关注和热捧。但是,它自身依然具有本质上的局限性,以往的神经网络都是限定在欧式空间内,这和大多数实际应用场景并不符合,因此,也阻碍了它在很多领域的实际落地应用。

图神经网络的出现能够有效的解决这一弊端,因此,近两年图神经网络成为了一个新的热门领域,由于它在关系表示方面更加契合现实的应用场景,使得它在搜索推荐、交通预测等领域获取了很大的成功。

但是,随之而来的问题就是,如何快速构建一个图神经网络模型成为了一个很棘手的问题。虽然,tensorflow、pytorch、mxnet在CNN、RNN领域取得了显著的成果,但是对于构建图神经网络却捉襟见肘。

于是针对这个问题,NYU和亚马逊联合开发了DGL框架,针对graph做了定制,不管是API设计还是性能优化,本文就来揭开DGL这个框架的神秘面纱吧!

DGL简介

今天给大家介绍一下开源图神经网络(Graph Neural Network,GNN)计算框架Deep Graph Library (DGL)[1]。该框架由New York University(NYU)和亚马逊公司主导开发,旨在为开发者提供一个基于现有深度学习张量计算框架可以开发GNN算法的平台。该框架0.1版本release是在2018年12月7日,当时支持的深度学习框架为pytroch和mxnet,具备基本的API,

28.jpg

给出了基本的GNN模型;今年1月24日,DGL 发布了0.4.2版本,这个新版本具备了很多 新的特性,包括支持异构图,支持后端等,这次主要给大家介绍的就是这个版本。

首先附上DGL的架构图,如图1所示,从这张图上我们可以看到:DGL最上层是应用层,目

前包含生命科学和知识图谱两类,代码路径/dgl/apps;下层有DGL定义的图、NN Modules、图上信息传递接口、图算法等;再下层是运行时,与深度学习框架对接。其中不得不提的的是图上的消息传递接口,DGL一直以来坚持以消息传递的形式来表示GNN算法,体现图上信息以send及receive的形式进行发送及接收。官网用PageRank的实现过程来说明了相关接口的使用方式https://docs.dgl.ai/tutorials/basics/3_pagerank.html,这里就不详细介绍这部分说明了,感兴趣的同学可以去看toturial相关内容。DGL工程定义了自己的图引擎,包括图的基本结构及操作等,这部分工作是利用C++实现的,通过编译为lib库的形式让python层进行调用。

DGL使用

本文主要想以Graph Covolutional Network(GCN)的是实现过程来简要介绍DGL的实现流程。GCN实现代码的路径为/dgl/examples/pytorch/gcn/gcn.py,模型训练入口为/dgl/examples/pytorch/gcn/train.py,同一目录下有readme文档,这里以pytorch的实现来介绍是因为基于tensorflow没跑通core dump了(满脸哭泣),以及不会用mxnet(学艺不精)不过这些都是细节,不影响理解核心内容。这里默认广大人民群众都很了解GCN这个网络了,所用数据集为cora,一个半监督学习任务,目标是对数据集内的文献进行分类。train.py内main函数负责控制数据加载,模型训练(下图),

29.jpg

其中train.py line 25~line 66主要进行数据读取,预处理等工作,截止到train.py line 66,利用cora的数据集构成的图还是一个network的图,train.py line 67将network图转换为DGL的图,这里体现了DGL的一个特性,支持对network图进行类型转换。train.py Line 79~94开始实例化模型,定义loss及优化器(下图)。

30.png

而在GCN模型中,核心是GraphConv的实现:dgl/python/dgl/nn/pytorch/conv/graphconv.py(下图)。

31.jpg

在GCN网络中,每个目标节点的特征(feature)更新,依靠的是将其一阶邻居的特征加和平均并与中心节点求和。计算公式为:

32.png

其中A为邻接矩阵(NxN),表征节点间连接关系,需进行归一化处理以实现求和平均;X为节点特征矩阵NxDinputW为权重(weight)矩阵DinputxDoutput。每进行一次AxW操作,图中节点特征就进行了一次更新。

从信息传递的角度理解,每个节点接收来自其一阶邻居的信息,对自身特征进行更新。注意,在GCN中如果没有权重W,这个过程与深度学习是无关的,正是因为W需要不断迭代更新,才需要深度学习框架。众所周知,每个深度学习框架都有自己的tensor类型,在计算过程中涉及的变量均为框架内tensor。以上述计算过程为例,XxWXW都是pytroch的tensor;而从DGL的角度来看,节点信息需要在DGL图上进行传递,此时要求节点信息是DGL可以操作的数据类型。DGL本身是定义了其数据类型NDArray的,对该类型数据可以进行操作。这样看来框架tensor想在DGL图上传递是存在鸿沟的,DGL通过DLPack来解决这个问题。

DLPack是Distributed (Deep) Machine Learning Community的一个开源项目,定义了一种开放的内存中tensor结构,用于深度学习框架之间共享tensor;这种数据结构mxnet原生支持,pytroch官方utils支持,tensorflow通过tfdlpack包支持。有了这种中间态存在,之前的问题就迎刃而解了。pytroch中计算出的节点信息首先转换为DLPack,然后再转换为DGL的NDArray,在图上进行传递。

信息传递是在GraphConv.py的line 119~121实现的,其中line 119~120根据节点特征得到需要传递的信息,所调用的fn.copy_src实际定义在/dgl/python/dgl/backend/pytorch/tensor.py中(下图)。因为这部分操作是嵌入在pytorch中的,所以定义了前向和后向计算的过程,以保证梯度回传顺利。

33.jpg

34.jpg

可以看到tensor.py中line 383就是把输入的pytorch tensor转换为DGL的NDArray以进行后续操作。其中核心的line 385行K.copy_reduce的定义在/dgl/src/kernel/binary_reduce.cc(上图)中。

在这个过程中可以看到DGL在C++层自定义了图操作并且是在host上进行的,也就说上面的tensor转换其实是把device(GPU)上的数据拉回host进行处理,这其实依赖pytorch支持device上数据回传的功能。这也是为什么DGL在0.4.2版本才支持tensorflow,因为tensorflow在1.15版本才提供device上回传tensor的接口。

GraphConv.py的line 121是节点信息更新的过程,这个过程与CopyReduce类似,实现的本质是AX的过程,调用的其实是cusparse提供的功能,具体实现参见/dgl/src/kernel/cuda/binary_reduce_sum.cu。这里利用cusparse本质是因为邻接矩阵A其实是一个稀疏矩阵,cusparse可以对稀疏tensor处理加速。完成节点信心更新后,GCN的核心计算过程就完成了,后续包括一些加bias和经过激活函数的操作,不再过多介绍。

以上以GCN的实现过程为例,给大家介绍了DGL是如何结合深度学习框架实现了图上的消息传递过程,值得提到的一点是,在训练过程中,graphconv.py的line 108行建立了一个局部变量,用以保存传入的图,之后的信息汇聚都在这个局部图上进行,并不影响原图,每个forward过程之后,这个局部变量都回被销毁。

本文部分内容介绍的可能不够详细与准确,期待与大家进行讨论。

Ps. DGL example里的模型,并不都是通过消息传递这种机制实现的,比如/dgl/examples/pytorch/recommendation中的PinSage就是用正常的tensor计算实现的,可能DGL也没想好怎么用send和receive来写这个模型吧。

相关文章
|
1月前
|
监控 安全
从 Racket 语言出发,创新员工网络监控软件的框架
在数字化企业环境中,员工网络监控软件对于保障信息安全和提升效率至关重要。Racket 语言凭借其独特特性和强大功能,为开发创新的监控软件提供了新可能。通过捕获和分析网络数据包、记录员工网络活动日志,甚至构建复杂的监控框架,Racket 能够满足企业的定制化需求,为企业信息安全和管理提供强有力支持。未来,基于 Racket 的创新解决方案将不断涌现。
41 6
|
20天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
62 6
|
28天前
|
机器学习/深度学习 人工智能
类人神经网络再进一步!DeepMind最新50页论文提出AligNet框架:用层次化视觉概念对齐人类
【10月更文挑战第18天】这篇论文提出了一种名为AligNet的框架,旨在通过将人类知识注入神经网络来解决其与人类认知的不匹配问题。AligNet通过训练教师模型模仿人类判断,并将人类化的结构和知识转移至预训练的视觉模型中,从而提高模型在多种任务上的泛化能力和稳健性。实验结果表明,人类对齐的模型在相似性任务和出分布情况下表现更佳。
57 3
|
1月前
|
安全 网络安全 区块链
网络安全与信息安全:构建数字世界的防线在当今数字化时代,网络安全已成为维护个人隐私、企业机密和国家安全的重要屏障。随着网络攻击手段的不断升级,从社交工程到先进的持续性威胁(APT),我们必须采取更加严密的防护措施。本文将深入探讨网络安全漏洞的形成原因、加密技术的应用以及提高公众安全意识的重要性,旨在为读者提供一个全面的网络安全知识框架。
在这个数字信息日益膨胀的时代,网络安全问题成为了每一个网民不可忽视的重大议题。从个人信息泄露到企业数据被盗,再到国家安全受到威胁,网络安全漏洞如同隐藏在暗处的“黑洞”,时刻准备吞噬掉我们的信息安全。而加密技术作为守护网络安全的重要工具之一,其重要性不言而喻。同时,提高公众的安全意识,也是防范网络风险的关键所在。本文将从网络安全漏洞的定义及成因出发,解析当前主流的加密技术,并强调提升安全意识的必要性,为读者提供一份详尽的网络安全指南。
|
8天前
|
安全 Linux 网络安全
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息。本文分三部分介绍 nmap:基本原理、使用方法及技巧、实际应用及案例分析。通过学习 nmap,您可以更好地了解网络拓扑和安全状况,提升网络安全管理和渗透测试能力。
45 5
|
13天前
|
存储 安全 网络安全
网络安全法律框架:全球视角下的合规性分析
网络安全法律框架:全球视角下的合规性分析
25 1
|
21天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
47 4
|
1月前
|
网络协议 物联网 虚拟化
|
21天前
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
39 1
|
8天前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架

热门文章

最新文章

下一篇
无影云桌面