第五章 · 5.2

5.2 环境与复现:从 conda 到 WSL 的工程实践

Environments and Reproducibility
环境是实验记录的一部分。解释器、二进制扩展、深度学习框架与 GPU 驱动共同影响程序能否运行,也可能影响数值结果。本节说明这些依赖的兼容关系,区分包管理器能够检查的约束与必须通过运行验证的条件;随后介绍环境隔离、版本记录和重建方法,给出三套环境的配置示例,并讨论 Windows 与 WSL2 的选择及复现验收标准。

5.2.1 依赖兼容性:解释器、框架与扩展

代码在重建环境后出现导入错误,或者同一实验在另一台机器上产生不同指标,都需要同时检查代码、数据和运行环境。分子机器学习常用 C++ 化学信息学库与深度学习扩展,因此除了 Python 包版本,还涉及二进制接口和设备运行时。所谓依赖地狱(dependency hell),通常指多组依赖约束难以同时满足,或声明的兼容范围不足以描述实际运行条件;定位问题应从具体的约束与错误证据出发。

第一类约束来自解释器与二进制扩展。RDKit 的许多核心功能由 C++ 实现,Python 绑定需要符合解释器的应用二进制接口(application binary interface, ABI)。普通 CPython 扩展往往针对特定次版本编译;3.10 与 3.12 是 Python 3 的两个次版本,不能直接假定其扩展兼容。采用 Limited API 和 Stable ABI 的扩展则可在规定范围内跨次版本使用。发行方通过轮子(wheel)提供预构建分发包,安装器依据标签选择适合当前解释器与平台的制品。

定义

ABI 与轮子的兼容约束。轮子文件名末尾包含 Python、ABI、平台三类标签。例如 cp311-cp311-manylinux_2_28_x86_64 表示面向 CPython 3.11 及其 ABI、满足相应 Linux 平台条件的构建;abi3 则表示 CPython Stable ABI。pip 会根据环境支持的标签过滤候选文件。纯 Python 轮子常使用 py3-none-any,但仍受 Requires-Python、语言与库接口以及传递依赖约束。例如 DeepChem 2.8.0 的发布元数据要求 Python ≥ 3.7 且 < 3.12,不能由“纯 Python 包”推断其支持任意解释器。

第二类约束来自框架、算子扩展与设备。PyTorch 的 CPU 构建和各 CUDA 构建不同;torch-scatter、torch-cluster 等扩展需要与相应 PyTorch 及 CUDA 构建匹配。运行 GPU 程序还要求驱动、运行时与 GPU 架构兼容。预构建包所需的 CUDA 运行库与本机用于编译的 CUDA toolkit 应分开核对:只有在源码构建或即时编译 CUDA 扩展时,才需要进一步检查编译器和 toolkit。找不到合适轮子时,pip 在存在源码包且配置允许的情况下可能尝试构建;二进制错配则可能表现为 undefined symbol 等导入错误。

第三类约束来自各项目声明和测试的版本范围。TorchDrug 安装文档写明 Python 3.7–3.10、PyTorch ≥ 1.8.0,并未声明 PyTorch ≤ 2.0;这也不等于任意后续 PyTorch 版本都经过验证。是否能与另一个项目共用环境,应检查两者的具体版本、扩展制品和测试结果,不能仅按发布时间判断。图 5.2-1 用少量版本组合说明环境选择过程,其中标记表示本节示例的选择状态,不构成官方支持矩阵。

排障时可依次记录 Python 版本与平台、安装包及其来源、PyTorch 版本与 CUDA 构建、GPU 驱动和完整错误信息,再区分安装阶段的候选缺失与运行阶段的加载或计算失败。python -m pip debug --verbose 可辅助查看支持的轮子标签;python -m pip check 可检查已安装包的声明依赖,但不能替代导入、算子和训练测试。

