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.mzph.cn/news/70670.shtml

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

相关文章

1772_WPS关闭WPS热点和云服务等模块

全部学习汇总&#xff1a; GitHub - GreyZhang/windows_skills: some skills when using windows system. 说起来&#xff0c;WPS加入的WPS热点以及WPS云服务等可能还都是很不错的功能。不过&#xff0c;我不是很喜欢。我喜欢我能够更加自由地去随心所欲使用我用的软件&#x…

使用 OpenCV 进行图像操作:腐蚀、膨胀等等

形态转变 形态变换是根据形状变换图像的图像处理方法。这一过程有助于区域形状的表征和描绘。这些变换使用应用于输入图像的结构元素,并生成输出图像。形态学操作有多种用途,包括去除图像中的噪声、定位图像中的强度凹凸和孔洞以及连接图像中的不同元素。形态转变有两种主要…

[machineLearning]非监督学习unsupervised learning

1.什么是非监督学习 常见的神经网络是一种监督学习,监督学习的主要特征即为根据输入来对输出进行预测,最终会得到一个输出数值.而非监督学习的目的不在于输出,而是在于对读入的数据进行归类,选取特征,打标签,通过对于数据结构的分析来完成这些操作, 很少有最后的输出操作. 从…

第15章 秒杀商品隔离解决方案

mini商城第15章 秒杀商品隔离解决方案 一、课题 商品秒杀-热门数据实时收集 二、回顾 1、掌握热门分析收集方案 2、Lua高级语法 3、Kafka使用 4、Lua垂直日志收集 5、Apache Druid大数据实时处理系统 三、目标 1、MyBatis查询Apache Druid 常规查询 复杂查询 2、热门…

Swagger 的介绍以及使用

文章目录 Swagger一.导语&#xff1a;二.Swagger是什么&#xff1f;它能干什么&#xff1f;框架说明总结:作用 三.SpringBoot集成Swagger3.1初始实现步骤3.2配置Swagger3.3配置扫描接口3.4配置API分组3.5拓展&#xff1a;其他皮肤 四.常用注解 Swagger 一.导语&#xff1a; 相…

Using Multiple RDF Knowledge Graphs for Enriching ChatGPT Responses

本文是LLM系列文章&#xff0c;针对《Using Multiple RDF Knowledge Graphs for Enriching ChatGPT Responses》的翻译。 使用多个RDF知识图来丰富ChatGPT响应 摘要1 引言2 相关工作3 GPT-LODS的过程和用例4 结束语 摘要 最近有一种趋势是使用新型人工智能聊天GPT聊天箱&…

ChatGPT集锦

目录 1. 一条指令让ChatGPT变的更强大2. 对ChatGPT提问时,常见的10种错误描述3. Custom instructions如何设置1. 一条指令让ChatGPT变的更强大 在使用GPT的过程中,如何让AI更清晰地了解你的需求很重要?今天分享一个指令,可以让GPT成为你的好同事,与你一起分析和解决问题,…

Vue 项目开发将数据下载到本地的方法

将数据保存到本地 需求分析 需求 Vue 项目开发时&#xff0c;要求不调用接口下载&#xff0c;而是主动将接口多次调用产生的接口返回值讲过保存保存到本地 分析 需要使用浏览器的File API&#xff0c;本地存储多次接口返回的数据&#xff0c;在这里我使用的Vuex状态管理去存…

linux - 文件利用率快满了 - mongo日志

https://zhuanlan.zhihu.com/p/82430795 查看文件利用率 df -h 文件夹大小 ls -lh 逐级搜索大文件或目录 du -sh * cd .. 返回上一层 ps -ef | grep mongo 启动&#xff1a; .mongodb/bin/mongod -f mongodb/config/configsvr.conf 关闭 .mongodb/bin/mongod -f mong…

C# Winform 简单排期实现(DevExpress TreeList)

