作者:昇腾实战派

知识地图https://blog.csdn.net/Lumos_Lovegood/article/details/161601003

背景概述

自监督深度语言建模在自然语言处理领域取得了前所未有的成功,近年来也被广泛应用于生物序列分析。然而,现有的蛋白质语言模型(如 ESM、TAPE-Transformer、ProtTrans 等)大多从自然语言领域直接引入现有架构和预训练任务,未能充分利用蛋白质的独特特性——蛋白质没有明确的多字母构建块(如单词和句子),长度变化远大于句子,且三维结构导致远距离位置之间存在大量相互作用。

ProteinBERT 由耶路撒冷希伯来大学 Nadav Brandes 团队于 2022 年发表于 Bioinformatics,是一种专门为蛋白质设计的深度语言模型。它的核心创新在于:引入了局部(序列级)与全局(蛋白质级)双重表示机制,预训练方案结合了掩码语言建模基因本体论(GO)注释预测双任务,且采用线性复杂度的全局注意力层替代传统自注意力,使模型能高效处理任意长度的蛋白质序列。整个模型仅约 1600 万参数,比其他蛋白质语言模型(通常 3800 万以上)小得多、快得多,却在多个基准上达到接近甚至超越 SOTA 的性能。

本文介绍 ProteinBERT 模型的 PyTorch + 昇腾 Ascend NPU 适配版本——从原始 TensorFlow/Keras 项目中转换预训练权重,在昇腾 AI 平台上完成推理与下游 benchmark 微调,为蛋白质功能预测和序列分析提供高效、可复现的技术方案。

模型介绍

ProteinBERT 概述

ProteinBERT 在约 1.06 亿条 UniRef90 蛋白质序列上进行自监督预训练,预训练任务包括:

  • 掩码语言建模(MLM):以 5% 概率随机替换氨基酸 token,模型需恢复原始序列
  • GO 注释预测:随机删除/添加 GO 注释,模型需恢复已知注释

模型支持端到端处理局部输入输出(序列级别,如二级结构、信号肽位置)和全局输入输出(蛋白质级别,如荧光、稳定性、远程同源性分类)。

整体架构

ProteinBERT 的架构灵感来自 BERT,但有几项关键创新:

双路径表示

路径张量形状维度作用
局部表示(Local)B × L × d_locald_local=128捕获残基级别的序列特征
全局表示(Global)B × d_globald_global=512捕获蛋白质整体功能特征

模型组成

  1. 输入层

    • 序列输入:26 个 token(20 种标准氨基酸 + U + X + OTHER + START/END/PAD)通过 Embedding 层转为局部表示
    • GO 注释输入:8943 维 one-hot 向量通过全连接层转为全局表示
  2. 核心主干:6 个 ProteinBERT Block

    每个 Block 包含:

    • 局部路径:窄卷积(kernel=9, dilation=1)+ 宽卷积(kernel=9, dilation=5)+ 位置全连接层 + LayerNorm
    • 全局路径:两层全连接 + LayerNorm
    • 局部→全局:全局注意力层(Global Attention),全局表示作为 Query,局部表示作为 Key/Value
    • 全局→局部:广播全连接层,将全局信息投影到每个序列位置
  3. 输出层

    • 局部输出:序列每个位置的 token 概率(Softmax)
    • 全局输出:8943 个 GO 注释的预测概率(Sigmoid)

全局注意力层(Global Attention)

这是 ProteinBERT 的核心创新。传统自注意力复杂度为 O(L²),而全局注意力的复杂度仅为 O(L)——全局表示(512维向量)作为 Query 与序列所有位置计算注意力,无需序列位置之间两两计算。这使得模型能高效处理极长的蛋白质序列(上万氨基酸),同时保持了全局信息与局部特征的双向流动。

具体实现:

  • 4 个注意力头,Key 维度 64
  • Query 来自全局表示,Key/Value 来自局部序列表示
  • 使用 tanh 激活 Query/Key,GELU 激活 Value
  • 注意力输出拼接后作为全局表示的残差更新

预训练与微调策略

预训练

  • 数据:UniRef90 约 1.06 亿蛋白质序列 + GO 注释
  • 损失函数:序列分类交叉熵 + GO 注释二元交叉熵
  • 训练约 28 天,~6.4 epochs,定期切换序列编码长度(128/512/1024)

微调协议

  1. 冻结所有预训练层,仅训练新增全连接层 40 epochs
  2. 解冻所有层,继续训练 40 epochs
  3. 在更大序列长度上做最终 epoch

应用场景

  • 信号肽识别:预测蛋白质 N 端是否存在信号肽及切割位点
  • 蛋白质稳定性预测:预测突变对蛋白质热稳定性的影响
  • 荧光强度预测:预测 GFP 突变体的荧光活性
  • 远程同源性检测:识别序列相似性极低但结构/功能相关的蛋白质
  • 二级结构预测:预测每个残基的二级结构类型(螺旋/折叠/卷曲)
  • 翻译后修饰预测:预测磷酸化等修饰位点

