(i, j) 位置的配对概率(含 Watson-Crick/wobble 与非经典配对、伪结 pseudoknot)SpotRnaModel —— 逐碱基 one-hot 特征(A/C/G/U,N 为无效掩码)做外积拼接得到 L×L×8 配对表示,经 5 个集成成员(2D 膨胀残差卷积块,其中 1 个成员含 2D-BiLSTM 路径)逐对打分,对每个 (i,j) 输出配对 logitSPOT-RNA(Singh et al., Nature Communications 2019)由 MultiMolecule 团队复现并发布
单 checkpooint。相比 1D 逐位置打分模型(如 OpenSpliceAI / DeltaSplice),SPOT-RNA 直接对
配对空间 建模:5 个成员各自的 sigmoid 输出取平均得到配对概率矩阵 contact_map
(1, L, L);施加阈值(config.threshold = 0.335)+ 多重配对(multiplet)去除
后得到 0/1 配对图,可还原为 dot-bracket 结构串(支持 () [] {} <> 四级括号标注伪结)。
| 组件 | 版本 |
|---|---|
| torch | 2.9.0 |
| torch-npu | 2.9.0.post1 |
| transformers | 5.9.0 |
| multimolecule | 0.2.1 |
| fastapi | 0.123.10 |
| CANN | 8.5.1 |
| NPU 设备 | Ascend 910B(Ascend910_9362)× 2 |
注:multimolecule 0.2.1 需要
transformers>=5.0,会与 vllm 0.18(要求transformers<5) 冲突;SPOT-RNA 为二维卷积判别模型(非 LLM),不走 vLLM,直接使用 multimolecule + torch_npu 在昇腾 NPU 上推理,故无影响。
multimolecule.SpotRnaModel + torch_npu + FastAPI(同 OpenSpliceAI / DeltaSplice
等生物模型部署模式)。inference.py 在导入后自动对 SpotRna2DBiLSTM._forward_packed 打补丁——torch_npu 的
pad_packed_sequence(..., total_length=L) 不生效(返回批内实际最长长度而非指定长度),
导致第 4 个集成成员(含 2D-BiLSTM)形状不匹配报错
(RuntimeError: shape mismatch ... [21,21,400] vs [21,22,400])。补丁在赋值前显式补齐
时间维度,CPU 与 NPU 输出一致性 ~1e-4。RnaTokenizer(词表 A/C/G/U/N,DNA 的 T 自动转 U,N 在 one-hot 置零),
add_special_tokens=False;输出 contact_map 为配对概率矩阵,model.postprocess()
施加阈值 + multiplet 去除得到 0/1 配对图。L×L×8 配对表示 +
L×L×64 隐藏层),默认最大长度 1000 nt(--max-length 可调至 2000),超长拒绝。python3 inference.py --serve \
--model-path /opt/atomgit/models/spotrna \
--port 8000 --device npu:0| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /health | 健康检查(NPU 设备信息 + 模型状态) |
| GET | /v1/models | 模型信息(ID、任务、参数量、阈值、集成成员数) |
| POST | /v1/predict | 二级结构预测:{"sequence": "...", "threshold": 0.335, "top_k": 50, "include_contact_map": false} |
| POST | /v1/variant-effect | 结构变异效应:{"reference": "...", "alternative": "...", "top_k": 50}(同长变异) |
# 二级结构预测
curl -X POST http://127.0.0.1:8000/v1/predict \
-H "Content-Type: application/json" \
-d '{"sequence": "UAGCUUAUCAGACUGAUGUUGA", "top_k": 8}'
# 结构变异效应(microRNA 155 第 12 位 G->A)
curl -X POST http://127.0.0.1:8000/v1/variant-effect \
-H "Content-Type: application/json" \
-d '{"reference": "UUAAUGCUAAUCGUGAUAGGGUU", "alternative": "UUAAUGCUAAUCGUAAUAGGGUU"}'# 使用模型卡演示序列 microRNA 21(22 nt)
python3 inference.py --model-path /opt/atomgit/models/spotrna --device npu:0
# 指定 RNA/DNA 序列(DNA 的 T 自动转 U)
python3 inference.py --model-path /opt/atomgit/models/spotrna --device npu:0 \
--sequence "GGGCUAUUAGCUCAGUUGGUUAGAGCGCACCCCUGAUAAGGGUGAGGUCGCUGAUUCGAAUUCAGCAUAGCUCA"
# 参考/替代序列的结构变异效应
python3 inference.py --model-path /opt/atomgit/models/spotrna --device npu:0 \
--reference "UUAAUGCUAAUCGUGAUAGGGUU" --alternative "UUAAUGCUAAUCGUAAUAGGGUU"
# 其他演示序列 / 保存完整接触图
python3 inference.py --model-path /opt/atomgit/models/spotrna --device npu:0 --demo hiv_tar
python3 inference.py --model-path /opt/atomgit/models/spotrna --device npu:0 --save-contact-map cm.npy| 序列 | 长度 | 预测结构 | 参考结构(模型卡) | 配对数 | 一致性 |
|---|---|---|---|---|---|
| microRNA 21 | 22 nt | .(((..(((((.)))))))).. | .(((..(((((.)))))))).. | 8 | ✅ 一致 |
| microRNA 155 | 23 nt | ...((.(((.......))).)). | ......((.........))..... | 5 | 模型自身折叠(与数据库参考不同) |
| HIV-1 TAR-WT | 57 nt | (((..((((((((((.(((((...(((((...).))))))))))))))))))).))) | 同上 | 23 | ✅ 一致 |
microRNA 21 预测碱基对 Top-5:(9,13) A-U P=0.9832、(10,12) G-C P=0.9442、
(8,14) C-G P=0.9010、(7,15) U-A P=0.6243、(6,16) A-U P=0.5834。
microRNA 155 为模型自身折叠结果,与模型卡 widget 中数据库(miRBase)参考结构 略有差异:模型预测
...((.(((.......))).)).(2 个茎环、5 对),数据库参考......((.........)).....(1 个茎环)。属不同工具/来源对同一序列的合理分歧, 非部署问题。
| 序列长度 | 推理耗时 |
|---|---|
| 22 nt | ~74 ms |
| 60 nt | ~81 ms |
| 300 nt | ~284 ms |
模型加载 ~1.6s(首次推理含算子编译 ~9.3s)。CPU / NPU contact_map 最大绝对差
1.19e-04(预测配对完全一致)。
microRNA 155 第 12 位 G -> A(UUAAUGCUAAUCGU**G**AUAGGGUU →
UUAAUGCUAAUCGU**A**AUAGGGUU):结构从 5 对变为 1 对,丢失 4 个碱基对
((3,21) (4,20) (7,17) (8,16)),stem 完全解旋——符合 G/C 碱基被替换后
配对自由能降低的预期。
spotrna-npu/
├── inference.py # 推理脚本(CLI + FastAPI 服务,含 NPU BiLSTM 补丁)
├── README.md # 部署说明文档
├── requirements.txt # 环境依赖清单
└── assets/ # 截图素材
├── agent_workflow.png # 部署工作流截图(待补充)
├── npu_device_call.png # NPU 设备调用截图(待补充)
└── model_result.png # 模型推理结果截图(待补充)