本文档记录 sentence-transformers/multi-qa-MiniLM-L6-cos-v1 多语言问答句嵌入模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
该模型基于 MiniLM-L6(6 层 Transformer,384 维隐藏层),通过 Mean Pooling + L2 归一化将文本编码为 384 维语义向量。与 all-MiniLM-L6-v2 同架构,但专门针对问答(QA)检索场景微调:在大量 (question, answer) 对上使用对比学习训练,使语义匹配的 QA 对在向量空间中更接近。特别适合 FAQ 检索、客服问答匹配等场景。
模型参数量约 22.7M,是 BERT-base(110M)的 1/5,推理速度和存储效率均显著优于标准 BERT。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
sentence-transformers | 5.5.0 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n multi-qa-minilm python=3.11 -y
conda activate multi-qa-minilm
pip install torch==2.8.0 torch_npu==2.8.0.post4 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers sentence-transformers numpy \
-i https://pypi.tuna.tsinghua.edu.cn/simple# 单条文本推理(NPU)
python inference.py --text "How many people live in Berlin?" --device npu
# 批量文本文件推理
python inference.py --batch_file questions.txt --device npu --batch_size 64
# CPU 推理(用于精度基准对比)
python inference.py --text "Hello world" --device cpu编程接口:
from inference import MultiQAMiniLMEncoder
encoder = MultiQAMiniLMEncoder(
model_path="./sentence-transformers_multi-qa-MiniLM-L6-cos-v1",
device="npu"
)
embeddings = encoder.encode(["How many people live in Berlin?"])
# embeddings.shape → (1, 384)python eval.py --model_path /path/to/model --batch_size 32评测脚本会自动执行 CPU 基准推理 → NPU 推理 → 精度对比分析,结果输出到控制台并保存至 eval_log.txt。
python inference.py --text "How many people live in Berlin?" --device npu预期输出:384 维归一化嵌入向量,无运行时错误。
[INFO] 加载模型: ./sentence-transformers_multi-qa-MiniLM-L6-cos-v1
[INFO] 推理设备: npu:0
[INFO] 模型加载完成,参数量: 22,713,216
=== 推理结果 ===
句子数: 1
嵌入维度: 384
推理耗时: 0.0023 s
吞吐量: 434.78 sentences/s测试条件:23 条多样化测试句子(含英文、中文、法文、数字、标点),batch_size=32,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| CPU 推理耗时 | 0.1696 s |
| NPU 推理耗时 | 0.0277 s |
| NPU 吞吐量 | 830.1 sentences/s |
| NPU vs CPU 加速比 | 6.1x |
MiniLM-L6 仅 6 层 384 维,推理速度极快,昇腾 NPU 上可获得约 6 倍加速。
分别在 CPU 和 NPU 上对 23 条多样化测试句子(涵盖英文、中文、法文、数字序列、标点符号、短文本、长文本等)推理,比较 384 维嵌入向量的余弦相似度。精度误差定义为 (1 - mean_cosine_similarity) × 100%,要求误差 < 1%。
同时计算语义相似度矩阵(23×23)的 Pearson 相关系数,评估 NPU 与 CPU 在语义检索排序上的一致性。
| 指标 | 数值 |
|---|---|
| 有效句子数 | 23 |
| 平均余弦相似度 | 1.000000 |
| 最小余弦相似度 | 0.999999 |
| 最大元素绝对误差 | 0.000254 |
| MSE | 0.00000000 |
| 相似度矩阵 Pearson r | 1.000000 |
| 精度误差率 | 0.0000% |
结论:精度误差率 0.0000%,远低于 1.0% 阈值,NPU 与 CPU 输出完全一致,评测通过 ✅
AutoModel.from_pretrained() 加载,model.to("npu:0") 迁移到昇腾 NPU(embeddings * mask).sum(1) / mask.sum(1)torch.nn.functional.normalize(embeddings, p=2, dim=1)AutoModel(本脚本)和 sentence-transformers 库import torch
import torch_npu
from transformers import AutoModel, AutoTokenizer
# 加载模型
model = AutoModel.from_pretrained("multi-qa-MiniLM-L6-cos-v1").to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("multi-qa-MiniLM-L6-cos-v1")
# 编码文本
text = "How many people live in Berlin?"
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
inputs = {k: v.to("npu:0") for k, v in inputs.items()}
with torch.no_grad():
outputs = model(**inputs)
# Mean Pooling
mask = inputs["attention_mask"].unsqueeze(-1).float()
embedding = (outputs.last_hidden_state * mask).sum(1) / mask.sum(1)
# L2 归一化
embedding = torch.nn.functional.normalize(embedding, p=2, dim=1)QA 检索特化:该模型在 QA 对数据(215M+ 对)上微调,question 和 answer 通过余弦相似度匹配。与 all-MiniLM-L6-v2 的通用语义相似度不同,本模型对"问题 vs 答案"的匹配更敏感,适合 FAQ 检索、客服问答匹配等场景。
384 维轻量嵌入:仅 384 维(vs BERT-base 的 768 维),推理速度和存储效率均提升约 2×,适合大规模向量检索场景。
首次 NPU 推理:MiniLM-L6 仅 6 层,算子编译约 2-3 秒,是所有 BERT 类模型中预热最快的。
跨语言支持:虽以英文为主训练,但对多语言问答有一定泛化能力(通过 WordPiece tokenizer 的多语言词表)。
输入长度限制:最大序列长度 512 word pieces,超出部分会被截断。训练时输入上限为 250 word pieces,超长文本可能影响效果。
与 all-MiniLM 的对比:all-MiniLM-L6-v2 适合通用语义搜索,本模型在 FAQ 匹配、客服问答等场景精度更高。