示例环境选择:着色格为历史实验候选,白格尚未核验,斜线格本例不采用;所有组合仍需核对官方要求与运行结果 示例环境选择:先确定用途,再核对兼容条件 这是配置规划示意,不是官方支持矩阵;着色不表示已完成运行验证 torch 2.0.x(2023) torch 2.4(2024) torch 2.7.x(2025) Python 3.9 Python 3.10 Python 3.11 Python 3.12 历史环境备选 本节示例起点 — 新实验的示例选项 旧实验的示例选项 尚未核验 本例不采用 本例历史环境候选 检查一 · 解释器与 ABI:核对 Python、ABI 和平台标签 检查二 · torch 与设备:区分 CPU / CUDA 构建,核对驱动要求 检查三 · 扩展包配对:按 torch 与 CUDA 构建选择扩展轮子 pip 会过滤轮子标签并求解声明依赖;未充分声明的二进制与设备条件仍需核验。 选定组合后完成导入、关键算子与最小训练测试,再记录版本、制品来源和平台条件。
图 5.2-1 示例环境选择。行列列出若干 Python 与 PyTorch 版本;着色格表示历史实验的候选配置,斜线格表示本例不采用,白格表示尚未核验。它们不表示官方支持或不支持,也不穷尽可能组合。TorchDrug 的已声明 Python 范围与本节选用 PyTorch 2.0.1 的示例应分别理解。实际配置还须核对依赖元数据、轮子标签、扩展构建和设备条件,并通过目标任务验证。

pip 的回溯解析(backtracking resolution)会根据依赖元数据搜索版本组合,同时考虑 Python 要求、环境标记及兼容轮子。它能够处理版本中的本地构建标识,但不会据此完整验证 GPU 驱动或执行所有算子。如果包未充分声明二进制配对要求,求解通过后仍可能发生运行错误;约束复杂时,回溯也可能耗时较长,或明确报告无解。应根据日志缩小候选范围、提供经过核验的约束和正确制品来源,随后执行运行测试。

环境管理也属于可复现性(reproducibility)设计。实验结果所依赖的主要因素可概括为:

\[\text{结果} = F(\text{代码与配置},\ \text{数据},\ \text{软件与硬件环境},\ \text{随机状态与执行过程})\]
(5.2-1)这是实验依赖关系的示意表达,不假定环境是可求导的连续变量,也不保证固定种子就能唯一确定执行过程。软件版本、浮点运算次序或未控制的并行行为都可能改变结果。环境漂移(environment drift)指升级、重装或配置变动使运行环境偏离已记录状态;其是否影响指标需要实际比较。Wilson et al.(2014,2017)关于科学计算实践的建议强调保留软件、数据与分析过程的记录。
习题 5.2-1

根据下列日志与背景,判断应优先检查哪类兼容约束,并各给出一条修复路径。说明仅凭日志还不能确认什么。

日志 A(import 时):ImportError: …/site-packages/rdkit/Chem/rdchem.so: undefined symbol;该环境上周刚把默认解释器从 3.10 换成 3.12,包未重装。

日志 B(import 时):ImportError: torch_scatter/_version.so: undefined symbol: _ZN2at…(截断);当前环境 torch 为 2.7.x,torch_scatter 是数月前装的。

日志 C(安装时):ERROR: Could not find a version that satisfies the requirement torch==2.0.1;解释器为 Python 3.12。

参考解答

A 优先检查解释器、扩展标签与动态库来源。更换解释器却保留旧包提示 ABI 或库路径错配,但 undefined symbol 本身不能证明扩展一定按 cp310 编译。可重建原版本环境,或在独立的 Python 3.12 环境中重新安装适配的 RDKit。B 优先核对 torch.__version__、torch.version.cuda 与扩展制品;截断符号提示 PyTorch 二进制接口问题,仍需完整日志确认。按官方索引重新选择配对扩展,随后测试实际算子。C 中 PyTorch 2.0.1 没有面向 CPython 3.12 的官方轮子;在索引与网络正常的前提下,pip 会过滤掉不兼容文件。保留旧框架时可新建 Python 3.10 或 3.11 环境;若任务允许升级框架,也可在新环境验证较新版本。若还要安装 TorchDrug 0.2.1,则其 Python 声明范围进一步排除 3.11。

