Code for running RFdiffusion.
RFdiffusion
图片来源:Ian C. Haydon / 华盛顿大学蛋白质设计研究所
描述
RFdiffusion 是一种用于结构生成的开源方法,可结合或不结合条件信息(如基序、靶标等)使用。正如我们在 RFdiffusion 论文 中所述,它能够应对各种蛋白质设计挑战。
Diffusion 能做的事情
- 基序支架构建
- 无条件蛋白质生成
- 对称性无条件生成(目前已实现循环、二面体和四面体对称性,更多对称性即将推出!)
- 对称性基序支架构建
- 结合剂设计
- 设计多样化(“部分扩散”,围绕某个设计进行采样)
目录
- RFdiffusion
- 目录
- 快速开始 / 安装
- 使用方法
- 运行扩散脚本
- 基本执行 - 无条件单体
- 基序支架构建
- "活性位点"模型可固定非常小的基序
inpaint_seq标志- 关于
diffuser.T的说明](#关于-diffusert-的说明) - 部分扩散
- 结合剂设计
- 结合剂设计的实践考虑
快速开始 / 安装
感谢 Sergey Ovchinnikov,RFdiffusion 已作为 Google Colab 笔记本 提供,您可以直接在其中运行!
我们强烈建议在开始使用 RFdiffusion 之前仔细阅读本 README,并尝试 Colab 笔记本中的一些示例。
如果您想在本地设置 RFdiffusion,请按照以下步骤操作:
要开始使用 RFdiffusion,请克隆此仓库:
git clone https://github.com/RosettaCommons/RFdiffusion.git
接下来,您需要将模型权重下载到 RFDiffusion 目录中。
cd RFdiffusion
mkdir models && cd models
wget http://files.ipd.uw.edu/pub/RFdiffusion/6f5902ac237024bdd0c176cb93063dc4/Base_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/e29311f6f1bf1af907f9ef9f44b8328b/Complex_base_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/60f09a193fb5e5ccdc4980417708dbab/Complex_Fold_base_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/74f51cfb8b440f50d70878e05361d8f0/InpaintSeq_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/76d00716416567174cdb7ca96e208296/InpaintSeq_Fold_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/5532d2e1f3a4738decd58b19d633b3c3/ActiveSite_ckpt.pt
wget http://files.ipd.uw.edu/pub/RFdiffusion/12fc204edeae5b57713c5ad7dcb97d39/Base_epoch8_ckpt.pt
Optional:
wget http://files.ipd.uw.edu/pub/RFdiffusion/f572d396fae9206628714fb2ce00f72e/Complex_beta_ckpt.pt
# original structure prediction weights
wget http://files.ipd.uw.edu/pub/RFdiffusion/1befcb9b28e2f778f53d47f18b7597fa/RF_structure_prediction_weights.pt
使用 Conda 安装 SE3-Transformer 和 RFdiffusion
Caution
如果您使用搭载 Apple Silicon 芯片的 Mac,需要支持 MPS 的分支,请参见 此链接。
确保您已安装 Anaconda 或 Miniconda。
您还需要安装 NVIDIA 的 SE(3)-Transformers 实现。以下是安装 NVIDIA SE(3)-Transformer 代码的方法:
# macos apple silicon specialized env w/o CUDA
conda env create -f env/SE3nv_macos.yml
conda activate RFdiffusion
# Pytorch with cpuonly
conda install 'pytorch==2.3.0' torchvision torchaudio cpuonly -c pytorch
pip install 'dgl==2.2.1' -f https://data.dgl.ai/wheels/repo.html
# install NVTX C headers, then real NVTX Python-binding
pip install git+https://github.com/YaoYinYing/nvtx-mock --force-reinstall
pip install nvtx
# install this version of SE3Transformer with cuda mocked out
pip install git+https://github.com/YaoYinYing/SE3Transformer
pip install git+https://github.com/NVIDIA/dllogger#egg=dllogger
pip install -e . # install the rfdiffusion module from the root of the repository
pip install pydantic
无论何时运行扩散过程,都应确保通过运行以下命令激活此 conda 环境:
conda activate RFdiffusion
在标准台式电脑上,完成全部设置所需时间应少于 30 分钟。 注意:由于用户使用的 GPU 类型和驱动程序存在差异,我们无法提供一个适用于所有设置的环境。因此,我们仅提供一个支持 CUDA 11.1 的 yml 文件,用户需根据自身设置对其进行自定义。这种自定义包括修改 yml 文件中指定的 cudatoolkit 以及(可能的)PyTorch 版本。
获取 PPI 支架示例
为了运行基于支架的蛋白质结合剂设计(PPI)示例,我们提供了一些示例支架文件(examples/ppi_scaffolds_subset.tar.gz)。
您需要解压缩该文件:
tar -xvf examples/ppi_scaffolds_subset.tar.gz -C examples/
我们将在“折叠条件控制”部分解释这些文件的具体含义以及使用方法。
用法说明
本节将演示如何运行扩散过程。
运行扩散脚本
实际执行的脚本为scripts/run_inference.py。该脚本有多种运行方式,具体由Hydra配置文件控制。
Hydra配置提供了一种便捷的方式来指定多种不同选项,其默认值直接取自模型检查点,因此默认情况下,推理过程应始终与训练过程保持一致。
这意味着config/inference/base.yml中的默认值可能与使用特定检查点进行推理时的实际值不匹配,而这一切都在后台自动处理。
基本执行——无条件单体

首先,我们来看如何对长度为150个氨基酸的蛋白质进行无条件设计。 为此,我们只需指定三个参数:
- 蛋白质长度
- 文件输出路径
- 设计数量
./scripts/run_inference.py 'contigmap.contigs=[150-150]' inference.output_prefix=test_outputs/test inference.num_designs=10
让我们详细了解一下。
首先,contigmap.contigs 是什么?
Hydra 配置文件告知推理脚本应如何运行。为了使内容有条理,配置文件包含不同的子配置,其中之一是 contigmap,它涉及与 contig 字符串(用于定义待构建的蛋白质)相关的所有内容。
如果不清楚,请查看配置文件:configs/inference/base.yml
配置中的任何内容都可以通过命令行手动覆盖。例如,你可以更改扩散器的工作方式:
diffuser.crd_scale=0.5
……但除非你确实清楚自己在做什么,否则不要这样做!!
那么,'contigmap.contigs=[150-150]' 是什么意思呢?
对于使用过 RFjoint 修复功能的用户来说,这可能看起来很熟悉,但又略有不同。实际上,扩散(Diffusion)使用的“contig mapper”与修复功能完全相同,只是由于我们使用 hydra,所以必须以不同的方式将其提供给模型。出于 hydra 的原因,contig 字符串必须作为列表中的单个项传递,而不是作为字符串,并且整个参数必须用 '' 括起来,这样命令行才不会尝试解析任何特殊字符。
contig 字符串允许你指定长度范围,但在这里,我们只想要一个 150 个氨基酸长度的蛋白质,所以只需指定 [150-150]。 这将运行 10 条扩散轨迹,并将输出保存到你指定的输出文件夹中。
注意:首次运行 RFdiffusion 时,会花费一些时间“Calculating IGSO3”。一旦完成,结果将被缓存,供未来参考!有关无条件单体生成的更多示例,请查看仓库中的 ./examples/design_unconditional.sh!
基序支架设计
RFdiffusion 可用于基序支架设计,其方式类似于 Constrained Hallucination 和 RFjoint 修复。总体而言,RFdiffusion 的性能显著优于 Constrained Hallucination 和 RFjoint 修复。
在进行蛋白质基序支架设计时,我们需要一种方法来指定要支架的特定蛋白质输入(来自 .pdb 文件的一个或多个片段),并能够指定在新的支架蛋白质中这些片段如何连接以及通过多少个残基连接。此外,我们希望能够对连接蛋白质的不同长度进行采样,因为我们通常无法预先精确知道需要多少个残基才能最好地支架一个基序。指定输入的工作由 contig 处理,由 hydra 配置中的 contigmap 配置控制。对于熟悉 Constrained Hallucination 或 RFjoint 修复的用户,其逻辑非常相似。
简要说明:
- 任何以字母为前缀的内容表示这是一个基序,该字母对应于输入 pdb 文件中的链字母。例如,A10-25 涉及相应输入 pdb 中的残基('A',10)、('A',11)……('A',25)。
- 任何不带字母前缀的内容表示待构建的蛋白质。这可以作为长度范围输入。这些长度范围在每次 RFdiffusion 推理迭代中随机采样。
- 要指定链断裂,我们使用
/0。
更详细地说,如果我们想要支架一个基序,输入方式与 RFjoint 修复类似,只是需要通过 hydra 配置输入。如果我们想要支架 pdb 中 A 链的 10-25 号残基,可以使用 'contigmap.contigs=[5-15/A10-25/30-40]' 来实现。这要求 RFdiffusion 从输入 pdb 的 A10-25 残基的 N 端构建 5-15 个残基(在每次推理周期中随机采样),然后在其 C 端构建 30-40 个残基(同样随机采样)。如果我们希望长度始终为例如 55 个残基,可以用 contigmap.length=55-55 来指定。显然,你还需要提供 pdb 文件的路径:inference.input_pdb=path/to/file.pdb。如果你的输入 pdb 包含你不想进行支架设计的残基,这无关紧要——contig 映射定义了 pdb 中哪些残基实际用作“基序”。换句话说,即使你的 pdb 文件有 B 链以及 A 链上的其他残基,RFdiffusion只会使用 A10-25。
要指定我们希望在存在单独链的情况下进行修复,可以按如下方式操作:
'contigmap.contigs=[5-15/A10-25/30-40/0 B1-100]'
仔细看这里。/0 是我们想要链断裂的指示符。注意,空格很重要。这告诉扩散模型在输入中添加一个大的残基跳跃(200个氨基酸),这样模型就会将第一条链视为与第二条链分离的独立链。
在 ./examples/design_motifscaffolding.sh 中可以找到一个基序支架设计的示例。
“活性位点”模型可固定非常小的基序
在 RFdiffusion 预印本中我们注意到,对于非常小的基序,RFdiffusion 往往无法将它们完美地固定在输出结果中。因此,对于诸如酶活性位点之类的极简位点的支架设计,我们在与这些任务相似的示例上对 RFdiffusion 进行了微调,使其能够更好地固定较小的基序,并更好地产生计算机模拟成功案例。如果您的输入功能基序非常小,我们建议使用此模型,可通过以下语法轻松指定:
inference.ckpt_override_path=models/ActiveSite_ckpt.pt
inpaint_seq 标志
对于熟悉 RFjoint 修复(Inpainting)的用户,contigmap.inpaint_seq 输入是等效的。其理念是,例如,在融合两个蛋白质时,原本位于蛋白质表面的残基(因此可能是极性的)现在需要被包裹到蛋白质的“核心”中。因此,我们希望它们变成疏水性残基。我们可以做的不是直接将它们突变为疏水性残基,而是掩盖它们的序列身份,让 RFdiffusion 对它们的序列进行隐式推理,并更好地与它们进行堆积。这需要一个不同于“基础”扩散模型的模型,该模型经过训练以理解这种模式,但这由推理脚本自动处理(您无需执行任何操作)。
要指定其序列应被隐藏的氨基酸,请使用以下语法:
'contigmap.inpaint_seq=[A1/A30-40]'
在此,我们将掩盖残基A1以及A30至A40(含A30和A40)之间所有残基的残基身份。
使用contigmap.inpaint_seq标志执行基序支架的示例位于./examples/design_motifscaffolding_inpaintseq.sh。
关于diffuser.T的说明
RFdiffusion最初是在200个离散时间步长下训练的。然而,最近的改进使我们能够减少推理时所需的时间步长数量。在许多情况下,仅使用约20个步长就能产生与使用200个步长相当的计算机模拟质量输出(速度提升10倍)。现在默认设置为50个步长。注意这一点对于理解下文所述的部分扩散非常重要。
部分扩散
利用扩散模型,我们可以对结构进行部分加噪和去噪,以获得围绕特定总体折叠的多样性。这一方法效果显著(参见Vazquez-Torres等人,BioRxiv 2022)。
这通过使用diffuser.partial_T输入并设置一个要“加噪至”的时间步长来实现。
噪点越多 == 多样性越丰富。在Vazquez-Torres等人2022年的研究中,我们通常使用约80的diffuser.partial_T,但这是相对于我们当时使用的200个时间步长而言的。现在默认的diffuser.T是50,因此需要相应调整diffuser.partial_T。例如,现在diffuser.T=50时,相当于80个加噪步骤的是diffuser.partial_T=20。不过,我们强烈建议对partial_T进行不同值的采样,以找到针对您特定问题的最佳参数。
进行部分扩散时,由于我们是从已知结构开始扩散,这会产生某些约束。您仍然可以使用contig输入,但这必须生成与输入蛋白质长度完全相同的contig字符串。例如,如果您有一个结合体:靶标复合物,并且想要使结合体(长度100,链A)多样化,您需要输入如下内容:
'contigmap.contigs=[100-100/0 B1-150]' diffuser.partial_T=20
原因在于,如果您的输入蛋白质仅有80个氨基酸,但您指定的期望长度为100,我们无法确定额外的20个氨基酸从何处进行扩散,因此,这些氨基酸将不在RFdiffusion已学习去噪的分布范围内。
部分扩散的示例可在 ./examples/design_partialdiffusion.sh 中找到!
如果需要,您还可以固定扩散链的部分序列。一个可能需要这样做的例子是在螺旋肽结合的情况下。如果您已将一段螺旋肽序列对接至理想螺旋结构上,现在希望多样化该复合物,允许该螺旋不再被预测为理想螺旋,您可以执行以下操作:
'contigmap.contigs=[100-100/0 20-20]' 'contigmap.provide_seq=[100-119]' diffuser.partial_T=10
在这种情况下,20aa 链是螺旋肽。contigmap.provide_seq 输入是从零开始索引的,您可以提供一个范围(因此 100-119 是一个包含性范围,用于解除肽整个序列的掩码)。多个序列范围可以用逗号分隔提供,例如 'contigmap.provide_seq=[172-177,200-205]'。
请注意,provide_seq 选项需要使用不同的模型检查点,但这由推理脚本自动处理。
在 ./examples/design_partialdiffusion_withseq.sh 中可以找到在扩散区域提供序列的部分扩散示例。指定多个序列范围的相同示例可在 ./examples/design_partialdiffusion_multipleseq.sh 中找到。
结合体设计
希望现在您已经清楚如何使用扩散来设计结合体了!事实上,RFdiffusion 在设计全新结合体方面展现出卓越的计算模拟和实验能力。
如果链 B 是您的靶标,那么您可以这样做:
./scripts/run_inference.py 'contigmap.contigs=[B1-100/0 100-100]' inference.output_prefix=test_outputs/binder_test inference.num_designs=10
这将生成与 B 链第 1-100 位残基结合的 100 残基长结合体。
然而,这可能不是制备结合体的最佳方法。由于扩散在计算上较为密集,我们需要尽可能提高其速度。如果目标蛋白较大(而大多数感兴趣的目标,如细胞表面受体,往往非常大),提供完整、未裁剪的目标蛋白会使扩散过程非常缓慢。一种经过验证的加速结合体设计的方法是围绕所需的界面位置裁剪目标蛋白。但是!这会产生一个问题:如果裁剪目标蛋白,可能会暴露出裁剪前埋藏在内部的疏水核心残基,如何确保结合体靶向目标蛋白表面预期的界面位点,而不是靶向刚刚人工创建的诱人疏水补丁呢?
我们通过向模型提供所谓的“热点残基”来解决这个问题。本 README 文件前面提到的复杂模型均使用热点残基进行训练,在这种训练机制中,在每个示例期间,模型会被告知目标蛋白上(部分)与配体接触的残基(即属于界面的残基)。模型很容易学习到它应该形成一个涉及这些热点残基的界面。因此,在推理时,我们可以提供自己的热点残基来定义结合体必须接触的区域。这些残基的指定方式如下:'ppi.hotspot_res=[A30,A33,A34]',其中 A 是热点残基在输入 pdb 文件中的链 ID,数字是热点残基在输入 pdb 文件中的残基索引。
最后,已观察到默认的 RFdiffusion 模型通常生成以螺旋为主的结合体。这些结合体具有较高的计算和实验成功率。然而,在某些情况下,可能需要其他类型的拓扑结构。为此,我们包含了一个“beta”模型,该模型能生成更多样化的拓扑结构,但尚未经过广泛的实验验证。使用此模型需自行承担风险:
inference.ckpt_override_path=models/Complex_beta_ckpt.pt
在 ./examples/design_ppi.sh 中可以找到使用 RFdiffusion 进行结合体设计的示例。
结合体设计的实用注意事项
RFdiffusion 是一款功能极其强大的结合体设计工具,但它并非万能。在本节中,我们将介绍 RFdiffusion 结合体设计中一些常见的问题,并提供如何充分利用此方法的建议。
目标位点的选择
并非目标蛋白上的每个位点都是结合体设计的理想候选。一个具有吸引力的结合位点应包含超过约 3 个疏水性残基,以便结合体与之相互作用。结合带电荷的极性位点仍然相当困难。结合靠近聚糖的位点也具有挑战性,因为聚糖在结合时通常会变得有序,这会带来能量上的损失。历史上,结合体设计也会避开非结构化的环区,但目前尚不清楚这是否仍是必需的,因为 RFdiffusion 已被用于结合与非结构化环区有许多共同之处的非结构化肽段。
目标蛋白的截断
RFdiffusion 的运行时间与系统中残基数量 N 的平方(O(N²))成正比。因此,对大型目标进行截断是非常明智的做法,这样可以避免不必要的计算成本。RFdiffusion 及所有下游步骤(包括 AF2)都设计为允许使用截断的目标。目标截断是一门技术。对于某些目标,例如多结构域细胞外膜蛋白,天然的截断点是两个结构域由柔性连接子连接的地方。对于其他蛋白质,如病毒刺突蛋白,截断点则不太明显。通常,您希望保留二级结构,并尽可能少地引入链断裂。您还应尝试在预期目标位点的每一侧保留约 10Å 的目标蛋白。我们建议使用 PyMol 来截断目标蛋白。
热点残基的选择
热点残基是我们整合到模型中的一项功能,用于控制结合体与目标蛋白相互作用的位点。在论文中,我们将热点残基定义为目标蛋白上与结合体的 Cβ 原子距离在 10Å 以内的残基。在目标上识别出的所有热点残基中,实际上只有 0-20% 会提供给模型,其余的则被屏蔽。理解这一点对于在推理时如何选择热点残基非常重要:模型期望形成的接触点比您指定的要多。我们通常建议选择 3-6 个热点残基,在生成数千个设计之前,您应该先进行几次试点运行,以确保您提供的热点残基数量能够产生您满意的结果。
如果您运行过之前的 PatchDock RifDock 结合体设计流程,在 RFdiffusion 论文中,我们选择的热点残基是目标蛋白的 PatchDock 残基。
binder设计规模
在论文中,我们为每个靶标生成了约10,000个RFdiffusion binder骨架。从这组骨架中,我们随后使用ProteinMPNN-FastRelax(如下所述)为每个骨架生成两个序列。我们使用带有初始猜测和靶标模板化的AF2(也如下所述)筛选了这些约20,000个设计。
鉴于我们在论文中观察到的高成功率,对于某些靶标,在一次设计流程中仅生成约1,000个RFdiffusion骨架可能就足够了。您需要获得足够多通过pAE_interaction < 10(在binder设计筛选部分有更详细描述)的设计,以便能够用这些成功的设计来完成DNA订单。我们发现,未通过pAE_interaction < 10的设计不值得订购,因为它们在实验中很可能无法发挥作用。
binder的序列设计
您可能已经注意到,RFdiffusion设计的binder输出的是聚甘氨酸序列。这并非错误。RFdiffusion是一个骨架生成模型,不会为设计区域生成序列,因此,必须使用另一种方法为binder分配序列。在论文中,我们使用ProteinMPNN-FastRelax协议进行序列设计。我们也建议您这样做。该协议的代码可在此GitHub仓库中找到。虽然我们发现该协议的FastRelax部分并未像在RifDock生成的对接结果中那样带来显著的计算机模拟成功率提升,但对于每个(计算成本高昂的)RFdiffusion骨架而言,它仍然是增加有效尝试次数的好方法。如果您希望仅在binder上运行ProteinMPNN而不进行FastRelax步骤,这也是可行的,但计算成本会更高。
binder设计筛选
binder设计流程中最重要的步骤之一是筛选步骤,用于评估您的binder是否真的被预测为有效。在论文中,我们使用带有初始猜测和靶标模板化的AF2进行筛选,该协议的脚本可在此处获取。我们发现,将pae_interaction < 10作为筛选条件可以很好地预测binder在实验中的有效性。
折叠条件控制
通过特定拓扑结构对结合剂设计(或单体生成)进行条件控制的方法效果显著。这是通过向已训练的模型提供(部分)二级结构和区块邻接信息来实现的,该模型已具备基于此类信息进行条件控制的能力。
例如1:
./make_secstruc_adj.py --input_pdb ./2KL8.pdb --out_dir /my/dir/for/adj_secstruct
或例如 2:
./make_secstruc_adj.py --pdb_dir ./pdbs/ --out_dir /my/dir/for/adj_secstruct
这将处理单个pdb文件或一个pdb文件夹,并输出二级结构和邻接pytorch文件,为输入模型做好准备。目前(尽管这可能不是必需的),如果您正在进行PPI,您还应该为目标蛋白质生成这些文件,并将其提供给模型。然后您可以按以下方式在推理时使用这些文件:
./scripts/run_inference.py inference.output_prefix=./scaffold_conditioned_test/test scaffoldguided.scaffoldguided=True scaffoldguided.target_pdb=False scaffoldguided.scaffold_dir=./examples/ppi_scaffolds_subset
一些额外注意事项:
- 如上所述,对于 PPI,您需要提供目标蛋白质及其二级结构和区块邻接性。这可以通过添加以下内容来实现:
scaffoldguided.target_pdb=True scaffoldguided.target_path=input_pdbs/insulin_target.pdb inference.output_prefix=insulin_binder/jordi_ss_insulin_noise0_job0 'ppi.hotspot_res=[A59,A83,A91]' scaffoldguided.target_ss=target_folds/insulin_target_ss.pt scaffoldguided.target_adj=target_folds/insulin_target_adj.pt
要生成这些区块邻接和二级结构输入,您可以使用辅助脚本。
现在,这将生成针对胰岛素靶标的3螺旋束。
对于ppi,添加此标志可能也很有价值:
scaffoldguided.mask_loops=False
理解这一点非常重要。在训练过程中,我们会对部分二级结构和区块邻接关系进行掩码处理。这样做很方便,因为它使我们在推理时能够轻松添加额外的残基,而无需为每个残基指定精确的二级结构。例如,如果你想构建一个长的三螺旋束,可以对环区进行掩码,并在该环区添加例如20个“掩码”标记。然后,模型(可能)会选择将其中15个残基形成螺旋(以延伸三螺旋束),再形成一个5个氨基酸的环。但你无需明确指定这些,这一点很方便。具体操作方式如下:
scaffoldguided.mask_loops=True scaffoldguided.sampled_insertion=15 scaffoldguided.sampled_N=5 scaffoldguided.sampled_C=5
在每次推理运行时,这将最多采样15个残基插入到您的3HB输入的环区中,并在N端和C端最多额外插入5个残基。
如果您没有大量pdb文件来构建块邻接关系,此策略非常有用。例如,我们已证明使用此策略,从单个起始pdb就能生成大量加长的TIM桶。不过,对于PPI而言,如果您使用提供的支架集,则无需此操作(因为有大量起始支架可供选择,生成额外多样性并非特别必要)。
最后,如果您有一个包含大量块邻接/二级结构文件的目录,但不想全部使用,可以创建一个包含您想要使用的文件的.txt文件,并传递:
scaffoldguided.scaffold_list=path/to/list
在蛋白质-蛋白质相互作用(PPI)方面,我们一直观察到,减少推理时添加的噪声能够改善设计效果。这虽然会以牺牲多样性为代价,但考虑到支架集规模庞大,这一影响可能并不显著。因此,我们建议降低噪声水平。0.5或许是一个不错的折衷选择:
denoiser.noise_scale_ca=0.5 denoiser.noise_scale_frame=0.5
这只是将我们添加到平移(noise_scale_ca)和旋转(noise_scale_frame)的噪声量按 0.5 的比例进行缩放(在本案例中)。
有关带有折叠条件的 PPI 的另一个示例可在此处获取:./examples/design_ppi_scaffolded.sh
在 Liu et al., 2024 中,我们证明了 RFdiffusion 可用于设计针对柔性肽的结合剂,其中肽的 3D 坐标未被指定,但可以指定二级结构。这允许用户设计针对处于例如螺旋或 β 状态的肽的结合剂。
此处的原理是,我们提供肽的输入 pdb 结构,但指定我们要掩盖其 3D 结构:
inference.input_pdb=input_pdbs/tau_peptide.pdb 'contigmap.contigs=[70-100/0 B165-178]' 'contigmap.inpaint_str=[B165-178]'
在此,我们正在生成针对tau肽(pdb索引B165-178)的70-100个氨基酸的结合剂,并使用configmap.inpaint_str对该肽进行结构掩码。不过,我们可以接着指定希望其采用β(链)二级结构:
scaffoldguided.scaffoldguided=True 'contigmap.inpaint_str_strand=[B165-178]'
或者,你可以指定 contigmap.inpaint_str_helix 使其成为螺旋结构!
参见 examples/design_ppi_flexible_peptide_with_secondarystructure_specification.sh 中的示例。
对称寡聚体的生成
我们现在将从讨论蛋白质-蛋白质相互作用(PPI)转向 RFdiffusion 表现出色的另一项任务:对称寡聚体设计。这是通过对在 t=T 时刻采样的噪声进行对称化处理,并在每个时间步对输入进行对称化来实现的。目前我们已实现以下对称类型供使用(其他类型即将推出!):
- 循环对称
- 二面体对称
- 四面体对称
以下是一个示例:
./scripts/run_inference.py --config-name symmetry inference.symmetry=tetrahedral 'contigmap.contigs=[360]' inference.output_prefix=test_sample/tetrahedral inference.num_designs=1
在这里,我们指定了一个不同的 config 文件(通过 --config-name symmetry)。由于对称扩散与上述扩散有很大不同,我们将大量对称相关的配置打包到了一个新文件中(参见 configs/inference/symmetry.yml)。使用此配置文件后,扩散将进入“对称模式”。
然后,通过 inference.symmetry= 指定对称类型。在这里,我们指定的是四面体对称,您也可以选择循环对称(例如 c4)或二面体对称(例如 d2)。
configmap.contigs 的长度指的是您的寡聚体的总长度。因此,它必须能被n条链整除。
更多设计寡聚体的示例可以在这里找到:./examples/design_cyclic_oligos.sh、./examples/design_dihedral_oligos.sh、./examples/design_tetrahedral_oligos.sh。
使用辅助势能
使用对称化噪声进行扩散可能会让您想到,我们可以在去噪过程中使用其他外部干预来引导扩散。我们已实现的一种此类干预是辅助势能。辅助势能对于引导推理过程非常有用。例如,在 RFjoint 修复中,我们对输出的最终形状几乎没有控制,但在扩散中,我们可以很容易地迫使网络生成,例如,一个紧密堆积的蛋白质。 这是通过我们在每个步骤中进行的更新来实现的。
让我们更深入地了解扩散过程的工作原理:
在时间步 T(反向扩散推理过程的第一步),我们从已知的先验分布中采样噪声。然后模型预测最终结构应该是什么样子,我们使用这两个状态(时间 T 的噪声,时间 0 的结构预测)来反推时间 t=T-1 的状态。因此,我们有一个向量,从时间 T 的每个坐标指向它们在时间 T-1 反推得到的对应位置。
但是,我们希望能够偏向这个更新,将轨迹推向某些期望的状态。这可以通过用另一个向量来偏置该向量来实现,该向量指向残基能够减少您所定义的势能“损失”的位置。例如,如果我们想使用 monomer_ROG 势能,其目的是最小化最终蛋白质的回转半径,如果模型对 t=0 的预测是非常细长的,那么当我们对 monomer_ROG 势能关于这些远距离残基的位置求导时,它们都会有更大的梯度。这些梯度,连同相应的缩放比例,可以组合成一个向量,然后与原始更新向量组合,在该时间步进行“偏向更新”。
应用这些势能时使用的确切参数很重要。如果您对它们的权重设置过高,最终可能无法得到良好的蛋白质。设置过低,则它们几乎没有效果。我们已经在一些不同的场景中探索了这些势能,并设置了合理的默认值,供您使用。但是,如果您觉得它们的强度太弱/太强,或者您只是想进行探索,请随意调整参数(在配置文件的 potentials 部分)。
势能被指定为一个字符串列表,每个字符串对应一个势能。势能的参数是 potentials.guiding_potentials。在每个势能的字符串中,可以按照以下语法指定参数:arg_name1:arg_value1,arg_name2:arg_value2,...,arg_nameN:arg_valueN。每个势能唯一需要的参数是您希望应用的势能名称,该参数的名称为 type,即您希望使用的势能类型。一些势能,如 olig_contacts 和 substrate_contacts,会采用全局选项,例如 potentials.substrate,有关势能的所有全局参数,请参见 config/inference/base.yml。此外,让势能的效果在整个轨迹中“衰减”是很有用的,这样在开始时势能的效果为 1 倍强度,到结束时则弱得多。这些衰减方式(constant、linear、quadratic、cubic)可以通过 potentials.guide_decay 参数进行设置。
以下是指定势能的示例:
potentials.guiding_potentials=[\"type:olig_contacts,weight_intra:1,weight_inter:0.1\"] potentials.olig_intra_all=True potentials.olig_inter_all=True potentials.guide_scale=2 potentials.guide_decay='quadratic'
我们仍在全面研究如何以及何时使用势能,并且强烈建议您自行探索不同的参数,因为它们显然在一定程度上取决于具体情况。到目前为止,很明显它们在基序支架构建和对称寡聚体生成方面可能会有所帮助。然而,它们似乎与蛋白质-蛋白质相互作用(PPI)中的热点残基存在奇怪的相互作用。我们认为我们知道其中的原因,并将在未来几个月努力编写更好的PPI势能函数。另外请注意,通常最好的做法是从“无势能”开始作为基准,然后慢慢增加其强度。对于寡聚体接触势能,建议从示例中提供的那些开始,并注意“链内”(intra)势能通常应高于“链间”(inter)势能。
我们已经实现了多种势能函数,但如果您想将设计推向某些特定目标,添加更多势能函数相对简单。唯一的条件是,无论您编写何种势能函数,它都必须是可微的。有关我们目前已实现的势能函数示例,请查看 potentials.potentials.py。
对称基序支架构建
我们还可以将对称扩散与基序支架构建相结合,以对称方式构建基序支架。 目前,我们有一种执行对称基序支架构建的方法。即通过指定基序相对于对称轴的位置。
特殊输入 .pdb 和 contigs 要求
目前,对于对称基序支架构建,我们要求用户在其输入pdb中提供其基序的对称化版本。这主要有两个原因。首先,模型是通过将任何基序居中于原点进行训练的,因此代码也会自动将基序居中于原点。因此,如果您的基序未经过对称化,这种居中操作将导致不对称单元的原点和对称轴恰好穿过该单元(这是不利的)。其次,扩散代码使用一组标准的对称轴(旋转矩阵)来扩展基序的不对称单元。为了防止意外运行以非预期方式扩展您的基序的扩散轨迹,我们要求用户使用RFdiffusion的标准对称轴对输入进行对称化。
RFdiffusion 标准对称轴
| 群组 | 轴 |
|---|---|
| 循环对称 (Cyclic) | Z |
| 二面体对称(循环部分)(Dihedral (cyclic)) | Z |
| 二面体对称(翻转/反射部分)(Dihedral (flip/reflection)) | X |
示例:相对于对称轴指定基序位置的对称基序支架构建输入
示例脚本 examples/design_nickel.sh 可用于构建RFdiffusion论文中展示的C4对称镍结合结构域。它结合了前面讨论的许多概念,包括对称寡聚体生成、基序支架构建以及引导势能的使用。
请注意,contigs应指定精确对称的内容。如果不是这样,程序可能会出错。
关于模型权重的说明
由于我们希望扩散模型能够实现多种功能,因此并不存在一个“万能模型”。例如,如果您希望在运行时加入二级结构条件控制,就需要使用与无此条件时不同的模型。在默认情况下,我们会自动处理大部分此类问题——通过解析您的输入来确定最合适的检查点。
这正是配置设置的实用之处。推理时使用的具体模型检查点包含了其训练时的所有参数,因此我们只需将这些值填充到配置文件中,即可确保推理按设计运行。
如果您确实想指定一个不同的检查点(例如,我们训练了一个新模型,您想要对其进行测试),只需确保该检查点与您的操作兼容。例如,如果您尝试将二级结构特征提供给一个未使用这些特征训练的模型,程序将会崩溃。
推理时可能需要调整的参数
有时,尝试使用替代模型可能会有帮助(例如活性位点模型或β结合剂模型)。这些模型可以通过 inference.ckpt_override_path 来指定。但我们不建议在所述用例之外使用这些模型,因为无法保证它们能够理解其他类型的输入。
有关推理时已实现功能的完整列表,请参见配置文件(configs/inference/base.yml 或 configs/inference/symmetry.yml)。虽然您可以修改所有内容,但除非您清楚自己在做什么,否则不建议这样做。
通常,不要修改 model、preprocess 或 diffuser 配置。这些配置与模型的训练方式有关,因此在推理时更改模型的使用方式是不明智的。
不过,以下参数绝对值得探索:
- inference.final_step:这是我们停止轨迹的时间点。我们发现,即使提前停止,模型也已经能对最终结构做出良好预测。这可以加快推理速度。
- denoiser.noise_scale_ca 和 denoiser.noise_scale_frame:这些参数可用于减少采样过程中使用的噪声(如上文讨论蛋白质-蛋白质相互作用时所述)。默认值为1(与训练时添加的噪声相同),但可以降低到例如0.5,甚至0。这实际上可以提高扩散生成模型的质量,但会以多样性为代价。如果您没有得到任何好的输出,或者您的问题约束非常严格,可以尝试降低噪声。虽然这些参数(分别针对平移和旋转)可以独立更改,但我们建议将它们保持一致。
理解输出文件
我们会输出几种不同的文件。
.pdb文件:这是模型生成的最终预测结果。请注意,每个设计的残基都以甘氨酸的形式输出(因为我们只设计了主链),且不包含侧链。这是因为,尽管 RFdiffusion 会以输入基序中的侧链为条件,但不会对这些预测应用损失函数,因此不能完全信任它们。.trb文件:该文件包含与特定运行相关的有用元数据,包括所使用的特定 contig(如果对长度范围进行了采样)以及 RFdiffusion 使用的完整配置。此文件中还有其他一些便捷信息:- 映射详情(即输入中的残基如何映射到输出中的残基)
con_ref_pdb_idx/con_hal_pdb_idx:这两个数组包含输入 pdb 索引(在con_ref_pdb_idx中)以及它们在输出 pdb 中的位置(在con_hal_pdb_idx中)。仅包含进行了修复的链(即不包含任何固定的受体/靶链)con_ref_idx0/con_hal_idx0:与上述数组相同,但为 0 索引且不包含链信息。这对于提取坐标(以评估对齐等)非常有用。inpaint_seq:详细说明推理过程中被掩码的残基。
- 映射详情(即输入中的残基如何映射到输出中的残基)
- 轨迹文件:默认情况下,我们会将完整轨迹输出到
/traj/文件夹中。这些文件可以在 PyMOL 中作为多步 pdb 打开。请注意,这些文件的顺序是反向的,因此第一个 pdb 实际上是 RFdiffusion 在推理过程中生成的最后一个(t=1)预测。我们同时包含了pX0预测(模型在每个时间步的预测结果)和Xt-1轨迹(每个时间步输入到模型中的内容)。
Docker
我们在 docker/Dockerfile 中提供了 Dockerfile,以帮助在 HPC 和其他容器编排系统上运行 RFdiffusion。按照以下步骤在您的系统上构建和运行容器:
- 使用
git clone https://github.com/RosettaCommons/RFdiffusion.git克隆此仓库,然后执行cd RFdiffusion - 使用
docker info验证 Docker 守护进程是否在您的系统上运行。您可以在 Docker 官方文档 中找到适用于 Mac、Windows 和 Linux 的 Docker 安装说明。您也可以考虑使用 Finch,这是一个用于容器开发的开源客户端。 - 在您的系统上使用
docker build -f docker/Dockerfile -t rfdiffusion .构建容器镜像 - 在您的文件系统上创建一些文件夹:
mkdir $HOME/inputs $HOME/outputs $HOME/models - 使用
bash scripts/download_models.sh $HOME/models下载 RFdiffusion 模型 - 下载测试文件(或您选择的其他文件):
wget -P $HOME/inputs https://files.rcsb.org/view/5TPN.pdb - 使用以下命令运行容器:
docker run -it --rm --gpus all \
-v $HOME/models:$HOME/models \
-v $HOME/inputs:$HOME/inputs \
-v $HOME/outputs:$HOME/outputs \
rfdiffusion \
inference.output_prefix=$HOME/outputs/motifscaffolding \
inference.model_directory_path=$HOME/models \
inference.input_pdb=$HOME/inputs/5TPN.pdb \
inference.num_designs=3 \
'contigmap.contigs=[10-40/A163-181/10-40]'
这将启动 rfdiffusion 容器,挂载模型、输入和输出文件夹,分配所有可用的 GPU,然后使用指定的参数调用 run_inference.py 脚本。
结论
我们非常高兴能与更广泛的科学界分享 RFdiffusion。我们预计在未来几个月内,当我们取得显著改进时会推出一些更新,敬请关注。我们知道,要熟练掌握 RFdiffusion 的正确语法执行可能需要一些时间(Hydra 有时确实有点复杂),所以如果您需要帮助,请随时在 GitHub 上提交 issue,我们会尽可能及时回复。
现在,让我们开始设计蛋白质吧。祝您玩得愉快!
—— Joe、David、Nate、Brian、Jason 以及 RFdiffusion 团队
RFdiffusion 直接构建在 RoseTTAFold 的架构和训练参数之上。因此,我们感谢 Frank DiMaio 和 Minkyung Baek 开发了 RoseTTAFold。 RFdiffusion 以开源 BSD 许可证发布(详见 LICENSE 文件)。它对非营利和营利性使用均免费。