一句话说明
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)