5.2.2 隔离与锁定:一实验一环境

环境隔离(environment isolation)使不同实验使用独立的解释器与包目录,减少一次依赖更新对其他实验的影响。“一实验一环境”可理解为每套需要独立重建的依赖配置对应一个环境;共享同一已验证配置的实验也可引用相同环境规格。环境仍依赖宿主系统、驱动和外部文件,因此隔离本身不保证复现,也不是完整的系统隔离。

conda 或 mamba 可管理解释器及 Python、非 Python 依赖;pip 则在已有解释器中安装 Python 分发包,包括纯 Python 包和二进制轮子,来源也不限于 PyPI。混用时应先确定 conda 通道、解释器与拟由 conda 管理的包,再用环境内的 pip 安装其余依赖。后续若需修改 conda 部分,通常应更新规格并重建环境,避免两个包管理器反复替换同名文件。conda 通道(channel)是包的发布来源;使用 conda-forge 等通道时,应记录通道顺序、优先级和平台,不能仅保留包名。

conda / mamba:解释器与环境依赖

  • 创建独立环境,并选择 Python 解释器;
  • 可同时管理 Python 包与非 Python 依赖;
  • 记录通道、优先级、版本和构建信息;
  • CUDA toolkit 按编译需求选择,GPU 驱动另行管理。

pip:当前解释器内的分发包

  • 支持纯 Python 包、兼容轮子及源码构建;
  • 可使用包索引、指定链接、本地文件或版本库来源;
  • 通过 python -m pip 明确目标解释器;
  • 依赖求解完成后,仍需检查实际导入和计算。

环境记录应区分依赖规格、已安装版本快照与制品锁定,见表 5.2-1。文件名不决定精确度:requirements.txt 可以包含宽松约束,也可以列出精确版本;environment.yml 既可手写,也可由工具导出。应检查实际内容及生成方式,并将其与代码一起纳入版本管理。

表 5.2-1环境记录的内容与边界
文件记录内容精确度角色
requirements.txt依赖及版本约束;rdkit==2026.* 仍允许多个版本由内容决定作为安装输入;范围约束会在重建时重新求解
requirements-lock.txt(若由 pip freeze 生成)已安装分发包的版本快照;--all 可包含默认省略的安装工具版本快照不自动记录全部轮子哈希、索引、驱动或编译条件,不能仅凭文件名视为完整锁定
environment.yml通道、conda 依赖及可选的 pip 依赖;解释器与构建是否精确取决于导出方式环境规格用于重建;跨平台通常需重新求解并验证,同平台可补充 conda 制品的显式清单

pip freeze 报告当前安装状态,不执行新的依赖求解,也不自动生成完整的锁定文件(lock file)。若要求精确重建,应进一步固定传递依赖、制品来源和哈希,并使用安装器的哈希校验;conda 环境可另存 conda list --explicit 的同平台制品清单。显式清单不代替 pip 部分的记录。对同时出现在 conda 导出与 pip 快照中的包,应注明由谁安装,避免重建时无意重复覆盖。最后在新环境中实际重建,才能检查记录是否充分。

容器可以保存更多用户态依赖。使用镜像摘要引用具体镜像,并保留构建文件,有助于追踪运行条件;但宿主内核、GPU 驱动、硬件和外部数据通常仍在镜像之外。是否采用容器,应由部署方式、协作规模和复现目标决定,不能把镜像摘要等同于实验全部输入。

5.2.3 三套示例环境:基础分析、历史复现与图学习

表 5.2-2 按用途给出三套环境的配置起点,图 5.2-2 说明它们的隔离关系。以下命令假设已安装并初始化 conda,使用全新且未被占用的环境名;为统一二进制条件,以 Linux x86_64 或 WSL2 中的 Ubuntu 22.04/24.04 为示例平台。这些命令尚不构成全书实验的已验证锁定文件:安装后应补齐具体模型所需依赖,完成最小训练与评估,再导出完整记录。

