AlphaFold3

AlphaFold3,支持蛋白质、DNA、RNA、任意小分子的预测。

如果不需要预测配体或者大批量预测,更建议去AlphaFold3 Server在线预测,每天有20次预测次数。

配置要求

官方的安装文档用的是Ubuntu 22.04系统。

建议使用NVIDIA H100或A100的GPU,80GB显存。我在4090 24GB上测试大概能跑90-100kDa以下的蛋白,调下设置速度慢点也能预测几百kDa的蛋白。

由于给的模型和权重文件解压完大概有600多GB,最好有1TB以上的SSD。

安装

AlphaFold3官方使用Docker或Singularity来配置环境,我这里用的是Conda,用Docker的根据官网流程来就行。

git clone https://github.com/google-deepmind/alphafold3.git
cd alphafold3
./fetch_databases.sh  #这是下载数据库的脚本,数据库很大,这一步可以单独早点做
conda create -n af3 python=3.11
conda activate af3
conda install -c bioconda hmmer
pip install -r dev-requirements.txt
pip install . --no-deps
build_data
python run_alphafold_test.py  # 运行测试脚本

如果是一些小显存显卡,可以设置一下来跑更大的蛋白:

打开alphafold3/src/alphafold3/model/model_config.py,将

pair_transition_shard_spec: Sequence[_Shape2DType] = (
      (2048, None),
      (None, 1024),
  )
flash_attention_implementation: attention.Implementation = 'triton'

改为

pair_transition_shard_spec: Sequence[_Shape2DType] = (
    (2048, None),
    (3072, 1024),
    (None, 512),
  )
flash_attention_implementation: attention.Implementation = 'xla'

打开alphafold3/run_alphafold.py,在import os后面加上:

os.environ['XLA_PYTHON_CLIENT_PREALLOCATE']='false'
os.environ['XLA_CLIENT_MEM_FRACTION']='3.2'
os.environ['TF_FORCE_UNIFIED_MEMORY']='true'

要注意爆显存的时候会用内存,速度会慢,但是起码能跑大点的蛋白了。

输入文件-顶层目录

在安装好并允许测试脚本通过后,就可以通过官方给的run_alphafold.py脚本来正式预测结构了。Alphafold3的输入格式是json格式的文件。

这个就是Alphafold3输入json文件的顶层目录结构。

{
    "name": "Job name goes here",
    "modelSeeds": [1, 2],
    "sequences": [
      {"protein": {...}},
      {"rna": {...}},
      {"dna": {...}},
      {"ligand": {...}}
    ],
    "bondedAtomPairs": [...],  # Optional
    "userCCD": "...",  # Optional
    "dialect": "alphafold3",
    "version": 2
}

name是任务以及生成pdb的名称。

sequences包含了需要预测的序列以及信息。

modelSeeds是随机数种子,列表中给几个数字就会重复预测几次。

dialect代表了识别语法格式,默认就行。

version代表了格式的版本,随着alphafold3更新可能会更新。最近就更新了一次,从1更新到了2,添加了对MSA文件路径的支持。

bondedATomPairsuserCCD不是必须提供的,用来自定义小分子和成键信息。

详解sequences:

这里面需要自定义最多的是sequences。sequences用[ ]圈起来,里面每一个元素都用{ }圈起来,逗号隔开。简单解释一下里面的内容。

1. protein

{"protein":{ }}为基础结构

id:链命名支持所有单字母和双字母。如果只是一个字符,代表一条链,如果有多个重复拷贝,用[ ]框起来,即"id": ["A", "B", "C"]

sequence:即序列,没什么好说的。

modifications:修饰的信息,可以没有。

unpairedMsaunpairedMsaPathpairedMsapairedMsaPath:多序列比对的信息,新的version2.0语法支持给Msa文件路径,和对应Msa的条目是互斥的,只能存在一个。Alphafold3是可以用hmmer自己做多序列比对的,如果有自己的比对信息才需要给这个,不是必须的。

templates:给结构模板,不是必须的。

{
    "protein": {
        "id": "A",
        "sequence": "PVLSCGEWQL",
        "modifications": [{"ptmType": "HY3", "ptmPosition": 1}, {"ptmType": "P1L","ptmPosition": 5}],
        "unpairedMsa": ...,
        "unpairedMsaPath": ...,
        "pairedMsa": ...,
        "pairedMsaPath": ...,
        "templates": [...]
    }
}

2. ligand

ligand有好几种选择的输入方式,第一种就是标准的三字母ccdCodes,代表了ccd数据库中的常见的配体类型,有自己的唯一标识码。用[ ]框起来,内部用逗号隔开。

{
  "ligand": {
    "id": ["G", "H", "I"],
    "ccdCodes": ["ATP", "ADP"]
  }
}

