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

OptMRL(multimolecule/optmrl)在昇腾 NPU 上的适配

1. 简介

  • 模型来源: multimolecule/optmrl(gitcode 镜像: hf_mirrors/multimolecule/optmrl)
  • 参数量: 约 0.476M(475,641)
  • 模型任务: 5'UTR 翻译效率预测(mean-ribosome-load / MRL)
  • 模型架构: 3 层 1D 卷积网络(120 卷积核,kernel size 8,same 填充,ReLU)→ Flatten → 40 维 Dense 瓶颈 → 标量回归头
  • 适配状态: 成功
  • 适配时间: 2026-08-19

OptMRL(Korbel, Eroshok & Ohler, 2023,非官方实现见 ohlerlab/mlcis) 以 CDS 上游紧邻的 50 nt 5'UTR 窗口 为输入,输出一个标量 mean ribosome load(MRL) 分数——一种由多聚核糖体图谱(polysome profiling) 衍生的翻译效率代理指标,数值越大代表翻译效率越高。模型先在约 26 万个随机 5'UTR 报告子上预训练,再在约 2 万个内源人类 5'UTR 上微调。

2. 验证环境

组件版本
torch2.9.0
torch-npu2.9.0.post1
transformers5.9.0
multimolecule0.2.1
fastapi0.123.10
numpy1.26.4
CANN8.5.1
NPUAscend 910(Ascend910_9362,64GB HBM)

3. 模型结构

OptMRL 为序列级回归 CNN:3 层 Conv1D(120 滤波器、kernel size 8、same 填充、ReLU)对 one-hot 编码的 50 nt 窗口做局部特征提取,展平后经 40 维 Dense 瓶颈(ReLU + dropout),最后输出单个标量回归分数。

配置项值
模型类型OptMrlForSequencePrediction
输入窗口50 nt(CDS 上游 5'UTR)
卷积层数 / 卷积核3 / 120 × kernel 8(same padding)
隐藏层(瓶颈)40(Dense + ReLU + dropout 0.2)
输出单个标量 mean-ribosome-load(MRL)
输出头回归头(无激活函数,直接输出 logits)
词表A/C/G/U/N(RnaTokenizer,T 自动转 U)
参数量475,641(0.4756M)

输入为 RNA(RnaTokenizer 按 A/C/G/U/N 编码,DNA 中的 T 自动转为 U), 输出为标量 MRL 预测值。模型对不足 50 nt 的序列右补齐、对超过 50 nt 的 序列截断到前 50 nt(等价于取 5' 端窗口)。

4. 昇腾 NPU 适配要点

#适配点说明
1非 LLM,不走 vLLM-AscendOptMRL 是 5'UTR 翻译效率回归 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(约 1.9MB),无需量化
4one-hot 嵌入模型内部用 F.one_hot 将 token 投影为 (batch, vocab=5, 50);在 NPU 上仅告警 "internal format"(输出正常),无需修补
5滑窗打分固定 50 nt 窗口,序列 ≤ 50 nt 单窗打分(模型自动补齐/截断);> 50 nt 按 stride 滑窗批量打分,返回逐位置 MRL 谱与 Top 高翻译效率窗口

模型验证: 在昇腾 NPU 上对 NRAS 5'UTR(131 nt)滑窗扫描,共 82 个窗口、 推理约 184 ms,MRL 谱均值 -0.2267、最大 0.9769(pos 70);单个 50 nt 窗口推理约 180 ms,输出结构与官方实现一致,行为符合预期。

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

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

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

5.3 命令行推理

# 缺省:使用模型卡内置 5'UTR 演示序列(NRAS, 131 nt)自动滑窗扫描
python3 inference.py \
    --model-path ./optmrl \
    --device npu:0 --top-windows 3

# 单窗打分(≤ 50 nt,模型自动补齐到 50 nt)
python3 inference.py \
    --model-path ./optmrl --device npu:0 \
    --sequence "GGGGCCGGAAGUGCCGCUCCUUGGUGGGGGCUGUUCAUGGCGGUUCCGG"

# 长序列滑窗扫描(> 50 nt,默认 stride=1)
python3 inference.py \
    --model-path ./optmrl --device npu:0 --sequence-file ./example_5utr.fa

5.4 服务化推理(FastAPI)

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

调用示例:

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

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

# MRL 预测(sequence 缺省时使用 NRAS 5'UTR 演示序列)
curl -X POST http://127.0.0.1:8011/v1/predict \
    -H "Content-Type: application/json" \
    -d '{"top_windows": 3}'

# 单窗预测(≤ 50 nt)
curl -X POST http://127.0.0.1:8011/v1/predict \
    -H "Content-Type: application/json" \
    -d '{"sequence": "GGGGCCGGAAGUGCCGCUCCUUGGUGGGGGCUGUUCAUGGCGGUUCCGG"}'

6. 推理结果

模型推理结果

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

[demo] 未提供序列,使用模型卡内置 5'UTR 演示序列(NRAS, 131 nt)
模型加载完成,耗时 7.6s,参数量 0.4756M
滑窗扫描: 窗口=50 nt, stride=1, 共 82 个位置, 推理耗时 184.4 ms
MRL 谱均值: -0.2267 | 最大值: 0.9769 @ pos 70
Top 3 高翻译效率窗口(MRL 最高):
  #1  pos   70  MRL=0.9769
  #2  pos   51  MRL=0.9651
  #3  pos   39  MRL=0.8835

服务化推理返回(POST /v1/predict,滑窗扫描):

{
  "sequence": "GGGGCCGGAAGUGCCGCUCCUUGGUGGGGGCUGUUCAUGGCGGUUCCGGGGUCUCCAACAUUUUUCCCGGCUGUGGUCCUAAAUCUGUCCAAAGCAGAGGCAGUGGAGCUUGAGGUUCUUGCUGGUGUGAA",
  "length": 131,
  "mode": "scan",
  "window": 50,
  "stride": 1,
  "mrl_mean": -0.2267,
  "mrl_max": 0.9769,
  "inference_ms": 190.0,
  "top_windows": [
    {"rank": 1, "pos": 70, "mrl": 0.9769},
    {"rank": 2, "pos": 51, "mrl": 0.9651},
    {"rank": 3, "pos": 39, "mrl": 0.8835}
  ]
}

7. 环境检查

NPU 设备调用

服务健康检查返回:

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

Agent 工作流

8. 复现步骤

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

# 2. 命令行推理
python3 inference.py --model-path ./optmrl --device npu:0 --top-windows 3

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

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