tools 工具 一句话说明 ESMFold 是 Meta AI 开发的蛋白质结构预测模型,最大特点是不需要多序列比对(MSA)步骤,直接用单条序列通过大型语言模型(ESM-2)预测结构,速度比 ColabFold 快 60 倍,适合大规模高通量预测。白话理解:不用查"亲戚序列"就能预测结构,靠的是语言模型"记住"了蛋白质进化知识。
安装与配置 # 方法1:通过 ESM 库安装(Meta 官方)
pip install fair-esm # 安装 ESM 库(当前 v2.0)
# 安装必要依赖
pip install torch torchvision torchaudio # PyTorch(需匹配 CUDA 版本)
pip install "fair-esm[esmfold]" # ESMFold 额外依赖
pip install biotite # 蛋白质序列/结构分析
# 模型权重(首次运行自动下载,约 2.7GB)
# 或提前手动缓存:
python -c "import esm; esm.pretrained.esmfold_v1()" # 触发自动下载
# 方法2:使用 API(Meta ESMFold API,无需安装)
# curl 请求即可:
curl -X POST \
"https://api.esmatlas.com/foldSequence/v1/pdb/" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "MKTAYIAKQRQISFVK..." # 直接发送氨基酸序列,返回 PDB 格式结构
核心用法 Python API(批量预测) import torch # PyTorch 框架
import esm # Meta ESM 库
# 加载 ESMFold 模型
model = esm . pretrained . esmfold_v1 () # 加载预训练 ESMFold v1 模型
model = model . eval () # 切换到推理模式(关闭 dropout)
model = model . cuda () # 移动到 GPU(如果有)
print ( "模型加载完成" )
# 单序列预测
sequence = "MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPILSRVGDGTQDNLSG" # 输入氨基酸序列
with torch . no_grad (): # 推理时不计算梯度(节省内存)
output = model . infer_pdb ( sequence ) # 预测并直接返回 PDB 格式字符串
# 保存结构
with open ( "predicted.pdb" , "w" ) as f :
f . write ( output ) # 写入 PDB 文件
print ( "结构已保存:predicted.pdb" )
# 获取 pLDDT 置信度分数
with torch . no_grad ():
output_dict = model . infer ( sequence ) # 获取详细输出(含分数)
plddt = output_dict [ "plddt" ][ 0 ] . cpu () . numpy () # 提取每残基 pLDDT 分数
print ( f "平均 pLDDT: { plddt . mean () : .2f } " ) # 打印平均置信度
print ( f "序列长度: { len ( sequence ) } " )
批量预测多条序列 import torch
import esm
from pathlib import Path # 路径处理
# 加载模型(只加载一次)
model = esm . pretrained . esmfold_v1 () . eval () . cuda ()
# 读取 FASTA 文件中的所有序列
def read_fasta ( fasta_path ):
"""读取 FASTA 文件,返回 {name: sequence} 字典"""
sequences = {}
current_name = None
with open ( fasta_path ) as f :
for line in f :
line = line . strip () # 去掉换行符
if line . startswith ( ">" ):
current_name = line [ 1 :] # 去掉 > 符号
sequences [ current_name ] = ""
elif current_name :
sequences [ current_name ] += line # 拼接序列
return sequences
sequences = read_fasta ( "proteins.fasta" ) # 读取所有序列
output_dir = Path ( "esmfold_results" )
output_dir . mkdir ( exist_ok = True ) # 创建输出目录
# 逐个预测(或批量预测更高效)
for name , seq in sequences . items ():
print ( f "预测: { name } (长度: { len ( seq ) } )" )
# 跳过太长的序列(ESMFold 对长序列内存要求高)
if len ( seq ) > 1000 :
print ( f " 跳过:序列过长 ( { len ( seq ) } aa)" )
continue
with torch . no_grad ():
pdb_str = model . infer_pdb ( seq ) # 预测结构
# 保存结果
out_file = output_dir / f " { name . replace ( ' ' , '_' ) } .pdb"
with open ( out_file , "w" ) as f :
f . write ( pdb_str ) # 写入 PDB 文件
print ( f " 保存至: { out_file } " )
print ( "批量预测完成!" )
参数详解 参数/方法 含义 说明 model.infer_pdb(seq)预测并返回 PDB 字符串 最简单接口 model.infer(seq)返回详细输出字典 含 pLDDT、坐标、MSA embedding 等 model.set_chunk_size(64)设置分块大小(节省显存) 64-128,值越小越省内存 output["plddt"]每残基置信度 (0-100) >90=高置信,<50=无序 output["positions"]原子坐标 tensor shape: [batch, residue, atom, 3]
实战案例 案例:ESMFold vs ColabFold 结果对比 import torch
import esm
import subprocess # 运行外部命令
import numpy as np
from pathlib import Path
# 用 ESMFold 预测
model = esm . pretrained . esmfold_v1 () . eval () . cuda ()
sequence = "MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQAPIL"
with torch . no_grad ():
result = model . infer ( sequence ) # 获取详细结果
plddt_esm = result [ "plddt" ][ 0 ] . cpu () . numpy () # ESMFold pLDDT 分数
print ( f "ESMFold 平均 pLDDT: { plddt_esm . mean () : .2f } " )
# 保存 ESMFold 结构
with open ( "esm_structure.pdb" , "w" ) as f :
f . write ( model . infer_pdb ( sequence )) # 保存 PDB
# 调用 ColabFold 预测同一序列(对比用)
with open ( "test.fasta" , "w" ) as f :
f . write ( f ">test_protein \n { sequence } \n " ) # 写 FASTA
subprocess . run ([ # 运行 ColabFold
"colabfold_batch" ,
"test.fasta" , "colabfold_out/" ,
"--num-models" , "1" , # 只用1个模型(快速)
"--num-recycle" , "1" # 1次循环(快速)
])
print ( "两种方法预测完成,可用 PyMOL 或 ChimeraX 比对结构" )
常见报错与解决 报错 原因 解决方法 CUDA out of memory序列太长 + GPU 显存不足 model.set_chunk_size(64) 分块计算RuntimeError: Expected all tensors to be on same device模型和数据设备不一致 确认 model.cuda() 和 tensor.cuda() 模型下载失败 网络问题 配置代理;手动下载并设置 TORCH_HUB 路径 pLDDT 全部低 天然无序蛋白 正常现象;分段预测结构域 输出 PDB 无 SEQRES 记录 ESMFold 输出格式简化 用 biotite 转换为标准 PDB
速查表 # 安装
pip install "fair-esm[esmfold]"
# 在线 API(最简单)
curl -X POST https://api.esmatlas.com/foldSequence/v1/pdb/ \
-d "MKTAYIAKQRQISFVK..." > predicted.pdb
# Python 基本用法
import esm
model = esm.pretrained.esmfold_v1() .eval() .cuda()
pdb_str = model.infer_pdb( "MKTAYIAK..." )
# 节省显存
model.set_chunk_size( 64 ) # 分块计算(长序列必用)
model.esm.half() # 半精度(节省约一半显存)
# 速度对比(500aa 蛋白质)
# ESMFold: ~10秒(单 GPU,无需 MSA)
# ColabFold: ~5分钟(需要 MMseqs2 搜索 MSA)
# AlphaFold2:~30分钟(完整 MSA 搜索)
# 当前版本:ESM v2.0(ESMFold v1)