环境名用于标识用途,版本文件用于标识实际配置。实验笔记中应同时记录环境名称、规格文件版本、平台和验证任务;只记录 mml-main 这样的名称,无法区分后续重建或修订得到的不同环境。

表 5.2-2三套示例环境的用途与版本选择
环境Python示例核心版本用途与待验证范围
mml-main(基础分析)3.11rdkit 2026.3.5、deepchem 2.8.0第 1–3 章基础表征与传统模型;深度模型需另配相应后端
torchdrug-arch(历史复现)3.10torch 2.0.1 CPU、torchdrug 0.2.1 及配对扩展第 4 章实现的导入与 CPU 小例起点;完整训练另行验证并锁定
pyg-lab(图学习)3.12torch 2.7.1 cu126、PyG 2.7.0;按需安装扩展5.1 节相关实践与新实验;要求匹配的 NVIDIA 设备和驱动

mml-main 选用 Python 3.11,符合 DeepChem 2.8.0 的 Python 声明范围。RDKit 2026.3.5 提供该解释器的 Linux x86_64 轮子,要求 glibc 2.28 或更高版本。DeepChem 主包安装并不自动提供所有可选深度学习后端;例如使用依赖 TensorFlow、PyTorch 或 JAX 的模型时,还需按模型文档选择对应版本。基础导入通过后,应至少运行一次所需的特征提取、数据划分和模型拟合。

# Linux x86_64 / WSL2:基础配置示例,尚未锁定全部传递依赖
conda create -n mml-main --override-channels -c conda-forge python=3.11 pip -y
conda activate mml-main
python -m pip install rdkit==2026.3.5 deepchem==2.8.0
python -m pip check
python -c "from rdkit import Chem; import deepchem as dc; assert Chem.MolFromSmiles('CCO') is not None; print(dc.__version__)"

torchdrug-arch 用于保留可追踪的历史实现。TorchDrug 0.2.1 发布于 2023 年 7 月,其安装文档未给出 PyTorch 2.0 上限;下例采用 2.0.1 CPU 版,只是一项便于说明扩展配对的选择。配对索引中,PyTorch 2.0.* 对应目录名 torch-2.0.0+cpu.html。旧 RDKit 扩展使用 NumPy 1.x 配置,并安装 TorchDrug 声明依赖的 rdkit-pypi,同一环境中不要再并装提供同名导入模块的 rdkit 分发包。TorchDrug 的部分功能会即时编译 C++ 扩展,运行前还应准备兼容的 C++ 编译器;下例的 CPU 配置不要求 CUDA toolkit。

# Linux x86_64 / WSL2,已有可用 C++ 编译器;CPU 配置起点
conda create -n torchdrug-arch --override-channels -c conda-forge python=3.10 pip -y
conda activate torchdrug-arch
python -m pip install numpy==1.23.5 scipy==1.10.1 setuptools==68.2.2 rdkit-pypi==2022.9.5
python -m pip install torch==2.0.1 --index-url https://download.pytorch.org/whl/cpu
python -m pip install torch-scatter==2.1.2+pt20cpu torch-cluster==1.6.3+pt20cpu --no-index -f https://data.pyg.org/whl/torch-2.0.0+cpu.html
python -m pip install torchdrug==0.2.1
python -m pip check
python -c "import torch, torch_scatter, torch_cluster; from torchdrug import data; print(torch.__version__, torch.version.cuda); print(data.Molecule.from_smiles('CCO'))"

上例固定了关键旧依赖和构建工具,但其余传递依赖仍需求解;这些选择既不是原论文的完整环境,也不保证第 4 章全部工作负载通过。若改用 GPU,应同时更换 PyTorch 构建和扩展索引,并核对驱动及即时编译所需的 CUDA toolkit。完成目标任务验证后,把完整版本、构建与测试记录保存为冻结环境(frozen environment)。修订时保留原记录,建立新版本环境并比较结果。

