博客详情

首页 / 博客详情
blog

DGL v0.5 版本有哪些更新?

近期发布的 DGL 0.5 版本在项目的许多方面进行了重大更新,包括文档、API、系统速度和可伸缩性。本文重点介绍了一些新的功能和增强。

更多文档,更少代码

DGL 已经经历了几个版本发布,新增了大量 API 和功能。虽然开发速度很快,但 DGL 的文档一直未能跟上。我们已经意识到了这个问题,并在本次发布中着手解决了它。主要有两项重大变更。首先是新的用户指南,其中有专门的章节介绍 DGL 的核心概念以及它们如何与 GNN 训练/测试流程相结合。目前共有七个章节:

  • :本章解释了图数据结构的基础知识、核心 DGLGraph 类的用法、异构图等内容。
  • 消息传递:本章从消息传递神经网络的数学定义开始,然后解释了如何在 DGL 中实现它们。
  • 构建 GNN 模块:本章逐步讲解了如何在 DGL 中为同构图和异构图定义 GNN 层/模块。
  • 图数据管线:本章解释了 DGL 中数据集的组织方式以及如何创建自己的数据集。
  • 训练图神经网络:本章提供了关于在 DGL 中训练 GNN 以进行节点、边和图预测任务的指导。
  • 大型图上的随机训练:本章介绍了 GNN 领域的小批量训练及相应的 DGL API。
  • 分布式训练:本章解释了 DGL 用于在单机之外扩展图训练的组件。

除了用户指南,我们还对 API 文档进行了大量重写,并按其命名空间进行了组织。我们还借此机会精简了 API 集,废弃了很少使用和冗余的 API,并将功能整合到更少的 API 中。例如,现在在 DGL 中创建图仅涉及 dgl.graph(用于同构图)和 dgl.heterograph(用于异构图)。另一个显著的简化是,现在 DGLGraph 是存储图和特征的唯一类。它可以表示同构图或异构图、子图或批处理图。

DGLGraph 的更多灵活性

0.5 版本在核心图结构上实现了更高的灵活性。首先,DGL 现在支持创建以 int32 存储的图;与 int64 相比,这不仅将内存消耗减少了一半,还启用了 cuSPARSE 提供的许多仅适用于 int32 的快速算子。其次,之前的 DGL 只提供了控制节点/边特征所在设备(host device)的 API,而在新版本中,它也允许更改图结构的所在设备(通过 DGLGraph.to)。DGL 已经在 CUDA 上实现了许多与结构相关的算子,例如获取度数、提取子图。第三,为了更紧凑地存储巨型图,DGL 添加了 DGLGraph.formats API 来控制图的内部稀疏格式。这可以将内存消耗减少一半或更多,尤其是在小批量训练中存储用于采样的图时。您可以在专门的用户指南章节中找到所有这些新功能的解释。

更快且确定的内核

除了可用性改进之外,DGL 团队始终将系统性能放在心上。在本次发布中,我们进行了广泛的代码重构,以减少 Python 栈开销并提高代码可读性。此外,我们升级了用于消息传递计算的核心 CPU/GPU 内核。具体来说,我们发现 GNN 中的消息传递可以归结为两种通用的计算模式:g-SpMM 和 g-SDDMM。这两种模式有多种并行化选择,DGL 根据稀疏格式和算子类型精心选择合适的实现。此外,为了获得更好的可重复性,DGL 默认选择确定性实现。阅读更新的白皮书以获取有关新内核设计的更多详细信息。

扩展到单机之外

DGL 能否扩展到单机无法容纳的巨型图?这个问题自 DGL 项目诞生以来就一直在我们的关注中。尽管之前的版本进行了一些尝试,但 0.5 是第一个彻底定义了用于分布式训练的用户级 API 和组件的版本。目标是创建一个从小批量训练到多机训练的连贯用户体验,理想情况下只需少量或无需代码更改。具体来说,本次发布包含了以下新组件:

  • 为了对图进行分割以进行分布式计算,DGL 集成了一个轻量级版本的高度优化的 METIS *图划分*工具包。
  • DistGraphServer 在每台机器上存储划分后的图结构和节点/边特征。这些服务器协同工作,向训练进程提供图数据。可以在一台机器上部署多个服务器以提高服务吞吐量。
  • 新的分布式采样器,与远程服务器交互并支持从划分的图进行采样。
  • 对于训练进程,DGL 提供了 DistGraphDistTensorDistEmbedding 抽象,用于访问远程存储的图结构、节点/边特征和嵌入。还有一个方便的 DistDataLoader,用于从分布式采样器获取小批量数据。

DGL 在整个技术栈中进行了多项优化。例如,当采样器和目标服务器位于同一台机器时,它们可以通过本地共享内存相互通信,而不是使用 IPC 或 TCP/IP 通信。未来的版本将会有更多优化。要开始使用,请查阅关于分布式训练的用户指南章节以及在 ogbn-paper100M 数据集上训练 GraphSAGERGCN 的示例。

延伸阅读