基于昇腾适配DeepMind团队发布的蛋白质结构预测模型OpenFold

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 组件版本

hdk:24.1.0.3

cann:8.0.RC3

python:3.9.2

torch:2.1.0

torch_npu:2.1.0.post6

openfold:1.0.0

torchaudio:2.1.0

torchmetrics:1.7.1

torchvision:0.16.0

pytorch-lightning:1.6.5

4.2 起容器

docker run -it \

--privileged=true \

--device /dev/davinci0 \

--device /dev/davinci1 \

--device /dev/davinci2 \

--device /dev/davinci3 \

--device /dev/davinci4 \

--device /dev/davinci5 \

--device /dev/davinci6 \

--device /dev/davinci7 \

--device /dev/davinci_manager \

--device /dev/devmm_svm \ --device /dev/hisi_hdc \

-v /usr/local/dcmi:/usr/local/dcmi \

-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \

-v /usr/bin/hccn_tool:/usr/bin/hccn_tool \

-v /usr/local/Ascend/driver/lib64/common:/usr/local/Ascend/driver/lib64/common \

-v /usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/driver/lib64/driver \

-v /etc/ascend_install.info:/etc/ascend_install.info

\ -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \

--name openfold 27913b525135 /bin/bash

4.3 安装Openfold

注:如果直接git clone安装,则默认安装的是2.0.0版本的openfold,我们需要的是1.0.0版本

4.3.1 下载源码

git clone --filter=blob:none --quiet https://github.com/aqlaboratory/openfold.git ./openfold

4.3.2 将版本修改为1.0.0

cd ./openfold/ git rev-parse -q --verify 'sha^4b41059694619831a7db195b7e0988fc4ff3a307'

git fetch -q https://github.com/aqlaboratory/openfold.git4b41059694619831a7db195b7e0988fc4ff3a307

git checkout -q 4b41059694619831a7db195b7e0988fc4ff3a307

du -sh

再vi setup.py查看,此时就变成了1.0.0版本

4.3.3 修改openfold的setup.py文件

vi /home/openfold/setup.py

在头部从torch.utils.cpp_extension中增加对cppextension的引用

修改get_cuda_bare_metal_version函数,增加对有没有cuda的判断

修改ext_modules的内容如下

4.3.4 编译安装

pip install e .

报错找不到torch,但此时torch已经安装好了

pip install --upgrade setuptools

更新setuptools工具

pip install --upgrade pip pip install wheel

更新 pip,安装wheel

pip install e .

报错

但pip list却能查到openfold(可能是python自动将当前目录加入了模块搜索路径导致的)

看能否导入

python -c "import openfold; print(openfold.__version__)"

报错ModuleNotFoundError: No module named 'torch._six'

原因:pytorch版本与deepspeed版本冲突,torch._six 是pytorch旧版本中的模块,新版本已移除。

解决办法:更新deepspeed

pip install --upgrade deepspeed

报错

设置环境变量

export ASCEND_HOME_PATH=/usr/local/Ascend/ascend-toolkit/

pip install --upgrade deepspeed

继续报错

source cann

source /usr/local/Ascend/ascend-toolkit/set_env.sh

pip install --upgrade deepspeed

python -c "import openfold; print(openfold.__version__)"

报错原因:pytorch lightning版本不兼容,seed_everything在当前pytorch lightning版本中已被移动到新的模块路径。

解决办法:降低pytorch lightning版本

pip install pytorch_lightning==1.6.5

但要先降低pip的版本

pip install pip==23.1

pip install pytorch_lightning==1.6.5

python -c "import openfold; print(openfold.__version__)"

报错原因:dllogger是cuda的日志记录工具,安装需要基于cuda驱动,故在昇腾上面无法安装

解决办法:注销dllogger的导入,用python的标准库logging取代

vi /home/910_tools/openfold/openfold/utils/logger.py

python -c "import openfold; print(openfold.__version__)"

报错ModuleNotFoundError: No module named 'attn_core_inplace_cuda'

pip list | grep open

此时只有在openfold的源码目录才能用pip list查询到

且无法卸载

在根目录或者其它目录查询不到

怀疑根本就没装好,重新安装

export OPENFOLD_DISABLE_CUDA=1 # 运行时禁用CUDA相关代码

export NO_CUDA=1 # 安装时禁用CUDA扩展编译

pip install . --no-build-isolation

报错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

vi /home/910_tools/openfold/setup.py

将cmdclass={'build_ext': BuildExtension}改为cmdclass={'build_ext': BuildExtension.with_options(use_ninja=False)}

pip install . --no-build-isolation

报错g++: error: openfold/utils/kernel/csrc/softmax_cuda_stub.cpp: No such file or directory

查看csrc文件夹

ll /home /910_tools/openfold/openfold/utils/kernel/csrc

发现确实没有softmax_cuda_stub.cpp这个文件

但GitHub上面的源码却有这个文件

touch softmax_cuda_stub.cpp

vi softmax_cuda_stub.cpp

将源码复制进去 wq保存退出

再次执行

pip install . --no-build-isolation

安装成功

验证

此时不论哪里都能查得到openfold

4.4 安装OpenMM

直接pip install openmm会报错

添加图片注释,不超过 140 字(可选)

报错原因:当前服务器架构是aarch64,而通过pypi下载的openmm,没有aarch64架构的whl离线包,所以会安装失败。

pypi.org上面仅有8.1.1版本以上且没有aarch64架构的包

通过源码编译的方式安装失败

解决办法

在conda-forge的package中搜索openmm

选择要安装的版本和机器架构

下载openmm的预编译的二进制包(非源码包)

注: 如果是conda环境,直接在当前环境执行

conda install --use-local openmm-7.7.0-py39h127581e_1.tar.bz2

若是docker环境还需以下操作

解压

tar -xjf openmm-7.7.0-py39h127581e_1.tar.bz2

将openmm的python模块复制到容器中python的site-packages中

cp -r ./lib/python3.9/site-packages/openmm /usr/local/python3.9.2/lib/python3.9/site-packages/

将openmm的共享库(.so 文件)复制到 Python 的 lib 目录并更新动态链接器缓存

cp libOpenMM* /usr/local/python3.9.2/lib/

ldconfig

验证容器的python环境中openmm的安装情况

4.5 安装pdbfixer

直接pip install pdbfixer会报错

pip install pdbfixer

下载源码使用pip install .安装

git clone https://github.com/openmm/pdbfixer.git

pip install .

但此时默认安装的是最新版的pdbfixer,提示需要8.2版本以上的openmm

查看所有版本信息

git ls-remote --tags origin

从源码中看到1.8.1版本的pdbfixer,要求openmm的版本大于7.2即可,所以安装1.8.1版本

切换至1.8.1版本

git checkout tags/v1.8.1

pip install .

安装成功

pip list | grep pdb

查看

5. 实验

5.1 下载openfold权重

bash scripts/download_openfold_params.sh openfold/resources

报错,需要安装aws

安装好之后重新执行

报错

原因:在Python 3环境中运行了为Python 2编写的代码。print语句缺少括号。

解决办法:卸载aws,重新安装。

curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"

./aws/install aws –version

重新执行脚本下载权重

bash scripts/download_openfold_params.sh openfold/resources

5.2 下载数据集

bash scripts/download_alphafold_dbs.sh data/

报错Error: aria2c could not be found. Please install aria2c (sudo apt install aria2).

apt update && apt install aria2 -y

开始下载

但原始数据集太大,手动创建蛋白质序列测试

5.3创建蛋白质序列测试文件

新建data目录,在data目录新建test.fasta

vi test.fasta

内容为

>test_sequence|PDBID|1AKI

GIVEQCCTSICSLYQLENYCN

保存退出

注:上述为简化胰岛素类似物(PDB ID: 1AKI)蛋白质序列

5.4 下载蛋白质模板文件

mkdir -p template_mmcif_dir/pdb_mmcif/mmcif_files/

下载蛋白质模板文件

https://files.wwpdb.org/pub/pdb/data/structures/divided/mmCIF/ak/1aki.cif.gz

解压之后放至template_mmcif_dir/pdb_mmcif/mmcif_files/

5.5 推理

vi run_pretrained_openfold.py

导入torch-npu

执行推理

python3 run_pretrained_openfold.py /home/910_tools/data//home/910_tools/template_mmcif_dir/pdb_mmcif/mmcif_files/ --output_dir/home/910_tools/output/ --model_device "npu:0" --config_preset "model_1_ptm" --openfold_checkpoint_path/home/openfold/openfold/resources/openfold_params/finetuning_ptm_2.pt

报错

原因:openfold中使用了np.object的方式,而新版本numpy已不使用此写法

解决办法:

  1. 在代码中搜索所有np.object和np.bool,将其替换为object、bool

grep -rn "np\.object" openfold/

grep -rn "np\.bool" openfold/

2. 降低numpy版本,但要考虑更多的版本冲突(不建议)

执行推理

python3 run_pretrained_openfold.py /home/910_tools/data//home/910_tools/template_mmcif_dir/pdb_mmcif/mmcif_files/ --output_dir/home/910_tools/output/ --model_device "npu:0" --config_preset "model_1_ptm" --openfold_checkpoint_path/home/openfold/openfold/resources/openfold_params/finetuning_ptm_2.pt

