PSP - 蛋白质序列提取 Transformer 蛋白质语言模型 ESM2 特征

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

Contracts

蛋白质语言模型 ESM (Evolutionary Scale Modeling) 是一种利用深度学习技术来预测蛋白质结构和功能的方法。ESM 通过在大规模的蛋白质序列数据库上,训练一个自回归的神经网络,学习蛋白质的进化规律和序列-结构-功能的关系。ESM 可以根据给定的蛋白质序列,生成其对应的隐向量,表示其结构和功能的特征,还可以利用隐向量进行多种下游任务,如结构预测、功能注释、相互作用分析等。ESM 是一种强大而通用的蛋白质语言模型,为蛋白质科学提供了新的视角和工具。

ESM (Evolutionary Scale Modeling),即进化尺度模型,包括 ESM-2、ESMFold、ESM-MSA-1b、ESM-1v、ESM-IF1(反向折叠),即

  • ESM-2,2022.8,SOTA 通用目的蛋白质语言模型 v2 版,其中 ESM-1v 是 v1 版本。
  • ESMFold,2022.11,端到端的单序列 3D 结构预测
  • ESM-MSA-1b,2021.6,MSA Transformer 语言模型
  • ESM-IF1,2022.4,反向折叠模型

具体参考:ESM GitHub

1. 配置 Docker 环境

配置 TORCH_HOMEBOS 环境,即:

vim ~/.bashrcexport TORCH_HOME=[your folder]/torch_home/
alias bos='bcecmd/bcecmd --conf-path bcecmd/bceconf/ bos'

建议配置 TORCH_HOME,固定 PyTorch 模型缓存地址,即 torch_home/hub/checkpoints 中。

在 Docker Image 中,导入 ESM 环境:

conda create -n esmfold --clone miniconda3/envs/esmfold

需要安装的 Torch 相关包:

pip install -q torch-scatter -f https://data.pyg.org/whl/torch-1.12.1+cu113.html
pip install -q torch-sparse -f https://data.pyg.org/whl/torch-1.12.1+cu113.html
pip install -q torch-cluster -f https://data.pyg.org/whl/torch-1.12.1+cu113.html
pip install -q torch-spline-conv -f https://data.pyg.org/whl/torch-1.12.1+cu113.html
pip install -q torch-geometric

导出 Docker 环境:

# 提交 Tag
docker ps -a
docker commit [container id] esmfold:v1.0# 准备远程 Tag
docker tag esmfold:v1.0 [your ip]/esmfold:v1.0# 推送至远程
docker push [your ip]/esmfold:v1.0
# 从远程拉取
# docker pull [your ip]/esmfold:v1.0

2. 批量推理 ESM2 模型

配置 ESM 推理脚本:

set -xe
PROJECT_DIR="$(cd "$(dirname $0)" && pwd)/.."source activate esmfold
export PATH="/usr/local/cuda-11.6/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-11.6/lib64:$LD_LIBRARY_PATH"
export TORCH_HOME=[your folder]/torch_home/echo "${PROJECT_DIR}"python "${PROJECT_DIR}/scripts/extract.py" esm2_t36_3B_UR50D \"${PROJECT_DIR}/mydata/all-1.fasta" \[your folder]/esm2_3B_feat/ \--toks_per_batch 1536 \--repr_layers -1 \--include per_tok contacts \--truncation_seq_length 1536 \--num_workers 8

测试 A100 显卡 80G,最大支持 1536 序列长度。

优化 scripts/extract.py 脚本,输出结果是序列 MD5 编码的特征,避免序列过长或名字重复:

  1. 增加 num_workers,提升推理速度。
  2. 替换 label 为蛋白质序列。
  3. 增加断点处理,避免重复搜索

# ...
data_loader = DataLoader(dataset, collate_fn=alphabet.get_batch_converter(args.truncation_seq_length),batch_sampler=batches, num_workers=args.num_workers,
)
# ...
# result = {"label": label}
result = {"label": strs[i]}  # label 修改成序列
# ...
for i, label in enumerate(labels):args.output_file = args.output_dir / f"{label}.pt"if os.path.isfile(args.output_file):warnings.warn(f"The feat has processed. {args.output_file}")continue
# ...

