第五章 · 5.1

5.1 图学习生态版图:PyG、DGL 与 Graphium

The GNN Ecosystem
本节按化学信息学、图计算、应用流程和专门任务四个层次比较常见工具。先说明 RDKit、PyG 与 DGL 的数据和计算接口,再介绍 DeepChem 与 Graphium 的任务组织方式,最后以 TorchDrug 为例讨论跨库迁移。重点是识别可复用的概念,以及需要逐项核对的数据语义、算子和环境。

5.1.1 分层看生态:一座四层建筑

这些工具的职责既有分工,也有重叠。RDKit 提供分子解析与化学信息学操作;PyG 和 DGL 提供图数据结构与计算接口;DeepChem、Graphium 和 TorchDrug 进一步组织特定任务的模型与训练流程。下图按主要职责分层,便于理解依赖关系,但并不表示每个应用库都必须依次调用所有下层项目。

四层生态地图:自底向上为化学信息学层、张量图基础层、分子机器学习应用层、专向工具层;箭头表示依赖方向,上层调用下层 专向工具层 specialized tools(各领域专用,仍站在下两层之上) 蛋白质工程 反应预测 材料筛选 分子机器学习应用层 application layer(把下层算子组织成“加载—训练—评估”的完整流程) DeepChem(操场) Graphium(工业) TorchDrug(0.2.1) 张量图基础层 tensor-graph layer(稀疏消息传递、变规模图批处理、图级读出) PyG(薄抽象) DGL(厚抽象) 化学信息学层 cheminformatics layer(解析 · 价态检查 · 规范化 · 描述符 · SMARTS) RDKit(事实标准) datamol(便捷封装) 本书较少涉足 共享下两层底座 第 3、4 章的舞台 本节主角:PyG 与 DGL 第 2 章全章 · 全站底座 最难以替代的一层 分子进模型的总闸口
图 5.1-1 图学习生态的分层地图。四层自底向上依次为化学信息学层、张量图基础层、分子机器学习应用层与专向工具层;箭头为依赖方向,上层调用下层。虚线框表示本书选用的 TorchDrug 0.2.1(5.1.4 节)。替换任何一层都可能改变默认行为,需要检查数据、算子和评估是否一致。

RDKit 是化学信息学领域广泛使用的开源工具,可用于 SMILES 与 MolBlock 解析、价态检查、分子标准化、描述符计算、SMARTS 匹配和骨架提取。许多分子机器学习流程通过它构建输入图,但具体清洗规则仍由任务决定。第 2 章介绍这些操作;5.1.5 节再说明 datamol 提供的便捷封装。

PyG 与 DGL 主要提供图数据结构和图上的张量计算。对图神经网络(graph neural network, GNN)而言,常用功能包括消息传递(message passing)、变长图批处理,以及图级读出函数(readout)。现成算子可以减少实现工作;需要新运算时,也可以扩展库接口或直接编写张量代码。底层接口影响实现成本,但不构成上层算法表达能力的绝对边界。

DeepChem、Graphium 和 TorchDrug 都提供面向分子任务的应用接口,但支持的任务与抽象范围不同。它们可能封装数据加载、特征化、训练、评估或预训练权重中的若干环节。蛋白质工程、反应预测和材料筛选还有专门工具,选择时应逐项检查任务支持与依赖,不能仅凭所处层级判断。

5.1.2 PyG 与 DGL:薄抽象与厚抽象

定义

薄抽象(thin abstraction)在本节中指较直接地暴露数学运算和张量接口,较少预设完整任务流程。这是比较接口设计的描述,不是某个库所有功能的固定分类。

厚抽象(thick abstraction)在本节中指将图对象、常用计算或任务流程组织为更完整的接口。它可能减少重复代码,也会增加需要理解的约定。两种倾向可以同时出现在同一库中。

PyG 的 MessagePassing 基类允许分别定义消息、聚合和节点更新,再由 propagate 调用沿边传播(Fey & Lenssen, 2019)。它与 3.5 节的消息传递框架相对应。Data 用于存储节点、边和图级属性,Batch 组织多图批次;PyG 也提供数据集、采样和分布式相关工具。因此,可以说其核心消息传递接口便于直接实现公式,但不能把整个库等同于不管理容器或运行流程。

