(i, j) 位置的配对概率(含 Watson-Crick/wobble 与非经典配对、伪结 pseudoknot)UfoldModel —— 逐碱基 one-hot 特征(A/C/G/U,N 为无效掩码)做外积拼接得到 16 个配对通道,再叠加 1 个手工构造的经典/wobble 配对先验通道,构成 L×L×17 的图像式表示,经 5 级下采样/上采样的 U-Net(channel_sizes=[32,64,128,256,512])回归出对称的接触分数矩阵,对每个 (i,j) 输出配对 logitUFold(Fu et al., Nucleic Acids Research 2021)由 MultiMolecule 团队复现并发布。
与 1D 逐位置打分模型(如 OpenSpliceAI / DeltaSplice)不同,UFold 直接对配对空间
建模:将序列编码为图像式 L×L×17 表示后经 U-Net 回归,logits 为 raw 分数(非概率,
勿直接当概率用),torch.sigmoid(logits) 得到配对概率矩阵 contact_map (1, L, L);
施加阈值(config.threshold = 0.5)+ UFold 约束后处理(拉格朗日乘子迭代 + L1 收缩)
后得到 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) 冲突;UFold 为二维卷积判别模型(非 LLM),不走 vLLM,直接使用 multimolecule + torch_npu 在昇腾 NPU 上推理,故无影响。
multimolecule.UfoldModel + torch_npu + FastAPI(同 SPOT-RNA / OpenSpliceAI /
DeltaSplice 等生物模型部署模式)。RnaTokenizer(词表 A/C/G/U/N,DNA 的 T 自动转 U,N 在 one-hot 置零),
add_special_tokens=False;模型内部将序列 padding 到 min_size=80 且为
size_multiple=16 的倍数(U-Net 四次下采样需要,_pad_inputs_embeds 自动处理);
输出 contact_map 为 sigmoid 后的配对概率矩阵,model.postprocess() 施加
UFold 约束后处理 + 阈值得到 0/1 配对图。logits 是 raw 分数(UfoldEncoder.forward 末尾
transpose(-1,-2) * logits 得到的平方分数),不是概率;配对概率一律取
outputs.contact_map(即 sigmoid(logits))。L×L×17 图像表示 +
U-Net),默认最大长度 600 nt(--max-length 可调至 1000),超长拒绝。python3 inference.py --serve \
--model-path /opt/atomgit/models/ufold \
--port 8000 --device npu:0| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /health | 健康检查(NPU 设备信息 + 模型状态) |
| GET | /v1/models | 模型信息(ID、任务、参数量、阈值、U-Net 通道数) |
| POST | /v1/predict | 二级结构预测:{"sequence": "...", "threshold": 0.5, "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"}'# 使用模型卡演示序列 tRNA(76 nt)
python3 inference.py --model-path /opt/atomgit/models/ufold --device npu:0
# 指定 RNA/DNA 序列(DNA 的 T 自动转 U)
python3 inference.py --model-path /opt/atomgit/models/ufold --device npu:0 \
--sequence "GGGCUAUUAGCUCAGUUGGUUAGAGCGCACCCCUGAUAAGGGUGAGGUCGCUGAUUCGAAUUCAGCAUAGCUCA"
# 参考/替代序列的结构变异效应
python3 inference.py --model-path /opt/atomgit/models/ufold --device npu:0 \
--reference "UUAAUGCUAAUCGUGAUAGGGUU" --alternative "UUAAUGCUAAUCGUAAUAGGGUU"
# 其他演示序列 / 保存完整接触图
python3 inference.py --model-path /opt/atomgit/models/ufold --device npu:0 --demo hiv_tar
python3 inference.py --model-path /opt/atomgit/models/ufold --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 | ~80 ms |
| 60 nt | ~90 ms |
| 300 nt | ~400 ms |
模型加载 ~1.7s(首次推理含算子编译 ~10s)。CPU / NPU contact_map 最大绝对差
~1e-4(预测配对完全一致)。
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 碱基被替换后
配对自由能降低的预期。
ufold-npu/
├── inference.py # 推理脚本(CLI + FastAPI 服务)
├── README.md # 部署说明文档
├── requirements.txt # 环境依赖清单
└── assets/ # 截图素材
├── agent_workflow.png # 部署工作流截图(待补充)
├── npu_device_call.png # NPU 设备调用截图(待补充)
└── model_result.png # 模型推理结果截图(待补充)