请访问我们的网站以获取有关这项工作的更多信息。
该存储库包含论文“从分子到材料:预训练原子属性预测的大型通用模型”的代码。
该存储库已弃用,不再积极维护。我们目前正在努力将该存储库的功能集成到官方 Open Catalyst 项目存储库中。如果您对此存储库有任何疑问或疑虑,请随时创建 github 问题或通过电子邮件与我们联系。请发送电子邮件给 Nima Shoghi 和 CC Brandon Wood。
在这项工作中,我们引入了联合多域预训练(JMP),这是一种有监督的预训练策略,可同时对来自不同化学领域的多个数据集进行训练,将每个数据集视为多任务框架内的唯一预训练任务。我们的组合训练数据集由来自 OC20、OC22、ANI-1x 和 Transition-1x 的约 1.2 亿系统组成。
这项工作的主要贡献是:
我们通过评估 JMP 在涵盖小分子、大分子和材料的各种基准套件中的微调性能,展示了 JMP 强大的泛化能力。 JMP 始终优于从头开始的训练,并在 40 个微调基准中的 34 个上设置或匹配最先进的水平。
我们证明,JMP 可以有效地扩展到更大的模型,如果在小型数据集上从头开始训练,这些模型通常会过度拟合。预训练充当强大的正则化器,使我们能够训练具有 2.35 亿个参数的模型,该模型在多个低数据基准上设置了新的最先进的性能。
我们对 JMP 的计算要求进行了详细分析。虽然前期成本高昂,但我们发现,与从头开始的训练相比,JMP 的微调速度快了 12 倍,因此可以收回预训练成本。
通过根据不同的化学数据对大型模型进行预训练,我们相信 JMP 代表了朝着化学通用机器学习潜力目标迈出的重要一步。可用数据和计算能力的持续增长只会提高 JMP 学习可转移原子表示的能力。
JMP 与从头开始的训练相比,平均提高了 59%,并且在 40 项任务中的 34 项上达到或达到了最先进水平。我们的工作强调了预训练策略的潜力,这些策略利用不同的数据来推进跨化学领域的特性预测,特别是对于低数据任务。
首先,克隆存储库并导航到根目录:
git clone https://github.com/facebookresearch/JMP.git
cd JMP
然后,设置 conda 环境,如environment.yml
文件中提供的那样。为此,请运行以下命令(注意:如果安装了conda
,请将其替换为mamba
):
conda env create -f environment.yml -n jmp
如果上述命令失败,您可以自己手动创建环境:
# Create the environment
conda create -n jmp python=3.11
conda activate jmp
# Install PyTorch
conda install -y -c pytorch -c nvidia pytorch torchvision torchaudio pytorch-cuda=12.1
# Install PyG, PyTorch Scatter, PyTorch Sparse.
conda install -c pyg pyg pytorch-sparse pytorch-cluster
# Install other conda dependencies
conda install -y
-c conda-forge
numpy matplotlib seaborn sympy pandas numba scikit-learn plotly nbformat ipykernel ipywidgets tqdm pyyaml networkx
pytorch-lightning torchmetrics lightning
einops wandb
cloudpickle
" pydantic>2 "
frozendict wrapt varname typing-extensions lovely-tensors lovely-numpy requests pytest nbval
# Install pip dependencies
pip install lmdb
# Install dependencies for materials datasets
pip install ase
# Install dependencies for large molecule datasets
conda install h5py
# Install MatBench dependencies
pip install matbench
# Install dependencies for PDBBind
pip install biopython rdkit
# Install dependencies for pre-processing ANI1x/Transition1x
pip install multiprocess
然后,激活环境:
conda activate jmp
最后,安装当前包如下:
pip install -e .
该代码现在可以使用了。有关如何运行代码的示例,请参阅configs
目录中的配置文件。
由于大小限制,用于预训练和微调的数据不包含在该存储库中。不过,下面提供了下载和预处理 OC20、OC22、ANI-1x、Transition-1x、QM9、rMD17、MatBench、QMOF、SPICE 和 MD22 数据集的说明。
要下载 ANI-1x 数据集并将其转换为我们的代码库可以使用的格式,请按照以下步骤操作:
mkdir -p /path/to/datasets/ani1x
cd /path/to/datasets/ani1x
.h5
格式): wget https://springernature.figshare.com/ndownloader/files/18112775 -O ani1x-release.h5
python -m jmp.datasets.scripts.ani1x_preprocess.ani1x_splits --input_file ani1x-release.h5 --train_keys_output train_keys.pkl --val_keys_output val_keys.pkl --test_keys_output test_keys.pkl
.traj
文件(将--num_workers
设置为可用的 CPU 核心数): mkdir -p traj
mkdir -p traj/train traj/val traj/test
python -m jmp.datasets.scripts.ani1x_preprocess.ani1x_write_traj --ani1x_h5 ani1x-release.h5 --split_keys train_keys.pkl --split train --traj_dir traj/train --num_workers 32
python -m jmp.datasets.scripts.ani1x_preprocess.ani1x_write_traj --ani1x_h5 ani1x-release.h5 --split_keys val_keys.pkl --split val --traj_dir traj/val --num_workers 32
python -m jmp.datasets.scripts.ani1x_preprocess.ani1x_write_traj --ani1x_h5 ani1x-release.h5 --split_keys test_keys.pkl --split test --traj_dir traj/test --num_workers 32
.traj
文件转换为.lmdb
文件: mkdir -p lmdb
mkdir -p lmdb/train lmdb/val lmdb/test
python -m jmp.datasets.scripts.ani1x_preprocess.ani1x_write_lmdbs --data_path traj/train --out_path lmdb/train --split train --num_workers 32
python -m jmp.datasets.scripts.ani1x_preprocess.ani1x_write_lmdbs --data_path traj/val --out_path lmdb/val --split val --num_workers 32
python -m jmp.datasets.scripts.ani1x_preprocess.ani1x_write_lmdbs --data_path traj/test --out_path lmdb/test --split test --num_workers 32
python -m jmp.datasets.scripts.ani1x_preprocess.ani1x_linear_ref linref --src lmdb/train --out_path linref.npz
python -m jmp.datasets.scripts.ani1x_preprocess.ani1x_linear_ref compute_mean_std --src lmdb/train --linref_path linref.npz --out_path mean_std.pkl
要下载 Transition-1x 数据集并将其转换为我们的代码库可以使用的格式,请按照以下步骤操作:
mkdir -p /path/to/datasets/transition1x
cd /path/to/datasets/transition1x
.h5
格式): wget https://figshare.com/ndownloader/files/36035789 -O transition1x-release.h5
.traj
文件(将--num_workers
设置为可用的 CPU 核心数): mkdir -p traj
mkdir -p traj/train traj/val traj/test
python -m jmp.datasets.scripts.transition1x_preprocess.trans1x_write_traj --transition1x_h5 transition1x-release.h5 --split train --traj_dir traj/train --num_workers 32
python -m jmp.datasets.scripts.transition1x_preprocess.trans1x_write_traj --transition1x_h5 transition1x-release.h5 --split val --traj_dir traj/val --num_workers 32
python -m jmp.datasets.scripts.transition1x_preprocess.trans1x_write_traj --transition1x_h5 transition1x-release.h5 --split test --traj_dir traj/test --num_workers 32
.traj
文件转换为.lmdb
文件: mkdir -p lmdb
mkdir -p lmdb/train lmdb/val lmdb/test
python -m jmp.datasets.scripts.transition1x_preprocess.trans1x_write_lmdbs --data_path traj/train --out_path lmdb/train --split train --num_workers 32
python -m jmp.datasets.scripts.transition1x_preprocess.trans1x_write_lmdbs --data_path traj/val --out_path lmdb/val --split val --num_workers 32
python -m jmp.datasets.scripts.transition1x_preprocess.trans1x_write_lmdbs --data_path traj/test --out_path lmdb/test --split test --num_workers 32
python -m jmp.datasets.scripts.transition1x_preprocess.trans1x_linear_ref linref --src lmdb/train --out_path linref.npz
python -m jmp.datasets.scripts.transition1x_preprocess.trans1x_linear_ref compute_mean_std --src lmdb/train --linref_path linref.npz --out_path mean_std.pkl
python -m jmp.datasets.finetune.rmd17 download --destination /path/to/datasets/rmd17/
python -m jmp.datasets.finetune.qm9 download --destination /path/to/datasets/qm9/
python -m jmp.datasets.finetune.md22 download --destination /path/to/datasets/md22/
python -m jmp.datasets.finetune.spice download --destination /path/to/datasets/spice/
python -m jmp.datasets.finetune.mat_bench download --destination /path/to/datasets/matbench/
python -m jmp.datasets.finetune.qmof download --destination /path/to/datasets/qmof/
预训练的检查点可从以下链接下载:
我们的代码库被设计为基于Python。要训练模型,您需要创建一个指定模型、数据集和训练参数的配置文件。这些配置对象使用 Pydantic 进行了全面的类型检查和验证。
创建配置对象后,您可以使用jmp.lightning.Runner
类来包装训练循环。有关如何微调模型的示例,请参阅configs/jmp_l_finetune.ipynb
。
大多数 JMP 都是 CC-BY-NC 许可的,如LICENSE
文件中所示。但是,该项目的部分内容可根据单独的许可条款使用:
如果您在研究中使用此代码,请引用以下论文:
@article{shoghi2023molecules,
title={From molecules to materials: Pre-training large generalizable models for atomic property prediction},
author={Shoghi, Nima and Kolluru, Adeesh and Kitchin, John R and Ulissi, Zachary W and Zitnick, C Lawrence and Wood, Brandon M},
journal={arXiv preprint arXiv:2310.16802},
year={2023}
}