跳转至

ESMFold — Meta 的单序列快速蛋白质结构预测模型


一句话说明

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"]原子坐标 tensorshape: [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)