pyg-lab 以 PyTorch 2.7.1 的 CUDA 12.6 构建为例,需要支持该构建的 NVIDIA GPU 与驱动。PyG 基础用法可不安装额外的 C++/CUDA 扩展,具体算子、采样器或性能需求决定是否补充。若需要 torch-scatter,PyTorch 2.7.* 对应的官方扩展目录是 torch-2.7.0+cu126.html,其中的 2.7.0 不应机械替换为 2.7.1。没有符合条件的 GPU 时,可将 PyTorch 索引与扩展构建同时改为 CPU,并相应调整设备测试。

# Linux x86_64 / WSL2,已具备兼容 CUDA 12.6 构建的 NVIDIA 驱动与 GPU
conda create -n pyg-lab --override-channels -c conda-forge python=3.12 pip -y
conda activate pyg-lab
python -m pip install torch==2.7.1 --index-url https://download.pytorch.org/whl/cu126
python -m pip install torch_geometric==2.7.0
# 仅在目标程序需要 torch-scatter 时执行下一行
python -m pip install torch-scatter==2.1.2+pt27cu126 --no-index -f https://data.pyg.org/whl/torch-2.7.0+cu126.html
python -m pip check
python -c "import torch, torch_geometric; print(torch.__version__, torch.version.cuda); assert torch.cuda.is_available(); x = torch.ones(2, device='cuda'); print((x + x).cpu())"
三套示例环境:基础分析、历史复现与图学习;各自维护解释器和包目录,宿主系统、硬件与驱动仍需记录 一台机器,三套环境:分别维护解释器与依赖 以下为配置示例;隔离减少包更新的相互影响,具体任务仍需运行验证 基础分析 mml-main Python 3.11 rdkit 2026.3.5 deepchem 2.8.0(pip 安装) 深度模型需另配后端 第 1–3 章 · 基础分析 torchdrug-arch Python 3.10(示例选择) torch 2.0.1 CPU + 扩展 torchdrug 0.2.1(2023 发布) 验证后保存完整环境记录 第 4 章 · CPU 小例起点 历史 图学习 pyg-lab Python 3.12 torch 2.7.1 cu126 PyG 2.7.0 + 按需扩展 装前先查版本配对表 5.1 生态 · 后续课题 × 独立管理 × 独立管理 共享条件:主机系统与硬件 · GPU 驱动(WSL2 使用 Windows 侧驱动) 分别保存环境规格、包版本与制品来源,并记录宿主平台条件 在独立环境验证更新,保留旧记录;复现结论以重建后的任务测试为依据。
图 5.2-2 三套示例环境的隔离结构。各环境维护自己的解释器、pip 与包目录;主机系统、硬件、驱动及外部数据仍可能共享。中间环境用于历史实现的验证与归档,右侧环境用于独立探索新的依赖配置。分开管理的理由是便于控制变更和追踪结果,无需假定不同用途的依赖必然不兼容。
警示

已有环境中的依赖变更。安装 TorchDrug 不会因其声明而必然把 PyTorch 降到 2.0.x;在本节 Python 3.11 的基础环境中,TorchDrug 0.2.1 首先就不满足 Python 版本要求。一般而言,pip 会根据本次安装请求与可用元数据选择依赖,可能升级、降级或拒绝安装。变更前应保存环境记录,在副本或新环境中检验。不要通过复制 site-packages 或修改搜索路径来借用另一个环境的包,这会绕过依赖与制品检查,尤其容易引入二进制错配。

习题 5.2-2

什么时候适合为历史项目保留冻结环境,什么时候适合迁移到另一套工具?给出至少三条判据,并以 TorchDrug 为例说明如何同时保留复现基线与开展新实验。若考虑 Graphium 或 PyG,应核对哪些功能差异?

