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

BPNet(multimolecule/bpnet)在昇腾 NPU 上的适配

1. 简介

  • 模型来源:multimolecule/bpnet(Kundaje 实验室 BPNet-OSKN,Nature Genetics 2021)
  • 参数量:约 0.13M(132,560)
  • 模型任务:从 1000 bp DNA 窗口预测多能性转录因子 Oct4 / Sox2 / Nanog / Klf4 的 碱基分辨率结合 profile(regulatory-profile / base-resolution TF binding,ChIP-nexus)
  • 模型架构:motif stem + 膨胀残差卷积(dilated residual CNN)的 BPNet 拓扑
  • 适配状态:成功
  • 适配时间:2026-08-19

BPNet(Žiga Avsec, Melanie Weilert, et al.,Kundaje 实验室)是碱基分辨率转录因子 结合预测的经典卷积神经网络:输入一段固定 1000 bp 的 DNA 窗口,输出中心多能性 转录因子 Oct4 / Sox2 / Nanog / Klf4 的 ChIP-nexus 结合信号(正向 / 反向两条链, 共 8 个通道),并以其揭示的"软基序语法"(soft motif syntax)——转录因子在增强子 上簇状协同结合——而闻名。

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. 模型结构

BPNet 将结合任务因子化为两个终端分支(共享膨胀残差骨干网络):

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

最终碱基分辨率结合轨迹由 postprocess 合成:track = softmax(profile_logits, dim=1) * exp(count_logits)。

配置项值
模型类型BpNetForProfilePrediction
输入窗口固定 1000 bp(短序列双侧补 N / 长序列中心裁剪)
输出轨迹1000 bp(与输入等长,pos i ↔ 输入 offset i,无中心裁剪偏移)
骨干网络stem 卷积(k25) + 9 层膨胀残差卷积(k3,dilation 2^(i+1)),hidden 64
任务数num_tasks=4(Oct4/Sox2/Nanog/Klf4)× num_strands=2(plus/minus)= 8 通道
词表A/C/G/T/N(DnaTokenizer,pad_token=N)
参数量132,560
权重model.safetensors(0.51MB,float32)

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

4. 昇腾 NPU 适配要点

#适配点说明
1非 LLM,不走 vLLM-AscendBPNet 是基因组功能预测 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(约 0.51MB),峰值 HBM 仅约 1.64MB,预热后单次推理约 2.3ms
4输入窗口规整模型要求 1000 bp 窗口;脚本自动将短序列双侧补 N、长序列中心裁剪到 1000 bp
5输出语义直接使用 model.postprocess() 合成结合轨迹(softmax(profile, 位置维)×exp(count)),输出即期望每碱基切计数,非负,无需 softmax / 归一化等额外后处理
6演示序列采用模型自选的小鼠 Pou5f1(Oct4)近端增强子(mm10 chr17:35,503,500-35,504,500,1000 bp),该区域含 Oct4/Sox2/Nanog 簇状结合位点,可直观复现论文的 soft motif syntax 模式

模型验证:在昇腾 NPU 上对演示序列(1000 bp)推理,输出 8 通道结合轨迹; 与 CPU 推理结果余弦相似度 1.0(max abs diff < 0.0036,纯浮点噪声),行为符合预期。

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/bpnet.git
# (仓库权重为 Git LFS,需 git-lfs pull 或经 LFS batch API 下载 model.safetensors,0.51MB)

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

# 方式三:ModelScope
python3 -c "from modelscope import snapshot_download; snapshot_download('multimolecule/bpnet', local_dir='bpnet')"

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

5.3 命令行推理

# 缺省:使用模型卡演示序列(小鼠 Pou5f1/Oct4 近端增强子,1000 bp)
python3 inference.py \
    --model-path ./bpnet \
    --device npu:0

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

# 从 FASTA / 纯文本文件读取
python3 inference.py \
    --model-path ./bpnet --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 ./bpnet \
    --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

# 转录因子结合 profile 预测(sequence 缺省时使用 Pou5f1 演示序列)
curl -X POST http://127.0.0.1:8017/v1/predict \
    -H "Content-Type: application/json" \
    -d '{}'

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

6. 推理结果

模型推理结果

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

[demo] 未提供序列,使用模型卡演示序列:mm10 chr17:35,503,500-35,504,500(Pou5f1/Oct4 近端增强子,1000 bp)
模型路径: /opt/atomgit/models/bpnet
设备:     npu:0
原始序列: 1000 bp(模型要求 1000 bp 窗口,短序列补 N / 长序列中心裁剪)
正在加载模型(首次加载会编译算子,可能较慢)...
模型加载完成,耗时 7.7s,参数量 0.1326M

