AlphaFold API实战:从一条序列到PDB的蛋白质结构预测
【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
给一条氨基酸序列,怎么让它直接吐出原子级精度的 PDB 结构文件,而不用拼一堆命令行 flag?本文带你用 AlphaFold 的 Python API 跑通完整的蛋白质结构预测链路——从序列到 MSA、前向推理、再松弛精修,几十行代码,全程不用碰命令行。
Quick Win:十几行代码先拿到 PDB
先看全链路的最短骨架。假设数据管道已经建好(下面细讲),核心就四步:
from alphafold.data import pipeline # 序列 -> 特征 from alphafold.model import model, config, data from alphafold.common import protein, residue_constants import numpy as np # 1. 构建模型:配置 + 参数文件 runner = model.RunModel(config.model_config("model_1"), data.get_model_haiku_params(model_name="model_1", data_dir="data")) # 2. 特征进模型(features 来自 DataPipeline) processed = runner.process_features(features, random_seed=42) result = runner.predict(processed, random_seed=42) # 3. 坐标 + pLDDT -> PDB 字符串 pdb_str = protein.to_pdb(protein.from_prediction( processed, result, b_factors=np.repeat(result["plddt"][:, None], residue_constants.atom_type_num, axis=-1), remove_leading_feature_dimension=True)) # 单体模型传 True这几行做的事:构建一个RunModel,把数据管道产出的特征喂进去做一次前向推理,再用protein.from_prediction把结果字典变成Protein对象,最后序列化成 PDB 字符串。跑通这一步,你就拥有了一条完整的蛋白质结构预测能力。
架构速览:五个模块各管一摊
整个仓库的分工很清晰,五个核心模块各司其职:
- 推理引擎——
alphafold/model/model.py:RunModel类,加载参数文件并执行完整前向预测 - 数据管道——
alphafold/data/pipeline.py:DataPipeline类,跑对齐工具把 FASTA 序列变成模型输入特征 - 结构松弛——
alphafold/relax/relax.py:AmberRelaxation类,用 Amber 力场修正预测结构的立体化学冲突 - 置信度指标——
alphafold/common/confidence.py:把模型原始输出换算成 pLDDT / PAE 评分 - 命令行参考——
run_alphafold.py:官方脚本的完整编排,照着它改就能当 API 手册用
DataPipeline 其实就是一条工厂流水线:jackhmmer 是原料初筛工位,在 UniRef90 / MGnify 里快速捞出同源序列;hhblits 是深挖工位,去 BFD 数据库里把更远缘的同源再挖出来。两个工位流水作业,MSA(多序列比对)就组装好了。
提示:完整数据库(UniRef90、MGnify、BFD 等)加起来约 2.2TB,仓库提供了
scripts/download_all_data.sh一键下载;资源有限时可用reduced_dbs预设把 BFD 换成小版本。
端到端工作流:AlphaFold Python API 蛋白质结构预测全链路
序列进、特征出
模型不认识 FASTA,它需要一张 MSA 矩阵加若干模板结构。这一步就是让数据管道把外部对齐工具都调度起来。构造DataPipeline时要显式传六个工具的可执行路径,这是新手最容易卡住的地方:
import shutil from alphafold.data import pipeline from alphafold.data import templates from alphafold.data.tools import hhsearch data_pipeline = pipeline.DataPipeline( jackhmmer_binary_path=shutil.which("jackhmmer"), hhblits_binary_path=shutil.which("hhblits"), uniref90_database_path="data/uniref90/uniref90.fasta", mgnify_database_path="data/mgnify/mgy_clusters_2022_05.fasta", bfd_database_path="data/bfd/bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt", small_bfd_database_path="data/small_bfd/small_bfd_metaclust_clu_complete_id30_c90_final_seq.sorted_opt", uniref30_database_path="data/uniref30/UniRef30_2021_03", template_searcher=hhsearch.HHSearch( binary_path=shutil.which("hhsearch"), databases=["data/pdb70/pdb70"]), template_featurizer=templates.HhsearchHitFeaturizer( mmcif_dir="data/pdb_mmcif/mmcif_files", max_template_date="2021-12-01", # 复现历史基准时设截止日期 max_hits=20, kalign_binary_path=shutil.which("kalign")), use_small_bfd=False) features = data_pipeline.process("input.fasta", "msa_output")注意use_small_bfd与两个 BFD 路径是联动的:传True就走 small BFD,数据库体积能小一个量级。跑完process,features里就是一个 NumPy 数组字典,MSA 中间文件落在msa_output目录里。
喂给模型,拿到坐标
特征有了,接下来加载模型参数做前向推理。config.model_config给出网络结构,data.get_model_haiku_params从磁盘读训练好的参数,两者合成一个RunModel:
from alphafold.model import model, config, data model_name = "model_1" # monomer 预设下有 model_1 ~ model_5 runner = model.RunModel( config.model_config(model_name), data.get_model_haiku_params(model_name=model_name, data_dir="data")) processed = runner.process_features(features, random_seed=42) result = runner.predict(processed, random_seed=42) print(result["plddt"]) # 每残基置信度 0-100,越高越可信最关键的坑在这里:predict返回的字典里装的是 JAX 数组,不能直接 pickle 落盘,官方脚本会先递归转成 NumPy 再存。另外process_features和predict要共用同一个random_seed,否则结果难以复现。
坐标变 PDB,置信度落盘
拿到结果字典后,protein.from_prediction负责把坐标、序列、链信息组装成Protein对象。pLDDT 会写进 B 因子列,方便你在任何可视化软件里按置信度着色:
import numpy as np from alphafold.common import protein, confidence, residue_constants plddt = result["plddt"] unrelaxed = protein.from_prediction( processed, result, b_factors=np.repeat(plddt[:, None], residue_constants.atom_type_num, axis=-1), remove_leading_feature_dimension=True) # 单体模型传 True with open("unrelaxed.pdb", "w") as f: f.write(protein.to_pdb(unrelaxed)) # PAE:残基对之间的预测对齐误差,判断"哪个区域和哪个区域靠得住" pae = confidence.compute_predicted_aligned_error( logits=result["predicted_aligned_error"]["logits"], breaks=result["predicted_aligned_error"]["breaks"])提示:
from_prediction的remove_leading_feature_dimension参数单体和多聚体取值相反——单体传True,多聚体传False,传错会直接报维度不匹配。
结构松弛:力场精修最后一步
神经网络吐出的坐标难免有范德华冲突,直接拿去建模不够体面。AmberRelaxation用 Amber 力场做约束最小化,把结构"捏"到化学上合理:
from alphafold.relax import relax relaxer = relax.AmberRelaxation( max_iterations=0, # 0 表示不设上限,跑到收敛 tolerance=2.39, # L-BFGS 能量容差 kcal/mol stiffness=10.0, # 重原子约束弹簧常数 exclude_residues=[], max_outer_iterations=3, # 官方默认 3,越大越稳但越慢 use_gpu=True) # 有卡就开着,快很多 relaxed_pdb, metrics, violations = relaxer.process(prot=unrelaxed) with open("relaxed.pdb", "w") as f: f.write(relaxed_pdb)跑完relaxed.pdb才是最终交付物;violations里还剩什么冲突一目了然,调试结构问题时先看它。
效率倍增:批量、GPU 加速与置信度可视化 ⚡
批量预测一批序列——场景:手头有几百条 FASTA。做法:模型构建只发生一次,DataPipeline和RunModel都复用,循环里只做 process + predict:
import glob, pathlib for fasta in sorted(glob.glob("inputs/*.fasta")): stem = pathlib.Path(fasta).stem feats = data_pipeline.process(fasta, f"msa_out/{stem}") r = runner.predict(runner.process_features(feats, random_seed=42), random_seed=42) # 对每个 r 重复上面的 PDB 导出逻辑GPU 加速——推理侧 JAX 装 CUDA 版即自动用卡,无需改代码;松弛侧把use_gpu=True打开,max_outer_iterations保持 3 即可,两者配合能省掉大部分墙钟时间。
画 pLDDT 曲线和 PAE 热图——场景:给结果配图汇报。pLDDT 看局部,PAE 看残基对之间:
import matplotlib.pyplot as plt plt.figure(figsize=(10, 4)) plt.plot(plddt, marker="o", ms=3) plt.xlabel("Residue"); plt.ylabel("pLDDT") plt.title("AlphaFold pLDDT 蛋白质结构预测置信度") plt.show() plt.figure(figsize=(8, 8)) plt.imshow(pae["predicted_aligned_error"], cmap="viridis", interpolation="nearest") plt.colorbar(label="PAE (Å)") plt.show()踩坑实录:五个高频问题 🐛
构造管道就报
Could not find jackhmmer症状:shutil.which返回 None,管道构建直接崩 根因:API 不会自动搜 PATH,工具路径全靠你显式传 解法:先激活装了 HMMER 的 conda 环境,或传绝对路径predict 阶段显存爆炸症状:长序列预测到一半 OOM 根因:full 数据库的 MSA 序列数太多,输入矩阵巨大 解法:
use_small_bfd=True切 reduced_dbs 预设,先跑通再放大同一条序列两次结果对不上症状:重跑后坐标有细微差异 根因:
random_seed没固定,或两次只固定了 predict 忘了 process_features 解法:两处传同一个固定值,JAX 版本也要一致松弛一步挂几个小时症状:
max_outer_iterations调大后慢到怀疑人生 根因:外层违规修复循环每轮都是完整力场最小化 解法:回到官方默认 3,或先看 unrelaxed 结果再决定要不要精修想复用 MSA 却被重新算了一遍症状:
use_precomputed_msas=True没生效 根因:MSA 文件按msa_output_dir查找,目录变了就找不到 解法:多次运行保持msa_output_dir完全一致
下一步 🚀
- 接入分子动力学做长时间尺度验证
- 用 multimer 模型预测蛋白质复合物
- 扩展做单点突变对结构的影响分析
延伸资料:notebooks/AlphaFold.ipynb 官方 Notebook 有完整的可视化示例,docs/technical_note_v2.3.0.md 技术笔记讲清了每个模块的设计动机。
打开终端,把你第一条序列丢进去,看看 AlphaFold 会给你吐出什么结构。
【免费下载链接】alphafoldOpen source code for AlphaFold 2.项目地址: https://gitcode.com/GitHub_Trending/al/alphafold
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考