本文档记录 BAAI/llm-embedder 句嵌入模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
llm-embedder 是 BAAI(北京智源人工智能研究院)推出的句嵌入模型,基于 BERT 架构(12 层 Transformer,768 维隐藏层),使用 CLS Token Pooling + L2 归一化提取句表示。与常见的 Mean Pooling 不同,该模型仅取 [CLS] 位置的输出作为整个句子的嵌入表示。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
sentence-transformers | 5.5.0 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n BAAI--llm-embedder python=3.11 -y
conda activate BAAI--llm-embedder
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/simpleHF_ENDPOINT=https://hf-mirror.com \
huggingface-cli download BAAI/llm-embedder \
--local-dir ./BAAI--llm-embedderpython inference.py --text "Hello world" --device npu
python inference.py --batch_file texts.txt --device npu --batch_size 32编程接口:
from inference import LLMEmbedder
encoder = LLMEmbedder(model_path="./BAAI--llm-embedder", device="npu")
embeddings = encoder.encode(["Hello world", "Another sentence"])
# embeddings.shape → (2, 768)python inference.py --text "This is a test sentence." --device npu预期输出:嵌入维度 768,无运行时错误。
测试条件:23 条多样化测试句子,batch_size=32。
| 指标 | 数值 |
|---|---|
| NPU 吞吐量 | 930.6 sentences/s |
分别在 CPU 和 NPU 上对 23 条多样化测试句子(中英文、短句、长句、特殊字符)推理,计算 NPU 与 CPU 嵌入的余弦相似度和语义相似度矩阵的 Pearson 相关系数。
| 指标 | 数值 |
|---|---|
| 精度误差率 | 0.0004% |
| 评测结果 | PASS |
结论:精度误差率 0.0004%,远低于 1% 要求,评测通过。
llm-embedder 由三个子模块组成:
该模型为标准 BERT 架构,NPU 适配无需修改模型结构:
AutoModel.from_pretrained() 加载,model.to("npu:0") 迁移model_output[0][:, 0, :]AutoTokenizer 在 CPU 分词后转移至 NPU.cpu().numpy() 转回 CPU# CLS Token Pooling(本模型使用)
cls_embedding = model_output[0][:, 0, :] # shape: (batch, 768)
# Mean Pooling(常见但本模型不使用)
mask = attention_mask.unsqueeze(-1).expand(embeddings.size()).float()
mean_embedding = (embeddings * mask).sum(1) / mask.sum(1)sentence_bert_config.json 配置一致tokenizer.json 和 vocab.txt,权重下载时确保包含这些文件