第二种是自定义的ccdCodes。

{
  "ligand": {
    "id": "J",
    "ccdCodes": ["LIG-1337"]
  }
}

如果要用这种格式,必须在上面提到的userCCD位置提供小分子cif信息,作为一个字符串来提供,比如下面的例子,其中换行符用\n来代替,因为json格式字符串不能换行。

data_MY-X7F
#
_chem_comp.id MY-X7F
_chem_comp.name '5,8-bis(oxidanyl)naphthalene-1,4-dione'
_chem_comp.type non-polymer
_chem_comp.formula 'C10 H6 O4'
_chem_comp.mon_nstd_parent_comp_id ?
_chem_comp.pdbx_synonyms ?
_chem_comp.formula_weight 190.152
#
loop_
_chem_comp_atom.comp_id
_chem_comp_atom.atom_id
_chem_comp_atom.alt_atom_id
_chem_comp_atom.type_symbol
_chem_comp_atom.charge
_chem_comp_atom.pdbx_align
_chem_comp_atom.pdbx_aromatic_flag
_chem_comp_atom.pdbx_leaving_atom_flag
_chem_comp_atom.pdbx_stereo_config
_chem_comp_atom.pdbx_backbone_atom_flag
_chem_comp_atom.pdbx_n_terminal_atom_flag
_chem_comp_atom.pdbx_c_terminal_atom_flag
_chem_comp_atom.model_Cartn_x
_chem_comp_atom.model_Cartn_y
_chem_comp_atom.model_Cartn_z
_chem_comp_atom.pdbx_model_Cartn_x_ideal
_chem_comp_atom.pdbx_model_Cartn_y_ideal
_chem_comp_atom.pdbx_model_Cartn_z_ideal
_chem_comp_atom.pdbx_component_atom_id
_chem_comp_atom.pdbx_component_comp_id
_chem_comp_atom.pdbx_ordinal
MY-X7F C02 C1 C 0 1 N N N N N N 48.727 17.090 17.537 -1.418 -1.260 0.018 C02 MY-X7F 1
......

#
loop_
_chem_comp_bond.comp_id
_chem_comp_bond.atom_id_1
_chem_comp_bond.atom_id_2
_chem_comp_bond.value_order
_chem_comp_bond.pdbx_aromatic_flag
_chem_comp_bond.pdbx_stereo_config
_chem_comp_bond.pdbx_ordinal
MY-X7F O01 C02 DOUB N N 1
......

#
_pdbx_chem_comp_descriptor.type SMILES_CANONICAL
_pdbx_chem_comp_descriptor.descriptor 'Oc1ccc(O)c2C(=O)C=CC(=O)c12'
#

第三种是smiles格式,直接用双引号。

{
  "ligand": {
    "id": "K",
    "smiles": "CC(=O)OC1C[NH+]2CCC1CC2"
  }
}

3. rna/dna

这两个和protein都是类似的,就不额外说了。

{
    "rna": {
      "id": "A",
      "sequence": "AGCU",
      "modifications": [
        {"modificationType": "2MG", "basePosition": 1},
        {"modificationType": "5MC", "basePosition": 4}
      ],
      "unpairedMsa": ...,  # Mutually exclusive with unpairedMsaPath.
      "unpairedMsaPath": ...  # Mutually exclusive with unpairedMsa.
    }
}
{
    "dna": {
      "id": "A",
      "sequence": "GACCTCT",
      "modifications": [
        {"modificationType": "6OG", "basePosition": 1},
        {"modificationType": "6MA", "basePosition": 2}
      ]
    }
}

运行

写好一个json文件以后保存,就可以运行alphafold3了。

每次使用之前首先激活环境。

conda activate af3

然后用git下载下来的run_alphafold.py来运行。

python run_alphafold.py --json_path=/path/to/json --model_dir=/path/to/model_dir --db_dir=/path/to/db_dir --output_dir=/path/to/output

model_dir是放权重的目录的路径,权重需要和alphafold3申请。

db_dir是一开始用fetch_databases脚本下载下来那一堆数据存放的目录。

json_pathoutput_dir很好理解,就是输入文件和输出目录。

有两个可能会用得到的可选参数:--run_data_pipeline=false--run_inference=false,这两个默认都是true,分别代表了Msa序列比对和执行预测,调成false就是只执行Msa序列比对或者有Msa信息了只执行预测。只Msa多序列比对的话不需要权重,也不吃GPU。

预测出的时间还是挺快的(我这测试可能2分钟一个),多序列比对反而耗时10分钟左右。如果需要高通量筛选小分子,就可以先做一个多序列比对,然后用这个信息去预测不同小分子。

Reference: https://github.com/google-deepmind/alphafold3/

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注