DGL 采用图中心(graph-centric)接口:DGLGraph 存储连接关系,ndata 与 edata 关联节点和边特征,update_all 组合消息函数与归约函数(Wang et al., 2019)。它也提供面向大图的分布式训练(distributed training)工具。后端、分布式组件和平台支持应以选定版本文档为准;这些功能不能仅由“厚抽象”一词推断。

两种库的多图批处理都把输入图组织成一张不连通的大图,并保留各图的归属信息。PyG 的 Batch继承 Data 或 HeteroData,提供 batch 向量,也支持通过 to_data_list 等接口还原单图。dgl.batch返回合并后的图,通过 batch_num_nodes 和 batch_num_edges 记录边界,并可用 dgl.unbatch 拆分。图 5.1-2 比较其接口表示,不能据此把一方描述为“只有张量、没有容器”。

同一批三张分子图(3、2、4 个节点)在 PyG 中被拼接为一张不连通大图并用 batch 向量标记归属,在 DGL 中装入同一个容器并保存每图节点数簿记 PyG:大图拼接 N 张图 → 一张不连通大图 + batch 向量 3 节点 2 节点 4 节点 0 1 2 3 4 5 6 7 8 batch = [0 0 0 1 1 2 2 2 2] edge_index 按节点数偏移;Batch 保存图归属 to_data_list 可还原输入的各张图 DGL:分块图 N 张图 → 一个容器 + 每图簿记 3 节点 2 节点 4 节点 0 1 2 3 4 5 6 7 8 batch_num_nodes = [3, 2, 4] 容器保留每张子图的节点数簿记,图身份随时可查 dgl.unbatch 可按所保存的边界还原原图 两者都以不连通大图计算,并保留每个输入图的归属与边界
图 5.1-2 同一批分子图(3、2、4 个节点)的两种批处理接口。两者都构造九节点的不连通大图,并保留各图边界。左图显示 PyG 的 batch 归属向量,Batch 还支持还原单图;右图显示 DGL 的 batch_num_nodes,虚线仅用于标示原图边界。接口不同不等于一个框架有图语义、另一个没有。

两种批处理都需要正确偏移节点编号、拼接特征并保存图边界。实际选择应结合已有代码、所需算子、数据规模和团队熟悉程度;不能从“拼接”或“簿记”推导哪个库必然适合研究或生产。以下列出可用于比较的需求。

倾向 PyG 的情形

  • 已有 PyG 参考实现,或需要在 MessagePassing 接口中定制算子
  • 所需算子和数据接口在选定版本中已有实现
  • 需要 MoleculeNet 等数据集加载器及相关示例

倾向 DGL 的情形

  • 项目已使用 DGLGraph 容器与消息传递接口
  • 大图任务可使用 DGL 提供的采样或分布式组件
  • 已有 DGL 代码资产,且目标版本支持所需平台

5.1.3 应用层分工:DeepChem 操场,Graphium 工业线

DeepChem 与 Graphium 都封装分子机器学习流程,但常用入口和任务重点不同。以下比较其公开功能,具体适用性仍需通过目标数据上的试运行判断。

DeepChem 提供较多教程、MoleculeNet 数据集入口和模型接口,适合学习从数据到评估的完整流程。本书按 2.8.0 接口展开;运行时应固定版本,并查阅官方发布记录。如果需要定制内部行为,应为数据处理与关键模型输出建立检查,升级后重新验证,而不应假定教程代码能直接跨版本运行。

Graphium由 datamol-io 组织发布,其公开接口包括分子特征化、GNN 结构、预训练模型和基于 PyTorch Lightning 的训练循环。它支持通过配置组织多项化学任务,可结合 3.7 节的多任务学习(multi-task learning)理解。Graphium 与 TorchDrug 的功能存在交集,但这不表示两者有官方继承关系。