报错

报错原因:deepspeed属性不在utils模块

解决办法:将涉及到deepspeed.utils.is_initialized()的地方都修改为deepspeed.comm.is_initialized()

执行推理

报错

报错原因:openfold自定义了一个注意力机制,底层会调用cuda核心进行加速

解决办法:使用原生的torch操作代替cuda操作

vi /home/910_tools/openfold/openfold/utils/kernel/attention_core.py

删除原始代码

将下面代码复制到attention_core.py保存退出

import torch
import torch.nn.functional as F
from functools import reduce
from operator import mul
class AttentionCoreFunction(torch.autograd.Function):
    @staticmethod
    def forward(ctx, q, k, v, bias_1=None, bias_2=None):
        if bias_1 is None and bias_2 is not None:
            raise ValueError("bias_1 must be specified before bias_2")
        q = q.contiguous()
        k = k.contiguous()
        v = v.contiguous()
        attention_logits = torch.matmul(q, k.transpose(-1, -2))
        if bias_1 is not None:
            attention_logits += bias_1
        if bias_2 is not None:
            attention_logits += bias_2
        attention_probs = F.softmax(attention_logits, dim=-1)
        o = torch.matmul(attention_probs, v)
        ctx.save_for_backward(q, k, v, attention_probs)
        ctx.bias_1_shape = bias_1.shape if bias_1 is not None else None
        ctx.bias_2_shape = bias_2.shape if bias_2 is not None else None
        return o
    @staticmethod
    def backward(ctx, grad_output):
        q, k, v, attention_probs = ctx.saved_tensors
        grad_q = grad_k = grad_v = grad_bias_1 = grad_bias_2 = None
        grad_v = torch.matmul(attention_probs.transpose(-1, -2), grad_output)
        grad_attn = torch.matmul(grad_output, v.transpose(-1, -2))
        grad_attn_logits = attention_probs * (grad_attn - (grad_attn * attention_probs).sum(dim=-1, keepdim=True))
        grad_q = torch.matmul(grad_attn_logits, k)
        grad_k = torch.matmul(q.transpose(-1, -2), grad_attn_logits).transpose(-1, -2)
        if ctx.bias_1_shape is not None:
            grad_bias_1 = grad_attn_logits.sum(
                dim=tuple(i for i, d in enumerate(ctx.bias_1_shape) if d == 1),
                keepdim=True
            )
        if ctx.bias_2_shape is not None:
            grad_bias_2 = grad_attn_logits.sum(
                dim=tuple(i for i, d in enumerate(ctx.bias_2_shape) if d == 1),
                keepdim=True
            )
        return grad_q, grad_k, grad_v, grad_bias_1, grad_bias_2
attention_core = AttentionCoreFunction.apply

执行推理

报错,和上述报错一本质一样

vi /home/910_tools/openfold/openfold/model/structure_module.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

重新执行推理

推理成功

输出文件

### 升腾AI平台部署Ollama大模型 #### 准备工作 为了在升腾AI处理器上成功部署Ollama大模型,需先确认服务器的操作系统版本以及安装必要的依赖库。对于操作系统的验证可以参照已有的指南[^1]。 #### 安装环境配置工具 针对Ollama大模型的特殊需求,在开始之前应当确保环境中已经正确设置了Python虚拟环境并安装了`pip`包管理器。这一步骤有助于后续更简便地管理和更新项目所需的各类软件包。 #### 获取预训练模型文件 访问官方发布的资源页面下载适用于升腾架构优化过的Ollama权重参数与配套脚本。通常这些资料会被打包成压缩文件形式提供给开发者使用。 #### 配置运行环境 通过命令行界面执行如下指令来创建一个新的Conda环境,并激活该环境以便于接下来的工作: ```bash conda create -n ollama python=3.8 conda activate ollama ``` 接着按照文档说明依次安装所需的各种Python库,特别是那些专门为适配NPU而设计的数据处理和加速计算组件。 #### 修改推理代码以适应硬件特性 由于Ollama原生可能并非直接支持升腾系列芯片,因此需要调整部分源码逻辑使其能够充分利用到Ascend 910的强大性能。具体改动涉及但不限于以下几个方面: - 调整网络层定义中的某些超参设置使之更适合当前硬件条件下的表现最优化; - 对原有框架做适当裁剪去除不必要的功能模块减少开销; 完成上述修改之后就可以尝试启动测试实例观察实际效果如何了。 #### 运行预测服务 当一切准备就绪后,可以通过调用API接口或者命令行的方式发起请求让模型基于输入样本给出相应的输出结果。此时应该密切关注日志输出情况及时发现潜在问题所在并加以解决直至整个流程稳定可靠为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值