DGL框架简介与安装配置

为什么选DGL?

做药物图神经网络,第一件事就是选个趁手的框架。我自己试过PyG、DGL,也看过一些自研的玩具框架。说实话,DGL对药物分子的处理更友好。为什么呢?因为药物分子天然是图结构——原子是节点,化学键是边。DGL天生支持异构图和批处理,这在药物筛选中几乎天天用。

我记得第一次用PyG做分子图时,自定义消息传递有点绕。换到DGL后,dgl.graph、dgl.DGLGraph、甚至dgl.batch这些API,思路很直接。你不需要去猜底层怎么分配显存,框架帮你做了。我当时心里就一个想法:就它了。

环境配置要点

安装前先确认三件事:Python版本、PyTorch版本、CUDA版本。我建议至少Python 3.8以上,PyTorch 1.12以上。CUDA版本视你的显卡而定,但别低于11.3。

核心依赖关系

组件推荐版本备注
Python3.8 – 3.113.12有时会遇到依赖冲突
PyTorch1.12 – 2.1检查torch版本是否支持你的CUDA
CUDA Toolkit11.3 – 12.1与PyTorch的cuda版本匹配
dgl1.1.2+最新稳定版

我个人习惯先创建独立的conda环境,避免把系统的Python搞乱。

安装DGL

官方提供三种方式:pip、conda、源码编译。我平时首选conda,因为它会自动处理CUDA相关依赖。

使用conda安装(推荐)

conda create -n dgl_env python=3.10
conda activate dgl_env
conda install -c dglteam dgl cuda11.8

这里cuda11.8替换为你自己的CUDA版本。如果你不想装CUDA或者只用CPU,可以直接装CPU版:

conda install -c dglteam dgl

使用pip安装

pip install dgl -f https://data.dgl.ai/wheels/repo.html

如果安装慢,可以加国内镜像:

pip install dgl -i https://pypi.tuna.tsinghua.edu.cn/simple

源码编译(不推荐新手尝试)

本来想跳过这块,但记得有次我需要自定义CUDA算子,迫不得已才走源码编译。流程大概是这样:

git clone https://github.com/dmlc/dgl.git
cd dgl
mkdir build
cd build
cmake -DUSE_CUDA=ON -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda ..
make -j4
cd ../python
python setup.py install

我那次搞了两个小时才发现是CMake的CUDA路径没写对……所以,除非你有特殊需求,否则直接用包管理器就好。

验证安装

装完一定要跑个简单的例程,这点我吃过亏。之前装完觉得没问题,结果一跑报CUDA版本不匹配的错,排查了半天。现在我会写一个小脚本测一下:

import dgl
import torch

print("DGL version:", dgl.__version__)
print("CUDA available:", torch.cuda.is_available())

# 创建一个简单的图:两个节点一条边
g = dgl.graph(([0, 1], [1, 0]))
print(g)

# 给节点赋特征
g.ndata['x'] = torch.tensor([[1.0], [2.0]])
print(g.ndata['x'])

如果看到类似 Graph(num_nodes=2, num_edges=2, ...) 的输出,恭喜你,环境通了。

基本使用流程

说白了,DGL的套路就三步:建图 → 加特征 → 消息传递。

第一步:建图

import dgl
# (src, dst) 两两对应
u = torch.tensor([0, 1, 2, 3])
v = torch.tensor([1, 2, 3, 0])
g = dgl.graph((u, v))

第二步:加特征

# 节点特征:4个节点,每个3维
g.ndata['feat'] = torch.randn(4, 3)
# 边特征:4条边,每个2维
g.edata['w'] = torch.randn(4, 2)

第三步:消息传递(用一个简单的GCN层演示)

import dgl.nn as dglnn
import torch.nn as nn

class SimpleGCN(nn.Module):
    def __init__(self, in_feats, out_feats):
        super().__init__()
        self.conv = dglnn.GraphConv(in_feats, out_feats)

    def forward(self, g, feats):
        h = self.conv(g, feats)
        return h

model = SimpleGCN(3, 2)
h = model(g, g.ndata['feat'])
print(h)

你想想看,这么几行代码就实现了一个可训练的GCN。这在药物分子性质预测上可以直接套用。我曾经在一个项目里把分子图转化成DGLGraph后,用同样的流程做QED(药物相似度)预测,效果还不错。

避坑指南

我踩过的坑,大部分都是环境相关的。这里列几条:

  • CUDA版本不一致: PyTorch编译时的CUDA版本必须和DGL的CUDA版本匹配,否则会报动态库加载失败。我后来统一用conda安装,很少出错了。
  • 多GPU场景: DGL默认会把图数据放在CPU,你需要手动调用 g.to(cuda)。我曾经忘记这个,结果在数据并行时报“not all tensors on same device”。
  • 异构图装DGL: 如果分子中有多种原子类型(比如C、N、O),要用 dgl.heterograph。我第一次做分子图时直接用同构图,结果把原子类型当成了节点特征,导致模型学习效率低。后来改用异构图,每种原子对应一种节点类型,准确率明显提升。

注意: Windows用户安装DGL时,如果遇到 DGL DLL load failed,很可能是缺少Visual C++ Redistributable。去微软官网下载最新版安装即可。我有个学员卡在这步整整一下午,装上后秒解决。

知识体系一览

下面这个SVG图帮你理清本章的核心脉络,从安装到第一个图,一目了然。

DGL框架安装与基本流程 环境准备 Python · CUDA 安装DGL conda / pip 验证安装 例程测试 建图 dgl.graph 加特征 ndata / edata 消息传递 GCN / GAT 以上流程是药物分子图神经网络的标准操作路径

小结

这一章我们走完了从环境搭建到第一个DGL例程的完整流程。核心就是那三件事:建图、加特征、做消息传递。后面几章我们会基于这个套路,一步步做出药物分子性质预测的实战模型。记住我那句建议:先配好环境,再跑通例程,后面会顺利很多。