3.7 节的 Tox21 示例用 12 个任务头共享表示,是一种多任务结构。更大规模的训练可以增加任务、分子和标签来源,但这些扩展需要分别评估。多保真学习(multi-fidelity learning)通常涉及精度或计算成本不同、且相互关联的信息源;把任意不同性质的量子标签和实验标签放在同一数据集中,并不自动构成有效的多保真模型。

预训练还可以形成供下游任务迁移的基础模型(foundation model)。Sypetkowski 等(2024)研究模型规模、数据量和预训练任务对分子 GNN 的影响,并报告 MolGPS 在所评估的 38 项下游任务中有 26 项超过论文所比较的既有最好结果,见原论文。这一结果支持在相应协议下研究规模效应,不能直接推广为所有任务都应优先采用大模型;从头训练与迁移学习仍应使用相同划分和预算进行比较。

5.1.4 TorchDrug 的历史定位与迁移

本书用 TorchDrug 0.2.1 展示性质预测与分子生成的任务接口。2026 年 9 月核对的官方安装文档声明 Python 3.7–3.10、PyTorch ≥ 1.8.0,没有给出 PyTorch 2.0 上限。文档范围、发行版本与仓库维护状态是不同信息,不能用版本号推断项目已永久停止维护。环境选择见 5.2 节。第 4 章所用算法也有原作者代码,但应逐个核对实现框架与训练设置。

跨库迁移可以复用分子图、消息传递、读出、损失和评估等概念,但实现需要逐项核对。原子编码、边方向、自环、归一化、批处理和默认训练参数的差异都可能改变结果。表 5.1-1 给出功能对应关系,作为迁移检查清单,而非接口可以直接替换的保证。

表 5.1-1TorchDrug 到 PyG 生态的迁移映射(版本状态截至 2026 年 8 月)
TorchDrug(v0.2.1)PyG 生态迁移要点
Molecule / PackedMoleculeData / Batch一分子一张 Data;PackedMolecule 的打包语义对应 Batch 的大图拼接(图 5.1-2)
tasks.GCPNGeneration、tasks.AutoregressiveGenerationGCPN 原作者实现与 GraphAF 原作者实现核对动作空间、特征化、监督目标与微调设置;原作者实现不应统称为 PyG 接口
models.RGCN 等编码器torch_geometric.nn 的 RGCNConv 等卷积层核对关系编码、归一化、自环和参数化,不能只对照名称
data.MoleculeDataset 等数据集类自建 Dataset(如 InMemoryDataset)SMILES 到图的流水线不变,沿用第 3 章的清洗与特征化
metrics 与内置训练循环PyTorch 原生循环 / Lightning训练骨架显式化,环境与复现见 5.2 节

以批处理为例,TorchDrug 的 Molecule.pack 返回 PackedMolecule,PyG 的 DataLoader 可以返回 Batch。两者都提供合并图和归属信息;以下片段展示接口形态,假定 smiles 和相应模型已经定义,完整训练流程还需补充标签、损失与优化器。

# TorchDrug 0.2.1:分子打包与图编码器接口示例
from torchdrug import data, models
mols = [data.Molecule.from_smiles(text) for text in smiles]
batch = data.Molecule.pack(mols)  # 返回 PackedMolecule
encoder = models.GIN(batch.node_feature.shape[-1], hidden_dims=[64, 64])
output = encoder(batch, batch.node_feature.float())
graph_feature = output["graph_feature"]  # 任务预测还需读出后的预测头
# PyG:同一概念的形态——Data 单图,Batch 拼接
graphs = [smiles_to_data(s) for s in smiles]            # 每个分子一张 Data
loader = DataLoader(graphs, batch_size=32, shuffle=True)
batch = next(iter(loader))                              # collate 时拼成大图
pred = model(batch.x, batch.edge_index, batch.batch)    # batch 向量标记归属

TorchDrug与 PyG 都保留批次中的图边界。其模型调用约定不同:TorchDrug 的许多编码器接收图对象及节点输入,PyG 的自定义模型则可以接收节点张量、边索引和图归属。迁移除分子转换函数外,还可能涉及边特征、模型结构、池化、损失及评估,不能只改一个函数便假定数值等价。

