AlphaFold3,支持蛋白质、DNA、RNA、任意小分子的预测。
如果不需要预测配体或者大批量预测,更建议去在线预测,每天有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文件路径的支持。
bondedATomPairs
和userCCD
不是必须提供的,用来自定义小分子和成键信息。
详解sequences:
这里面需要自定义最多的是sequences。sequences用[ ]圈起来,里面每一个元素都用{ }圈起来,逗号隔开。简单解释一下里面的内容。
1. protein
以{"protein":{ }}
为基础结构
id
:链命名支持所有单字母和双字母。如果只是一个字符,代表一条链,如果有多个重复拷贝,用[ ]框起来,即"id": ["A", "B", "C"]
。
sequence
:即序列,没什么好说的。
modifications
:修饰的信息,可以没有。
unpairedMsa
和unpairedMsaPath
,pairedMsa
和pairedMsaPath
:多序列比对的信息,新的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_path
和output_dir
很好理解,就是输入文件和输出目录。
有两个可能会用得到的可选参数:--run_data_pipeline=false
和--run_inference=false
,这两个默认都是true,分别代表了Msa序列比对和执行预测,调成false就是只执行Msa序列比对或者有Msa信息了只执行预测。只Msa多序列比对的话不需要权重,也不吃GPU。
预测出的时间还是挺快的(我这测试可能2分钟一个),多序列比对反而耗时10分钟左右。如果需要高通量筛选小分子,就可以先做一个多序列比对,然后用这个信息去预测不同小分子。
Reference: