liuhongwei-2026/pangolin-npu
模型介绍
文件和版本
Pull Requests
讨论
分析

Pangolin(multimolecule/pangolin)在昇腾 NPU 上的适配

1. 简介

  • 模型来源: multimolecule/pangolin(gitcode 镜像: hf_mirrors/multimolecule/pangolin)
  • 参数量: 约 8.365M(8,364,828)
  • 模型任务: 从前体 mRNA(pre-mRNA)序列预测组织特异性剪接位点强度(4 组织:heart / liver / brain / testis)
  • 模型架构: 1D 扩张残差卷积神经网络(CNN,SpliceAI 扩张残差架构扩展)
  • 适配状态: 成功
  • 适配时间: 2026-08-19

Pangolin(Zeng & Li, 2022,原实现 tkzeng/Pangolin, 由 MultiMolecule 团队复现并发布)输入经过独热编码的核苷酸序列,对每个位置预测 一个剪接位点评分以及每个组织的剪接位点使用评分。Pangolin 通常用于对参考序列与 替代序列分别评分并计算其差值,从而评估遗传变异对剪接的影响(splice-variant-effect)。

2. 验证环境

组件版本
torch2.9.0
torch-npu2.9.0.post1
transformers5.9.0
multimolecule0.2.1
fastapi0.123.10
numpy1.26.4
CANN8.5.1
NPUAscend 910(Ascend910_9362,64GB HBM)

3. 模型结构

Pangolin 是 1D 扩张残差 CNN:Conv1d(5→32, k=1) 嵌入 → 4 个扩张残差 stage(每个 stage 4 个 block,kernel/dilation: 11/1、11/4、21/10、41/25)→ 共享 skip 连接 → per-tissue 预测头。每个组织有 3 个 ensemble 成员,输出取平均。

