ESM2 蛋白質語言模型
先決條件
| 需求項目 | 最低要求 | 建議規格 |
|---|---|---|
| Python | 3.8+ | 3.10 |
| PyTorch | 1.10+ | 2.0+ |
| CUDA | 11.0+ | 11.7+ |
| GPU VRAM | 8GB | 24GB (A10G) |
| RAM | 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
│
└─ 使用情境?
├─ QC 過濾 → 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(標題行)
疑難排解
OOM 錯誤:使用較小模型或分批處理序列 處理緩慢:改用 esm2_t12_35M 以提升速度 PLL 分數偏低:可能表示序列為非自然/經設計的序列
錯誤解讀
| 錯誤 | 原因 | 解決方法 |
|---|---|---|
RuntimeError: CUDA out of memory | 序列過長或批次過大 | 減少批次大小 |
KeyError: representation | 請求了錯誤的層數 | 650M 模型請使用第 33 層 |
ValueError: sequence | 無效的胺基酸 | 檢查是否有非標準胺基酸 |
下一步:使用 chai 或 boltz 進行結構預測 → 使用 protein-qc 進行品質篩選。