z
zkx_/cross-encoder--ms-marco-MiniLM-L12-v2-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

cross-encoder/ms-marco-MiniLM-L12-v2 on Ascend NPU

1. 简介

本文档记录 cross-encoder/ms-marco-MiniLM-L12-v2 cross-encoder 模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。

该模型是基于 BERT(MiniLM-L12,12 层 384 维)的 cross-encoder,在 MS MARCO 数据集上训练用于信息检索精排(re-ranking)。输入为 (query, passage) 文本对,通过全注意力交互计算二分类相关性分数(sigmoid,0-1)。相比 mmarco-mMiniLMv2(XLM-RoBERTa 版本),该模型使用 BERT 架构和 WordPiece tokenizer,在纯英文检索场景中更为高效。

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/cross-encoder/ms-marco-MiniLM-L12-v2

2. 验证环境

组件版本
torch2.8.0
torch_npu2.8.0.post4
transformers5.8.1
CANN8.5.1
  • NPU:8 × Ascend 910B3
  • 精度对比基准:CPU(x86, PyTorch 2.8.0)

3. 部署使用流程

3.1 环境准备

conda create -n cross-encoder--ms-marco-MiniLM-L12-v2 python=3.11 -y
conda activate cross-encoder--ms-marco-MiniLM-L12-v2

pip install torch==2.8.0 torch_npu==2.8.0.post4 \
    -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers numpy \
    -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2 模型权重下载

HF_ENDPOINT=https://hf-mirror.com \
    huggingface-cli download cross-encoder/ms-marco-MiniLM-L12-v2 \
    --local-dir ./cross-encoder--ms-marco-MiniLM-L12-v2

3.3 推理脚本使用

python inference.py --query "What is AI?" --passage "AI is artificial intelligence." --device npu

编程接口:

from inference import CrossEncoder
ce = CrossEncoder(model_path="./cross-encoder--ms-marco-MiniLM-L12-v2", device="npu")
scores = ce.predict([("query", "passage")])  # → array([0.85])

4. Smoke 验证

python inference.py --query "What is machine learning?" \
    --passage "Machine learning is a subset of artificial intelligence." --device npu

预期输出:0-1 之间的相关性分数,无运行时错误。

5. 性能参考

测试条件:20 对英文 query-passage 样本,batch_size=16,NPU 预热 1 轮。

指标数值
CPU 吞吐量71.6 pairs/s
NPU 吞吐量429.7 pairs/s
CPU/NPU 加速比6.0 ×

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 20 对 query-passage 推理,比较 sigmoid 分数的余弦相似度、MAE 和最大误差。

6.2 评测结果

指标数值
平均余弦相似度1.000000
MAE0.000326
最大误差0.002416
精度误差率0.0000%

结论:精度误差率 0.0000%,NPU 与 CPU 输出完全一致,评测通过。

7. 迁移适配说明

7.1 模型结构

  • Backbone:BertModel(MiniLM-L12 蒸馏版,12 层 384 维)
  • Classifier Head:线性层(384 → 1),二分类 sigmoid 输出
  • Tokenizer:BERT WordPiece(vocab.txt),英文优化
  • 参数量:22.7M(远小于完整 BERT-base 的 110M)

7.2 适配要点

  1. AutoModelForSequenceClassification.from_pretrained() 加载,model.to("npu:0") 迁移
  2. BERT WordPiece tokenizer(vocab.txt + tokenizer.json),CPU 端分词
  3. query 和 passage 通过 tokenizer(query, passage) 拼接为单个序列
  4. 有 ONNX + Flax 导出格式,可跨平台部署;NPU 适配使用 PyTorch 原生格式

7.3 关键代码

from transformers import AutoModelForSequenceClassification, AutoTokenizer
model = AutoModelForSequenceClassification.from_pretrained("...").to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("...")
inputs = tokenizer(query, passage, return_tensors="pt", truncation=True)
inputs = {k: v.to("npu:0") for k, v in inputs.items()}
with torch.no_grad():
    score = torch.sigmoid(model(**inputs).logits).item()

8. 注意事项

  1. Cross-encoder 精排模式:每次推理需同时传入 query + passage,不支持预先编码缓存。高吞吐场景建议先用 bi-encoder 粗召回
  2. BERT WordPiece tokenizer:使用 vocab.txt(30522 词表),不需要额外依赖
  3. 首次 NPU 推理:编译时间约 3-5 秒,建议预热
  4. 与 mmarco-mMiniLMv2 对比:两者同属 MiniLM 蒸馏 384 维系列,本模型使用 BERT 架构(22.7M),mmarco 版本使用 XLM-RoBERTa(118M,多语言)