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

Basset(multimolecule/basset)在昇腾 NPU 上的适配

1. 简介

  • 模型来源:multimolecule/basset(Kelley et al., PLOS Computational Biology 2016)
  • 参数量:约 4.14M(4,140,469)
  • 模型任务:从 600 bp DNA 序列预测 164 个细胞/组织类型的 DNase I 高敏感(chromatin accessibility / DNase I hypersensitivity)
  • 模型架构:深度一维卷积神经网络(1D CNN:3 个 Conv1D+BN+ReLU+MaxPool 块 → 展平 → 2 层全连接 → 164 路多标签二分类头)
  • 适配状态:成功
  • 适配时间:2026-08-19

Basset(Kelley et al., 2016)在 ENCODE DNase-seq 数据上训练,输入固定 600 bp 的人类基因组 DNA 窗口,对 164 个细胞/组织类型分别输出一个 DNase I 高敏感 概率(0~1,多标签二分类,sigmoid)。它是染色质可及性(chromatin accessibility) 预测的经典基座模型,可用于预测任意基因组位置的开放染色质状态、定位候选调控元件等。

2. 验证环境

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

3. 模型结构

Basset 将 600 bp DNA 序列按 A/C/G/T one-hot 编码(4 通道,N 作为 pad 编码为零向量) 送入 1D 卷积栈,逐块 MaxPool 降采样,展平后经 2 层全连接回归 164 个 DNase I 高敏感概率。关键配置:

配置项值
模型类型BassetForSequencePrediction
输入窗口固定 600 bp(嵌入层强校验,短序列双侧补 N / 长序列中心裁剪)
卷积层3 层(Conv1d 300@k19、200@k11、200@k7)+ BatchNorm + ReLU
池化层MaxPool1d(3、4、4,ceil_mode=True,valid 卷积)
全连接层2 层(2000 → 1000 → 1000,含 BN + ReLU + Dropout(0.3))
输出164 个 DNase I 高敏感概率(多标签二分类,sigmoid)
词表A/C/G/T(DnaTokenizer,U 自动转 T,pad=N;vocab_size=4)
参数量4,140,469
权重大小model.safetensors 约 16.5MB(float32)

输入为 DNA 序列(DnaTokenizer 按 A/C/G/T 编码,0-3;N 为 pad_token_id=4,编码为 零向量),输出为 164 个 0~1 概率(原始 logits 经 sigmoid 映射,与模型 postprocess 一致,无需额外归一化)。每个通道对应一个 DNase-seq 细胞/组织类型 轨迹;config id2label 为 null 时命名为 dnase_0~dnase_163。概率 > 0.5 判定该 位置的染色质在该细胞类型中开放。

4. 昇腾 NPU 适配要点

#适配点说明
1非 LLM,不走 vLLM-AscendBasset 是基因组功能预测 CNN(多标签二分类,非自回归生成),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(约 16.5MB),峰值进程内存约 176MB
4定长输入强校验模型嵌入层 _check_sequence_length 要求输入恰好 sequence_length=600 bp;脚本自动将短序列双侧补 N、长序列中心裁剪到 600 bp(N 即 pad_token,编码为零向量)
5输出语义164 个 logits 经 sigmoid 映射为 DNase I 高敏感概率(多标签二分类),直接输出;hypersensitive_tracks 统计概率 > 0.5 的开放染色质通道数

模型验证:在昇腾 NPU 上对 600 bp 确定性合成 DNA(seed=42)推理,输出 max_prob = 0.614276(dnase_147)、hypersensitive_tracks = 1;与 CPU 推理结果 余弦相似度 1.0(max abs diff < 0.001,纯浮点噪声),行为符合预期。

5. 快速开始

5.1 安装依赖

pip install -r requirements.txt

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

5.2 下载模型权重

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

# 方式二:HuggingFace 镜像(hf-mirror.com)
HF_ENDPOINT=https://hf-mirror.com HF_HUB_DISABLE_XET=1 \
  python3 -c "from huggingface_hub import snapshot_download; \
  snapshot_download('multimolecule/basset', local_dir='./basset')"

# 方式三:multimolecule 直接加载(会自动下载)
python -c "from multimolecule import BassetForSequencePrediction, DnaTokenizer; \
tok = DnaTokenizer.from_pretrained('multimolecule/basset'); \
m = BassetForSequencePrediction.from_pretrained('multimolecule/basset')"

5.3 命令行推理

# 缺省:自动生成 600 bp 确定性合成 DNA(seed=42)做演示
python3 inference.py \
    --model-path ./basset \
    --device npu:0

