BPNet(Žiga Avsec, Melanie Weilert, et al.,Kundaje 实验室)是碱基分辨率转录因子 结合预测的经典卷积神经网络:输入一段固定 1000 bp 的 DNA 窗口,输出中心多能性 转录因子 Oct4 / Sox2 / Nanog / Klf4 的 ChIP-nexus 结合信号(正向 / 反向两条链, 共 8 个通道),并以其揭示的"软基序语法"(soft motif syntax)——转录因子在增强子 上簇状协同结合——而闻名。
| 组件 | 版本 |
|---|---|
| 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 910(Ascend910_9362,本机 2 卡,演示以单卡运行) |
BPNet 将结合任务因子化为两个终端分支(共享膨胀残差骨干网络):
(batch, sequence_length, num_labels);(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() 直接合成,无需额外后处理。
| # | 适配点 | 说明 |
|---|---|---|
| 1 | 非 LLM,不走 vLLM-Ascend | BPNet 是基因组功能预测 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,纯浮点噪声),行为符合预期。
pip install -r requirements.txt若 vLLM-Ascend 环境已存在(transformers<5),建议使用独立 venv 安装本仓库依赖, 避免与 multimolecule 所需的 transformers 5.9.0 冲突。
# 方式一: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')"# 缺省:使用模型卡演示序列(小鼠 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# 启动服务(默认 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..."}'
命令行推理输出(演示序列,昇腾 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,本机实测)。

服务健康检查返回:
{
"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 实测,进程内存)。

# 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 | 赛道: 模型适配赛道