5.1.1 分层看生态:一座四层建筑
初学者常把图学习生态看成一排并列的工具箱:装一个、学一个、换一个。这个心智模型站不住。RDKit、PyG、DGL、DeepChem、Graphium 之间不是竞争关系,而是上下依赖关系——有的供给算子,有的供给流程,有的供给数据。看懂“谁站在谁肩上”,选型才有坐标系;本节乃至本章的迁移路线,都挂在这张地图上。
最底层是化学信息学层,RDKit 是这一层的事实标准(de facto standard)。分子进入模型之前的每一道工序——SMILES 与 molblock 解析、价态检查、规范化、描述符计算、SMARTS 子结构匹配、骨架提取——都落在它身上。任何上层库想拿到分子图,几乎都要经由它的解析与清洗;二十年积累的化学边角案例,没有第二家完整复刻,数据出口(写文件、画结构)也在此收口。第 2 章全章就是这一层的操作手册。datamol 贴在这一层外侧,作便捷封装,5.1.5 节再谈。
往上是张量图基础层,PyG 与 DGL 住在这里。图神经网络(graph neural network, GNN)的全部计算围绕邻居展开,这层的职责是把图上的计算翻译成 GPU 上的稀疏张量运算:消息传递(message passing)的散射与归拢、大小不一的图的批处理、图级读出函数(readout)。稀疏、变长、可微分三个需求叠加,自研成本极高;更重要的是,这一层决定了上层库的算法上限——上层封装不出下层没有的算子。
再上是分子机器学习应用层:DeepChem、Graphium,以及冻结的 TorchDrug。这层的职责是组织流程——数据集加载、特征化、训练循环、评估协议,外加预训练权重。第 3、4 章的全部实验都发生在这一层。最上层是专向工具层,蛋白质工程、反应预测、材料筛选各有专门工具;本书不展开,但它们同样站在下两层之上,学完下两层再进入这些方向,成本会显著下降。
5.1.2 PyG 与 DGL:薄抽象与厚抽象
薄抽象(thin abstraction):库只承担“论文里的数学对象 → 张量运算”的翻译,不替用户管理流程、容器与运行环境。概念最少,与论文的映射最直接。
厚抽象(thick abstraction):库把常用工作流固化为一等公民——图是一等公民的容器,消息传递是一等公民的算子,多后端与分布式是一等公民的运行假设。概念更重,换来工程一致性。
PyG 是薄抽象的标本(Fey & Lenssen, 2019)。核心是一个 MessagePassing 基类:子类声明消息怎么构造、怎么聚合、节点怎么更新,一次 propagate 调用完成沿边的散射与归拢。这与 3.3 节的消息传递公式逐项对应——论文写什么,类里就覆写什么。数据对象 Data 是一个命名张量袋:x、edge_index、y 想塞就塞,库不追问语义。薄抽象的直接收益是迭代快:新算子常与论文同步出现,复现成本因此极低;相应地,工程约束(跨后端、跨机器)留给用户自己解决。
DGL 是厚抽象的标本(Wang et al., 2019)。设计原点是图中心(graph-centric):DGLGraph 是一等公民容器,节点特征与边特征住在容器内(ndata 与 edata),消息传递被泛化为一套编程模型——update_all 接收消息函数与归约函数,内置函数覆盖常见算式,自定义函数无缝接入。运行环境同样做厚:历史上提供 MXNet、TensorFlow 等多后端,近年版本聚焦 PyTorch;面向超大图的分布式训练(distributed training)支持是它的看家本领。
批处理是两种哲学分歧最直观的地方。分子图大小不一,批处理要回答同一个问题:怎么把 N 张图送进一次前向。PyG 的答案是大图拼接:把 N 张图沿节点维连成一张不连通的大图,edge_index 逐图按累计节点数偏移,另附一个 batch 向量标记每个节点的归属;图级读出按 batch 向量分组聚合。整个批处理是纯张量操作,没有引入新容器。DGL 的答案是分块图:dgl.batch 在逻辑上同样得到一张图,但容器内部保存每张子图的节点数与边数簿记,图身份随时可查,unbatch 可以按簿记完整还原。图 5.1-2 把两条路线并排画出。
两条路线没有胜负。拼接路线概念最少,与 PyTorch 稀疏算子衔接自然,适合把论文公式逐行搬进代码;簿记路线保留图语义,跨后端、跨机器时的不变量更清楚,适合工程化与规模化。落到选型上,逻辑很简单。
倾向 PyG 的情形
- 复现论文、改读出层、快速试错——离论文公式最近
- 要最新算子:新方法常先在 PyG 出现参考实现
- 分子任务周边接口与示例密度更高(含 MoleculeNet 加载器)
倾向 DGL 的情形
- 工业部署,需要统一的图中心容器与编程模型
- 超大图或图级别的大规模训练,需要分布式支持
- 团队有多后端历史资产或跨框架一致性要求
5.1.3 应用层分工:DeepChem 操场,Graphium 工业线
应用层的两个活跃坐标恰成对照:DeepChem 是练手的操场,Graphium 是工业的路线。
DeepChem 最大的资产是教程与数据集生态。第 3 章用过的 MoleculeNet 家族基准,加载、特征化、模型谱系在它那里打包成一致的流程,入门摩擦全场最低;教学场景里它的地位短期无可替代。代价是 API 稳定性一般:稳定版停在 2.8.0(2024 年 4 月),nightly 持续构建,接口在版本之间偶有位移(2026 年 8 月核实)。合理的用法是把它当操场与数据入口;课题的深层定制不要押在它的内部接口上,否则每次升级都是一次回归测试。
Graphium 走另一条路,由 Valence Labs(Recursion 制药公司的 AI 研究引擎)维护,训练骨架立在 PyTorch Lightning 上,与 datamol 同在 datamol-io 组织。定位明确:大规模多任务学习(multi-task learning)训练与预训练模型的发布载体。第 3 章末已经把多任务的谱系铺好,这里正好接上。
连续性这样看:3.7 节的 Tox21 模型里,12 个任务头共享一个消息传递主干,这是“多任务”的最小形态。把任务数从 12 推向数十、分子数从数千推向数百万,再把精度不同的标签源——量子化学计算值与实验测量值——放进同一次训练,就得到 Graphium 的标准工况,也就是多保真学习(multi-fidelity learning):粗标签便宜量大,精标签贵而稀少,同层训练让两者互相补位。
再往前一步就是基础模型(foundation model)。MolGPS 在数百万分子、数十个任务上预训练,参数量约十亿量级,下游 38 个任务中 26 个刷新纪录(Sypetkowski et al., 2024)。它的意义超出单个模型:应用层不再只卖便利,开始沉淀基础模型资产,预训练权重本身成为生态竞争点。三年前“从零训练单任务模型”是常规操作;今天工业界的问题正在变成“选哪个预训练权重、怎么微调”——第 3 章的手艺没有作废,只是位置从起点挪到了中途。
5.1.4 TorchDrug 的历史定位与迁移
TorchDrug 在这张地图上是一枚教学标本。项目冻结于 v0.2.1(约 2022 年),官方兼容上限为 Python 3.10 与 PyTorch 2.0;新硬件、新版依赖上的安装会越来越难,环境细节是 5.2 节的主题。第 4 章仍然选它讲分子生成,理由与解剖课用固定标本相同:接口体贴、概念清楚,预训练加微调的两阶段结构表达得干净;而且它不再变动,讲义不会一夜失效。读它还有一个背景收益:它出自 DeepGraphLearning 组织——GraphAF 的官方 PyG 实现也在同一组织之下(Zhu et al., 2022),两边的代码品味同源。
迁移的本质先说破:第 3、4 章学的概念全部平移——SMILES 到分子图的流水线、消息传递、读出、多任务头、策略梯度、预训练加微调,一个都不用重学;要换的只有工程外壳。表 5.1-1 给出逐项映射。
| TorchDrug(v0.2.1,冻结) | PyG 生态 | 迁移要点 |
|---|---|---|
| Mol / PackedMol | Data / Batch | 一分子一张 Data;PackedMol 的打包语义对应 Batch 的大图拼接(图 5.1-2) |
| models.GCPN、models.GraphAF | DeepGraphLearning 的 PyG 参考实现(bond_learning、GraphAF 仓库) | 第 4 章的两阶段训练逻辑原样照搬,算法与推导一致 |
| layers.RGCN 等层 | torch_geometric.nn 的 RGCNConv 等卷积层 | 层语义一一对应,仅参数命名不同 |
| data.MoleculeDataset 等数据集类 | 自建 Dataset(如 InMemoryDataset) | SMILES 到图的流水线不变,沿用第 3 章的清洗与特征化 |
| metrics 与内置训练循环 | PyTorch 原生循环 / Lightning | 训练骨架显式化,环境与复现见 5.2 节 |
批处理一例最能说明“概念平移、外壳更换”。5.1.2 节讲过两种批处理思想;TorchDrug 的 PackedMol 与 PyG 的 Batch 正是同一思想的两种拼写。下面的对照只看概念对应,不抠参数细节。
# TorchDrug:第 3、4 章的批处理形态——PackedMol 是一等容器
mols = [data.Molecule.from_smiles(s) for s in smiles] # 解析由 RDKit 完成
batch = data.PackedMol.from_molecule(*mols) # 打包:大图与归属边界随行
pred = model(batch.node_feature, batch.edge_list,
batch.edge_weight.float()) # 一次前向吞下整批
# 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 把打包结果当容器用——PackedMol 自带边界与归属,前向直接传容器属性;PyG 把打包结果当普通大图用——归属压缩成一个 batch 向量,前向传扁平张量。看懂这一处,表 5.1-1 的其余条目都是查表工作。第 3 章的读者若迁移到 PyG,真正要重写的只有 smiles_to_data 这一个函数——而它本身就是第 2 章练过的流水线。
5.1.5 数据周边:datamol 与 MoleculeNet 数据集
数据侧有两个名字值得记住。datamol 是 RDKit 的便捷封装层:清洗流水线开箱即用——去盐、保留最大片段、规范化、批量算描述符——原本十几行 RDKit 调用的预处理收敛为少数高层函数。它与 Graphium 同在 datamol-io 组织,同一批维护者把“数据清洗”与“模型训练”做成配套件,这是分层地图上相邻层咬合的现成实例。选 Graphium 路线的团队,数据入口顺理成章落在 datamol。
数据集方面,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 选库原则:问题定义先于工具
选库决策,自上而下过一遍:
- 先固定问题定义:数据、指标、划分协议。它们跨库不变,先于任何工具存在。
- 学概念、复现论文:取最薄的层——RDKit 造数据,PyG 直写算子,公式与代码零距离。
- 学流程、要现成教程与数据:取最全的层——DeepChem 入门摩擦最低。
- 做工业、看长期:取维护与社区健康的层——分子专向且有预训练资产沉淀的 Graphium,或社区与算子密度最高的 PyG。
- 每一步追问两句:这个库一年后还在吗?换掉它,我的哪些资产能带走?
生态活跃度是工程风险。TorchDrug 冻结不是失败,而是学术软件的常态生命周期:论文发表、使命完成、维护停止。评估任何一个库,看四项:提交与发布节奏、issue 响应速度、维护主体(公司、基金会还是个人)、依赖兼容窗口。冻结库用于教学无妨,写进生产依赖树,等于把一份带日期的风险埋进项目地基。
最后是态度问题:警惕框架忠诚度(framework loyalty)。熟悉产生粘性,粘性产生立场,立场让人替工具辩护而不是替问题辩护。工具的半衰期以年计;问题定义——数据从哪里来、指标怎么算、结论能否站住——以十年计。本书用两章 RDKit、两章 TorchDrug 讲原理,正因此要在最后一章讲迁移:离开任何一个库时,你带走的都不该是 API 记忆,而是这套概念与纪律。5.3 节的陷阱清单,将把它们落到具体条目上。
习题 5.1-1
为下列三个场景各选一条技术栈(从 RDKit、datamol、PyG、DGL、DeepChem、Graphium 中取舍),指出每条栈的主要成本(学习成本、维护成本、风险),并判断哪一环最容易在两年后失效。
(a)研究生复现一篇 2025 年发表的 GNN 溶解度论文,并改进其读出层;(b)药企团队建多任务 ADMET 预测服务,维护期五年;(c)本科公选课的两周分子机器学习单元,学生无化学背景。
参考解答(a)RDKit + PyG:自建 Dataset 走第 3 章流水线,读出层直写在 MessagePassing 模型里。主要成本在工程起步(特征化函数与划分协议要自己写);风险是论文代码未必可复跑。两年后最可能失效的是复现目标本身(该论文被新方法超越),栈本身仍然可用。(b)Graphium + datamol(或 PyG + Lightning 自建):收益是预训练资产与明确的维护主体,数据清洗与训练配套;成本在选型锁定与内部封装的持续维护,应通过标准数据格式(SDF、CSV)与测试把内部接口与外部库隔开。最容易失效的环节是自己封装的接口层,而非底层库。(c)DeepChem 教程 + MoleculeNet 子集:加载与评估一体化,成本最低;风险是 API 位移,教学代码应每学期随版本核对。三题共同点:数据与评估协议都不随库变动——这正是本节的主题。
习题 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 冻结对第 4 章读者的冲击),并给出你自己的一条应对原则。
参考解答(要点)利:深度熟练带来效率复利,社区互助与职位画像短期内真实存在;在单一栈内积累的底层调试经验可迁移。弊:视野盲区(只见一种抽象方式,误把约定当本质);迁移成本随时间累积;职业身份被工具定义,工具冻结时资产随之贬值——TorchDrug 读者若只学了它的 API,项目停止维护后所剩无几,若学了消息传递与两阶段训练的概念,迁移只是查表(表 5.1-1)。应对原则示例:把笔记与代码按“概念—实现”两栏记录,概念栏不出现任何库名;每年用一个小项目在另一条栈上重走一遍旧流水线。
关键术语
- 薄抽象 (thin abstraction)
- 只承担“数学对象到张量运算”的翻译、不固化工作流的库设计取向;PyG 为代表。
- 厚抽象 (thick abstraction)
- 把容器、编程模型与运行环境一并固化的库设计取向;DGL 为代表。
- 消息传递 (message passing)
- 图上的一次计算:沿边构造消息、按节点聚合、再更新表示。
- 大图拼接 (flat batching)
- PyG 的批处理路线:N 张图连成一张不连通大图,归属压入一个 batch 向量。
- 分块图 (bookkept batching)
- DGL 的批处理路线:容器保存每张子图的节点数与边数簿记,图身份可查可还原。
- 多任务学习 (multi-task learning)
- 多个标签任务共享同一主干、任务头分立的训练形态(3.7 节)。
- 多保真学习 (multi-fidelity learning)
- 把精度不同的标签源(如计算值与实验值)放进同一次训练并令其互补。
- 图基础模型 (graph foundation model)
- 在大规模多任务分子数据上预训练、可迁移到众多下游任务的图网络,如 MolGPS。
- 分布式训练 (distributed training)
- 多机多卡协同训练;厚抽象路线的主要设计动机之一。
- 框架忠诚度 (framework loyalty)
- 把身份绑定到某一工具而非问题定义的倾向;本节警示的对象。
参考文献与延伸阅读
- Fey M, Lenssen JE. 2019. Fast graph representation learning with PyTorch Geometric. arXiv:1903.02428.
- 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.
- Zhu Z, Shi C, Zhang Z, et al. 2022. TorchDrug: a powerful and flexible machine learning platform for drug discovery. arXiv:2202.08320.
- 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).
- Wu Z, Ramsundar B, Feinberg EN, et al. 2018. MoleculeNet: a benchmark for molecular machine learning. Chemical Science 9:513–530.
- Landrum G, et al. 2006–. RDKit: open-source cheminformatics. 开源软件(2026.03 系列,2026 年 8 月核实).
- PyTorch Geometric 官方文档. pytorch-geometric.readthedocs.io(2026 年 8 月核实).
- Valence Labs / datamol-io. Graphium 与 datamol 官方文档. graphium-docs.datamol.io、datamol.io(2026 年 8 月核实).