参考解答

第一,实验目的:核对历史实现时优先保留已有代码与可用环境,新实验则根据功能需求评估工具。第二,迁移成本:检查数据结构、特征定义、模型与损失、训练器、扩展算子和检查点格式,不能仅依据包龄或纯 Python 属性估计成本。第三,维护条件:比较文档、测试、目标平台支持和团队维护能力。第四,验证预算:迁移需要固定数据与评价协议,对关键输出开展数值或统计比较。Graphium 的官方定位是分子图多任务学习库,不能据此称为 TorchDrug 的官方后继,也不能假定它完整替代生成模块。可保留一份可重建的 TorchDrug 基线,在新环境验证 Graphium、PyG 或其他实现适用的任务;记录每项差异,并用预先约定的验收标准判断迁移是否完成。

5.2.4 Windows 与 WSL2:按工作负载选择平台

WSL2(Windows Subsystem for Linux 2)在轻量虚拟机中运行 Linux 内核和发行版,可用于依赖 Linux 脚本、系统库或编译工具的工作流。它与原生 Linux 的使用方式有许多共同点,但仍有虚拟化、文件系统和设备支持差异,环境测试需要注明平台。CUDA on WSL 通过 Windows 侧的 NVIDIA 驱动提供 GPU 支持;按 NVIDIA 文档配置时,不应在 WSL 内再安装 Linux 显示驱动。需要编译 CUDA 扩展时,应另选适合 WSL 的 toolkit 安装方式。WSLg 用于 Linux 图形应用,并非训练程序使用 GPU 的前提。

注记

文件系统边界。通过 /mnt/c 从 WSL 访问 Windows 文件,属于跨界 I/O(cross-filesystem I/O),其开销随文件数量、访问方式和系统配置而变,不能统一概括为固定倍数。Microsoft 建议 Linux 命令行项目优先放在 Linux 文件系统中,例如 ~/projects;主要由 Windows 工具处理的项目则放在 Windows 文件系统。Windows 可通过 \\wsl$ 访问 WSL 文件,也可使用支持 WSL 的编辑器连接方式。

原生 Windows 也可用于 RDKit、PyTorch 和多种 PyG 工作负载,这些项目提供相应的 Windows 轮子或安装路径。是否使用 WSL2,应检查目标版本、CPU 架构、扩展编译条件、脚本和部署平台。TorchDrug 官方文档也包含 Windows 安装说明,其中即时编译需要额外配置 Visual Studio 工具链。已有工作负载在 Windows 上通过验证时,无需仅因它含二进制扩展而迁移。

在 WSL2 中,可由发行版包管理器安装系统依赖,由独立 conda 环境管理实验用 Python 栈。日常包安装使用当前环境的 python -m pip,避免以 sudo pip 修改系统解释器。编译器、环境变量、缓存路径及 WSL 版本也应记录,尤其是在与原生 Linux 结果比较时。

本节安装条件与示例版本依据 2026 年 9 月 5 日查阅的官方资料整理。重建历史实验时保留其原始规格;建立新环境时重新核对下载文件、依赖范围和设备要求,并注明检查日期。

5.2.5 复现清单:把环境纳入实验记录

复现应先约定比较标准:检查点或输出逐位一致、关键数值在给定容差内一致,或多次独立运行的指标满足预先规定的统计标准。PyTorch 不保证跨版本、平台或 CPU/GPU 的完全一致,即使使用相同种子。随机状态记录应覆盖实际调用的随机数生成器:Python random、NumPy 全局生成器及单独创建的 Generator、PyTorch 生成器,以及数据加载工作进程。torch.manual_seed 可设置 CPU 与 CUDA 的种子;DataLoader 的生成器和 worker_init_fn 则应结合加载逻辑配置。

