寫在前面:蛋白質是生命活動的基石,其功能和序列之間的復雜關系長期以來吸引著科學家們的關注。盡管深度突變掃描等實驗方法可以解析蛋白質突變的功能影響,但這些技術的應用范圍局限于序列空間的一小部分。近年來,基于蛋白質語言模型(PLM)的計算方法如ESM2模型取得了一些突破。然而,這些模型在零樣本預測中往往無法顯著提高蛋白質活性。為了解決這一問題,作者提出了EVOLVEpro,一個結合PLM和回歸模型的少樣本主動學習框架,用于蛋白質的快速優化。
主要研究思路:
1、蛋白質語言模型(PLM):使用大規模蛋白質序列數據庫(例如ESM2)進行訓練,理解蛋白質序列的內在規律;
2、頂層回歸模型:在實驗數據的支持下,學習蛋白質突變與功能的關系,預測最佳的突變方向;
3、主動學習策略:每一輪篩選最可能成功的突變,驗證實驗結果后更新模型,逐步優化蛋白質功能;
整個流程通過“少量實驗數據”+“AI預測”實現快速進化,極大減少了實驗的復雜性和時間成本。
一、Google Colab 使用教程
使用 EVOLVEpro 改善蛋白質活性的分步指南(作者用?DMS 工作一部分的小型數據集上進行模擬),參考教程見下述連接;
https://colab.research.google.com/drive/1YCWvR73ItSsJn3P89yk_GY1g5GEJUlgy?usp=sharing
二、本地服務器安裝教程
1、克隆項目代碼
先把代碼下載到本地:
git clone https://github.com/mat10d/EvolvePro.git
cd EvolvePro
2、創建并激活 EVOLVEpro 的核心環境
EVOLVEpro 需要一些依賴庫,官方提供了一個環境配置文件來一次性安裝它們。執行下面兩步:
conda env create -f environment.yml # 創建環境,自動安裝所有必需的依賴
conda activate evolvepro # 激活剛剛創建好的環境
這個環境包含了 EVOLVEpro 本身運行需要的核心庫。
3、創建并激活蛋白語言模型(Protein Language Models)環境
EVOLVEpro 使用了多種蛋白質語言模型(PLM),這些模型依賴和核心程序不完全相同,官方建議把它們放到一個單獨的環境中。這樣可以避免庫版本沖突,保證兩部分能正常運行。
運行下面命令安裝并配置這些模型:
sh setup_plm.sh # 執行安裝蛋白語言模型的腳本
conda activate plm # 激活專門的蛋白語言模型環境
激活plm的環境檢查是否安裝的是GPU版本的pytorch,如果默認安裝的是CPU版的話,可以重新安裝:
import torch
print(torch.cuda.is_available())
# Flase, 如果輸出為False,則執行一下兩部安裝GPU版本的pytorch
conda remove pytorch libtorch # 卸載當前的 CPU 版本 PyTorch
conda install pytorch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 pytorch-cuda=12.1 -c pytorch -c nvidia # 安裝PyTorch 2.5.1(支持 CUDA 12.1)
這個環境里包括:
-
深度學習框架(如 PyTorch)
-
通過 pip 安裝的蛋白語言模型(例如 ESM、ProtT5、UniRep、ankh、unirep)
-
只能通過 GitHub 克隆源碼安裝的模型(例如 proteinbert、efficient-evolution)
為什么要分兩個環境?
將 EVOLVEpro 核心功能和蛋白語言模型放在不同的環境里,可以:
保持依賴整潔,不會相互干擾
避免包版本沖突,減少安裝錯誤
方便針對不同部分獨立升級或維護
三、本地服務器使用示例
該模塊包含了用于生成和處理突變體數據的函數。在使用該模塊前,請確保激活 evolvepro
環境:
conda activate evolvepro
? 1、實驗突變(Experimental Mutation)處理流程
這是針對已知野生型序列進行系統性突變(如單點突變、組合突變)處理的工具。
📌 目標輸出:
輸出為一個 FASTA 文件,包含了與野生型(WT)序列相比的所有單點氨基酸突變。
步驟(1):定義一些關鍵變量
# 定義一些關鍵變量
wt_seq = "MNTINIAKNDFS"
output_path = "test"
步驟(2):生成野生型和單點突變體的 FASTA 文件
# 生成野生型 fasta 文件并創建單個氨基酸突變體 fasta 文件
from evolvepro.src.process import generate_wt, generate_single_aa_mutants
generate_wt(wt_seq, f'{output_path}/dataset_WT.fasta')
generate_single_aa_mutants(f'{output_path}/dataset_WT.fasta', f'{output_path}/dataset.fasta')
📖 說明:
-
'MNTINIAKNDFS'
:輸入的野生型蛋白質序列(可根據自己蛋白進行修改) -
f'{output_path}/dataset_WT.fasta'
:指定保存的 FASTA 文件路徑 -
generate_single_aa_mutants函數:輸入為上一步生成的野生型 FASTA 文件 ,輸出為包含所有單點突變體(每個位點替換為19種其他氨基酸)的 FASTA 文件
例如:
-
WT:MNTINIAKNDFS
-
單點突變:ANTINIAKNDFS(M1A)、TNTINIAKNDFS(M1T)……
注意:執行完上述函數之后會創建一個僅包含WT序列的?FASTA 文件dataset_WT.fasta 以及包含WT序列和單點飽和突變序列的FASTA文件dataset.fasta。
步驟(3):推薦一組隨機初始突變體
# 隨機推薦一組突變體進行檢測
from evolvepro.src.process import suggest_initial_mutants
suggest_initial_mutants(f'{output_path}/dataset.fasta', 12, random_seed=1)
📖 說明:
-
f'{output_path}/dataset.fasta'
:輸入為之前生成的所有單點突變體的 FASTA 文件 -
12
:隨機選擇推薦的突變體數量(可根據實際需求調整) -
random_seed:設置隨機種子為 1
此函數適用于篩選出首輪需要實驗驗證的突變體(如用于訓練初始機器學習模型)。
步驟(4):生成 n-突變組合(N-mutant combinations)
# 基于一個野生型蛋白序列和一個包含單點突變信息(和活性指標)的Excel文件,自動根據設定的活性閾值組合多個突變(如雙突變、三突變等),生成對應的突變體序列,并保存為FASTA格式文件
from evolvepro.src.process import generate_n_mutant_combinations
generate_n_mutant_combinations(f'{output_path}/dataset_WT.fasta', f'{output_path}/beneficial_mutations.xlsx', 2, f'{output_path}/dataset_2rd.fasta', threshold=1.15)
📖 說明:
-
f'{output_path}/dataset_WT.fasta'
:WT序列的FASTA文件 -
'beneficial_mutations.xlsx'
:包含實驗測得的有益突變位點和氨基酸變體的 Excel 文件 -
2:組合突變數,例如生成雙突變組合
-
f'{output_path}/dataset_2rd.fasta'
:輸出的 FASTA 文件 -
threshold=1.15
:突變位點得分閾值,低于該值的突變不予組合(可選)
該函數適用于從已有的有益突變中,組合出潛在更優的多突變體。
beneficial_mutations.xlsx
示例結構:
Variant | activity |
T12V | 1.086 |
N157K | 0.577 |
P26S | 1.024 |
R111Y | 0.782 |
... | ... |
? 2、使用適合的?PLM 模型提取所有變體的蛋白質語言模型嵌入
在使用該模塊前,請確保激活 plm
環境:
conda activate plm
該腳本的一般運行方式如下:
python evolvepro/plm/[model_name]/extract.py [model_location] [fasta_file] [output_dir] [additional_options]
用途:
-
從輸入的 FASTA 文件中讀取蛋白質序列(如所有單點突變體)
-
使用指定的蛋白語言模型生成嵌入向量(embeddings)
-
輸出為 CSV 格式(每一行為一個序列的 embedding)
適用于:
-
使用 GPU 的高性能計算環境(支持 SLURM 作業調度系統)
-
或本地命令行執行(適當修改參數即可)
示例如下:
python evolvepro/plm/esm/extract.py esm2_t48_15B_UR50D \output/dms/brenan.fasta \output/plm/esm/brenan \--toks_per_batch 512 \--include mean \--concatenate_dir output/plm/esm/
參數解釋:
參數 | 說明 |
---|---|
esm2_t48_15B_UR50D | 使用的蛋白質語言模型名稱(Facebook ESM2的15B模型) |
output/dms/brenan.fasta | 輸入的 FASTA 文件,包含所有待分析的單點突變體 |
output/plm/esm/brenan | 每個突變體的嵌入結果將保存至該目錄 |
--toks_per_batch 512 | 每個 batch 的 token 數(建議根據 GPU 顯存調小以防 OOM) |
--include mean | 表示導出 "mean pooling" 的序列嵌入(常用于下游預測任務) |
--concatenate_dir output/plm/esm/ | 將所有單個突變體的嵌入合并為一個 CSV 文件保存在該目錄 |
📁 輸出說明
-
output/plm/esm/brenan/
:包含每條序列對應的嵌入.csv
文件 -
output/plm/esm/
中會匯總一個合并的embeddings.csv
文件,適用于后續訓練/可視化
每個 CSV 文件內容(示例):
ID | emb_0 | emb_1 | ... | emb_1279 |
---|---|---|---|---|
M1A_mut_1 | 0.123 | -0.12 | ... | 0.061 |
? 3、應用 EVOLVEpro 模型優化蛋白質活性
(1)核心源文件位置:
evolvepro/src/evolve.py
主函數接口:
-
evolve_experimental
(用于單點突變優化) -
evolve_experimental_multi
(用于組合突變優化)
(2)在使用該模塊前,請確保激活 evolvepro
環境:
conda activate evolvepro
(3)支持的突變類型:
類型 | 簡介 |
---|---|
Single Mutant Evolution | 每一輪只考慮單個氨基酸替代突變的活性優化 |
Multi-Mutant Evolution | 在已有有益突變的基礎上組合生成多突變體進行進一步優化 |
(4)📂 所需輸入文件說明:
文件類型 | 用途說明 |
---|---|
FASTA 文件 | 包含野生型蛋白序列。用于確定突變相對于 WT 的參考序列 |
PLM 嵌入(.csv) | 蛋白語言模型生成的突變體嵌入特征文件,每個序列一行,維度一致 |
演化實驗數據(.xlsx) | 每一輪突變體的測定活性數據,需包含序列與其對應的實驗值(如表達量、活性等) |
(5)🔧 核心參數說明:
參數名 | 類型 | 說明 |
---|---|---|
protein_name | str | 蛋白名稱,用于標識任務 |
round_name | str | 當前演化輪次名稱,例如 Round3 |
embeddings_base_path | str | 嵌入文件存儲路徑 |
embeddings_file_name | str 或 list | 單輪使用一個 CSV,多輪組合突變可傳入多個文件名(列表) |
round_base_path | str | 所有實驗數據所在文件夾路徑 |
round_file_names | list | 實驗數據文件名列表,如 ['Round1.xlsx', 'Round2.xlsx'] |
rename_WT | bool | 是否在輸出文件中將 WT 命名為統一格式 |
number_of_variants | int | 模型預測后選擇的 top N 個突變體用于下一輪實驗 |
output_dir | str | 輸出目錄,包含模型預測結果、可視化文件、推薦突變體等 |
(6)示例一:單突變優化
from evolvepro.src.evolve import evolve_experimentalprotein_name = 't7_pol'
embeddings_base_path = '/path/to/embeddings'
embeddings_file_name = 'embeddings_file.csv'
round_base_path = '/path/to/round/data'
wt_fasta_path = "/path/to/wildtype/fasta"
number_of_variants = 12
output_dir = '/path/to/output/'round_name = 'Round2'
round_file_names = ['T7_pol_Round1.xlsx', 'T7_pol_Round2.xlsx']
rename_WT = Trueevolve_experimental(protein_name,round_name,embeddings_base_path,embeddings_file_name,round_base_path,round_file_names,wt_fasta_path,rename_WT,number_of_variants,output_dir
)
📌 用途:
-
輸入前兩輪的實驗數據
-
模型預測下一輪中最值得嘗試的
12
個單點突變體 -
結果寫入
output_dir
,用于實際實驗
參考鏈接:
https://github.com/mat10d/EvolvePro
https://www.science.org/doi/10.1126/science.adr6006
AI蛋白質大模型代碼實踐:3萬字長文讀懂EvolvePro蛋白質進化框架與本地部署全流程