注意不能使用 num_workers 否则程序无法运行。

日志:

python workspace/esm-by-chenlong/run/../scripts/extract.py esm2_t36_3B_UR50D workspace/esm-by-chenlong/mydata/all-1.fasta pdb_dataset/esm2_6b_feat/ --toks_per_batch 1536 --repr_layers -1 --include per_tok contacts --truncation_seq_length 1536 --num_workers 32
Transferred model to GPU
Read /nfs_beijing_ai/chenlong/workspace/esm-by-chenlong/run/../mydata/all-1.fasta with 27115 sequences
Processing 1 of 6668 batches (66 sequences)
Processing 2 of 6668 batches (61 sequences)
Processing 3 of 6668 batches (56 sequences)
Processing 4 of 6668 batches (52 sequences)
Processing 5 of 6668 batches (51 sequences)

注意序列尺寸 2048 导致显存溢出。

3. 准备 ESM2 输入 FASTA 数据

将 FASTA 文件夹中的全部 FASTA 文件组成1个文件,并且序列描述,转换成 Hash 编码,避免相同序列的特征重复生成特征,即:

  • seq_encoder :Hash 编码函数,同时也用于查找。
  • load_feat:读取 feature 特征,支持显示数据和绘制图像。
  • merge_fasta_folder:合并 FASTA 文件夹。

即:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2022. All rights reserved.
Created by C. L. Wang on 2023/9/13
"""
import argparse
import os
import sys
import warnings
from pathlib import Pathfrom tqdm import tqdmp = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:sys.path.append(p)from myutils.project_utils import traverse_dir_files_for_large, read_file, write_list_to_fileclass Esm2FastaGenerator(object):"""ESM2 工具类"""def __init__(self):pass@staticmethoddef seq_encoder(sequence):"""将 seq 使用 hash 编码,避免重复生成"""import hashlibreturn hashlib.md5(sequence.encode(encoding="utf-8")).hexdigest()@staticmethoddef load_feat(path, is_print=False):"""加载 ESM 特征文件,以及打印特征"""import torchfrom torch import Tensorrep = torch.load(path)if is_print:print(f"[Info] rep: {rep.keys()}")for key in rep.keys():val = rep[key]if isinstance(val, str):print(f"[Info] {key}: {val}")elif isinstance(val, dict):for sub_key in val.keys():print(f"[Info] {key}: {sub_key}: {val[sub_key].shape}")elif isinstance(val, Tensor):print(f"[Info] {key}: {val.shape}")else:print(f"[Info] {key}: {val}")# 绘制接触矩阵import matplotlib.pyplot as pltcontacts_map = rep["contacts"]plt.matshow(contacts_map)plt.title("contacts_map")save_name = "contacts_map.png"plt.savefig(save_name, bbox_inches='tight', format='png')plt.show()return rep@classmethoddef merge_fasta_folder(cls, folder_path, output_path):"""合并 fasta 文件,用于 esm 推理"""print(f"[Info] folder_path: {folder_path}")print(f"[Info] output_path: {output_path}")assert os.path.isdir(folder_path)path_list = traverse_dir_files_for_large(folder_path, ext="fasta")print(f"[Info] fasta: {len(path_list)}")seq_set = set()for path in tqdm(path_list, "[Info] fasta"):data_lines = read_file(path)n = len(data_lines)for i in range(1, n, 2):seq = data_lines[i]if seq:seq_set.add(seq)seq_list = list(seq_set)print(f"[Info] seq unique: {len(seq_list)}")# create_empty_file(output_path)seq_lines = []header_set = set()for seq in tqdm(seq_list, "[Info] seq"):header = cls.seq_encoder(seq)header_set.add(header)seq_lines.append(f">{header}")seq_lines.append(seq)assert len(seq_lines) // 2 == len(header_set)write_list_to_file(output_path, seq_lines)print(f"[Info] over! {output_path}")def main():parser = argparse.ArgumentParser()parser.add_argument("-f","--folder-path",type=Path,required=True,)parser.add_argument("-o","--output-path",type=Path,required=True)args = parser.parse_args()folder_path = str(args.folder_path)output_path = str(args.output_path)if os.path.isfile(output_path):warnings.warn(f"The output file exists, append lines to it! {output_path}")# from root_dir import DATA_DIR# folder_path = os.path.join(DATA_DIR, "fasta")# output_path = os.path.join(DATA_DIR, "all.fasta")Esm2FastaGenerator.merge_fasta_folder(folder_path, output_path)def main2():from root_dir import DATA_DIRfeat_path = os.path.join(DATA_DIR, "fffd26f4307d76eec938ac9c2c93a698.pt")Esm2FastaGenerator.load_feat(feat_path, is_print=True)if __name__ == '__main__':main()# main2()

输出的序列 ESM2 特征包括:

  • label 序列描述
  • representations 序列表征 LxH
  • mean_representations 均值化表征 H
  • bos_representations 起始 Token 表征 H
  • contacts 序列接触表征 LxL

例如 序列长度是 65,ESM2 650M 的 Embeddings 是 1280,ESM2 3B 是 2560,即:

[Info] rep: dict_keys(['label', 'representations', 'contacts'])
[Info] label: MAKDSKAPVVEIFDERDGCTSAGSTGKASDAGEKGLLVKVSMQKVGYNAIMAKSVAASYMNK
[Info] representations: 36: torch.Size([62, 2560])
[Info] contacts: torch.Size([62, 62])

其中 序列长度 235 的 ESM2 3B 特征,约是 2.6M,序列长度 65 的 ESM2 650M 特征,约是 361 KB。

4. 测试 ESM2 推理脚本

推理脚本:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2022. All rights reserved.
Created by C. L. Wang on 2023/9/11
"""
import math
import os
import sys
import timeimport torchimport esmp = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if p not in sys.path:sys.path.append(p)from myutils.project_utils import time_elapsedclass Esm2Infer(object):"""推理 ESM2 特征"""def __init__(self):print("[Info] 加载模型开始! ")s_time = time.time()self.model, self.alphabet = esm.pretrained.esm2_t33_650M_UR50D()print(f"[Info] vocab: {self.alphabet.to_dict()}")self.batch_converter = self.alphabet.get_batch_converter()self.model.eval()  # disables dropout for deterministic resultsprint(f"[Info] 加载模型完成! 耗时: {time_elapsed(s_time, time.time())}")def predict(self, data_list):"""数据示例:data_list = [("protein1", "MKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"),("protein2", "KALTARQQEVFDLIRDHISQTGMPPTRAEIAQRLGFRSPNAAEEHLKALARKGVIEIVSGASRGIRLLQEE"),("protein2 with mask", "KALTARQQEVFDLIRD<mask>ISQTGMPPTRAEIAQRLGFRSPNAAEEHLKALARKGVIEIVSGASRGIRLLQEE"),("protein3",  "K A <mask> I S Q"),]"""print(f"[Info] data_list: {len(data_list)}")batch_labels, batch_strs, batch_tokens = self.batch_converter(data_list)print(f"[Info] batch_labels: {batch_labels}")print(f"[Info] batch_tokens: {batch_tokens}")batch_lens = (batch_tokens != self.alphabet.padding_idx).sum(1)print(f"[Info] batch_lens: {batch_lens}")  # 有效维数# Extract per-residue representations (on CPU)with torch.no_grad():results = self.model(batch_tokens, repr_layers=[33], return_contacts=True)token_representations = results["representations"][33]# Generate per-sequence representations via averaging# NOTE: token 0 is always a beginning-of-sequence token, so the first residue is token 1.sequence_representations = []for i, tokens_len in enumerate(batch_lens):feat = token_representations[i, 1: tokens_len - 1]# embeddings = feat.mean(0)# print(f"[Info] idx: {i}, feat: {feat.shape}, embeddings: {embeddings.shape}")# sequence_representations.append(embeddings)sequence_representations.append(feat)return sequence_representationsdef main():data_list = [("protein1", "MKTVRQERLKSIVRILERSKEPVSGAQLAEELSVSRQVIVQDIAYLRSLGYNIVATPRGYVLAGG"),("protein2", "KALTARQQEVFDLIRDHISQTGMPPTRAEIAQRLGFRSPNAAEEHLKALARKGVIEIVSGASRGIRLLQEE"),("protein2 with mask", "KALTARQQEVFDLIRD<mask>ISQTGMPPTRAEIAQRLGFRSPNAAEEHLKALARKGVIEIVSGASRGIRLLQEE"),("protein3", "K A <mask> I S Q"),]ei = Esm2Infer()ei.predict(data_list)if __name__ == '__main__':main()

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

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