5.1.5 数据周边:datamol 与 MoleculeNet 数据集

datamol 对 RDKit 的常用操作提供便捷封装,可用于分子标准化、片段处理和描述符计算。选择这类高层函数时仍需检查默认参数,因为去盐、互变异构体处理和立体化学保留方式会改变输入。Graphium 与 datamol 同在 datamol-io 组织,但是否采用相同预处理流程应由任务和复现要求决定。

数据集方面,MoleculeNet 家族(Wu et al., 2018)——ESOL、FreeSolv、Lipophilicity、BBBP、Tox21、SIDER、HIV、BACE——是分子性质预测的通用货币。在 PyG 生态,torch_geometric.datasets.MoleculeNet 直接提供加载接口,数据文件历史上经 DeepChem 渠道分发。换言之,三个库在同一批数据上汇合,第 3 层的应用库与第 2 层的算子库在数据通道上本就互通。

一句提醒:同一数据集在不同库里的默认划分、特征化与单位口径可能不同,跨库比较数字时要回到原始文献核对协议。第 3 章反复强调的评估纪律——划分方式先于模型——在生态问题上原样成立。

5.1.6 选库原则:问题定义先于工具

方法

选库决策,自上而下过一遍:

  1. 先固定问题定义:数据、指标、划分协议。它们跨库不变,先于任何工具存在。
  2. 学概念、复现论文:可考虑 RDKit 构建数据、PyG 实现图算子,并核对公式与默认行为。
  3. 学流程、要现成教程与数据:可从 DeepChem 的教程和数据接口开始,预先验证所需环境。
  4. 做工业、看长期:比较任务支持、维护记录、许可、测试与迁移成本,并用原型评估候选工具。
  5. 同时记录维护状态与替代方案,明确迁移时可复用的数据、模型定义和验证用例。
警示

维护状态影响持续使用的成本。评估一个库时,可检查发布与提交记录、问题响应、维护主体以及依赖兼容范围,并记录核对日期。对需要复现的实验,应保存具体代码版本与环境;对持续开发的项目,还应估计更新、测试和迁移的工作量。

熟悉一个框架有助于提高实现效率,但也可能形成框架忠诚度(framework loyalty),使工具约定被误认为方法要求。本书以 RDKit、DeepChem 和 TorchDrug 的实例解释原理,最后讨论生态与迁移,是为了将概念、数据协议和实现细节区分开来。5.3 节将这些原则整理为可执行的学习与复现检查。

习题 5.1-1

为下列三个场景各选一条技术栈(从 RDKit、datamol、PyG、DGL、DeepChem、Graphium 中取舍),指出每条栈的主要成本(学习成本、维护成本、风险),并判断哪一环最容易在两年后失效。

(a)研究生复现一篇 2025 年发表的 GNN 溶解度论文,并改进其读出层;(b)药企团队建多任务 ADMET 预测服务,维护期五年;(c)本科公选课的两周分子机器学习单元,学生无化学背景。

参考解答

(a)可考虑 RDKit + PyG,在复用论文代码与自建模型之间比较工作量。需要核对特征化、划分、读出和结果是否可复现;论文被新方法超过并不使复现失去价值。(b)可比较 Graphium + datamol 与 PyG + Lightning 等方案,通过原型测量任务支持、吞吐、维护成本与升级风险。预训练资产是否有益要由独立验证决定,不能预言哪一层必然先失效。(c)可从 DeepChem 教程和 MoleculeNet 子集入手,预先固定环境,按学生基础缩小任务范围。这些都是候选方案;相同问题的工具比较应先固定数据、指标和评估协议。

习题 5.1-2

把第 3 章的预测流水线逐站映射到 PyG 生态的组件,并回答:哪一站最容易引入口径不一致?

