z
zkx_/sentence-transformers_multi-qa-MiniLM-L6-cos-v1-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

multi-qa-MiniLM-L6-cos-v1 on Ascend NPU

1. 简介

本文档记录 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 检索、客服问答匹配等场景。

相关获取地址:

  • 权重下载地址(ModelScope):sentence-transformers/multi-qa-MiniLM-L6-cos-v1
  • 权重下载地址(HuggingFace):https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1

2. 验证环境

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

3. 部署使用流程

3.1 环境准备

conda create -n sentence-transformers_multi-qa-MiniLM-L6-cos-v1 python=3.11 -y
conda activate sentence-transformers_multi-qa-MiniLM-L6-cos-v1

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

3.2 推理脚本使用

python inference.py --text "How many people live in Berlin?" --device npu
python inference.py --batch_file questions.txt --device npu

编程接口:

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)

4. Smoke 验证

python inference.py --text "How many people live in Berlin?" --device npu

预期输出:384 维归一化嵌入向量,无运行时错误。

5. 性能参考

测试条件:23 条多样化测试句子,batch_size=32,NPU 预热 1 轮。

指标数值
NPU 吞吐量1,381.1 sentences/s

MiniLM-L6 仅 6 层 384 维,推理速度极快(1381 sent/s),是所有 BERT 类模型中最快的之一。

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 23 条多样化测试句子推理,比较 384 维嵌入向量的余弦相似度和语义相似度矩阵的 Pearson 相关系数。

6.2 评测结果

指标数值
精度误差率0.0000%

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

7. 迁移适配说明

7.1 模型结构

  • Backbone:BertModel(MiniLM-L6 蒸馏版,6 层,384 维)
  • Pooling:Mean Pooling(对所有 token 嵌入取 mask 加权平均)
  • Normalize:L2 归一化到单位球面
  • Tokenizer:BERT WordPiece(vocab.txt),英文优化
  • 参数量:约 22.7M(MiniLM 轻量设计)

7.2 适配要点

  1. 使用 AutoModel.from_pretrained() 加载,model.to("npu:0") 迁移
  2. 手动实现 Mean Pooling:(embeddings * mask).sum(1) / mask.sum(1)
  3. 与 all-MiniLM-L6-v2 完全相同的适配流程(仅权重不同)
  4. 支持 sentence-transformers 格式和直接 AutoModel 加载两种方式

7.3 关键代码

import torch, 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)
    mask = inputs["attention_mask"].unsqueeze(-1).float()
    embedding = (outputs.last_hidden_state * mask).sum(1) / mask.sum(1)
    embedding = torch.nn.functional.normalize(embedding, p=2, dim=1)

8. 注意事项

  1. QA 检索特化:该模型在 QA 对数据上微调,question 和 answer 通过余弦相似度匹配。与 all-MiniLM-L6-v2 的通用语义相似度不同,本模型对"问题 vs 答案"的匹配更敏感。
  2. 384 维轻量嵌入:仅 384 维(vs BERT-base 的 768 维),推理速度和存储效率均提升约 2×,适合大规模向量检索场景。
  3. 首次 NPU 推理:MiniLM-L6 仅 6 层,算子编译约 2-3 秒,是所有 BERT 模型中预热最快的。
  4. 跨语言支持:虽以英文为主训练,但对多语言问答有一定泛化能力(通过 WordPiece tokenizer 的多语言词表)。
  5. 与 all-MiniLM 对比:all-MiniLM-L6-v2 适合通用语义搜索,本模型在 FAQ 匹配、客服问答等场景精度更高。