相关文章

【毕设选题】 大数据二手房数据爬取与分析可视化 -python 数据分析 可视化

# 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…

​Qt for Python 入门¶​

本页重点介绍如何从源代码构建Qt for Python&#xff0c;如果你只想安装PySide2。 与你需要运行&#xff1a;pip pip install pyside2有关更多详细信息&#xff0c;请参阅我们的快速入门指南。此外&#xff0c;您可以 查看与项目相关的常见问题解答。 一般要求 Python&#xf…

华为云使用脚本初始化Linux数据盘

初始化新挂载的磁盘 登录云服务器&#xff0c;执行以下命令获取自动初始化磁盘脚本。 wget https://ecs-instance-driver.obs.cn-north-1.myhuaweicloud.com/datadisk/LinuxVMDataDiskAutoInitialize.sh 说明&#xff1a; 若回显异常&#xff0c;请检查云服务器是否绑定弹性公…

深度学习-全连接神经网络-训练过程-模型正则与超参数调优- [北邮鲁鹏]

目录标题 神经网络中的超参数学习率超参数优化方法网格搜索法随机搜索法 超参数搜索策略粗搜索精搜索 超参数的标尺空间 神经网络中的超参数 超参数 网络结构&#xff1a;隐层神经元个数&#xff0c;网络层数&#xff0c;非线性单元选择等优化相关&#xff1a;学习率、dorpou…

EXCEL如何把一个单元格内的文本和数字分开?例如:龚龚15565 = 龚龚 15565

使用工具&#xff1a;WPS 举例&#xff1a; EXCEL如何把一个单元格内的文本和数字批量分开&#xff1f;不使用数据分列。 第一步、将第二行数据冻结 第二步、在B1、C1单元格输入需要分开的示例 第三步、点击选中B1单元格&#xff0c;输入快捷键【CTRLE】进行填充。B2单元格也是…

C++ - map 和 set 使用介绍

简介 其实在map 和 set 的底层实现当中有差不多一半的 结构是使用 二叉搜索树来实现&#xff0c;关于二叉搜索树可以看下面这个篇博客&#xff1a;C - 搜索二叉树_chihiro1122的博客-CSDN博客 而 set 是 key 模型&#xff0c;他是直接按照 key 值大小来有规律的在 二叉搜索树当…

pytorch环境配置

pytorch安装与基础 pytorch相关配置一&#xff1a;安装cuda1:找到nvidia control panel2:打开控制面板&#xff0c;找到系统信息中的&#xff0c;组件即可查看到cuda版本&#xff0c;这里我的cuda版本为12.0.1503&#xff1a;下载对应版本的 cuda toolkit4:安装流程5.验证是否安…

163邮箱开通发件功能

点击设置 查看详情 开启这个功能&#xff0c;如下 开通IMAP/SMTP服务 开通POP3/SMTP服务完成了 设置邮箱完成。

解决Agora声网音视频在后台没有声音的问题

前言:本文会介绍 Android 与 iOS 两个平台的处理方式 一、Android高版本在应用退到后台时,系统为了省电会限制应用的后台活动,因此我们需要开启一个前台服务,在前台服务中发送常驻任务栏通知,以此来保证App 退到后台时不会被限制活动. 前台服务代码如下: package com.notify…

