第二章:环境搭建 —— 把工具箱先摆好

做计算化学与机器学习交叉的管线,第一件事不是写代码,而是搭环境。我在这个领域折腾了几年,踩过的坑有一半都出在环境不一致上。明明自己本地跑得好好的,换台机器就崩,这感觉你想想看,多憋屈。

这一章咱们就把 Python、RDKit、PyTorch、DLPack 这几样核心工具装好,并且验证它们能正常协作。我会把一些常见的坑提前指出来,帮你省掉半夜 debug 的时间。

2.1 为什么我先推荐 Miniconda

Python 版本混乱,包依赖经常打架。我个人习惯用 Miniconda 来管理环境,因为它既能隔离 Python 版本,又能控制 CUDA 驱动级别的兼容性。你可能会问:“直接用 pip 不行吗?” 行,但 conda 在处理 RDKit 这种带 C++ 后端的库时省心很多。

提示: 如果你已经装了 Anaconda,也没问题。但 Miniconda 更轻量,我建议用它。下载地址我就不贴了,官网找一下就行。

安装好 Miniconda 后,创建一个干净的环境:

conda create -n drug_pipeline python=3.10
conda activate drug_pipeline

Python 3.10 是目前 RDKit 和 PyTorch 兼容性最好的版本。我试过 3.11,个别包还在适配,没必要冒风险。

2.2 安装 RDKit —— 化学家的瑞士军刀

RDKit 是处理分子结构的基础库。我们在管线里要用它读 SDF、画分子、计算指纹。你不装 RDKit,后面的配体处理全都白搭。

安装 RDKit 最靠谱的方式是用 conda:

conda install -c conda-forge rdkit

不要用 pip 直接装,除非你特别清楚自己在做什么。我曾经图省事用 pip 装了一个版本,结果到 Mac 上 segfault,查了两天才发现是编译时的 OpenSSL 版本不符。conda 会帮你处理这些底层链接。

装完验证一下:

python -c "from rdkit import Chem; print(Chem.MolFromSmiles('CCO'))"

如果能输出一个分子对象信息(不是 None),就对了。如果报错,大概率是 GCC 版本或 libcxx 问题,换 conda 源重装试试。

2.3 安装 PyTorch —— 选 CPU 还是 GPU?

PyTorch 是整个管线里负责深度学习的引擎。这里有个关键选择:你要用 GPU 吗?

如果你手头有 NVIDIA 显卡,且安装了 CUDA 驱动,那我强烈建议装 GPU 版本。蛋白配体预测的模型往往要训练几百个 epoch,哪怕只用 CPU 推断,一个 batch 也可能慢到怀疑人生。

GPU 版本的安装命令(以 CUDA 11.8 为例):

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

如果你没有 GPU,或者想先在笔记本上跑跑原型,那就装 CPU 版:

conda install pytorch torchvision torchaudio cpuonly -c pytorch

装完一定要验证一下:

python -c "import torch; print(torch.__version__); print('CUDA available:', torch.cuda.is_available())"
场景 推荐命令 备注
有 GPU(CUDA 11.8) conda install ... pytorch-cuda=11.8 记得先查 nvidia-smi 确认驱动版本
有 GPU(CUDA 12.x) conda install ... pytorch-cuda=12.1 PyTorch 2.x 已支持
无 GPU / 仅 CPU conda install ... cpuonly 训练会很慢,但能跑
警告: 千万别用 pip 装 PyTorch 再装 cudatoolkit,两者版本不匹配会导致“CUDA error: device-side assert triggered”这种幽灵错误。直接用 conda 一条命令搞定最稳。

2.4 DLPack —— 打通张量传输的桥梁

DLPack 不是给所有人用的,但在我们的管线里它很重要。为什么?因为我们要在 PyTorch、RDKit(通过其他工具)甚至未来可能用到的 TensorFlow 之间共享张量。DLPack 提供了一个标准的内存布局,让不同框架之间零拷贝交换数据。

安装很简单:

conda install -c conda-forge dlpack

或者用 pip:

pip install dlpack

装完后做个基本测试:

python -c "import dlpack; print(dlpack.__version__)"

在实际管线中,我们会把 PyTorch 模型输出的特征张量通过 DLPack 转化成其他框架能理解的格式,从而调用不同的评分函数。这个用法后面章节会展开,现在先确保它能被 import 就行。

2.5 其他辅助工具

除了上面三个主角,还有几个小工具会让开发更顺手:

  • numpy —— 数值计算基础,conda 会自动装,但显式装一下没坏处。
  • scipy —— 后面做聚类、距离矩阵时用。
  • matplotlib / seaborn —— 画损失曲线、ROC 图。
  • pandas —— 处理 CSV/TSV 数据,尤其是 binding 数据表。
  • tqdm —— 进度条,跑批量训练时你会感谢它。

一行命令全装:

conda install numpy scipy matplotlib seaborn pandas tqdm

2.6 整体验证 —— 跑一个小例子

环境搭没搭好,跑个简单的端到端测试最放心。我们来读一个分子,用 PyTorch 算个随机特征,再验证 DLPack 能把它转一下。

from rdkit import Chem
from rdkit.Chem import AllChem
import torch
import dlpack

# 读一个分子(咖啡因)
mol = Chem.MolFromSmiles('CN1C=NC2=C1C(=O)N(C(=O)N2C)C')
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=2048)

# 转成 numpy,再转成 PyTorch 张量
import numpy as np
fp_np = np.array(fp, dtype=np.float32)
fp_tensor = torch.from_numpy(fp_np)

# 通过 DLPack 交换(演示用)
# 实际 dlpack 的 API 依赖具体版本,这里只验证 import 成功
print("RDKit:", Chem.MolToSmiles(mol))
print("Torch tensor shape:", fp_tensor.shape)
print("DLPack imported:", hasattr(dlpack, '__version__'))

如果这段代码没报错,恭喜你,核心管线环境已经跑通了。

2.7 环境搭建总体流程

我把整个环境搭建的逻辑画成了一张图,方便你对照检查哪个环节漏了。

环境搭建流程 ① Miniconda + 环境 ② RDKit (conda-forge) ③ PyTorch (CPU/GPU) ④ DLPack ⑤ numpy/scipy/... ⑥ 综合测试脚本 关键提示 • 先装 Miniconda,再依次装各包,不要调换顺序 • PyTorch GPU 版本一定要和 CUDA 驱动匹配 • RDKit 用 conda-forge 源最稳,不要用 pip • 装完后一定跑一次“整体验证”脚本,确认无报错 • 如果遇到编译错误,优先考虑升级 conda 版本
我的心得: 环境搭建这一步,90% 的失败都源于 conda 和 pip 混用,或者 CUDA 版本对不上。你严格按照上面的顺序走,一次成功的概率很高。如果卡住了,不要硬扛,直接删掉环境重新来,比无头绪 debug 快得多。