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

Xpresso(multimolecule/xpresso)在昇腾 NPU 上的适配

1. 简介

  • 模型来源:multimolecule/xpresso(Agarwal & Shendure, Cell Reports 2020)
  • 参数量:约 0.11M(113,125)
  • 模型任务:从启动子 DNA 序列 + 转录本特征预测稳态 mRNA 表达量(regulatory-activity / gene expression)
  • 模型架构:深度一维卷积神经网络(1D CNN:2 层膨胀卷积 + 最大池化 → 展平 → 拼接 6 维特征 → 全连接回归头)
  • 适配状态:成功
  • 适配时间:2026-08-19

Xpresso(Agarwal et al., 2020)输入一段以转录起始位点(TSS)为中心、约 10,500 bp 的启动子 DNA 窗口,叠加 6 维 mRNA 半衰期转录本特征 (RNA half-life、UTR 长度等,源自基因注释),输出单个标量——稳态 mRNA 表达量的 log 尺度预测值,是启动子序列 → 基因表达量回归的经典模型。

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

Xpresso 将 10.5 kb 启动子窗口按 A/C/G/T/N one-hot 编码后送入 1D 卷积栈,逐级 最大池化降采样,展平后与 6 维转录本特征拼接,经全连接层回归单个表达量标量。 关键配置:

配置项值
模型类型XpressoForSequencePrediction
输入窗口10,500 bp(以 TSS 为中心,短序列右补零 / 长序列中心裁剪)
卷积层2 层(Conv1d 128@k6、32@k9)+ MaxPool1d(30, 10)
激活函数ReLU
转录本特征6 维(num_features=6,必须传入)
全连接层64 → 2(SequencePredictionHead → 1)
输出1 个标量:稳态 mRNA 表达量(log 尺度)
词表A/C/G/T/N(DnaTokenizer,U 自动转 T)
参数量113,125

输入为启动子 DNA 序列(DnaTokenizer 按 A/C/G/T/N 编码),输出为单个标量 log 表达量(exp 还原后为线性尺度相对丰度),数值越大代表该启动子驱动表达 的能力越强。

4. 昇腾 NPU 适配要点

#适配点说明
1非 LLM,不走 vLLM-AscendXpresso 是基因组功能预测 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(仅约 453KB),计算量小
4features 张量模型 num_features=6,forward 必须传 features 张量(shape (batch, 6));脚本缺省全 0(演示用),可通过 CLI / API 传入真实基因注释特征
5序列预处理短序列由模型内部右补零、长序列中心裁剪到 input_length=10500;DnaTokenizer 直接编码 A/C/G/T/N,U 自动转 T

模型验证:在昇腾 NPU 上对 10,500 bp 的确定性合成启动子 DNA(seed=42, features 全 0)推理,输出单个标量 expression_log = -0.450962,单次推理约 312 ms(首轮含算子编译约 320 ms,预热后单次约 5 ms),输出结构与官方一致 (log 尺度标量回归),行为符合预期。

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

# 方式二:HuggingFace 镜像(hf-mirror.com)
git clone https://hf-mirror.com/multimolecule/xpresso

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

5.3 命令行推理

# 缺省:自动生成 10500 bp 确定性合成启动子 DNA(seed=42)、features 全 0 做演示
python3 inference.py \
    --model-path ./xpresso \
    --device npu:0

# 传入自定义启动子序列(短序列自动右补零,长序列自动中心裁剪)
python3 inference.py \
    --model-path ./xpresso --device npu:0 \
    --sequence "ACTCCCCTGCCCTCAACAAGAT...(10500 bp 内)"

# 传入 6 维转录本特征(RNA half-life 等,真实预测建议提供)
python3 inference.py \
    --model-path ./xpresso --device npu:0 \
    --sequence "ACTCCC..." --features "4.2,1200,100,11,2500,6.5"

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

5.4 服务化推理(FastAPI)

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

调用示例:

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

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

# 表达量预测(sequence/features 缺省时按 seed 生成演示序列、features 全 0)
curl -X POST http://127.0.0.1:8015/v1/predict \
    -H "Content-Type: application/json" \
    -d '{"seed": 42}'

# 传入自定义启动子序列 + 6 维特征
curl -X POST http://127.0.0.1:8015/v1/predict \
    -H "Content-Type: application/json" \
    -d '{"sequence": "ACTCCCCTGCCCTCAACAAGAT...", "features": [1.0, 500, 50, 5, 1000, 3.0]}'

6. 推理结果

模型推理结果

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

[demo] 未提供序列,自动生成 10500 bp 确定性合成启动子 DNA(seed=42)
[demo] 未提供转录本特征(features),默认全 0(真实预测建议提供基因注释特征)
模型路径: /opt/atomgit/models/xpresso
设备:     npu:0
序列长度: 10500 bp(模型要求 10500 bp 启动子窗口,短序列右补零/长序列中心裁剪)
特征:     [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
正在加载模型(首次加载会编译算子,可能较慢)...
模型加载完成,耗时 7.7s,参数量 0.113M

推理耗时: 311.9 ms
输出: 稳态 mRNA 表达量预测(log 尺度)
  expression_log    = -0.450962
  expression_linear = 0.637015(exp 还原的相对丰度)
  window_bp         = 10500 bp | features = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

SUCCESS

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

{
  "expression_log": -0.450962,
  "expression_linear": 0.637015,
  "window_bp": 10500,
  "num_features": 6,
  "features": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
  "output": "mRNA steady-state expression (log scale)",
  "inference_ms": 318.1
}

自定义启动子 + 特征示例(TP53 启动子,features=[1.0, 500, 50, 5, 1000, 3.0]):

{
  "expression_log": 7.677862,
  "expression_linear": 2159.99609,
  "window_bp": 10500,
  "num_features": 6,
  "features": [1.0, 500.0, 50.0, 5.0, 1000.0, 3.0],
  "output": "mRNA steady-state expression (log scale)",
  "inference_ms": 4.39
}

7. 环境检查

NPU 设备调用

服务健康检查返回:

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

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

{
  "object": "list",
  "data": [
    {
      "id": "xpresso",
      "task": "regulatory-activity",
      "library_name": "multimolecule",
      "params": 113125,
      "num_features": 6,
      "sequence_length": 10500,
      "num_labels": 1,
      "pipeline_tag": "tabular-regression"
    }
  ]
}

Agent 工作流

8. 复现步骤

# 1. 环境准备(依赖 + 权重)
pip install -r requirements.txt
git clone https://gitcode.com/hf_mirrors/multimolecule/xpresso.git
# (下载 LFS 权重 model.safetensors,453KB,sha256 校验 938fe3e4...6fee99d3590b)

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

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

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