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

ChromBPNet(multimolecule/chrombpnet)在昇腾 NPU 上的适配

1. 简介

  • 模型来源:multimolecule/chrombpnet(Kundaje 实验室 ChromBPNet,ENCODE 染色质可及性)
  • 参数量:约 6.61M(6,609,156)
  • 模型任务:从 2114 bp DNA 窗口预测中心 1000 bp 的碱基分辨率染色质可及性轨迹 (regulatory-profile / base-resolution chromatin accessibility,ATAC-seq / DNase-seq)
  • 模型架构:双子网 BPNet 拓扑膨胀残差卷积神经网络(bias 子网 + accessibility 子网)
  • 适配状态:成功
  • 适配时间:2026-08-19

ChromBPNet(Brenton et al. / Kundaje 实验室,ENCODE project)是 bias-corrected 的碱基分辨率染色质可及性预测模型:内部组合两个 BPNet 风格的膨胀残差卷积子网——

  • bias 子网:捕获 Tn5 / DNase 酶切偏置(enzyme cleavage bias);
  • accessibility 子网:学习偏置校正后的真实可及性信号。

输入固定 2114 bp 的 DNA 窗口,输出中心 1000 bp 的每碱基可及性轨迹 (期望切计数,expected counts per base),是 ATAC-seq / DNase-seq 足迹分析、 染色质开放性定量的经典模型。

2. 验证环境

组件版本
torch2.9.0
torch-npu2.9.0.post1
transformers5.9.0
multimolecule0.2.1
fastapi0.123.10
CANN8.5.1
NPUAscend 910(Ascend910_9362,本机 2 卡,演示以单卡运行)

3. 模型结构

ChromBPNet 将可及性任务因子化为两个终端分支(内部对用户透明地组合 bias 与 accessibility 两个子网):

  • profile 分支:逐位点多项分布 logits,形状 (batch, profile_length, num_labels);
  • count 分支:每任务/每链一个标量 log 总计数,形状 (batch, num_labels)。

最终可及性轨迹由 postprocess 合成:track = softmax(profile_logits, dim=1) * exp(count_logits)。

配置项值
模型类型ChromBpNetForProfilePrediction
输入窗口固定 2114 bp(短序列双侧补 N / 长序列中心裁剪)
输出轨迹中心 1000 bp(profile pos i ↔ 输入 offset 557 + i)
子网 1accessibility:hidden 512,stem k21 + 8 层膨胀残差(k3,dilation 2^i)
子网 2bias:hidden 128,stem k21 + 4 层膨胀残差(k3,dilation 2^i)
任务数num_tasks=1,num_strands=1(单链可及性信号)
词表A/C/G/T/N(DnaTokenizer,pad_token=N)
参数量6,609,156
权重model.safetensors(26.4MB,float32)

输入为 DNA 序列(DnaTokenizer 按 ACGTN 编码,pad=N),输出为可及性轨迹 (期望每碱基切计数,非负)与 log 总计数。轨迹 = softmax(profile) × exp(count), 由 model.postprocess() 直接合成,无需额外后处理。

4. 昇腾 NPU 适配要点

#适配点说明
1非 LLM,不走 vLLM-AscendChromBPNet 是基因组功能预测 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(约 26.4MB),峰值 HBM 仅约 48MB
4输入窗口规整模型要求 2114 bp 窗口才能产出完整 1000 bp 轨迹;脚本自动将短序列双侧补 N、长序列中心裁剪到 2114 bp
5输出语义直接使用 model.postprocess() 合成可及性轨迹(softmax(profile)×exp(count)),输出即期望每碱基切计数,非负,无需 softmax / 归一化等额外后处理

模型验证:在昇腾 NPU 上对模型卡 TP53 演示序列(184 bp,补 N 到 2114 bp)推理, 输出 count_logits = 5.912、轨迹总量 369.54、峰值信号 10.208;与 CPU 推理结果 余弦相似度 1.0(max abs diff < 0.004,纯浮点噪声),行为符合预期。