QCustomPlot绘图类详解(大白话)

本文假定你会使用Qt开发&#xff0c;但未接触过QCustomPlot绘图类或者是刚接触。 如何往Qt中引入QCustomPlot 首先&#xff0c;去官网下载最新版本的源码&#xff0c;注意是QCustomPlot.tar.gz这个文件&#xff0c;里面包含源码和示例。实际上&#xff0c;我们只需要qcustompl…

[学习笔记]CS224W(图机器学习) 2022/2023年冬学习笔记

资料&#xff1a; 课程网址 斯坦福CS224W图机器学习、图神经网络、知识图谱【同济子豪兄】 斯坦福大学CS224W图机器学习公开课-同济子豪兄中文精讲 cs224w&#xff08;图机器学习&#xff09;2021冬季课程学习笔记集合 序言 到图神经网络GCN为止的内容参考了斯坦福CS224W图机…

XUbuntu22.04之查找进程号pidof、pgrep总结(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【zlm】 webrtc源码讲解

目录 前端WEB 服务器收到请求 服务端的处理 播放 拉流 参考文章 前端WEB 服务器收到请求 POST /index/api/webrtc?applive&streamtest&typeplay HTTP/1.1 HttpSession::onRecvHeaderHttpSession::Handle_Req_POSTHttpSession::Handle_Req_POSTif (totalConte…

雅思学习总结

#【中秋征文】程序人生&#xff0c;中秋共享# 雅思小科普&#xff1a; 1. 什么是雅思考试&#xff1f; 雅思考试是由&#xff1a;英国文化协会、澳洲 IDP 教育集团、剑桥 大学考试委员会举办的英语水平测试。全称翻译成中文是&#xff1a; 国际英语语言测试系统。 2…

数据库直连提示 No suitable driver found for jdbc:postgresql

背景&#xff1a;我在代码里使用直连的方式在数据库中创建数据库等&#xff0c;由于需要适配各个数据库服务所以我分别兼容了mysql、postgresql、oracal等。但是在使用过程中会出现错误&#xff1a; No suitable driver found for jdbc:postgresql 但是我再使用mysql的直连方式…

片上网络(1)概述

前言 NoC&#xff1a;On-Chip Networks&#xff0c;片上网络。 由于多核乃至众核时代的到来&#xff0c;用于连接它们的可扩展、低延迟、大带宽的通信结构变得至关重要。 在核心较少时&#xff0c;总线Bus和矩阵/交叉开关Crossbar是主要的互联结构。总线可以提供较低的传输延迟…

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac)

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac) Mac mini操作系统&#xff0c;安装完 Google Chrome 浏览器以后&#xff0c;单击 启动台 桌面左下角的“显示应用程序”&#xff0c;我们发现捆绑安装了 Goo…

docker学习:dockerfile和docker-compose

学习如何使用dockerfile 以下内容&#xff0c;部分来自gpt生成&#xff0c;里面的描述可能会出现问题&#xff0c;但代码部分&#xff0c;我都会进行测试。 1. 需求 对于一个docker&#xff0c;例如python&#xff0c;我们需要其在构建成容器时&#xff0c;就有np。有以下两种方…

【项目实战】【已开源】USB2.0 HUB 集线器的制作教程(详细步骤以及电路图解释)

写在前面 本文是一篇关于 USB2.0 HUB 集线器的制作教程&#xff0c;包括详细的步骤以及电路图解释。 本文记录了笔者制作 USB2.0 HUB 集线器的心路历程&#xff0c;希望对你有帮助。 本文以笔记形式呈现&#xff0c;通过搜集互联网多方资料写成&#xff0c;非盈利性质&#xf…

java 单元测试Junit

所谓单元测试&#xff0c;就是针对最小的功能单元&#xff0c;编写测试代码对其进行正确性测试。为了测试更加方便&#xff0c;有一些第三方的公司或者组织提供了很好用的测试框架&#xff0c;给开发者使用。这里介绍一种Junit测试框架。Junit是第三方公司开源出来的&#xff0…