1. 摘要
OpenFold是一种基于深度学习的蛋白质结构预测模型,广泛应用于蛋白质从头预测、功能位点解析、突变效应模拟等领域。该模型的核心目标是通过大规模预训练和多阶段优化,从氨基酸序列中高效、准确地推断蛋白质的三维结构。OpenFold结合了Transformer架构和几何优化模块,显著提高了结构预测的精度和速度。该模型的部署包含详细的微调教程、模型训练、推理优化等内容,为研究人员提供了全面的技术支持。
2. OpenFold介绍
OpenFold是由DeepMind团队开发的一种高效蛋白质结构预测模型。该模型在AlphaFold2的基础上进行了多项改进,进一步提升了蛋白质结构预测的准确性和计算效率。其核心算法包括大规模预训练的Transformer模型和几何优化模块,能够从氨基酸序列中快速推断出蛋白质的三维结构。通过多阶段优化和大规模数据集的训练,该模型在蛋白质从头预测、功能位点解析、突变效应模拟等领域展现了卓越的性能。此外,OpenFold的部署文档详细介绍了模型的微调、训练、推理优化等步骤,为研究人员提供了全面的技术支持,推动了蛋白质结构预测技术的广泛应用。
3. OpenFold网络架构
OpenFold的模型架构由三个核心模块构成:输入嵌入层、Evoformer堆叠模块和结构解码器。输入数据整合了多序列比对(MSA)、模板特征、氨基酸序列及进化信息,形成高维生物特征张量。通过分阶段嵌入与特征融合,数据首先被压缩至低维隐空间,随后由多尺度Evoformer模块进行全局-局部特征交互,最终通过几何约束的结构解码器输出蛋白质的3D原子坐标与置信度。
3.1 输入嵌入层
为统一处理异构生物特征并降低计算复杂度,OpenFold采用混合嵌入策略:
- MSA嵌入:使用1D卷积核(宽度=3,步长=1)对MSA序列进行通道压缩,配合层归一化(LayerNorm)稳定训练。
- 模板嵌入:通过残差连接的3D卷积(核3×3×3,步长1×2×2)提取模板结构特征,输出通道数对齐主嵌入空间。
- 序列特征投影:氨基酸物理化学属性经全连接层映射至隐空间,与上述嵌入结果拼接,形成初始隐状态张量(维度:C×L,L为序列长度)。
3.2 Evoformer堆叠模块
该模块由48层对称Evoformer块构成,采用双路处理机制:
- 全局注意力通路:引入轴向注意力机制,在序列维度(L)和MSA行维度(N)交替执行缩放余弦注意力,计算效率较传统Transformer提升3.2倍。每层包含:
- 局部结构通路:使用门控卷积网络(核大小=5,膨胀率=2)捕获局部氨基酸环境特征,配合三角更新机制建模残基间几何关系。每层输出经GroupNorm归一化后与全局通路特征融合。
3.3 结构解码器
- 主干几何生成:基于隐变量通过迭代对齐层(Invariant Point Attention, IPA)逐步优化主链扭转角
- 侧链重建:采用条件随机场(CRF)对侧链构象进行能量最小化采样,结合Rosetta能量函数约束立体化学合理性。
- 输出层:最终通过SE(3)-等变全连接层输出原子坐标(维度:L×37×3,37为每个残基原子数)及置信度热图(分辨率1Å)。
4. 核心组件安装
4.1 组件版本
4.2 起容器
4.3 安装Openfold
注:如果直接git clone安装,则默认安装的是2.0.0版本的openfold,我们需要的是1.0.0版本
4.3.1 下载源码
4.3.2 将版本修改为1.0.0
再vi setup.py查看,此时就变成了1.0.0版本
4.3.3 修改openfold的setup.py文件
在头部从torch.utils.cpp_extension中增加对cppextension的引用
修改get_cuda_bare_metal_version函数,增加对有没有cuda的判断
修改ext_modules的内容如下
4.3.4 编译安装
报错找不到torch,但此时torch已经安装好了
更新setuptools工具
更新 pip,安装wheel
报错
但pip list却能查到openfold(可能是python自动将当前目录加入了模块搜索路径导致的)
看能否导入
报错ModuleNotFoundError: No module named 'torch._six'
原因:pytorch版本与deepspeed版本冲突,torch._six 是pytorch旧版本中的模块,新版本已移除。
解决办法:更新deepspeed
报错
设置环境变量
继续报错
报错原因:pytorch lightning版本不兼容,seed_everything在当前pytorch lightning版本中已被移动到新的模块路径。
解决办法:降低pytorch lightning版本
但要先降低pip的版本
报错原因:dllogger是cuda的日志记录工具,安装需要基于cuda驱动,故在昇腾上面无法安装
解决办法:注销dllogger的导入,用python的标准库logging取代
报错ModuleNotFoundError: No module named 'attn_core_inplace_cuda'
此时只有在openfold的源码目录才能用pip list查询到
且无法卸载
在根目录或者其它目录查询不到
怀疑根本就没装好,重新安装
报错ninja: error: '/home /910_tools/openfold/openfold/utils/kernel/csrc/softmax_cuda_stub.cpp', needed by '/home /910_tools/openfold/build/temp.linux-aarch64-cpython-39/openfold/utils/kernel/csrc/softmax_cuda_stub.o', missing and no known rule to make it
将cmdclass={'build_ext': BuildExtension}改为cmdclass={'build_ext': BuildExtension.with_options(use_ninja=False)}
报错g++: error: openfold/utils/kernel/csrc/softmax_cuda_stub.cpp: No such file or directory
查看csrc文件夹
发现确实没有softmax_cuda_stub.cpp这个文件
但GitHub上面的源码却有这个文件
touch softmax_cuda_stub.cpp
vi softmax_cuda_stub.cpp
将源码复制进去 wq保存退出
再次执行
安装成功
验证
此时不论哪里都能查得到openfold
4.4 安装OpenMM
直接pip install openmm会报错
报错原因:当前服务器架构是aarch64,而通过pypi下载的openmm,没有aarch64架构的whl离线包,所以会安装失败。
pypi.org上面仅有8.1.1版本以上且没有aarch64架构的包
通过源码编译的方式安装失败
解决办法
在conda-forge的package中搜索openmm
选择要安装的版本和机器架构
下载openmm的预编译的二进制包(非源码包)
注: 如果是conda环境,直接在当前环境执行
若是docker环境还需以下操作
解压
将openmm的python模块复制到容器中python的site-packages中
将openmm的共享库(.so 文件)复制到 Python 的 lib 目录并更新动态链接器缓存
验证容器的python环境中openmm的安装情况
4.5 安装pdbfixer
直接pip install pdbfixer会报错
下载源码使用pip install .安装
但此时默认安装的是最新版的pdbfixer,提示需要8.2版本以上的openmm
查看所有版本信息
从源码中看到1.8.1版本的pdbfixer,要求openmm的版本大于7.2即可,所以安装1.8.1版本
切换至1.8.1版本
安装成功
查看
5. 实验
5.1 下载openfold权重
报错,需要安装aws
安装好之后重新执行
报错
原因:在Python 3环境中运行了为Python 2编写的代码。print语句缺少括号。
解决办法:卸载aws,重新安装。
重新执行脚本下载权重
5.2 下载数据集
报错Error: aria2c could not be found. Please install aria2c (sudo apt install aria2).
开始下载
但原始数据集太大,手动创建蛋白质序列测试
5.3创建蛋白质序列测试文件
新建data目录,在data目录新建test.fasta
内容为
>test_sequence|PDBID|1AKI
GIVEQCCTSICSLYQLENYCN
保存退出
注:上述为简化胰岛素类似物(PDB ID: 1AKI)蛋白质序列
5.4 下载蛋白质模板文件
下载蛋白质模板文件
解压之后放至template_mmcif_dir/pdb_mmcif/mmcif_files/
5.5 推理
导入torch-npu
执行推理
报错
原因:openfold中使用了np.object的方式,而新版本numpy已不使用此写法
解决办法:
- 在代码中搜索所有np.object和np.bool,将其替换为object、bool
2. 降低numpy版本,但要考虑更多的版本冲突(不建议)
执行推理
报错
报错原因:deepspeed属性不在utils模块
解决办法:将涉及到deepspeed.utils.is_initialized()的地方都修改为deepspeed.comm.is_initialized()
执行推理
报错
报错原因:openfold自定义了一个注意力机制,底层会调用cuda核心进行加速
解决办法:使用原生的torch操作代替cuda操作
删除原始代码
将下面代码复制到attention_core.py保存退出
执行推理
报错,和上述报错一本质一样
注销45行attn_core_inplace_cuda = importlib.import_module("attn_core_inplace_cuda")
添加from openfold.utils.kernel.attention_core import AttentionCoreFunction
删除435行调用attn_core_inplace_cuda.forward_代码,使用原生softmax实现
执行推理
报错ModuleNotFoundError: No module named 'simtk.openmm'
原因:openmm或相关依赖中使用比较老的openmm导入方式
解决办法:将openfold、openmm、pdbfixer中所有涉及到simtk.openmm的地方都修改为openmm
重新执行推理
推理成功
输出文件