5. 快速开始

5.1 安装依赖

pip install -r requirements.txt

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

5.2 下载模型权重

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

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

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

5.3 命令行推理

# 缺省:使用模型卡内置演示序列(TP53 启动子,184 bp)
python3 inference.py \
    --model-path ./chrombpnet \
    --device npu:0

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

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

5.4 服务化推理(FastAPI)

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

调用示例:

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

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

# 可及性轨迹预测(sequence 缺省时使用 TP53 演示序列)
curl -X POST http://127.0.0.1:8016/v1/predict \
    -H "Content-Type: application/json" \
    -d '{}'

# 传入自定义 DNA 序列
curl -X POST http://127.0.0.1:8016/v1/predict \
    -H "Content-Type: application/json" \
    -d '{"sequence": "ACTCCCCTGCCCTCAACAAGAT..."}'

6. 推理结果

模型推理结果

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

[demo] 未提供序列,使用模型卡内置演示序列(TP53 启动子,184 bp)
模型路径: /opt/atomgit/models/chrombpnet
设备:     npu:0
原始序列: 184 bp(模型要求 2114 bp 窗口,短序列补 N / 长序列中心裁剪)
正在加载模型(首次加载会编译算子,可能较慢)...
模型加载完成,耗时 7.6s,参数量 6.609M

推理耗时: 247.02 ms
输出: 碱基分辨率染色质可及性预测(中心 1000 bp,期望每碱基切计数)
  count_logits = 5.912246(log 总计数)
  total_count  = 369.5353(信号总量)
  profile      = 1000 bp 轨迹,max=10.20824, mean=0.369535
  峰值位点     = profile pos 452 ↔ 输入 offset 1009
  Top 可及位点:
    profile pos  452 | input offset 1009 | signal 10.2082
    profile pos  536 | input offset 1093 | signal 9.5046
    profile pos  462 | input offset 1019 | signal 8.3601
    profile pos  520 | input offset 1077 | signal 8.0890
    profile pos  562 | input offset 1119 | signal 7.8053
  input_bp     = 2114 bp | raw_bp = 184 bp

SUCCESS

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

{
  "count_logits": 5.912246,
  "total_count": 369.5353,
  "profile_length": 1000,
  "profile_offset": 557,
  "track": [0.000978, 0.000892, ...],
  "track_max": 10.20824,
  "track_mean": 0.369535,
  "track_argmax": 452,
  "top_peaks": [
    {"pos": 452, "value": 10.2082, "input_offset": 1009},
    {"pos": 536, "value": 9.5046, "input_offset": 1093},
    {"pos": 462, "value": 8.3601, "input_offset": 1019}
  ],
  "input_bp": 2114,
  "raw_bp": 184,
  "channels": ["signal"],
  "output": "base-resolution chromatin accessibility (expected counts per base)",
  "inference_ms": 247.0
}

真实长序列示例(3200 bp 输入,自动中心裁剪到 2114 bp):

{
  "count_logits": 8.859937,
  "total_count": 7043.1914,
  "track_max": 14.065506,
  "track_argmax": 1,
  "raw_bp": 3200,
  "input_bp": 2114,
  "inference_ms": 262.3
}

首次推理含算子编译约 250 ms;预热后单次推理约 2.5 ~ 13 ms。

7. 环境检查

NPU 设备调用

服务健康检查返回:

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

本机共 2 张 Ascend910,演示以 ASCEND_RT_VISIBLE_DEVICES=0 限定单卡, 故 device_count=1。

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

{
  "object": "list",
  "data": [
    {
      "id": "chrombpnet",
      "task": "regulatory-profile",
      "library_name": "multimolecule",
      "params": 6609156,
      "sequence_length": 2114,
      "profile_length": 1000,
      "num_labels": 1,
      "pipeline_tag": "tabular-regression"
    }
  ]
}

峰值 HBM 占用约 48MB(torch.npu.max_memory_allocated 实测,进程内存)。

Agent 工作流

8. 复现步骤

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

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

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

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