PyTorch + 昇腾 NPU 适配版本

迁移动机

原始 ProteinBERT 基于 Keras/TensorFlow 实现。为在昇腾 Ascend NPU 上高效运行推理与微调,本项目将核心模型代码转换为 PyTorch 实现,并通过 torch_npu 适配昇腾硬件加速。

仓库结构

proteinbert_pytorch/
├── README.md
├── setup.py
├── bin/
│   ├── convert_tf_to_pytorch       # 权重转换入口
│   ├── env_npu.sh                  # 昇腾环境配置
│   ├── inference_proteinbert_npu   # 推理入口
│   └── finetune_proteinbert_npu    # 微调入口
├── scripts/
│   ├── demo_scripts/               # 完整 benchmark 演示
│   │   ├── demo1_signalP_npu.py
│   │   ├── demo2_all_benchmarks_npu.py
│   │   └── demo3_attention_npu.py
│   ├── deploy_toolkit/             # 部署相关脚本
│   └── tools/                      # 调试与对比工具
├── protein_benchmarks/             # 下游 benchmark 数据集
└── proteinbert/
    ├── __init__.py
    ├── model.py                    # ProteinBERTModel PyTorch 实现
    ├── convert_weights.py          # TF pkl → PyTorch state_dict
    ├── inference.py                # 推理逻辑
    └── finetune.py                 # 微调逻辑

核心实现

ProteinBERTModel:包含序列 Embedding、全局输入 Dense、6 个 ProteinBERTBlock、序列输出 Dense 和注释输出 Dense。

ProteinBERTBlock:每个 Block 实现局部路径(窄卷积 + 宽卷积 + 全连接 + LayerNorm)和全局路径(全连接 + GlobalAttention + LayerNorm),以及两路径之间的信息交换。

GlobalAttention:多头全局注意力,使用 einsum 高效计算 Query(全局)与 Key/Value(序列)的注意力,复杂度为 O(L)。

当前覆盖能力

  • 加载原始 TensorFlow pkl 预训练权重
  • 转换为 PyTorch state_dict
  • 提取 embedding(局部 + 全局)
  • 在 CPU / Ascend NPU 上做推理
  • 在 9 个下游 benchmark 上做微调与评估

当前版本不包含原始仓库完整的 UniRef 预训练流水线的 PyTorch 复刻。

版本信息

软件版本
CANN8.2+
Python3.10
PyTorch2.5.1
torch_npu2.5.1
NumPy1.26.4

环境配置

创建 Conda 环境

conda create -n proteinbert_npu python=3.10 -y
conda activate proteinbert_npu

克隆代码

git clone https://atomgit.com/AI4Science/proteinbert_pytorch.git
cd proteinbert_pytorch
mkdir ./proteinbert_models

安装依赖

pip install torch==2.5.1 torch_npu==2.5.1 numpy==1.26.4 pyyaml \
    pandas scikit-learn h5py scipy
pip install decorator attrs psutil absl-py cloudpickle ml-dtypes tornado

如果不使用 Ascend NPU,只做 CPU 推理,则 torch_npu 不是必须的。

配置昇腾环境

source ./bin/env_npu.sh

该脚本会自动:

  • source /usr/local/Ascend/ascend-toolkit/set_env.sh
  • 补充 Ascend driver / CANN 的运行时库路径
  • 默认设置 ASCEND_RT_VISIBLE_DEVICES=0

安装包

python setup.py install

模型权重准备

权重存放位置

./proteinbert_models/
├── epoch_92400_sample_23500000.pkl    # 原始 TF 预训练权重
└── proteinbert_pytorch.pt             # 转换后的 PyTorch checkpoint

下载原始 TensorFlow 权重

从以下地址下载:

  • https://modelers.cn/models/Ascend-AI4S/proteinbert
  • 或 GitHub: https://github.com/nadavbra/proteinbert_data_files/blob/master/epoch_92400_sample_23500000.pkl

转换为 PyTorch 权重

convert_tf_to_pytorch \
    --input ./proteinbert_models/epoch_92400_sample_23500000.pkl \
    --output ./proteinbert_models/proteinbert_pytorch.pt

推理命令

CPU 推理

inference_proteinbert_npu \
    --weights ./proteinbert_models/proteinbert_pytorch.pt \
    --seqs MKTVRQERLKSIVRILERSKEPVSGAQ ACDEFGHIKLMNPQRSTUVWXY \
    --device cpu

NPU 推理

inference_proteinbert_npu \
    --weights ./proteinbert_models/proteinbert_pytorch.pt \
    --seqs MKTVRQERLKSIVRILERSKEPVSGAQ ACDEFGHIKLMNPQRSTUVWXY \
    --device npu:0

快速代码示例

from proteinbert import convert_tf_to_pytorch, tokenize_seqs
import torch

seqs = [
    "MKTVRQERLKSIVRILERSKEPVSGAQ",
    "ACDEFGHIKLMNPQRSTUVWXY",
]
seq_len = 512

