博客详情

主页 / 博客详情
blog

DGL v0.3 版本发布

v0.3 版本包含许多重要更新

  • 融合的消息传递核,可大幅提升大型图上 GNN 的训练速度。详情请参考我们的博客文章
  • 添加了组件,通过图采样实现在超大图上进行 GNN 的分布式训练。详情请参考我们的博客文章
  • 新的模型和神经网络模块。
  • 许多其他的错误修复和其他增强。

因此,请注意以下变化:

安装

之前使用 pip 和 conda 的安装方法,即:

pip install dgl
conda install -c dglteam dgl

现在仅安装 CPU 构建版本(适用于 Linux/MacOS/Windows)。

使用 pip 安装 CUDA 构建版本

Pip 用户可以使用以下方式安装 DGL CUDA 构建版本:

pip install <package-url>

其中 <package-url> 是以下之一:

  CUDA 9.0 CUDA 10.0
Linux + Py35 pip install https://data.dgl.ai/wheels/cuda9.0/dgl-0.3-cp35-cp35m-manylinux1_x86_64.whl pip install https://data.dgl.ai/wheels/cuda10.0/dgl-0.3-cp35-cp35m-manylinux1_x86_64.whl
Linux + Py36 pip install https://data.dgl.ai/wheels/cuda9.0/dgl-0.3-cp36-cp36m-manylinux1_x86_64.whl pip install https://data.dgl.ai/wheels/cuda10.0/dgl-0.3-cp36-cp36m-manylinux1_x86_64.whl
Linux + Py37 pip install https://data.dgl.ai/wheels/cuda9.0/dgl-0.3-cp37-cp37m-manylinux1_x86_64.whl pip install https://data.dgl.ai/wheels/cuda10.0/dgl-0.3-cp37-cp37m-manylinux1_x86_64.whl
Win + Py35 pip install https://data.dgl.ai/wheels/cuda9.0/dgl-0.3-cp35-cp35m-win_amd64.whl pip install https://data.dgl.ai/wheels/cuda10.0/dgl-0.3-cp35-cp35m-win_amd64.whl
Win + Py36 pip install https://data.dgl.ai/wheels/cuda9.0/dgl-0.3-cp36-cp36m-win_amd64.whl pip install https://data.dgl.ai/wheels/cuda10.0/dgl-0.3-cp36-cp36m-win_amd64.whl
Win + Py37 pip install https://data.dgl.ai/wheels/cuda9.0/dgl-0.3-cp37-cp37m-win_amd64.whl pip install https://data.dgl.ai/wheels/cuda10.0/dgl-0.3-cp37-cp37m-win_amd64.whl
MacOS 不适用 不适用

使用 conda 安装 CUDA 构建版本

Conda 用户可以使用以下方式安装 CUDA 构建版本:

conda install -c dglteam dgl-cuda9.0   # For CUDA 9.0
conda install -c dglteam dgl-cuda10.0  # For CUDA 10.0

DGL 当前支持 CUDA 9.0 (dgl-cuda9.0) 和 10.0 (dgl-cuda10.0)。要查找您的 CUDA 版本,请使用 nvcc --version。要从源代码安装,请查看我们的安装指南

新的内置消息传递和聚合函数

我们扩展了内置消息传递和聚合函数的列表,以涵盖更多用例。以前,DGL 只支持 copy_srccopy_edgesrc_mul_edge。v0.3 版本发布后,我们支持更多组合。这里展示了一些新的内置函数。

import dgl
import dgl.function as fn
import torch as th
g = ... # create a DGLGraph
g.ndata['h'] = th.randn((g.number_of_nodes(), 10)) # each node has feature size 10
g.edata['w'] = th.randn((g.number_of_edges(), 1))  # each edge has feature size 1
# collect features from source nodes and aggregate them in destination nodes
g.update_all(fn.copy_u('h', 'm'), fn.sum('m', 'h_sum'))
# multiply source node features with edge weights and aggregate them in destination nodes
g.update_all(fn.u_mul_e('h', 'w', 'm'), fn.max('m', 'h_max'))
# compute edge embedding by multiplying source and destination node embeddings
g.apply_edges(fn.u_mul_v('h', 'h', 'w_new'))

如您所见,语法非常直观。u_mul_e 表示将源节点数据与边数据相乘;u_mul_v 表示将源节点数据与目标节点数据相乘,依此类推。每个内置组合都将映射到一个 CPU/CUDA 核,并且支持广播和梯度计算。详情请查看我们的文档

训练超大图

我们添加了新的组件:共享内存 DGLGraph 和分布式采样器,以支持图神经网络的分布式和多进程训练。

现已上线两个新教程:

  • 通过邻居采样及其变体训练 GNN (链接)。
  • 使用分布式图存储将采样器-训练器架构扩展到超大图 (链接)。

我们还提供了关于如何设置这种分布式环境的脚本 (链接)。

增强和错误修复

  • NN 模块
    • dgl.nn.[mxnet|pytorch].edge_softmax 现在直接返回边上的归一化分数。
    • 修复了将图作为输入时发生的内存泄漏错误。
    • DGLGraph 现在支持直接从 scipy csr matrix 转换,而无需先转换为 coo matrix。
    • 只读图现在可以通过 dgl.batch 进行批处理。
    • DGLGraph 现在通过 DGLGraph.remove_nodesDGLGraph.remove_edges 支持节点/边移除(文档)。
    • 一个新的 API DGLGraph.to(device),可以将所有节点/边数据移动到指定设备。
    • 一个新的 API dgl.to_simple,可以将图转换为没有多重边的简单图。
    • 一个新的 API dgl.to_bidirected,可以将图转换为双向图。
    • 一个新的 API dgl.contrib.sampling.random_walk,可以从图中生成随机游走。
    • 允许从另一个 DGLGraph 构建 DGLGraph
  • 新的模型示例
    • APPNP
    • GIN
    • PinSage(慢速版本)
    • DGI
  • 错误修复
    • 修复了将 numpy 整数作为参数传入时的错误。
    • 修复了从没有边的 networkx 图构建时发生的错误。
    • 修复了 nodeflow 中 ID 有时未正确转换的错误。
    • 修复了 MiniGC 数据集中节点数量不一致的错误。
    • 修复了 RGCN 示例中 bfs_level=0 时的错误。
    • 修复了 DLContext 未在 CFFI 中正确暴露的错误。
    • 修复了 Cython 构建期间发生的崩溃。
    • 修复了当给定消息函数是内置函数时 send 中的错误。