确定性(determinism)需要在指定环境与操作范围内讨论。torch.use_deterministic_algorithms(True) 会为所覆盖的操作选用确定性实现,或在已知非确定且无替代实现时报告错误;它不控制所有第三方扩展与外部随机源。torch.backends.cudnn.benchmark = False 可固定卷积算法选择过程,但算法本身是否确定仍须检查;部分 CUDA 操作还需要按文档设置 CUBLAS_WORKSPACE_CONFIG。无法消除的非确定性应记录,并纳入结果比较方案。

固定种子、控制执行条件和记录依赖版本分别减少不同来源的差异,任何一项都不能单独保证复现。验证应覆盖当前机器上的重复运行与独立环境的重建,并保留失败日志。若改动软件或硬件,先重新运行基线,确认差异是否超过约定容差,再解释方法改进。

数据记录应包含版本、原始文件哈希、预处理代码与参数,以及实际训练、验证和测试集合的成员。MoleculeNet 加载流程中的划分器与种子只有在数据、顺序和实现一致等条件下才可能重现同一划分,因此直接保存划分文件更便于核验。使用 ChEMBL 等数据库时应注明具体 release。每个运行目录还应记录代码提交及未提交改动、配置、数据与划分清单、环境规格和平台信息,使结果能够追溯到对应输入。

全流程验证应在新目录和独立环境中进行,并指定单独的缓存位置或禁用复用已有预处理产物,保留原实验文件。先完成导入和关键算子检查,再从明确的数据版本运行最小训练、评估及所需的完整实验。重建成功说明该路径经过检验,但不证明所有平台、隐藏依赖或随机条件都已覆盖;对失败应保存日志并修订复现说明。

可重运行的程序也可能包含数据泄漏。Kapoor 与 Narayanan(2023)讨论了泄漏对机器学习科学结论的影响;3.8 节已介绍相关检查方法。环境验证关注计算过程能否重建,泄漏审查关注评价是否使用了不应获得的信息,两者都需要纳入实验审核。

式 (5.2-1) 提醒我们将影响结果的条件显式记录。环境隔离便于控制变更,版本与制品记录便于重建,任务测试则提供实际证据。进入 5.3 节的数据和方法陷阱检查时,仍应保留环境排查路径,不能仅凭完成清单就排除环境因素。

方法

复现清单(发表前逐项核对)。① 随机状态:记录实际使用的生成器、种子与工作进程初始化;② 比较标准:明确数值容差或统计要求,记录确定性设置与例外;③ 数据版本:保存来源、版本、预处理、文件哈希和实际划分;④ 环境记录:保存解释器、包版本、制品来源、构建条件、驱动与硬件,区分版本快照和制品锁定;⑤ 结果追溯:每次运行保存代码、配置、数据、划分及环境记录的标识;⑥ 重建验证:使用新目录、独立环境与单独缓存,完成约定工作负载并保存日志;⑦ 泄漏审查:结合 3.8 节检查特征、划分、调参与评价过程。

习题 5.2-3

为“复现 GraphAF 类生成实验”设计复现包的目录结构,列出关键文件,并说明环境规格、数据清单和结果目录如何关联。区分原论文实现与其他库的实现,给出一项重建后的验收标准。

参考解答

目录结构建议:

  • graphaf-repro/(仓库根)
  • envs/——environment.yml、包版本快照、制品来源与哈希清单,以及平台和编译说明;
  • data/——manifest.csv(来源、数据版本、下载日期、SHA-256)、下载与预处理脚本;使用 ZINC 子集时明确具体文件与筛选规则;
  • splits/——实际划分文件及其哈希,并记录划分器、参数与种子;
  • src/——实现源码与上游提交说明;configs/ 保存训练和评价参数;
  • results/run-001/——该次运行的配置副本、日志、指标、样本、检查点及 PROVENANCE 文件。

运行开始时,将代码提交、未提交补丁、配置与清单哈希写入 PROVENANCE,并保存种子、设备、驱动和启动命令。明确实现来自 GraphAF 原仓库还是 TorchDrug 等重实现,不能把后者的环境配置视为原论文环境。哈希用于确认记录和制品身份,重建还依赖对应文件能够取得;哈希不一致时应查明输入差异,而非直接断言实验必然不可复现。验收可规定:在同一数据和评价代码下,固定配置的最小训练能完成,生成有效率与目标指标落在预先约定的数值容差或多次运行区间内,并保留比较报告。


