PSP - 蛋白质结构预测 OpenFold Multimer 重构训练模型的数据加载

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/132602155

PDB

OpenFold Multimer 在训练过程的数据加载时,需要将 MSA 与 Template 信息转换成 Feature,再进行训练,这样速度较慢。通过修改数据集类 OpenFoldSingleMultimerDataset__getitem__ 方法,可以加速训练过程。


1. 准备训练数据

在训练过程中,需要读取 mmcif_cache.json 文件,数据结构如下:

{"4ewn": {"release_date": "2012-12-05","chain_ids": ["D"],"seqs": ["MLAKRI..."],"no_chains": 1,"resolution": 1.9},"5m9r": {"release_date": "2017-02-22","chain_ids": ["A","B"],"seqs": ["MQDNS...","MQDNS..."],"no_chains": 2,"resolution": 1.44},
#...
}  

当前的训练数据格式,例如 train_200_mini.csv,如下:

pdb_id,chain_id,resolution,release_date,seq,len,chain_type,filepath
7m5z,"A,B",3.06,2021-10-06,"LEDVV...,QNKLE...","263,264","protein,protein",[pdb_path]/structures/m5/pdb7m5z.ent.gz
7k05,"A,B",1.85,2021-10-06,"MSFPP...,MSFPP...","200,200","protein,protein",[pdb_path]/structures/k0/pdb7k05.ent.gz
# ...

同时需要将 feature 的路径,也加入到训练文件 mmcif_cache.json 中,进而,通过预读文件,进行特征抽取,即:

[your folder]/multimer_train/features

使用特征文件夹中,已经预处理之后的特征 features.pkl,进行训练即可:

# 单个文件夹内容
chain_id_map.json
features.pkl
sequences.fasta

训练文件的转换命令,如下:

python openfold_scripts/main_mmcif_cache_transfer.py -i data/train_200_mini.csv -f [your folder]/multimer_train/features -o mydata/openfold/mmcif_cache_mini.json