配置项值
模型类型PangolinModel
输入可变长前体 mRNA 序列(RnaTokenizer,词表 A/C/G/U/N,T 自动转 U)
上下文窗口10000 nt(context=10000,两侧各填充 context//2=5000 个零)
隐藏层32(hidden_size=32,hidden_act=relu,BatchNorm1d)
扩张残差 stage4 × 4 blocks(kernel_size/dilation: 11/1、11/4、21/10、41/25,padding=same)
集成num_ensemble=3(每组织 3 个成员取平均)
组织num_tissues=4(heart、liver、brain、testis)
输出通道12 = 4 组织 × 3 通道(2 个 softmax 剪接位点评分 + 1 个 sigmoid 使用)
词表5(A/C/G/U/N,pad/unk=N=4,RnaTokenizer)
参数量8,364,828(8.365M)
权重格式float32(model.safetensors 约 33.9MB)

输出通道顺序:heart_no_splice, heart_splice_site, heart_usage, liver_no_splice, liver_splice_site, liver_usage, brain_no_splice, brain_splice_site, brain_usage, testis_no_splice, testis_splice_site, testis_usage(probabilities 形状 (batch, seq_len, 12))。

4. 昇腾 NPU 适配要点

#适配点说明
1非 LLM,不走 vLLM-AscendPangolin 是判别式 CNN(pre-mRNA → 剪接评分,非自回归生成),vLLM / vllm-ascend 无法直接服务;采用 multimolecule + torch_npu + FastAPI 方案在昇腾 NPU 上推理
2依赖版本约束multimolecule 0.2.1 依赖 transformers.initialization,需要 transformers>=5.0(本仓库固定 5.9.0,与 config.json 的 transformers_version 一致);这会与 vllm 0.18(要求 transformers<5)冲突,但本模型不使用 vLLM,无影响
3推理设备通过 torch_npu 注册 npu 后端,模型 .to("npu:0") 在昇腾 910 上计算;权重为 float32(约 33.9MB),无需量化
4上下文填充嵌入层在序列两侧各填充 context//2=5000 个零,最长单次输入约 10000 nt;超过 10000 nt 的长序列由脚本按 stride=500 滑窗打分并重叠取平均
5one-hot 嵌入模型内部用 F.one_hot 将 token 投影为 (batch, seq_len, vocab=5) 通道;在 NPU 上仅告警 "internal format"(输出正常),无需修补
6T→U 转换RnaTokenizer 默认 replace_T_with_U=true,DNA 序列中的 T 自动转为 U 后送入模型
7变体效应评估内置 --ref-seq / --alt-seq / --pos 变体模式与 POST /v1/variant 端点,计算替代序列相对参考序列在目标位置的 Δsplice_site、Δusage

模型验证: 在昇腾 NPU 上对模型卡内置演示序列 AGCAGUCAUUAUGGCGAA(18 nt) 推理,输出 12 通道剪接评分(每位置 softmax 通道和=1、usage∈[0,1]), heart 组织 Top 剪接位点 pos 17 score=0.0670、usage=0.0468,行为符合预期。 首次推理(含算子编译)约 1.2 s。

5. 快速开始

5.1 安装依赖

pip install -r requirements.txt

若 vLLM-Ascend 环境已存在(transformers<5),建议使用独立 venv 安装本仓库依赖, 避免与 multimolecule 所需的 transformers 5.9.0 冲突。

5.2 下载模型权重

# 方式一:GitCode 镜像(权重为 Git LFS,需 git-lfs pull 或经 LFS batch API 下载)
git clone https://gitcode.com/hf_mirrors/multimolecule/pangolin.git

# 方式二:HuggingFace 镜像(hf-mirror.com)+ huggingface_hub 下载真实权重
git clone --depth 1 https://hf-mirror.com/multimolecule/pangolin.git
HF_ENDPOINT=https://hf-mirror.com python3 -c "
from huggingface_hub import hf_hub_download
hf_hub_download(repo_id='multimolecule/pangolin', filename='model.safetensors',
                local_dir='./pangolin')
"

# 方式三:multimolecule 直接加载(会自动下载,需可访问 HF)
python -c "from multimolecule import RnaTokenizer, PangolinModel; \
tok = RnaTokenizer.from_pretrained('multimolecule/pangolin'); \
m = PangolinModel.from_pretrained('multimolecule/pangolin')"

5.3 命令行推理

# 缺省:使用模型卡内置演示序列(AGCAGUCAUUAUGGCGAA, 18 nt)打分
python3 inference.py --model-path ./pangolin --device npu:0

# 单条序列打分(≤ 10000 nt 单次打分,> 10000 nt 自动滑窗)
python3 inference.py --model-path ./pangolin --device npu:0 \
    --sequence "AGCAGUCAUUAUGGCGAAACGU"

# 从 FASTA 文件读取序列
python3 inference.py --model-path ./pangolin --device npu:0 \
    --sequence-file ./example.fa --stride 500

# 变体效应评估(ref/alt 等长,pos 为 0-based 变异位置)
python3 inference.py --model-path ./pangolin --device npu:0 \
    --ref-seq "AGCAGUCAUUAUGGCGAA" --alt-seq "AGCAGUCAUUAUGGCGAG" --pos 17

5.4 服务化推理(FastAPI)

# 启动服务(默认 0.0.0.0:8000,此处演示用 127.0.0.1:8014)
export ASCEND_RT_VISIBLE_DEVICES=0
python3 inference.py --serve \
    --model-path ./pangolin \
    --device npu:0 \
    --host 127.0.0.1 --port 8014

调用示例:

# 健康检查
curl http://127.0.0.1:8014/health

# 模型信息
curl http://127.0.0.1:8014/v1/models

# 剪接位点评分预测(sequence 缺省时使用模型卡演示序列)
curl -X POST http://127.0.0.1:8014/v1/predict \
    -H "Content-Type: application/json" \
    -d '{"top_sites": 3}'

# 变体效应评估
curl -X POST http://127.0.0.1:8014/v1/variant \
    -H "Content-Type: application/json" \
    -d '{"ref": "AGCAGUCAUUAUGGCGAA", "alt": "AGCAGUCAUUAUGGCGAG", "pos": 17}'

6. 推理结果

模型推理结果

命令行推理输出(演示序列 18 nt,昇腾 NPU):

[demo] 未提供序列,使用模型卡内置演示序列(18 nt)
模型加载完成,耗时 8.9s,参数量 8.3648M

推理耗时: 1235.0 ms(首次含算子编译)
输出通道 (12): heart_no_splice, heart_splice_site, heart_usage, liver_no_splice,
liver_splice_site, liver_usage, brain_no_splice, brain_splice_site, brain_usage,
testis_no_splice, testis_splice_site, testis_usage
窗口长度: 10000 nt(滑窗时窗口=10000, stride=500)

各组织 Top 剪接位点(splice_site 评分最高位置):
  heart : pos 17 score=0.0670 usage=0.0468; pos 16 score=0.0603 usage=0.0420; pos 2 score=0.0537 usage=0.0364
  liver : pos 17 score=0.0790 usage=0.0250; pos 0 score=0.0734 usage=0.0272; pos 16 score=0.0730 usage=0.0250
  brain : pos 17 score=0.0670 usage=0.0268; pos 16 score=0.0565 usage=0.0193; pos 0 score=0.0543 usage=0.0230
  testis: pos 17 score=0.0700 usage=0.0155; pos 2 score=0.0618 usage=0.0153; pos 0 score=0.0561 usage=0.0094

SUCCESS

说明:模型在跨物种(人、恒河猴、大鼠、小鼠)RNA-seq 剪接位点使用数据上训练, 上述人工序列为模型卡内置的演示序列,输出为模型对该序列的真实预测, 不代表具体生物学结论。

7. 环境检查

NPU 设备调用

服务健康检查返回:

{
  "status": "ok",
  "model": "multimolecule/pangolin",
  "device": "npu:0",
  "npu": {"available": true, "device_count": 1, "name": "Ascend910_9362"}
}

Agent 工作流

8. 复现步骤

# 1. 环境准备(依赖 + 权重)
pip install -r requirements.txt
git clone --depth 1 https://hf-mirror.com/multimolecule/pangolin.git
HF_ENDPOINT=https://hf-mirror.com python3 -c "
from huggingface_hub import hf_hub_download
hf_hub_download(repo_id='multimolecule/pangolin', filename='model.safetensors',
                local_dir='./pangolin')
"

# 2. 命令行推理
python3 inference.py --model-path ./pangolin --device npu:0

# 3. 服务化推理
python3 inference.py --serve --model-path ./pangolin \
    --device npu:0 --host 127.0.0.1 --port 8014
curl http://127.0.0.1:8014/health

贡献者: liuhongwei-2026 | 赛道: 模型适配赛道