本文档记录 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,在纯英文检索场景中更为高效。
相关获取地址:
| 组件 | 版本 |
|---|---|
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--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/simpleHF_ENDPOINT=https://hf-mirror.com \
huggingface-cli download cross-encoder/ms-marco-MiniLM-L12-v2 \
--local-dir ./cross-encoder--ms-marco-MiniLM-L12-v2python 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])python inference.py --query "What is machine learning?" \
--passage "Machine learning is a subset of artificial intelligence." --device npu预期输出:0-1 之间的相关性分数,无运行时错误。
测试条件:20 对英文 query-passage 样本,batch_size=16,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| CPU 吞吐量 | 71.6 pairs/s |
| NPU 吞吐量 | 429.7 pairs/s |
| CPU/NPU 加速比 | 6.0 × |
分别在 CPU 和 NPU 上对 20 对 query-passage 推理,比较 sigmoid 分数的余弦相似度、MAE 和最大误差。
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 1.000000 |
| MAE | 0.000326 |
| 最大误差 | 0.002416 |
| 精度误差率 | 0.0000% |
结论:精度误差率 0.0000%,NPU 与 CPU 输出完全一致,评测通过。
AutoModelForSequenceClassification.from_pretrained() 加载,model.to("npu:0") 迁移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()