©️ 版权所有 2023 @ 作者
作者:
周耕墨 📨
日期:2024-7-24
Licenses:这个Bohrium笔记本使用Uni-Mol模型参数,其输出内容遵循创作共用署名 4.0 国际 (CC BY 4.0) 许可协议。您可以在以下网址找到详细信息:http://creativecommons.org/licenses/by-nc-sa/4.0
快速开始:点击上方的 开始连接 按钮,选择unimol-docking:pytorch1.12.1-cuda11.6镜像和GPU机器开始使用,最便宜的就可以。
背景
关于Uni-Mol
Uni-Mol是由深势科技在2022年5月发布的基于分子结构的通用三维分子表示学习框架。Uni-Mol包含两个预训练模型,它们都采用相同的SE(3) Transformer架构:一个是通过209M分子构象预训练的分子模型;另一个是通过300万候选蛋白质口袋数据预训练的口袋模型。
利用三维结构信息并结合有效的预训练方案使得Uni-Mol在14/15个分子属性预测任务中超越了之前最佳的方法。尤其是Uni-Mol在三维空间相关任务中表现出色,包括蛋白质-配体结合姿态预测、分子构象生成等。该论文已被顶级机器学习会议ICLR 2023接受。
关于PoseBusters
PoseBusters是一个Python包,它使用知名的化学信息学工具包RDKit执行一系列标准的质量检查。只有那些通过这些检查并预测出类似天然的结合模式的方法,才应被视为具有“最先进”的性能。
PoseBusters基准集是一组新的、精心挑选的、公开可用的来自PDB的晶体复合物。它是一组多样化的、最近的高质量蛋白质-配体复合物,包含类药分子。它只包含自2021年以来发布的复合物,因此不包含PDBbind通用集v2020中的任何复合物,后者被用来训练Uni-Mol。
运行前准备:
环境
- 基础 Docker 镜像:
dptechnology/unicore:latest-pytorch1.12.1-cuda11.6-rdma
- 其他依赖项:RDKit 和 BioPandas:
rdkit==2022.9.3
biopandas==0.4.1
- 数据:
PoseBusters
和Astex
的蛋白质 pdf 文件和配体 sdf 文件
代码、数据和模型
Commit: b962451 (b962451a019e15363bd34b3af9d3a3cd02330947)
项目路径:
/workspace/Uni-Mol
数据路径:
/workspace/Uni-Mol/eval_sets
模型路径:
/workspace/Uni-Mol/ckp/binding_pose_220908.pt
(可从github仓库下载)
运行
导入模块
数据预处理函数,用于生成 lmdb
文件
配体准备
从 sdf 文件中获取分子,并使用 RDKit 为其生成 100 个构象。然后,通过 k-means 将这些构象聚类为 10 个,并将它们作为模型的初始输入。
蛋白质准备
蛋白质口袋残基是指与任何配体晶体结构的重原子相距 6 Å 以内的残基。然后,从这些残基中提取原子,并过滤掉金属和稀有元素原子,以获得模型输入的口袋原子。
从蛋白质 pdb
文件和配体 sdf
文件生成模型输入的 lmdb
文件
数据描述 eval_sets
PoseBusters数据(428条)和Astex数据(85条)分别存储在
eval_sets
下的posebusters
和astex
文件夹中。同一目录下的parse_protein.py
脚本用于处理下载的原始pdb和sdf文件。在
posebusters
目录中,蛋白质和配体文件夹分别存储运行parse_protein
脚本后处理过的pdb
和sdf
文件。pdb文件的命名格式为{pdb_code}.pdb
,sdf文件的命名格式为{pdb_code}_{lig_code}.sdf
。posebuster_set_meta.csv
文件包含了PoseBusters基准测试中每条数据的pdb code、ligand code和相应的下载网址。原始数据通过这些网址从PDB下载。Astex的数据目录结构与PoseBusters类似。
这里为了方便演示,选择前两个复合物
Example of meta_info content: pdb_code lig_code prot_url \ 0 5S8I 2LY https://files.rcsb.org/download/5S8I.pdb lig_url \ 0 http://ligand-expo.rcsb.org/files/2/2LY/isdf/5... ligs 0 <rdkit.Chem.rdchem.Mol object at 0x172fc16c0> pdb code: ['5S8I', '5SAK'] lig code: ['2LY', 'ZRY'] Start preprocessing data... Number of systems: 2 2it [00:03, 1.58s/it] Total num: 2, Success: 2, Failed: 0 Done!
2024-07-23 18:59:12 | INFO | unimol.inference | loading model(s) from /workspace/Uni-Mol/ckp/binding_pose_220908.pt 2024-07-23 18:59:12 | INFO | unimol.tasks.docking_pose | ligand dictionary: 30 types 2024-07-23 18:59:12 | INFO | unimol.tasks.docking_pose | pocket dictionary: 9 types 2024-07-23 18:59:16 | INFO | unimol.inference | Namespace(activation_dropout=0.0, activation_fn='gelu', adam_betas='(0.9, 0.999)', adam_eps=1e-08, all_gather_list_size=16384, allreduce_fp32_grad=False, arch='docking_pose', attention_dropout=0.1, batch_size=8, batch_size_valid=8, bf16=False, bf16_sr=False, broadcast_buffers=False, bucket_cap_mb=25, conf_size=10, cpu=False, curriculum=0, data='/workspace/Uni-Mol/posebuster', data_buffer_size=10, ddp_backend='c10d', delta_pair_repr_norm_loss=-1.0, device_id=0, disable_validation=False, dist_threshold=8.0, distributed_backend='nccl', distributed_init_method=None, distributed_no_spawn=False, distributed_num_procs=1, distributed_port=-1, distributed_rank=0, distributed_world_size=1, dropout=0.1, ema_decay=-1.0, emb_dropout=0.1, empty_cache_freq=0, encoder_attention_heads=64, encoder_embed_dim=512, encoder_ffn_embed_dim=2048, encoder_layers=15, fast_stat_sync=False, find_unused_parameters=False, finetune_mol_model=None, finetune_pocket_model=None, fix_batches_to_gpus=False, fixed_validation_seed=None, force_anneal=None, fp16=True, fp16_init_scale=4, fp16_no_flatten_grads=False, fp16_scale_tolerance=0.0, fp16_scale_window=256, log_format='simple', log_interval=50, loss='docking_pose', lr_scheduler='fixed', lr_shrink=0.1, masked_coord_loss=-1.0, masked_dist_loss=-1.0, masked_token_loss=-1.0, max_pocket_atoms=256, max_seq_len=512, max_valid_steps=None, min_loss_scale=0.0001, model_overrides='{}', mol=Namespace(activation_dropout=0.0, activation_fn='gelu', attention_dropout=0.1, delta_pair_repr_norm_loss=-1.0, dropout=0.1, emb_dropout=0.1, encoder_attention_heads=64, encoder_embed_dim=512, encoder_ffn_embed_dim=2048, encoder_layers=15, masked_coord_loss=-1.0, masked_dist_loss=-1.0, masked_token_loss=-1.0, max_seq_len=512, pooler_activation_fn='tanh', pooler_dropout=0.0, post_ln=False, x_norm_loss=-1.0), no_progress_bar=False, no_seed_provided=False, nprocs_per_node=1, num_workers=8, optimizer='adam', path='/workspace/Uni-Mol/ckp/binding_pose_220908.pt', pocket=Namespace(activation_dropout=0.0, activation_fn='gelu', attention_dropout=0.1, delta_pair_repr_norm_loss=-1.0, dropout=0.1, emb_dropout=0.1, encoder_attention_heads=64, encoder_embed_dim=512, encoder_ffn_embed_dim=2048, encoder_layers=15, masked_coord_loss=-1.0, masked_dist_loss=-1.0, masked_token_loss=-1.0, max_seq_len=512, pooler_activation_fn='tanh', pooler_dropout=0.0, post_ln=False, x_norm_loss=-1.0), pooler_activation_fn='tanh', pooler_dropout=0.0, post_ln=False, profile=False, quiet=False, recycling=3, required_batch_size_multiple=1, results_path='/workspace/Uni-Mol/infer_pose', seed=1, skip_invalid_size_inputs_valid_test=False, suppress_crashes=False, task='docking_pose', tensorboard_logdir='', threshold_loss_scale=None, train_subset='train', user_dir='/workspace/Uni-Mol/unimol', valid_subset='posebuster_428', validate_after_updates=0, validate_interval=1, validate_interval_updates=0, validate_with_ema=False, wandb_name='', wandb_project='', warmup_updates=0, weight_decay=0.0, x_norm_loss=-1.0) 2024-07-23 18:59:16 | INFO | unicore.tasks.unicore_task | get EpochBatchIterator for epoch 1 2024-07-23 18:59:20 | INFO | unimol.inference | Done inference!
/workspace/Uni-Mol 100%|█████████████████████████████████████████████| 2/2 [00:00<00:00, 12.41it/s] 0%| | 0/2 [00:00<?, ?it/s]5SAK-N=C1N/C(=N\Nc2ccccc2)c2ccccc21-RMSD:0.6344-0.0361-0.2067 5S8I-CNC(=O)c1scc2c1OCCO2-RMSD:1.0975-0.0144-0.2149 100%|█████████████████████████████████████████████| 2/2 [00:23<00:00, 11.97s/it] RMSD < 1.0 : 0.5 RMSD < 1.5 : 1.0 RMSD < 2.0 : 1.0 RMSD < 3.0 : 1.0 RMSD < 5.0 : 1.0 avg RMSD : 0.8659875802603305
计算对称RMSD指标
calc rmsd for: pdb code: ['5S8I', '5SAK'] lig code: ['2LY', 'ZRY'] ************************************************** results length: 2 RMSD < 1.0 : 0.5 RMSD < 1.5 : 1.0 RMSD < 2.0 : 1.0 RMSD < 3.0 : 1.0 RMSD < 5.0 : 1.0 avg RMSD : 0.8659898326762625
预测结构可视化
Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com Requirement already satisfied: py3Dmol in /opt/conda/lib/python3.8/site-packages (2.2.1) WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
图中
绿色分子是unimol预测的结构
红色分子为晶体结构