推理耗时: 248.36 ms
输出: 碱基分辨率转录因子结合预测(中心 1000 bp,期望每碱基切计数,8 通道)
  count_logits = [4.713688, 4.604733, 3.647181, 3.68895, 5.136195, 4.996147, 4.076308, 3.95573](log 总计数,每通道)
  channels     = ['Oct4_plus', 'Oct4_minus', 'Sox2_plus', 'Sox2_minus', 'Nanog_plus', 'Nanog_minus', 'Klf4_plus', 'Klf4_minus']
  逐通道统计 (count=总信号, max=峰值, argmax=峰值位点):
       Oct4_plus: count=   111.46  max= 3.2157 @ pos 542
      Oct4_minus: count=    99.96  max= 3.2608 @ pos 558
       Sox2_plus: count=    38.37  max= 1.3508 @ pos 546
      Sox2_minus: count=    40.00  max= 3.1108 @ pos 558
      Nanog_plus: count=   170.07  max= 4.0834 @ pos 561
     Nanog_minus: count=   147.84  max= 5.9487 @ pos 574
       Klf4_plus: count=    58.93  max= 0.4420 @ pos 480
      Klf4_minus: count=    52.23  max= 0.5633 @ pos 580
  Oct4+Sox2+Nanog 聚合轨迹 Top 结合位点(簇状结合 / soft motif syntax):
    pos  558 | signal 9.4945
    pos  574 | signal 8.4074
    pos  575 | signal 7.0956
    pos  561 | signal 6.8671
    pos  571 | signal 6.4276
    pos  580 | signal 6.2916
    pos  563 | signal 6.0313
    pos  562 | signal 5.8948
    pos  542 | signal 5.7545
    pos  579 | signal 5.2689
  input_bp     = 1000 bp | raw_bp = 1000 bp

SUCCESS

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

{
  "count_logits": [4.713688, 4.604733, 3.647181, 3.68895, 5.136195, 4.996147, 4.076308, 3.95573],
  "profile_length": 1000,
  "profile_offset": 0,
  "channels": ["Oct4_plus", "Oct4_minus", "Sox2_plus", "Sox2_minus",
               "Nanog_plus", "Nanog_minus", "Klf4_plus", "Klf4_minus"],
  "channel_stats": [
    {"channel": "Oct4_plus",  "count": 111.4625, "max": 3.215745,  "argmax": 542},
    {"channel": "Oct4_minus", "count": 99.9563,  "max": 3.260839,  "argmax": 558},
    {"channel": "Sox2_plus",  "count": 38.3663,  "max": 1.350774,  "argmax": 546},
    {"channel": "Sox2_minus", "count": 40.0028,  "max": 3.110763,  "argmax": 558},
    {"channel": "Nanog_plus", "count": 170.0675, "max": 4.083377,  "argmax": 561},
    {"channel": "Nanog_minus","count": 147.8424, "max": 5.948717,  "argmax": 574},
    {"channel": "Klf4_plus",  "count": 58.9275,  "max": 0.44202,   "argmax": 480},
    {"channel": "Klf4_minus", "count": 52.2338,  "max": 0.56326,   "argmax": 580}
  ],
  "osn_peaks": [
    {"pos": 558, "value": 9.4945},
    {"pos": 574, "value": 8.407397},
    {"pos": 575, "value": 7.095592},
    {"pos": 561, "value": 6.867116}
  ],
  "input_bp": 1000,
  "raw_bp": 1000,
  "output": "base-resolution TF binding profile (expected counts per base, Oct4/Sox2/Nanog/Klf4 × plus/minus)",
  "inference_ms": 247.29
}

演示结果解读:Oct4 / Sox2 / Nanog 的预测结合峰簇状聚集在 pos 540 ~ 580 区间 (Oct4_plus 峰 @ 542、Oct4_minus & Sox2_minus 峰 @ 558、Nanog_plus 峰 @ 561、 Nanog_minus 峰 @ 574),正是 BPNet 论文展示的增强子上多转录因子软基序语法 / 簇状协同结合的经典模式。

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

{
  "raw_bp": 2000,
  "input_bp": 1000,
  "count_logits": [2.52, 2.58, 2.19, 2.11, 3.16, 3.08, 2.63, 2.73],
  "inference_ms": 5.1
}

首次推理含算子编译约 250 ms;预热后单次推理约 2.3 ms(median,本机实测)。

7. 环境检查

NPU 设备调用

服务健康检查返回:

{
  "status": "ok",
  "model": "multimolecule/bpnet",
  "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": "bpnet",
      "task": "regulatory-profile",
      "library_name": "multimolecule",
      "params": 132560,
      "sequence_length": 1000,
      "profile_length": 1000,
      "num_labels": 8,
      "channels": ["Oct4_plus", "Oct4_minus", "Sox2_plus", "Sox2_minus",
                   "Nanog_plus", "Nanog_minus", "Klf4_plus", "Klf4_minus"],
      "pipeline_tag": "tabular-regression"
    }
  ]
}

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

Agent 工作流

8. 复现步骤

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

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

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

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