model, n_annotations = convert_tf_to_pytorch(
    "./proteinbert_models/epoch_92400_sample_23500000.pkl"
)
model = model.to("cpu").eval()

tokens = torch.from_numpy(tokenize_seqs(seqs, seq_len)).long()
input_annotations = torch.zeros(len(seqs), n_annotations)

with torch.no_grad():
    local_outputs, global_outputs = model(tokens, input_annotations)

Benchmark 微调

单个 Benchmark 微调

例如在 signalP_binary 上微调:

finetune_proteinbert_npu \
    --weights ./proteinbert_models/proteinbert_pytorch.pt \
    --train-csv ./protein_benchmarks/signalP_binary.train.csv \
    --test-csv ./protein_benchmarks/signalP_binary.test.csv \
    --task binary \
    --device npu:0

运行全部 Benchmark

HOME=$PWD TORCH_DEVICE_BACKEND_AUTOLOAD=0 python \
    ./scripts/demo_scripts/demo2_all_benchmarks_npu.py \
    --device npu:0

指定部分 benchmark:

HOME=$PWD TORCH_DEVICE_BACKEND_AUTOLOAD=0 python \
    ./scripts/demo_scripts/demo2_all_benchmarks_npu.py \
    --device npu:0 \
    --benchmarks signalP_binary fluorescence scop

支持的 Benchmark 列表

Benchmark任务类型指标
signalP_binary全局二分类AUC
fluorescence全局回归Spearman
remote_homology全局多分类Accuracy
stability全局回归Spearman
scop全局多分类Accuracy
secondary_structure序列级分类Accuracy
disorder_secondary_structure序列级二分类AUC
ProFET_NP_SP_Cleaved全局二分类AUC

精度验证

Embedding 提取验证

项目结果
Local embedding 形状(3, 512, 1562)
Global embedding 形状(3, 15599)
CPU/NPU seq_probs 偏差max_abs_diff=0.01190776, mean_abs_diff=0.00008779
CPU/NPU annotations 偏差max_abs_diff=0.00603402, mean_abs_diff=0.00000099

NPU 推理性能

项目结果
Batch size4
Sequence length512
平均推理时间0.0048 s
吞吐量~826 seq/s

下游 Benchmark 实测结果(NPU)

Benchmark指标NPU 实测结果
signalP_binaryAUC0.995857
fluorescenceSpearman0.662879
remote_homologyAccuracy0.213092
stabilitySpearman0.765755
scopAccuracy0.885998
secondary_structureAccuracy0.740793
disorder_secondary_structureAUC0.872198
ProFET_NP_SP_CleavedAUC0.982882

与 TensorFlow/GPU 基线对比

Benchmark指标GPU (TF)NPU (PyTorch)偏差
signalP_binaryAUC0.99610.9965+0.04%
fluorescenceSpearman0.64750.6597+1.22%
remote_homologyAccuracy22.42%21.17%-1.25%
stabilitySpearman0.70680.7851+7.83%
ProFET_NP_SP_CleavedAUC0.98550.9852-0.03%

分类任务整体与 TensorFlow 基线接近。回归任务的差异更大,主要受 TensorFlow Adam 与 PyTorch Adam 优化器收敛差异影响。

迁移适配要点

TensorFlow → PyTorch 关键差异

问题解决方案
Keras 权重存储为 pkl dump解析 pkl 文件提取各层 numpy 数组,按层名映射到 PyTorch
TF LayerNormalization 默认 eps=1e-3PyTorch LayerNorm 中设置 eps=1e-3 保持一致
TF Conv1D 权重 (K, Cin, Cout)转置为 PyTorch (Cout, Cin, K)
TF Dense 权重 (in, out)转置为 PyTorch (out, in)
TF 全局注意力参数形状差异按多头结构 reshape 后映射

昇腾 NPU 适配

PyTorch 版本通过 torch_npu 在昇腾 NPU 上运行,只需指定设备即可:

--device npu:0

CPU/NPU 精度偏差在可接受范围内(mean_abs_diff < 0.0001)。

已知限制

  • 当前版本不包含原始仓库完整的 UniRef 预训练流水线的 PyTorch 复刻
  • PhosphositePTM benchmark 因缺少 PhosphositePTM.train.csv 无法完成微调评测
  • 回归任务(fluorescence、stability)因优化器差异,PyTorch 版与 TF 版结果偏差较大
  • 建议与原始 TensorFlow 版使用不同 Conda 环境

参考文献

  • Brandes, N., Ofer, D., Peleg, Y., Rappoport, N. & Linial, M. ProteinBERT: A universal deep-learning model of protein sequence and function. Bioinformatics (2022). https://doi.org/10.1093/bioinformatics/btac020
  • 上游代码仓库:https://github.com/nadavbra/protein_bert
  • PyTorch 昇腾适配版:https://atomgit.com/AI4Science/proteinbert_pytorch
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