源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2022. All rights reserved.
Created by C. L. Wang on 2023/8/31
"""
import argparse
import json
import os
import sys
from pathlib import Pathimport pandas as pd
from tqdm import tqdmp = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:sys.path.append(p)class MmcifCacheTransfer(object):"""训练 CSV 转换成 OpenFold 的 mmcif_cache.json 格式"""def __init__(self):pass@staticmethoddef process(input_path, feature_dir, output_path):print(f"[Info] 输入文件: {input_path}")print(f"[Info] 特征文件夹: {feature_dir}")print(f"[Info] 输出文件: {output_path}")assert os.path.isfile(input_path)df = pd.read_csv(input_path)print(f"[Info] 输入样本: {len(df)}")mmcif_cache_dict = dict()# pdb_id,chain_id,resolution,release_date,seq,len,chain_type,filepathfor _, row in tqdm(df.iterrows(), "[Info] pdb"):pdb_id = row["pdb_id"]release_date = row["release_date"]chain_ids = row["chain_id"].split(",")seqs = row["seq"].split(",")no_chains = len(chain_ids)resolution = float(row["resolution"])feature_folder = os.path.join(feature_dir, pdb_id[1:3], f"pdb{pdb_id}_{''.join(chain_ids)}")pdb_dict = {"release_date": str(release_date),"chain_ids": chain_ids,"seqs": seqs,"no_chains": no_chains,"resolution": resolution,"feature_folder": feature_folder}mmcif_cache_dict[pdb_id] = pdb_dictwith open(output_path, "w") as fp:fp.write(json.dumps(mmcif_cache_dict, indent=4))print(f"[Info] 全部处理完成: {output_path}")def main():parser = argparse.ArgumentParser()parser.add_argument("-i","--input-path",help="the input file path.",type=Path,required=True,)parser.add_argument("-f","--feature-dir",help="the preprocess feature dir.",type=Path,required=True)parser.add_argument("-o","--output-path",help="the output file path.",type=Path,required=True)args = parser.parse_args()input_path = str(args.input_path)feature_dir = str(args.feature_dir)output_path = str(args.output_path)assert os.path.isfile(input_path)# from root_dir import ROOT_DIR, DATA_DIR# input_path = os.path.join(ROOT_DIR, "data", "train_200_mini.csv")# output_path = os.path.join(DATA_DIR, "openfold", "mmcif_cache_mini.json")mct = MmcifCacheTransfer()mct.process(input_path, feature_dir, output_path)if __name__ == '__main__':main()

2. 加载训练数据

OpenFold Multimer 的特征读取逻辑,在 openfold/data/data_modules.py#OpenFoldSingleMultimerDataset() 中,即:

if self.mode == 'train' or self.mode == 'eval':path = os.path.join(self.data_dir, f"{mmcif_id}")ext = Nonefor e in self.supported_exts:if os.path.exists(path + e):ext = ebreakif ext is None:raise ValueError("Invalid file type")# TODO: Add pdb and core exts to data_pipeline for multimerpath += extif ext == ".cif":data = self._parse_mmcif(path, mmcif_id, self.alignment_dir, alignment_index)else:raise ValueError("Extension branch missing")
else:path = os.path.join(self.data_dir, f"{mmcif_id}.fasta")data = self.data_pipeline.process_fasta(fasta_path=path,alignment_dir=self.alignment_dir)

修改成直接加载 Feature 的形式,即:

if self.mode == 'train' or self.mode == 'eval':# 训练或评估时,使用预处理的特征feat_folder = self.mmcif_data_cache[mmcif_id]['feature_folder']feat_path = os.path.join(feat_folder, "features.pkl")# logger.info(f"[Info] feat_path: {feat_path}")data = {}with open(feat_path, "rb") as f:feat_dict = pickle.load(f)data.update(feat_dict)# logger.info(f"[Info] data: {data.keys()}")
else:path = os.path.join(self.data_dir, f"{mmcif_id}.fasta")data = self.data_pipeline.process_fasta(fasta_path=path,alignment_dir=self.alignment_dir)

同时,还需要修改训练数据总数:

def __len__(self):# 数据部分都由 mmcif_data_cache 提供# return len(self._chain_ids)return len(self.mmcif_data_cache.keys)

3. 配置模型训练

模型训练的参数,如下:

python3 train_openfold.py \--train_data_dir [your folder]/af2-data-v230/pdb_mmcif/mmcif_files/ \--train_alignment_dir mydata/alignment_dir/ \--train_mmcif_data_cache_path [your folder]/multimer_train/openfold_cache/mmcif_cache_mini.json \--template_mmcif_dir [your folder]/af2-data-v230/pdb_mmcif/mmcif_files/ \--output_dir mydata/output_dir/ \--max_template_date "2021-10-10" \--config_preset "model_1_multimer_v3" \--template_release_dates_cache_path mmcif_cache.json \--precision bf16 \--gpus 1 \--replace_sampler_ddp=True \--seed 42 \--deepspeed_config_path deepspeed_config.json \--checkpoint_every_epoch \--obsolete_pdbs_file_path [your folder]/af2-data-v230/pdb_mmcif/obsolete.dat

模型训练占用显存较多,V100 目前无法支持,调低 crop_size 与 num_workers,降低资源占用,配置位于 openfold/config.py 中,即:

# crop_size
elif "multimer" in name:c.update(multimer_config_update.copy_and_resolve_references())c.data.train.crop_size = 64  # TODO: 用于测试# num_workers
"data_module": {"use_small_bfd": False,"data_loaders": {"batch_size": 1,# "num_workers": 16,"num_workers": 2,  # TODO: 用于测试"pin_memory": True,},
},

其中,crop_size = 64 占用显存约是 5141MiB

训练日志,如下:

Epoch 0:   0%|                                 | 0/199 [00:00<?, ?it/s]INFO:openfold/data/data_modules.py:mmcif_id is: 7poc, idx: 148 and has 4 chains
INFO:openfold/data/data_modules.py:mmcif_id is: 7u49, idx: 97 and has 3 chains
INFO:openfold/data/data_modules.py:mmcif_id is: 7z7h, idx: 114 and has 6 chains
INFO:openfold/data/data_modules.py:mmcif_id is: 7nup, idx: 111 and has 4 chains
cum_loss: tensor([84.1698], device='cuda:0', dtype=torch.float64, grad_fn=<MulBackward0>) losses: {'distogram': tensor(4.1562, device='cuda:0', dtype=torch.float64), 'experimentally_resolved': tensor(0.6914, device='cuda:0'), 'fape': tensor(1.6598, device='cuda:0', dtype=torch.float64), 'plddt_loss': tensor(3.9062, device='cuda:0', dtype=torch.float64), 'masked_msa': tensor(3.0938, device='cuda:0'), 'supervised_chi': tensor(0.7941, device='cuda:0', dtype=torch.float64), 'violation': tensor(3.6495, device='cuda:0'), 'tm': tensor(4.1562, device='cuda:0', dtype=torch.float64), 'chain_center_of_mass': tensor([1.3754], device='cuda:0', dtype=torch.float64), 'unscaled_loss': tensor([10.5212], device='cuda:0', dtype=torch.float64), 'loss': tensor([84.1698], device='cuda:0', dtype=torch.float64)}
Epoch 0:   1%|| 1/199 [02:55<9:38:06, 175.18s/it, loss=84.2, v_num=]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/116061.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构回顾】

数据结构回顾 一、单链表二、单循环链表 一、单链表 #include <stdio.h> #include <stdlib.h>typedef struct Node {int data;Node *next; }Node;Node* initList() {Node *list (Node*)malloc(sizeof(Node));list->data 0;list->next NULL;return list; }…

【自用】西门子s7-200连接显示屏和物联网盒子完整配置过程

总览 1.PLC配置 2.显示屏配置 3.物联网盒子配置 一、PLC配置 1.连接PLC软件 STEP-7MicroWIN V4.0 SP9完整版 链接&#xff1a;https://pan.baidu.com/s/17LMEXnbkQZMPI8Bte24Eug?pwdjsi3 提取码&#xff1a;jsi3 2.PLC配置 打开 PLC 上面的小盖子&#xff0c;把红色按钮…

桌面端后台项目笔记

套用模板 vue-pure-admin 所用主要框架笔记 1. electron app const { app } require(electron) app.on(事件名, () > {} // 回调函数)常用事件 will-finish-launching 当应用程序完成基础的启动的时候触发ready&#xff1a;electron完成初始化时触发window-all-close…

5G 数字乡村数字农业农村大数据中心项目农业大数据建设方案PPT

导读:原文《5G 数字乡村数字农业农村大数据中心项目农业大数据建设方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。以下是部分内容,

SpringCloudAlibaba常用操作

SpringCloudAlibaba常用操作 微服务概念 1.1 单体、分布式、集群 单体 ⼀个系统业务量很⼩的时候所有的代码都放在⼀个项⽬中就好了&#xff0c;然后这个项⽬部署在⼀台服务器上就 好了。整个项⽬所有的服务都由这台服务器提供。这就是单机结构。 单体应⽤开发简单,部署测试…

go学习part21 Redis

300_尚硅谷_Redis的基本介绍和原理示意_哔哩哔哩_bilibili Redis 命令 | 菜鸟教程 (runoob.com) 1.基本介绍 2.基本操作 Redis的基本使用: 说明:Redis安装好后&#xff0c;默认有16个数据库&#xff0c;初始默认使用0号库,编号是0...15 1.添加key-val [set] 2.查看当前redi…

文件夹中lib,dll含义

.dll文件是动态链接库&#xff08;Dynamic Link Library&#xff09;的缩写&#xff0c;它包含了一组可执行的函数和数据&#xff0c;供程序调用。它可以被多个应用程序共享和重用&#xff0c;减少了代码的冗余。通过动态链接库&#xff0c;可以实现代码的模块化和提高代码的复…

meethigher-Apache Poi 实现Excel多级联动下拉框

由于最近做的功能&#xff0c;需要将接口返回的数据列表&#xff0c;输出到excel中&#xff0c;以供后续导入&#xff0c;且网上现有的封装&#xff0c;使用起来都较为麻烦&#xff0c;故参考已有做法封装了工具类。 使用apache poi实现excel联动下拉框思路 创建隐藏单元格&a…

jmeter源码二次开发

本文以jmeter5.5为例&#xff0c;扩展“TCP Socket支持定长的返回字节流”功能。 一、 源码本地编译运行 1、在jmeter官网下载源码&#xff1a;jmeter各版本源码地址 2、在idea中用gradle导入jmeter源码&#xff0c;idea中要配置jdk&#xff0c;gradle&#xff0c;我用的是j…

Java的23种设计模式

Java的23种设计模式 一、创建型设计模式1.单例模式 singleton1.1.静态属性单例模式1.2 静态属性变种1.3 基础的懒汉模式1.4 线程安全的懒加载单例1.5 线程安全的懒加载 单例-改进1.6 双重检查锁1.7 静态内部类1.8 枚举单例1.9 注册表单例 2.工厂方法模式 factory3.抽象工厂模式…

Linux进程概念及其状态

文章目录 &#x1f347;1. 什么是进程&#x1f348;1.1 概念&#x1f348;1.2 理解进程 &#x1f34b;2. Linux的PCB&#x1f34e;3. 查看进程 & 杀死进程&#x1f352;4. 系统调用获取进程标识符&#x1f353;4.1 进程PID&#x1f353;4.2 父进程PPID &#x1f346;5. 系统…

JAVA基础-JDBC

本博客记录JAVA基础JDBC部分的学习内容 JDBC基本概念 JDBC : JAVA链接数据库&#xff0c;是JAVA链接数据库的技术的统称&#xff0c;包含如下两部分&#xff1a; 1. JAVA提供的JDBC规范&#xff08;即各种数据库接口&#xff09;存储在java.sql 和 javax.sql中的api 2. 各个数…

Docker 常用服务 安装使用 教程

Docker安装常用服务 1、 安装mysql # 1.拉取mysql镜像到本地 docker pull mysql:tag (tag不加默认最新版本) # 2.运行mysql服务 docker run --name mysql -e MYSQL_ROOT_PASSWORDroot -d mysql:tag --没有暴露外部端口外部不能连接 docker run --name mysql -e MYSQL_ROOT_PAS…

CSS判断手机暗黑模式

手机有个功能到了晚上会自动变成深色也就是暗黑模式.这种情况下网页会自动变颜色.如果想自由控制暗黑模式下的html样式的话,可以用如下方式: media (prefers-color-scheme: dark) {/*html, body {*//*filter: invert(1) hue-rotate(180deg);*//*}*/.maill{margin-left: 0;marg…

[HNCTF 2022] web 刷题记录

文章目录 [HNCTF 2022 Week1]easy_html[HNCTF 2022 Week1]easy_upload[HNCTF 2022 Week1]Interesting_http[HNCTF 2022 WEEK2]ez_SSTI[HNCTF 2022 WEEK2]ez_ssrf [HNCTF 2022 Week1]easy_html 打开题目提示cookie有线索 访问一下url 发现要求我们输入手机号&#xff0c;可是只…

使用 zipfile创建文件压缩工具

在本篇博客中&#xff0c;我们将使用 wxPython 模块创建一个简单的文件压缩工具。该工具具有图形用户界面&#xff08;GUI&#xff09;&#xff0c;可以选择源文件夹中的文件&#xff0c;将其压缩为 ZIP 文件&#xff0c;并将压缩文件保存到目标文件夹中。 C:\pythoncode\new\z…

[C/C++]天天酷跑超详细教程-中篇

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…

探索UniApp分包

目录 什么是UniApp分包&#xff1f; UniApp分包的原理 优势 如何使用UniApp分包 1.manifest.json文件配置 2.静态图片资源分包注意事项 3.pages.json配置 结论 探索UniApp分包&#xff1a;优化移动应用性能与用户体验 在移动应用开发领域&#xff0c;性能和用户体验是至…

Linux测开常用命令总结

文章目录 Linux系统中文件目录树 基本指令的使用&#xff1a; Linux命令的帮助信息查看 --help command --help 说明&#xff1a; 显示command 命令的帮助信息通过man命令查看帮助信息 man command( 命令的名称) man 命令查看的帮助信息更加详细ls&#xff0c;pwd&#xff0c…

多应用模式下,忽略项目的入口文件,重写Apache规则

多应用模式下&#xff0c;忽略项目的入口文件&#xff0c;重写Apache规则 首先&#xff0c;我的项目是具有两个应用&#xff0c;admin和index,同时给它们绑定了域名&#xff0c;但是每次访问时都需要加入项目的入口文件地址 index.php ,为了忽略这个入口文件&#xff0c;只能通…