z
zkx_/all-mpnet-base-v2-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

all-mpnet-base-v2 on Ascend NPU

1. 简介

本文档记录 sentence-transformers/all-mpnet-base-v2 句嵌入模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。

all-mpnet-base-v2 是一个基于 MPNet 的句嵌入模型(12 层 Transformer,768 维隐藏层),通过 Mean Pooling + L2 归一化将文本映射到 768 维语义向量空间。相比 all-MiniLM-L6-v2,该模型精度更高但参数量更大,适用于对语义质量要求较高的场景。

相关获取地址:

  • 权重下载地址(ModelScope):sentence-transformers/all-mpnet-base-v2
  • 权重下载地址(HuggingFace):https://huggingface.co/sentence-transformers/all-mpnet-base-v2

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 all-mpnet-base-v2 python=3.11 -y
conda activate all-mpnet-base-v2

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 模型权重下载

modelscope download --model sentence-transformers/all-mpnet-base-v2 \
    --local_dir ./all-mpnet-base-v2

3.3 推理脚本使用

# 命令行推理
python inference.py --text "Hello world" --device npu

# 批量推理
python inference.py --batch_file texts.txt --device npu --batch_size 32

编程接口:

from inference import MPNetEncoder

encoder = MPNetEncoder(model_path="./all-mpnet-base-v2", device="npu")
embeddings = encoder.encode(["Hello world", "Another sentence"])
# embeddings.shape -> (2, 768)

4. Smoke 验证

python inference.py --text "This is a test sentence." --device npu

预期输出:嵌入维度 768,无运行时错误。

5. 性能参考

测试条件:23 条多样化测试句子,batch_size=32。

指标数值
CPU 吞吐量27.3 sentences/s
NPU 吞吐量876.7 sentences/s
CPU/NPU 加速比32.1 ×

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 23 条多样化测试句子推理,计算:

  • NPU-CPU 余弦相似度:每条句子嵌入的余弦相似度
  • 元素级最大绝对误差 与 MSE
  • 相似度矩阵 Pearson 相关系数:语义结构一致性

6.2 评测结果

指标数值
平均余弦相似度0.999995
最小余弦相似度0.999977
精度误差率0.0005%
最大元素绝对误差0.000878
MSE0.00000001
相似度矩阵 Pearson r0.999997

结论:精度误差率 0.0005%,远低于 1% 要求,评测通过。

7. 迁移适配说明

7.1 模型结构

all-mpnet-base-v2 由三个子模块组成:

  1. Transformer(MPNet-base,12 层,768 维):文本编码
  2. Pooling(Mean Pooling):对所有 token 嵌入取加权平均
  3. Normalize(L2 归一化):将嵌入向量归一化到单位球面

7.2 适配要点

该模型为标准 MPNet 架构,NPU 适配无需修改模型结构:

  1. 使用 AutoModel.from_pretrained() 加载权重,model.to("npu:0") 迁移到 NPU
  2. 手动实现 Mean Pooling(兼容 NPU 设备)
  3. 输入通过 AutoTokenizer 在 CPU 分词后转移到 NPU
  4. 输出通过 .cpu().numpy() 转回 CPU

8. 注意事项

  1. NPU 预热:首次推理会触发算子编译,建议先执行一次预热调用
  2. batch_size:batch_size ≥ 16 可充分发挥 NPU 并行能力
  3. 与 MiniLM 对比:all-mpnet-base-v2 精度更高(768 维 vs 384 维),但模型体积更大(438MB vs 87MB),推理速度略慢
  4. 多 NPU 场景:当前使用单 NPU(npu:0),多卡并行可指定不同 device ID