DGL最新的v0.7版刚刚正式发布。大家已经可以通过pip或conda下载升级。这里我们总结了新版本的一些特性。
系统层面的增强
此次0.7版中有不少底层系统结构上的增强。其中很大一部分有来自用户社区的参与和贡献。我们非常高兴地注意到这一趋势,也欢迎未来能有更多来自社区的贡献。
基于GPU的邻居采样加速
我们知道邻居采样(neighbor sampling)是巨图训练非常重要的基础算法。在英伟达团队的帮助下,新版DGL现在支持在GPU上进行等概率邻居采样,并在GPU上完成MFG转换。这就避免了在每个采样迭代过程中把数据从CPU内存到GPU显存的拷贝,同时还能利用GPU的加速能力加快采样的过程。有了这一功能,在ogbn-product数据上运行GraphSAGE模型取得了超过10倍的提速 (在g3.16x实例上,每epoch运行时间从113秒降低到11秒)。想要使用这一功能,可以对一个存在GPU上的图创建一个NodeDataLoader,并指明在GPU上进行采样,如下所示。
g = ... # 一个图 g = g.to('cuda:0') # 把此图存入GPU # 创建一个dataloader dataloader = dgl.dataloading.NodeDataLoader( g, # 支持存在GPU上的图 train_nid, sampler, device=torch.device('cuda:0'), # 指定特定的GPU来进行采样 num_workers=0, # num_workers必须设定成0 batch_size=1000, drop_last=False, shuffle=True) # 模型训练的循环 for input_nodes, output_nodes, sample_graphs in dataloader: # 生成的sample_graphs已经在GPU里了 train_on(input_nodes, output_nodes, sample_graphs)
对应此功能,以下文档也相应地进行了修改:
在《用户手册》中新增了一章《Using GPU for Neighborhood Sampling》,介绍了何时以及如何使用这一新功能。
在NodeDataLoader代码中新增了API文档。
CPU上消息传递内核的加速
CPU上GNN消息传递的GSpMM内核的核心代码在0.7版中进行了改写增强。新的内核对CSR矩阵进行操作,并利用了英特尔的LibXSMM实现内核生成。相关细节可参考论文 https://arxiv.org/abs/2104.06700。在Xeon处理器上,这个功能会自动打开,从而带来显著的性能提升。这里非常感谢英特尔团队对于新CPU内核的贡献。
针对多GPU和分布式场景的节点嵌入(NodeEmbedding)模块的优化
新版的DGL使用NCCL来同步训练过程中的稀疏点嵌入(dgl.nn.NodeEmbedding)的梯度。用户指定nccl作为torch.distributed.init_process_group的后端选项时,这一功能会被自动启动。我们的试验显示,使用这一功能在ogbn-mag数据上训练RGCN会带来20%左右的提速。在g4dn.12xlarge实例(4块T4 GPU)上,每epoch的训练时间从47.2秒降到39.5秒。这里非常感谢英伟达团队的贡献。此外,在新版本中,分布式的点嵌入模块(dgl.distributed.DistEmbedding)也实现了同步的梯度更新机制,让训练过程更加的稳定。
DGL Kubernetes Operator
奇虎360团队为DGL贡献了专用的Kubernetes Operator,使得在Kubernates上使用DGL进行分布式或非分布式训练变得更加方便。感兴趣的用户可以参考奇虎团队的github仓库:https://github.com/Qihoo360/dgl-operator。
其他关键性能提升
除了上述提到的主要性能提升,DGL社区还帮助我们修复了一些性能的问题。其中,DGL在中等规模的图数据上使用CPU进行随机游走采样的速度提升了24倍。对十亿级别点的超大图进行分布式训练集分割的内存消耗节省了7倍。详情请参阅0.7版本的发布日志。
更多的模型
和之前的版本发布一样,0.7版里面也发布了新的19个模型样例,使得样例总数达到了90个。为了便于用户找到他们需要的样例(比如,特定的主题或数据集),我们在dgl.ai上提供了一个新的搜索工具,供用户使用关键字来搜索模型样例。
以下为0.7版里新发布的模型样例列表:
Interaction Networks for Learning about Objects, Relations, and Physics (https://arxiv.org/abs/1612.00222.pdf)
Multi-GPU RGAT for OGB-LSC Node Classification
Network Embedding with Completely-imbalanced Labels (https://ieeexplore.ieee.org/document/8979355)
Temporal Graph Networks improved
Diffusion Convolutional Recurrent Neural Network (https://arxiv.org/abs/1707.01926)
Gated Attention Networks for Learning on Large and Spatiotemporal Graphs (https://arxiv.org/abs/1803.07294)
DeeperGCN (https://arxiv.org/abs/2006.07739)
Deep Graph Contrastive Representation Learning (https://arxiv.org/abs/2006.04131)
Graph Neural Networks Inspired by Classical Iterative Algorithms (https://arxiv.org/abs/2103.06064)
GraphSAINT
Label Propagation
Combining Label Propagation and Simple Models Out-performs Graph Neural Networks (https://arxiv.org/abs/2010.13993)
GCNII
Latent Dirichlet Allocation on GPU
A Heterogeneous Information Network based Cross Domain Insurance Recommendation System for Cold Start Users
Five heterogeneous graph models: HetGNN/GTN/HAN/NSHE/MAGNN. Sparse matrix multiplication and addition with autograd are also added as a result.
Heterogeneous Graph Attention Networks with minibatch sampling
Learning Hierarchical Graph Neural Networks for Image Clustering
单机多GPU和分布式训练的教程
随着用户对于在超大规模图数据上运用图神经网络的需求的增加,我们收到了很多对于如何使用单机多GPU和多机分布式训练的问题。在本版本里,我们新增了两个教程,分别介绍了使用单机多GPU训练进行点分类和图分类的方法,和如何使用多机进行DGL分布式训练的方法。目前这两个教程都可以在docs.dgl.ai里面看到。
更多内容请参阅0.7版本