四时宝库

程序员的知识宝库

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

4.4 安装OpenMM

直接pip install openmm会报错

报错原因:当前服务器架构是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

重新执行推理

推理成功

输出文件

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接