all-MiniLM-L6-v2 on Ascend NPU
1. 简介
本文档记录 all-MiniLM-L6-v2(句子嵌入模型)在昇腾 NPU(Ascend 910B3)环境的适配部署与精度验证结果。
all-MiniLM-L6-v2 是一种轻量级句子嵌入模型,参数量约 22.7M,基于 MiniLM 架构(6 层 BERT),将输入句子映射到 384 维向量空间,适用于语义搜索、聚类和文本分类等下游任务。本项目完成该模型在昇腾 NPU 上的推理适配,并验证 NPU 与 CPU 推理结果的精度误差 < 1%。
相关地址:
2. 验证环境
| 组件 | 版本 |
|---|
python | 3.11.x |
torch | 2.10.0+cpu |
torch_npu | 2.10.0 |
transformers | 5.8.1 |
safetensors | 0.7.0 |
CANN | 8.5.1 |
| NPU 驱动 | 25.5.2 |
| NPU 硬件 | Ascend 910B3 (8卡) |
| 操作系统 | Linux (aarch64) |
3. 模型信息
| 项目 | 值 |
|---|
| 模型架构 | MiniLM (6-layer BERT) |
| 参数量 | ~22.7M |
| 隐藏维度 | 384 |
| Layers | 6 |
| Attention Heads | 12 |
| 最大序列长度 | 256 |
| 输出维度 | 384(CLS token) |
| 权重格式 | safetensors |
| 原始框架 | PyTorch (transformers) |
| 预训练数据 | Web corpus (distilled from BERT) |
| 许可证 | Apache-2.0 |
4. Conda 环境安装
创建独立的 conda 环境并安装依赖(使用华为云 PyPI 镜像加速):
# 创建 conda 环境
conda create -n minilm python=3.11 -y
# 激活环境
conda activate minilm
# 安装 PyTorch 及相关依赖(华为云镜像)
pip install torch==2.10.0 torchvision==0.25.0 --index-url https://repo.huaweicloud.com/repository/pypi/simple/
# 安装 torch_npu(根据环境选择对应版本)
pip install torch_npu==2.10.0 --index-url https://repo.huaweicloud.com/repository/pypi/simple/
# 安装 transformers 及其他依赖
pip install transformers safetensors --index-url https://repo.huaweicloud.com/repository/pypi/simple/
如果 HuggingFace 网络不通,设置镜像:
export HF_ENDPOINT=https://hf-mirror.com/
5. 推理执行
句子嵌入提取
# NPU 推理(默认)
python3 inference.py \
--model_path /path/to/all-MiniLM-L6-v2 \
--text "Your sentence here"
# CPU 推理
python3 inference.py \
--model_path /path/to/all-MiniLM-L6-v2 \
--text "Your sentence here" \
--device cpu
精度与性能评测
python3 benchmark.py \
--model_path /path/to/all-MiniLM-L6-v2 \
--npu_device npu:0
评测结果日志将输出到 log.txt。
6. 参数说明
inference.py 参数
| 参数 | 说明 | 默认值 |
|---|
--model_path | 模型权重路径(包含 config.json, model.safetensors) | 必需 |
--text | 输入文本 | Hello, world! |
--device | 运行设备,可选 npu:0 或 cpu | npu:0 |
benchmark.py 参数
| 参数 | 说明 | 默认值 |
|---|
--model_path | 模型权重路径 | 必需 |
--npu_device | NPU 设备 ID | npu:0 |
--num_warmup | NPU 预热轮数 | 3 |
7. 精度评测
评测方法
使用同一段输入文本分别在 CPU(FP32)和 NPU(FP32)上运行推理,对比输出 CLS token 嵌入向量的差异。
评价指标说明
| 指标 | 含义 | 判定阈值 |
|---|
| 向量级相对误差 | ` | |
| 余弦相似度 | NPU 与 CPU 输出向量间的方向一致性 | > 0.99 |
| 最大/平均绝对误差 | 逐元素差值统计,反映数值偏差的绝对量级 | — |
精度结果
| 输出张量 | 向量级相对误差 | 余弦相似度 | 最大绝对误差 | 平均绝对误差 |
|---|
| CLS embedding | 0.099959% | 0.9999995828 | — | — |
判定结论
| 指标 | 实测值 | 阈值 | 状态 |
|---|
| 向量级相对误差 | 0.10% | < 1% | PASS |
| 余弦相似度 | 0.9999996 | > 0.99 | PASS |
8. 性能数据
| 操作 | 耗时 |
|---|
| CPU 推理时间(FP32) | 0.27s |
| NPU 推理时间(FP32,3轮预热后) | 0.01s |
| 加速比 (CPU / NPU) | 26.19x |
9. 注意事项
- 首次加载:首次加载模型权重会从本地读取 safetensors 文件,耗时约 1 秒。
- NPU 预热:NPU 首次推理包含编译优化,通常需要 1-2 轮预热才能达到稳定性能。脚本默认开启 3 轮预热。
- 精度:本模型使用 FP32 精度,NPU 与 CPU 输出误差极低(~0.1%),不影响下游语义检索效果。
- 权重文件:模型权重(.safetensors)不包含在适配仓库中,需单独下载。
- 输出说明:脚本输出
last_hidden_state[:, 0](CLS token)作为句子嵌入向量,维度为 384。
- 轻量推理:22.7M 参数,NPU 推理仅需 ~0.01s,适合高吞吐场景。