# 传入自定义 DNA 序列(短序列自动双侧补 N,长序列自动中心裁剪到 600 bp)
python3 inference.py \
    --model-path ./basset --device npu:0 \
    --sequence "GGCAGTTGCTAGCTGTGCCTGAAGTCCAGACAG..."

# 从 FASTA / 纯文本文件读取
python3 inference.py \
    --model-path ./basset --device npu:0 --sequence-file ./sequence.fa

5.4 服务化推理(FastAPI)

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

调用示例:

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

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

# DNase I 高敏感预测(sequence 缺省时按 seed 生成演示序列)
curl -X POST http://127.0.0.1:8017/v1/predict \
    -H "Content-Type: application/json" \
    -d '{"seed": 42}'

# 传入自定义 DNA 序列(top_k 控制摘要展示的通道数,默认 5,最大 164)
curl -X POST http://127.0.0.1:8017/v1/predict \
    -H "Content-Type: application/json" \
    -d '{"sequence": "GGCAGTTGCTAGCTGTGCCTGAAGTCCAGACAG...", "top_k": 10}'

6. 推理结果

模型推理结果

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

[demo] 未提供序列,自动生成 600 bp 确定性合成 DNA(seed=42)
模型路径: /opt/atomgit/models/basset
设备:     npu:0
原始序列: 600 bp(模型要求定长 600 bp,短序列补 N / 长序列中心裁剪)
正在加载模型(首次加载会编译算子,可能较慢)...
模型加载完成,耗时 7.3s,参数量 4.135M

推理耗时: 239.53 ms
输出: 164 个细胞/组织类型的 DNase I 高敏感概率(sigmoid,> 0.5 判为高敏感)
  num_tracks           = 164
  hypersensitive_tracks = 1(prob > 0.5 的通道数)
  mean_prob            = 0.294386 | max_prob = 0.614276
  top_tracks:
    dnase_147        prob = 0.614276
    dnase_121        prob = 0.478433
    dnase_46         prob = 0.476126
    dnase_148        prob = 0.472399
    dnase_119        prob = 0.459132
  input_bp             = 600 bp | raw_bp = 600 bp

SUCCESS

服务化推理返回(POST /v1/predict,演示序列):

{
  "num_tracks": 164,
  "hypersensitive_tracks": 1,
  "top_tracks": [
    {"track": "dnase_147", "prob": 0.614276},
    {"track": "dnase_121", "prob": 0.478433},
    {"track": "dnase_46",  "prob": 0.476126},
    {"track": "dnase_148", "prob": 0.472399},
    {"track": "dnase_119", "prob": 0.459132}
  ],
  "mean_prob": 0.294386,
  "max_prob": 0.614276,
  "full_probs": [0.17893, 0.256457, 0.216733, 0.190059, 0.362936, "...164 个概率"],
  "input_bp": 600,
  "raw_bp": 600,
  "channels": ["dnase_0", "dnase_1", "...", "dnase_163"],
  "output": "DNase I hypersensitivity probability (sigmoid) across 164 cell types",
  "inference_ms": 234.18
}

真实人类基因组示例(人源 GAPDH 启动子区域 chr12:6644581-6645181,hg38, UCSC API 获取 600 bp 序列):

{
  "num_tracks": 164,
  "hypersensitive_tracks": 0,
  "top_tracks": [
    {"track": "dnase_55",  "prob": 0.385312},
    {"track": "dnase_99",  "prob": 0.367123},
    {"track": "dnase_129", "prob": 0.364514},
    {"track": "dnase_127", "prob": 0.329264},
    {"track": "dnase_113", "prob": 0.317433}
  ],
  "mean_prob": 0.112048,
  "max_prob": 0.385312,
  "full_probs": [0.109112, 0.128825, 0.083248, "..."],
  "input_bp": 600,
  "raw_bp": 600,
  "inference_ms": 10.28
}

首次推理含算子编译约 234 ms;预热后 API 单次推理约 10 ~ 11 ms (模型核心计算约 1.3 ms,含 164 维结果 JSON 序列化)。

7. 环境检查

NPU 设备调用

服务健康检查返回:

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

模型信息(GET /v1/models):

{
  "object": "list",
  "data": [
    {
      "id": "basset",
      "task": "dnase-hypersensitivity",
      "library_name": "multimolecule",
      "params": 4135064,
      "sequence_length": 600,
      "num_labels": 164,
      "pipeline_tag": "text-classification"
    }
  ]
}

峰值进程内存约 176MB(npu-smi 实测,服务进程)。

Agent 工作流

8. 复现步骤

# 1. 环境准备(依赖 + 权重)
pip install -r requirements.txt
git clone https://gitcode.com/hf_mirrors/multimolecule/basset.git
# (下载 LFS 权重 model.safetensors,16.5MB)

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

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

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