排期的需求在很多任务安排的系统中都有相应的需求&#xff0c;原生的Winform控件并未提供相应的控件&#xff0c;一般都是利用DataGridViewTreeView组合完成相应的需求&#xff0c;实现起来比较麻烦。用过DevExpress控件集的开发者应该知道&#xff0c;DevExpress WinForm提供了…

【动态规划刷题 10】等差数列划分 最长湍流子数组

413. 等差数列划分 链接: 413. 等差数列划分 如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0c;[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums &#xff0c;返回…

9.7黄金是否会继续下跌?后市如何布局

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周四(9月7日)亚市早盘&#xff0c;现货黄金继续承压&#xff0c;金价目前交投在1917美元附近。美国强劲PMI数据令金价承压&#xff0c;在美国数据走强和美联储发出鹰…

Git 备忘单

Git 是一个去中心化的版本管理软件。通过这个备忘单&#xff0c;您将可以快速访问最常见的 git 命令。 配置 设置全局配置 git config --global user.name "[name]" git config --global user.email "[email]"开始使用 创建 git 存储库 git init克隆现…

Java面试题:线程的run()和start()有什么区别?

线程的 run() 方法和 start() 方法是 Java 多线程中的两个重 要方法。 1. run() 方法是线程的执行体&#xff0c;线程启动后会执行 run() 方法中的代码&#xff0c;当 run() 方法执行完毕后&#xff0c;线程便终止了。 2. start() 方法用于启动一个新线程&#xff0c;它会…

【linux字符设备驱动-01】创建一个字符设备驱动

目录 一、创建字符设备1、申请设备号方法一方法二 2、创建类方法一方法二 3、创建设备 二、创建字符设备驱动1、初始化&#xff1a;cdev_init2、添加到内核&#xff1a;cdev_add 三、一个完整的字符设备驱动程序1、驱动源码2、测试demo 一、创建字符设备 1、申请设备号 方法一…

腾讯汤道生:超千亿参数 超2万亿tokens 腾讯混元大模型向行业全面开放

9月7日&#xff0c;2023腾讯全球数字生态大会在深圳宝安举行。腾讯集团高级执行副总裁、云与智慧产业事业群CEO汤道生表示&#xff0c;腾讯将迈入“全面拥抱大模型”时代&#xff1a;“以大模型生成技术为核心&#xff0c;人工智能正在成为下一轮数字化发展的关键动力&#xff…

stable diffusion实践操作-SD原理

系列文章目录 本文专门开一节写SD原理相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 文章目录 系列文章目录前言一、原理说明1.1、出图原理1.1.1 AI画画不是和人一样&#xff0c;从0开始&#xff0c;而是一个去噪点的过程&am…

华为云云服务器评测|详解 Nacos 安装部署

环境配置 服务器云耀云服务器L操作系统CentOS 7.9 64bit | 公共镜像JDK64 bit JDK 1.8MavenMaven 3.2.xnacos-server2.2.3 下载地址 官方githubRelease 2.2.3 (May 25th, 2023) alibaba/nacos GitHub百度网盘链接&#xff1a;https://pan.baidu.com/s/1K8UE6iJL2ZnosUY83b…

金鸣识别名片识别模块 ,名片扫描仪的神仙“伴侣”

名片扫描仪是现代办公中常见的设备&#xff0c;其作用是将纸质名片转换为电子格式并进行识别。在实现这一功能方面&#xff0c;使用自带OCR功能和金鸣识别两种方式均具有各自的优势。 一方面&#xff0c;自带OCR功能的名片扫描仪具有便捷性和即时性的优势。通过设备内置的OCR技…

Qt Creator使用Clang Format方法

Qt Creator使用Clang Format 习惯性的想格式化代码&#xff0c;发现Qt Creator默认居然是没有代码格式化的&#xff0c;只有一个缩进。 Qt Creater中有个插件&#xff1a;beautifier&#xff0c;在"帮助->关于"插件中&#xff0c;开启“Beautifier”即可&#xf…