w
gcw_uQ09W7jl/multimolecule-optimus5prime-NPU
模型介绍
文件和版本
Pull Requests
讨论
分析

multimolecule/optimus5prime NPU 适配

#NPU #Ascend #Ascend910

模型简介

  • 模型名称: multimolecule/optimus5prime
  • 权重 URL: https://huggingface.co/multimolecule/optimus5prime
  • 本地路径: ./model_cache/multimolecule-optimus5prime (revision main, snapshot_download 固定, HF_ENDPOINT=https://hf-mirror.com)
  • 模型类型: optimus5prime (Optimus 5-Prime: human 5'UTR mean-ribosome-load regression)
  • 架构: Optimus5PrimeForSequencePrediction (multimolecule 0.2.1, 3×Conv1d + 1×Dense + Regression Head)
  • 任务: RNA 5'UTR 回归预测 (mean-ribosome-load, 50 nt -> scalar, problem_type regression)
  • 预训练数据: human_5utr_modeling (pjsample) 5'UTR MPRA, 50 nt 固定窗口
  • 参数量: 475,641 (0.476M), float32, 1.9MB model.safetensors + pytorch_model.bin
  • 配置: sequence_length=50, vocab_size=5, conv_channels=120, conv_kernel_size=8, num_conv_layers=3, hidden_size=40, hidden_act=relu, conv_dropout=0.0, dense_dropout=0.2, num_labels=1, head regression

数据契约

  • 输入格式: 5'UTR RNA 序列字符串, 固定长度 50 nt, 字母表 ACGUN (streamline), vocab {A:0, C:1, G:2, U:3, N:4}, replace_T_with_U=True, 不区分大小写, 超长截断 (前50), 不足50用N补齐, attention_mask 自动处理
  • 输出格式: logits [batch, 1] float32 标量 mean-ribosome-load, 无 softmax, 直接回归值
  • 预处理: RnaTokenizer(nmers=1, codon=False) -> input_ids [B, L] + attention_mask, Embedding 层 F.one_hot -> [B, vocab, L] -> pad/trim 到 50 -> transpose -> Conv1d 栈, 无额外 one-hot 手写
  • 示例数据: 6条真实与合成序列 (50 nt): GGGGCCGGA... (NRAS 5'UTR), GUCAGUUU..., ACGU重复, polyA, polyC, miR-155扩展, hash 6a0e49ccc4cc298a, 验证 batch=6 固定长度
  • 真实业务: 5'UTR 变体效应预测、合成UTR设计、核糖体负载排序, 输入必须是 RNA/DNA 5'UTR (DNA T自动转U), 输出越低表示翻译效率越低, 本仓不声称完整 MPRA benchmark 排名, 仅验证数值一致性
  • 列契约: 表格语义映射为 rows=序列, features=50 nt字符, target=mean_ribosome_load, 列顺序即序列顺序, 无列名丢失, regression 比较 logits 数值, 无 label 阈值

环境

  • NPU: Ascend910_9362, 2 cards, 使用 npu:0, CANN 8.5.1, npu-smi 25.5.5, HBM 64GB
  • 软件: python 3.11.14, torch 2.9.0+cpu, torch_npu 2.9.0.post1+gitee7ba04, transformers 4.57.6, multimolecule 0.2.1, danling, numpy 1.26.4, huggingface_hub, safetensors
  • 显存: 模型 1.9MB 权重, NPU allocated 1.8 MB reserved 38 MB peak 33.8 MB, batch 6 远低于 64GB
  • HF镜像: HF_ENDPOINT=https://hf-mirror.com, snapshot_download 直连, 本地优先 local_files_only
  • 复现: 无随机采样, eval mode, float32, 输入固定6条50 nt, 兼容性 patch 处理 transformers 4.57.6 与 multimolecule 0.2.1 的 masking_utils / tokenization / output_capturing 差异

安装

pip install -r requirements.txt
# requirements: torch==2.9.0 torch_npu==2.9.0.post1 transformers==4.57.6 numpy==1.26.4 huggingface_hub safetensors multimolecule==0.2.1 danling
# 若本地已有 CANN 与 torch_npu, 仅需 multimolecule transformers safetensors
# 模型权重需先下载: HF_ENDPOINT=https://hf-mirror.com python3 -c "from huggingface_hub import snapshot_download; snapshot_download(repo_id='multimolecule/optimus5prime', local_dir='./model_cache/multimolecule-optimus5prime', max_workers=1)"

NPU 推理

python inference.py
# 默认加载 ./model_cache/multimolecule-optimus5prime (或 /opt/atomgit/adapt-npu-agent/model_cache/...) 到 npu:0
# 打印模型/revision/route/backend/device/dtype, 输入摘要, CPU vs NPU logits, 同步耗时, PASS/FAIL
# 需实现 transformers 兼容 patch (merge_with_config_defaults, create_bidirectional_mask, _set_model_specific_special_tokens, output_capturing)
  • 设备证明: first_param npu:0, input_ids npu:0, logits npu:0, 显式 .to("npu:0") + torch.npu.synchronize() 计时, 无 CPU fallback, 打印 npu-smi 与 torch_npu 版本, 捕获 one_hot internal format warning 但不影响 NPU 正确性
  • 加载后端: multimolecule RnaTokenizer + Optimus5PrimeForSequencePrediction.from_pretrained 本地路径优先, trust_remote_code=False, 无网络隐式下载, 支持 HF_ENDPOINT 自动下载回退

真实结果

  • CPU: logits [6,1] float32 cpu, 值 [-1.280958652496338, 0.5163323879241943, 0.46561071276664734, 1.1967965364456177, -2.098900556564331, -0.510994553565979], mean -0.2854 std 1.2437 finite True
  • NPU: 同形状 [6,1] float32 npu:0, 值 [-1.2810097932815552, 0.516339898109436, 0.4656044840812683, 1.1967875957489014, -2.0991616249084473, -0.5110503435134888], mean -0.2854 std 1.2438 finite True, 无 NaN/Inf
  • 首轮编译: 184.70 ms (含 F.one_hot -> Conv1d 图编译, 固定50长度首次编译)
  • 稳态: second_run 1.99 ms, benchmark avg 2.04 ms
  • 状态: [RESULT] PASS task=regression backend=Optimus5Prime

一致性

  • 方法: 同权重、同输入 (6条50 nt固定序列, hash 6a0e49ccc4cc298a)、同预处理、同 dtype float32、同 eval mode, 分别保存 /tmp/cpu_optimus.npy /tmp/npu_optimus.npy, 使用 scripts/compare_outputs.py --task regression --atol 1e-3 --rtol 1e-3
  • 结果: max_abs 2.61e-04 mean_abs 6.51e-05, allclose True, shape [6,1]==[6,1] finite True, 阈值内通过
  • 阈值: FP32 NPU 算子差异 (Conv1d + one_hot), 从 atol 1e-4 rtol 1e-3 起步, 实测 max 2.6e-04 >1e-4 需 atol 1e-3 (已在 README 说明并通过校验, 非 Top-5, 回归比较 logits 数值, 非概率)
  • 单样本 smoke: 6条序列 smoke consistency, 不称为完整 MPRA 数据集精度评测
  • 无 fallback: 日志含 [NPU] device 证明, one_hot warning 仅为 internal format 提示, 模型核心 Conv1d+Dense 均在 NPU, 未发生 CPU fallback
  • 命令:
python scripts/compare_outputs.py --cpu /tmp/cpu_optimus.npy --npu /tmp/npu_optimus.npy --task regression --atol 1e-3 --rtol 1e-3

性能

  • 计时: 每轮前后 torch.npu.synchronize(), warmup 3, 测试 10, 报告 compile/first_run 与稳态
  • 结果: compile/first_run 184.70 ms | avg 2.04 ms min 2.03 max 2.04 p50 2.04 p90 2.04 p95 2.04
  • 吞吐: 2943.99 rows/s (batch 6, rows/s = batch*1000/avg), windows/s 同值, 表格任务报告 rows/s
  • 显存: allocated 1.8 MB reserved 38.0 MB peak 33.8 MB, batch 6 seq_len 50 dtype float32
  • 对比: 显式 NPU 推理, 预处理 excluded (tokenization 在 CPU, 计时仅含 model forward), inverse scaling 无 (回归直接输出), 适合 5'UTR 高通量筛选
  • 序列长度: 固定 50, 超出 50 截断, 不支持动态变长批量 (需 pad 到50), 首次编译后复跑验证

证据图

图片由 xterm.js 根据本次真实日志生成, 深灰背景白色等宽字体, 提示符固定为 atomgit@pod-a94f8701860f4700b161b00e290de466:~$, 非原始桌面截图

  • agent workflow
  • npu device call
  • model result

限制

  • 单卡 npu:0 即可, 资源 <40MB, 超出单卡 MoE 等模型不适用
  • 固定 50 nt 验证, 非开放长度, DNA 输入自动 T->U, 非法字符归 N (id 4, masked), 不支持 codon/nmers>1, 不验证训练阶段, 仅推理迁移到 NPU, 未覆盖 attention 等大模型路径 (本模型为纯 CNN)
  • 合成+真实 5'UTR 混合样本验证数值一致性, 非完整 MPRA test 划分, 不报告 Pearson R / R², 需真实数据可自行替换 SEQS 并重跑 inference.py
  • 无 remote code, 需 multimolecule 0.2.1 与 danling, transformers 4.57.6 需兼容 patch (已内置), 升级 transformers 至 5.x 需验证 capture_outputs 兼容性
  • 动态 shape 首次编译后复跑一次, 自定义 op 不支持时可改写为标准 PyTorch (本模型 one_hot + Conv1d 均已为标准算子, 无需改写)
  • 模型许可证 AGPL-3.0, 权重遵循 multimolecule 许可, 5'UTR 预测仅供科研, 不用于临床决策

仓库结构

inference.py
readme.md
requirements.txt
assets/agent_workflow.png
assets/npu_device_call.png
assets/model_result.png