关键术语

可复现性 (reproducibility)
依据已记录的输入与过程重建实验,并满足预先约定的数值或统计比较标准。
依赖地狱 (dependency hell)
多组依赖约束难以同时满足,或声明范围不足以反映实际运行条件的情形。
应用二进制接口 (application binary interface, ABI)
二进制模块间的接口约定;普通 CPython 扩展通常需匹配次版本,Stable ABI 提供规定范围内的跨版本兼容。
轮子 (wheel)
Python 预构建分发格式,可包含纯 Python 代码或二进制扩展;安装器依据 Python、ABI 和平台标签选择候选。
环境漂移 (environment drift)
升级、重装或配置变动使运行环境偏离已记录状态,可能影响程序行为与数值结果。
环境隔离 (environment isolation)
为不同依赖配置建立独立解释器与包目录,减少变更的相互影响;宿主条件仍需记录。
锁定文件 (lock file)
固定依赖解析结果及所需制品信息的文件;pip freeze 的版本快照不自动具备完整制品锁定信息。
conda 通道 (channel)
conda 包的发布来源;环境记录应包含使用的通道、顺序及优先级设置。
冻结环境 (frozen environment)
保留已验证版本与制品记录的环境配置;需要修改时建立新版本并保留原基线。
跨界 I/O (cross-filesystem I/O)
跨 Windows 与 WSL 文件系统进行读写;性能影响取决于访问模式与系统配置。
确定性 (determinism)
在明确输入与执行条件下产生相同输出的性质;需说明适用操作、平台和已知例外。
回溯解析 (backtracking resolution)
依赖求解器在发现冲突后撤销候选选择并继续搜索的策略,复杂约束可能增加求解成本。

参考文献与延伸阅读

  1. Wilson G, Aruliah DA, Brown CT, et al. 2014. Best practices for scientific computing. PLoS Biology 12(1): e1001745.
  2. Wilson G, Bryan J, Cranston K, Kitzes J, Nederbragt L, Teal TK. 2017. Good enough practices in scientific computing. PLoS Computational Biology 13(6): e1005510.
  3. Kapoor S, Narayanan A. 2023. Leakage and the reproducibility crisis in machine-learning-based science. Patterns 4(9): 100804.
  4. RDKit. Installation. RDKit Documentation, rdkit.org/docs/Install.html;RDKit 2026.3.5 发布文件与rdkit-pypi 2022.9.5 发布文件(平台标签核对).
  5. DeepChem. Getting Started: Installation. DeepChem Documentation, deepchem.io;DeepChem 2.8.0 发布元数据(Python 版本要求).
  6. PyTorch Geometric 团队. Installation. PyTorch Geometric 2.7.0 Documentation;扩展索引:PyTorch 2.0 CPU、PyTorch 2.7 CUDA 12.6.
  7. pip 开发组. Dependency Resolution、pip freeze、Secure installs. pip Documentation.
  8. Microsoft. Working across Windows and Linux file systems. Windows Subsystem for Linux Documentation.
  9. TorchDrug 团队. Installation. TorchDrug 0.2.1 Documentation;发布元数据与依赖声明.
  10. Python 开发组. C API Stability;PyPA. Platform compatibility tags.
  11. PyTorch 团队. Previous PyTorch Versions;Reproducibility. PyTorch Documentation.
  12. conda 开发组. Managing environments(官方文档源文件).
  13. NVIDIA. CUDA on WSL User Guide;NumPy 开发组. Troubleshooting(NumPy 2.0 ABI 兼容问题).
  14. Graphium 开发组. Graphium Documentation(项目定位与功能范围). 本节软件资料查阅日期:2026-09-05.