scBasset(Yuan & Kelley, Nature Methods 2022,官方实现见 calico/scBasset, 由 MultiMolecule 团队复现并发布)以固定长度 1344 bp 的 DNA peak 窗口为输入, 输出 2034 个细胞(Buenrostro2018 造血单细胞 ATAC-seq atlas)各自的可及性 logit,经 sigmoid 即每细胞开放概率。模型是逐细胞二分类(open/closed)任务, 非自回归 LLM,不走 vLLM-Ascend,采用 multimolecule + torch_npu + FastAPI 方案在昇腾 NPU 上服务化推理。
| 组件 | 版本 |
|---|---|
| torch | 2.9.0 |
| torch-npu | 2.9.0.post1 |
| transformers | 5.9.0 |
| multimolecule | 0.2.1 |
| fastapi | 0.123.10 |
| numpy | 1.26.4 |
| CANN | 8.5.1 |
| NPU | Ascend 910(Ascend910_9362,64GB HBM) |
scBasset 为判别式序列 CNN:Conv1D(288, kernel=17, pool=3, GELU) → Conv1D(288→323→363→407→456→512, kernel=5, pool=2) × 6 → Conv1D(256, kernel=1) → Dense(32, BN) → 每细胞嵌入层。输入经 one-hot 投影为
(batch, vocab=5, 1344) 通道,模型将序列维度在 dense bottleneck 中折叠为
32 维细胞嵌入,最后经共享预测头输出 2034 维 per-cell 可及性 logits。
| 配置项 | 值 |
|---|---|
| 模型类型 | ScBassetForSequencePrediction |
| 输入窗口 | 固定 1344 bp DNA peak 窗口 |
| 卷积层数 / 卷积核 | 8 / stem 17、tower 5、pointwise 1 |
| 池化 | stem MaxPool(3),tower MaxPool(2) |
| 激活函数 | quick_gelu(GELU 的 sigmoid 近似) |
| Dense bottleneck | 32(隐藏维) |
| 输出 | 2034 维 per-cell 可及性 logits(Buenrostro2018 造血 atlas,每细胞二分类) |
| 输出头 | SequencePredictionHead(无激活函数,problem_type=binary) |
| 词表 | DNA streamline 5 token(DnaTokenizer,A/C/G/T/N,pad=“N”) |
| 参数量 | 4,585,978(4.586M) |
输入为 DNA(DnaTokenizer,streamline 词表 5:A/C/G/T/N,DNA 的 T 保持 T)。
模型要求定长 1344 bp 输入,嵌入层会严格校验长度;不足 1344 bp 时以
pad token N 右补齐,滑窗扫描时每个窗口恰好 1344 bp。词表与
a2zchromatin 等 IUPAC 16 token 模型不同,不可混用。
| # | 适配点 | 说明 |
|---|---|---|
| 1 | 非 LLM,不走 vLLM-Ascend | scBasset 是判别式 CNN(1344 bp DNA → 2034 维 per-cell 可及性 logits,非自回归生成),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(model.safetensors 约 17.5MB),无需量化 |
| 4 | 定长 1344 bp | 嵌入层 _check_sequence_length 严格校验输入长度,不足 1344 bp 必须以 pad token N 补齐、超过则滑窗切分,否则直接抛 ValueError |
| 5 | streamline 词表 | 模型 vocab_size=5(A/C/G/T/N),DnaTokenizer.from_pretrained 从 checkpoint 读取 model_max_length=1344,pad/unk 均为 N(id=4);真实 N 碱基在窗内保留、padding 位由 attention_mask 置零 |
| 6 | one-hot 嵌入 | 模型内部用 F.one_hot 将 token 投影为 (batch, vocab=5, 1344) 通道;在 NPU 上仅告警 "internal format"(输出正常),无需修补 |
| 7 | 滑窗扫描 | 长序列(> 1344 bp)按 stride 滑窗批量打分,返回逐位置平均可及性谱与 Top 候选开放区域 |
| 8 | 后处理 | model.postprocess(outputs) 即 sigmoid(logits),勿再套其他激活;每细胞二分类阈值 P≥0.5 视为开放 |
模型验证: 在昇腾 NPU 上对模型卡内置 TP53 启动子演示序列(184 bp,补 1344) 推理,2034 个细胞 P(可及性) 均值 0.031、无细胞达开放阈值,Top 细胞 cell 1224 P=0.493;对 2000 bp 长序列 stride=200 滑窗扫描共 4 个窗口、热推理约 6 ms/窗, CPU/NPU 最大绝对偏差 2.08e-04(Top 细胞完全一致)。热推理单窗口约 5 ms (首次推理含算子编译约 188 ms)。
pip install -r requirements.txt若 vLLM-Ascend 环境已存在(transformers<5),建议使用独立 venv 安装本仓库依赖, 避免与 multimolecule 所需的 transformers 5.9.0 冲突。
# 方式一:GitCode 镜像
git clone https://gitcode.com/hf_mirrors/multimolecule/scbasset.git
# (仓库权重为 Git LFS,需 git-lfs pull 或经 LFS batch API 下载 model.safetensors,约 17.5MB)
# 方式二:HuggingFace 镜像(hf-mirror.com)
git clone https://hf-mirror.com/multimolecule/scbasset
# 方式三:multimolecule 直接加载(会自动下载)
python -c "from multimolecule import DnaTokenizer, ScBassetForSequencePrediction; \
tok = DnaTokenizer.from_pretrained('multimolecule/scbasset'); \
m = ScBassetForSequencePrediction.from_pretrained('multimolecule/scbasset')"# 缺省:使用模型卡内置演示序列(TP53 启动子, 184 bp)单窗打分
python3 inference.py \
--model-path ./scbasset \
--device npu:0
# 单窗打分(≤ 1344 bp,右补 "N" 到 1344 bp)
python3 inference.py \
--model-path ./scbasset --device npu:0 \
--sequence "ACTCCCCTGCCCTCAACAAGATGTTTTGCCAACTGGCCAAGACCTGC"
# 长序列滑窗扫描(> 1344 bp,默认 stride=200)
python3 inference.py \
--model-path ./scbasset --device npu:0 \
--sequence-file ./example_1344bp.fa --stride 200 --top-windows 3# 启动服务(默认 0.0.0.0:8000,此处演示用 127.0.0.1:8001)
export ASCEND_RT_VISIBLE_DEVICES=0
python3 inference.py --serve \
--model-path ./scbasset \
--device npu:0 \
--host 127.0.0.1 --port 8001调用示例:
# 健康检查
curl http://127.0.0.1:8001/health
# 模型信息
curl http://127.0.0.1:8001/v1/models
# 染色质可及性预测(sequence 缺省时使用 TP53 启动子演示序列)
curl -X POST http://127.0.0.1:8001/v1/predict \
-H "Content-Type: application/json" \
-d '{"top_cells": 5}'
# 返回全部 2034 个细胞的 P(可及性)
curl -X POST http://127.0.0.1:8001/v1/predict \
-H "Content-Type: application/json" \
-d '{"include_probs": true}'
# 同长 ref/alt 序列的可及性差异(每细胞 delta)
curl -X POST http://127.0.0.1:8001/v1/variant-effect \
-H "Content-Type: application/json" \
-d '{"ref": "ACTCCCCTGCCCTCAACAAGATGTTTTGCCAACTGGCCAAGACCTGC", \
"alt": "CCTCCCCTGCCCTCAACAAGATGTTTTGCCAACTGGCCAAGACCTGC"}'
命令行推理输出(TP53 启动子演示序列,昇腾 NPU):
[demo] 未提供序列,使用模型卡内置演示序列(TP53 启动子, 184 bp)
模型加载完成,耗时 8.0s,参数量 4.5860M,细胞数 2034
推理耗时: 187.8 ms(首次含算子编译;热推理约 5 ms)
窗口长度: 1344 bp(固定 1344 bp DNA peak 窗口)
细胞数: 2034(Buenrostro2018 造血单细胞 ATAC-seq atlas)
P(可及性) 均值: 0.031
P(可及性) 中位数: 0.0187
开放细胞 (P≥0.5): 0 (0.0%)
Top 10 高可及性细胞:
#1 cell 1224 P(可及性)=0.4932
#2 cell 770 P(可及性)=0.4470
#3 cell 1189 P(可及性)=0.4054
#4 cell 489 P(可及性)=0.3486
#5 cell 1868 P(可及性)=0.3448
#6 cell 1225 P(可及性)=0.3295
#7 cell 1300 P(可及性)=0.3275
#8 cell 728 P(可及性)=0.3229
#9 cell 1668 P(可及性)=0.3089
#10 cell 1681 P(可及性)=0.2954
SUCCESS滑窗扫描输出(2000 bp 长序列,stride=200,昇腾 NPU):
滑窗扫描: 窗口=1344 bp, stride=200, 共 4 个位置, 推理耗时 24.5 ms
平均可及性谱 均值: 0.2441 | 最大值: 0.2441 @ pos 600
Top 3 候选开放区域(平均可及性最高):
#1 pos 600 mean_accessibility=0.2441
#2 pos 400 mean_accessibility=0.2441
#3 pos 200 mean_accessibility=0.2441服务化推理返回(POST /v1/predict,单窗):
{
"sequence": "ACTCCCCTGCCCTCAACAAGATGTTTTGCCAACTGGCCAAGACCTGCCCTGTGCAGCTGTGGGTTGATTCCACACCCCCGCCCGGCACCCGCGTCCGCGCCATGGCCATCTACAAGCAGTCACAGCACATGACGGAGGTTGTGAGGCGCTGCCCCCACCATGAGCGCTGCTCAGATAGCGATGG",
"length": 184,
"mode": "single",
"window": 1344,
"stride": 200,
"num_cells": 2034,
"inference_ms": 183.71,
"prob_mean": 0.031,
"prob_median": 0.0187,
"open_cells": 0,
"open_ratio": 0.0,
"top_cells": [
{"rank": 1, "cell": 1224, "accessibility": 0.4932},
{"rank": 2, "cell": 770, "accessibility": 0.447},
{"rank": 3, "cell": 1189, "accessibility": 0.4054}
]
}说明:模型在 Buenrostro2018 造血单细胞 ATAC-seq 数据上训练,细胞数 2034 为该 数据集的细胞嵌入层维度(dataset-specific)。上述人工序列为模型卡内置的基因 演示序列,输出为模型对该窗口的真实预测,不代表物种生物学结论。

服务健康检查返回:
{
"status": "ok",
"model": "multimolecule/scbasset",
"device": "npu:0",
"npu": {"available": true, "device_count": 2, "name": "Ascend910_9362"}
}
# 1. 环境准备(依赖 + 权重)
pip install -r requirements.txt
git clone https://gitcode.com/hf_mirrors/multimolecule/scbasset.git
# (下载 LFS 权重 model.safetensors,约 17.5MB)
# 2. 命令行推理
python3 inference.py --model-path ./scbasset --device npu:0
# 3. 服务化推理
python3 inference.py --serve --model-path ./scbasset \
--device npu:0 --host 127.0.0.1 --port 8001
curl http://127.0.0.1:8001/health贡献者: liuhongwei-2026 | 赛道: 模型适配赛道