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已不使用此写法
解决办法:
- 在代码中搜索所有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
重新执行推理
推理成功
输出文件