本文档记录 BAAI/bge-base-en-v1.5 BGE-base 句嵌入模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
BGE(BAAI General Embedding)是智源研究院(BAAI)推出的通用句嵌入模型系列。bge-base-en-v1.5 是基于 BERT-base(12层,768维)的对比学习嵌入模型,在 MTEB 基准的检索任务上表现优异(NDCG@10 达 58+)。相比 small 版本(384维),base 版本精度更高但推理速度约为其一半,适合对语义质量要求更高的 RAG 和语义搜索场景。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n BAAI--bge-base-en-v1.5 python=3.11 -y
conda activate BAAI--bge-base-en-v1.5
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/simplepython inference.py --text "How to bake a chocolate cake?" --device npu
python inference.py --batch_file queries.txt --device npu --batch_size 32编程接口:
from inference import BGEEncoder
encoder = BGEEncoder(model_path="./BAAI--bge-base-en-v1.5", device="npu")
embeddings = encoder.encode(["What is the capital of France?"])
# embeddings.shape → (1, 768)python inference.py --text "How to bake a chocolate cake?" --device npu预期输出:768 维归一化嵌入向量,无运行时错误。
测试条件:23 条多样化测试句子(含中英文、短句、长句、特殊字符),batch_size=32,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| NPU 吞吐量 | 688.5 sentences/s |
| CPU/NPU 加速比 | 23.6 × |
BGE-base(768维)在 NPU 上获得 23.6× 加速。768 维嵌入在 NPU 上的计算密度高于 384 维,加速比更大。但绝对吞吐(688 vs 792 sent/s)低于 BGE-small。
分别在 CPU 和 NPU 上对 23 条多样化测试句子(英文、中文、法文、标点、数字、短句、长句)推理,从以下维度评估:
(1 - 平均余弦) × 100%(要求 < 1.0%)| 指标 | 数值 | 说明 |
|---|---|---|
| 有效句子数 | 23 | — |
| 平均余弦相似度 | 0.999978 | 接近完美 |
| 最小余弦相似度 | 0.999735 | 最差句仍 > 0.9997 |
| 精度误差率 | 0.0022% | 远低于 1% 要求 |
| 最大元素绝对误差 | 0.000944 | 768维中最大单维偏差 |
| MSE | 0.00000006 | 整体偏差可忽略 |
| 相似度矩阵 Pearson r | 0.999988 | 语义结构完全保持 |
| 句子 | 余弦 | 句子 | 余弦 |
|---|---|---|---|
| "Hello world" | 0.999979 | "I love programming in Python" | 0.999988 |
| "The quick brown fox..." | 0.999980 | "Machine learning..." | 0.999968 |
| "Yes" | 0.999975 | "No." | 0.999980 |
| "你好世界" | 0.999959 | "Bonjour le monde!..." | 0.999978 |
| "What is the meaning of life?" | 0.999983 | "Price: $100.50 (50% off!)" | 0.999981 |
全部 23 句余弦相似度 ≥ 0.999735。
结论:精度误差率 0.0022%,远低于 1% 阈值。NPU 与 CPU 输出在向量方向、数值精度和语义结构上均等价,评测通过。
AutoModel.from_pretrained() 加载,model.to("npu:0") 迁移(embeddings * mask).sum(1) / mask.sum(1)from transformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained("bge-base-en-v1.5").to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("bge-base-en-v1.5")
inputs = tokenizer(text, return_tensors="pt"); inputs = {k:v.to("npu:0") for k,v in inputs.items()}
with torch.no_grad():
emb = model(**inputs).last_hidden_state
mask = inputs["attention_mask"].unsqueeze(-1).float()
embedding = torch.nn.functional.normalize((emb*mask).sum(1)/mask.sum(1), p=2, dim=1)"Represent this sentence for searching relevant passages: " 前缀以发挥最佳检索效果。本适配脚本未强制添加,可自行在调用前拼接。SentenceTransformer 加载。NPU 适配使用手动 Mean Pooling 以简化依赖。