X
Xiaoxy510/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 检索、客服问答匹配等场景。

模型参数量约 22.7M,是 BERT-base(110M)的 1/5,推理速度和存储效率均显著优于标准 BERT。

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1
  • 权重下载地址(ModelScope):https://modelscope.cn/models/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 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

3.2 推理脚本使用

# 单条文本推理(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)

3.3 精度与性能评测

python eval.py --model_path /path/to/model --batch_size 32

评测脚本会自动执行 CPU 基准推理 → NPU 推理 → 精度对比分析,结果输出到控制台并保存至 eval_log.txt。

4. Smoke 验证

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

5. 性能参考

测试条件: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 倍加速。

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 23 条多样化测试句子(涵盖英文、中文、法文、数字序列、标点符号、短文本、长文本等)推理,比较 384 维嵌入向量的余弦相似度。精度误差定义为 (1 - mean_cosine_similarity) × 100%,要求误差 < 1%。

同时计算语义相似度矩阵(23×23)的 Pearson 相关系数,评估 NPU 与 CPU 在语义检索排序上的一致性。

6.2 评测结果

指标数值
有效句子数23
平均余弦相似度1.000000
最小余弦相似度0.999999
最大元素绝对误差0.000254
MSE0.00000000
相似度矩阵 Pearson r1.000000
精度误差率0.0000%

结论:精度误差率 0.0000%,远低于 1.0% 阈值,NPU 与 CPU 输出完全一致,评测通过 ✅

7. 迁移适配说明

7.1 模型结构

  • Backbone:BertModel(MiniLM-L6 蒸馏版,6 层 Transformer,384 维隐藏层)
  • Attention:标准 Multi-Head Self-Attention(12 头)
  • Activation:GELU
  • Normalization:LayerNorm(eps=1e-12)
  • Pooling:Mean Pooling(对所有 token 嵌入取 attention_mask 加权平均)
  • Normalize:L2 归一化到单位球面(输出为单位向量)
  • Tokenizer:BERT WordPiece(vocab.txt),词表大小 30522
  • 参数量:约 22.7M

7.2 适配要点

  1. 使用 AutoModel.from_pretrained() 加载,model.to("npu:0") 迁移到昇腾 NPU
  2. 手动实现 Mean Pooling 层:(embeddings * mask).sum(1) / mask.sum(1)
  3. L2 归一化:torch.nn.functional.normalize(embeddings, p=2, dim=1)
  4. 支持两种加载方式:直接 AutoModel(本脚本)和 sentence-transformers 库

7.3 关键代码

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)

8. 注意事项

  1. QA 检索特化:该模型在 QA 对数据(215M+ 对)上微调,question 和 answer 通过余弦相似度匹配。与 all-MiniLM-L6-v2 的通用语义相似度不同,本模型对"问题 vs 答案"的匹配更敏感,适合 FAQ 检索、客服问答匹配等场景。

  2. 384 维轻量嵌入:仅 384 维(vs BERT-base 的 768 维),推理速度和存储效率均提升约 2×,适合大规模向量检索场景。

  3. 首次 NPU 推理:MiniLM-L6 仅 6 层,算子编译约 2-3 秒,是所有 BERT 类模型中预热最快的。

  4. 跨语言支持:虽以英文为主训练,但对多语言问答有一定泛化能力(通过 WordPiece tokenizer 的多语言词表)。

  5. 输入长度限制:最大序列长度 512 word pieces,超出部分会被截断。训练时输入上限为 250 word pieces,超长文本可能影响效果。

  6. 与 all-MiniLM 的对比:all-MiniLM-L6-v2 适合通用语义搜索,本模型在 FAQ 匹配、客服问答等场景精度更高。