参考解答
表 5.1-2第 3 章流水线到 PyG 组件的映射
流水线步骤(第 3 章)PyG 侧组件
SMILES 列表读入自写函数:读 CSV / SDF(RDKit 或 pandas)
解析与清洗(去盐、规范化)RDKit(或 datamol 流水线)
分子图构造自写 smiles_to_data:Data 携带 x、edge_index、y
GNN 主干(消息传递 + 读出)torch_geometric.nn 卷积层堆叠 + 全局读出(如 pooling)
多任务头与损失线性层 × 任务数 + 掩码 BCE(3.7 节)
AUC 评估roc_auc_score(按任务逐个报告)

最容易出口径问题的是“解析与清洗”一站:原子特征的编码表、隐式氢的处理、是否规范化互变异构体,不同实现各有默认值,悄悄改变图的节点数与特征维度。对策与第 3 章相同:把编码规则写死在数据集文档里,跨库比较时先对齐图的构造协议,再谈模型。

习题 5.1-3

论述题(400 字左右):框架忠诚度有何利弊?请至少结合本书范围内的一个实例(如复现 TorchDrug 0.2.1 示例时的版本选择),并给出你自己的一条应对原则。

参考解答(要点)

熟悉框架的益处包括减少实现时间、复用调试经验和获得社区支持;局限包括依赖特定接口、忽略其他实现选择,以及升级或迁移时的额外工作。以 TorchDrug 0.2.1 为例,可同时记录概念定义与对应接口,并保存能够重建的环境。尝试另一种实现时,应对齐数据和算子语义,再比较输出,以判断哪些经验可以迁移。


关键术语

薄抽象 (thin abstraction)
较直接暴露数学运算与张量接口的设计取向;不代表一个库完全不组织流程。
厚抽象 (thick abstraction)
在接口中组织较完整的图对象、运算或任务流程的设计取向。
消息传递 (message passing)
图上的一次计算:沿边构造消息、按节点聚合、再更新表示。
大图拼接 (flat batching)
PyG 的批处理路线:N 张图连成一张不连通大图,通过 Batch 的 batch 向量等信息保存归属。
分块图 (bookkept batching)
DGL 的批处理路线:容器保存每张子图的节点数与边数簿记,图身份可查可还原。
多任务学习 (multi-task learning)
多个标签任务共享同一主干、任务头分立的训练形态(3.7 节)。
多保真学习 (multi-fidelity learning)
联合利用精度或成本不同且相互关联的信息源,收益需通过验证评估。
图基础模型 (graph foundation model)
在大规模多任务分子数据上预训练、可迁移到众多下游任务的图网络,如 MolGPS。
分布式训练 (distributed training)
通过多个计算设备协同完成训练,需要处理数据划分与参数通信。
框架忠诚度 (framework loyalty)
因熟悉某一工具而过度依赖其约定的倾向,可能影响方法选择。

参考文献与延伸阅读

  1. Fey M, Lenssen JE. 2019. Fast graph representation learning with PyTorch Geometric. arXiv:1903.02428.
  2. Wang M, Zheng D, Ye Z, et al. 2019. Deep graph library: a graph-centric, highly-performant package for graph neural networks. arXiv:1909.01315.
  3. Zhu Z, Shi C, Zhang Z, et al. 2022. TorchDrug: a powerful and flexible machine learning platform for drug discovery. arXiv:2202.08320.
  4. Sypetkowski M, Wenkel F, Poursafaei F, et al. 2024. On the scalability of GNNs for molecular graphs. Advances in Neural Information Processing Systems 37 (NeurIPS 2024; arXiv:2404.11568).
  5. Wu Z, Ramsundar B, Feinberg EN, et al. 2018. MoleculeNet: a benchmark for molecular machine learning. Chemical Science 9:513–530.
  6. Landrum G, et al. 2006–. RDKit: open-source cheminformatics. 开源软件(2026.03 系列,2026 年 8 月核实).
  7. PyTorch Geometric 官方文档. pytorch-geometric.readthedocs.io(2026 年 8 月核实).
  8. Valence Labs / datamol-io. Graphium 与 datamol 官方文档. graphium-docs.datamol.io、datamol.io(2026 年 8 月核实).