name: esm description: > ESM2蛋白质语言模型,用于嵌入表示和序列评分。 在以下场景使用此技能:(1) 计算伪对数似然(PLL)分数, (2) 获取蛋白质嵌入用于聚类分析, (3) 通过序列合理性筛选设计, (4) 零样本变体效应预测, (5) 分析序列-功能关系。
如需结构预测,请使用chai或boltz。 如需质量控制阈值,请使用protein-qc。 license: MIT category: design-tools tags: [sequence-design, embeddings, scoring] proteinbase_slug: esm2-optimization proteinbase_url: https://proteinbase.com/design-methods/esm2-optimization biomodals_script: modal_esm2_predict_masked.py
ESM2 蛋白质语言模型
先决条件
| 要求 | 最低 | 推荐 |
|---|---|---|
| Python | 3.8+ | 3.10 |
| PyTorch | 1.10+ | 2.0+ |
| CUDA | 11.0+ | 11.7+ |
| GPU 显存 | 8GB | 24GB (A10G) |
| 内存 | 16GB | 32GB |
如何运行
第一次使用? 请参阅安装指南来设置Modal和biomodals。
选项1:Modal
cd biomodals
modal run modal_esm2_predict_masked.py \
--input-faa sequences.fasta \
--out-dir embeddings/
GPU: A10G (24GB) | 超时: 默认300秒
选项2:Python API(推荐)
import torch
import esm
# 加载模型
model, alphabet = esm.pretrained.esm2_t33_650M_UR50D()
batch_converter = alphabet.get_batch_converter()
model = model.eval().cuda()
# 处理序列
data = [("seq1", "MKTAYIAKQRQISFVK...")]
batch_labels, batch_strs, batch_tokens = batch_converter(data)
with torch.no_grad():
results = model(batch_tokens.cuda(), repr_layers=[33])
# 获取嵌入表示
embeddings = results["representations"][33]
关键参数
ESM2 模型
| 模型 | 参数量 | 速度 | 质量 |
|---|---|---|---|
| esm2_t6_8M | 8M | 最快 | 快速筛选 |
| esm2_t12_35M | 35M | 快 | 良好 |
| esm2_t33_650M | 650M | 中等 | 更好 |
| esm2_t36_3B | 3B | 慢 | 最佳 |
输出格式
embeddings/
├── embeddings.npy # (N, 1280) 数组
├── pll_scores.csv # 每个序列的PLL分数
└── metadata.json # 序列信息
示例输出
成功运行
$ modal run modal_esm2_predict_masked.py --input-faa designs.fasta
[INFO] 正在加载ESM2-650M模型...
[INFO] 正在处理100条序列...
[INFO] 正在计算伪对数似然...
embeddings/pll_scores.csv:
sequence_id,pll,pll_normalized,length
design_0,-0.82,0.15,78
design_1,-0.95,0.08,85
design_2,-1.23,-0.12,72
...
摘要:
平均PLL: -0.91
PLL > 0的序列: 42/100 (42%)
良好输出的特征:
- PLL_normalized: > 0.0(更接近天然序列)
- 嵌入表示形状: (N, 1280) 对应650M模型
- 更高的PLL = 更自然的序列
决策树
我应该使用ESM2吗?
│
├─ 你需要什么?
│ ├─ 序列合理性评分 → ESM2 PLL ✓
│ ├─ 用于聚类的嵌入表示 → ESM2 ✓
│ ├─ 变体效应预测 → ESM2 ✓
│ └─ 结构预测 → 使用ESMFold
│
├─ 选择什么模型大小?
│ ├─ 快速筛选 → esm2_t12_35M
│ ├─ 标准使用 → esm2_t33_650M ✓
│ └─ 最佳质量 → esm2_t36_3B
│
└─ 使用场景?
├─ 质量控制筛选 → PLL > 0.0 阈值
├─ 多样性分析 → 平均池化嵌入
└─ 突变扫描 → 每个位置的对数几率
PLL 解释
| 标准化PLL | 解释 |
|---|---|
| > 0.2 | 非常自然的序列 |
| 0.0 - 0.2 | 良好,接近天然 |
| -0.5 - 0.0 | 可接受 |
| < -0.5 | 可能不自然 |
典型性能
| 任务规模 | 时间 (A10G) | 成本 (Modal) | 备注 |
|---|---|---|---|
| 100条序列 | 5-10分钟 | ~$1 | 快速筛选 |
| 1000条序列 | 30-60分钟 | ~$5 | 标准 |
| 5000条序列 | 2-3小时 | ~$20 | 大批量 |
吞吐量: 使用650M模型约100-200条序列/分钟。
验证
wc -l embeddings/pll_scores.csv # 应与输入序列数+1(表头)匹配
故障排除
内存不足错误: 使用更小的模型或分批处理序列 处理速度慢: 使用esm2_t12_35M以提高速度 PLL分数低: 可能表明序列不寻常/经过设计
错误解释
| 错误 | 原因 | 解决方法 |
|---|---|---|
RuntimeError: CUDA out of memory |
序列过长或批次过大 | 减小批次大小 |
KeyError: representation |
请求了错误的层 | 对650M模型使用第33层 |
ValueError: sequence |
无效氨基酸 | 检查是否存在非标准氨基酸 |
下一步: 使用chai或boltz进行结构预测 → 使用protein-qc进行筛选。