2502_90647073/BAAI
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

BAAI/bge-small-zh-v1.5 — 昇腾 NPU 适配与精度测评

✅ 适配结论:精度完全对齐,误差 < 0.001%

评估维度最小余弦相似度归一化误差判定
纯中文文本 (8个样本)0.99999887< 0.0002%✅ 通过
中英混合/英文文本 (7个样本)0.99999702< 0.0003%✅ 通过
全局 (15个样本)0.999997020.0003%✅ 通过

关键发现: 之前报告中 10.5% 的偏差来源于 vLLM-Ascend 的 EncoderOnlyAttention 实现,而非 NPU 硬件本身。 通过 HuggingFace 模型直连 NPU(不经过 vLLM),余弦相似度在所有测试文本上均 > 0.999997。

📋 模型信息

属性值
模型名称BAAI/bge-small-zh-v1.5
模型架构BERT (4层, 512 hidden, 8 heads)
参数量~30M
嵌入维度512
最大序列长度512
预训练精度float32
推理引擎HuggingFace Transformers + torch_npu
硬件平台Ascend 910 (NPU)
CANN 版本8.5.1

📦 环境要求

组件版本
Python≥ 3.10
CANN8.5.x
torch≥ 2.6.0
torch_npu≥ 2.6.0
transformers≥ 4.30.0

🚀 快速使用

命令行推理

# 单文本嵌入
python3 infer_npu.py --text "今天天气很好,适合出去玩"

# 批量嵌入
python3 infer_npu.py --text "文本1" --text "文本2" --text "文本3"

# 从文件读取
python3 infer_npu.py --input texts.txt

HTTP API 服务

# 启动服务
python3 infer_npu.py --serve --port 8000

# 调用 API
curl http://localhost:8000/v1/embeddings \
  -H "Content-Type: application/json" \
  -d '{"input": ["今天天气很好,适合出去玩", "The quick brown fox"]}'

Python API

from infer_npu import BGEEmbeddingNPU

engine = BGEEmbeddingNPU()
embs = engine.encode(["今天天气很好", "Hello world"], batch_size=32)
print(embs.shape)  # (2, 512)

🎯 精度对比评测

评测方法

使用 HuggingFace Transformers 模型分别在 CPU (float32 黄金基线) 和 NPU 上运行, 确保完全相同的代码路径(相同的张量操作、相同的池化策略)。

对比维度:

  1. CPU float32 — 黄金基线 (全精度)
  2. NPU float32 — HuggingFace 直连 Ascend 910

嵌入提取方式 (CLS + L2 Normalize):

hidden_states → CLS token [0] → L2 normalize → output embedding

精度数据

#类型文本NPU-f32 vs CPU-f32 余弦MSE最大绝对误差
0纯中文今天天气很好,适合出去玩0.999999283.1e-091.8e-04
1纯中文今天阳光明媚,适合户外活动0.999999233.1e-091.9e-04
2纯中文机器学习是人工智能的一个重要分支0.999999283.4e-091.8e-04
3纯中文自然语言处理技术正在快速发展0.999999342.9e-091.5e-04
4纯中文北京是中国的首都0.999999173.5e-091.6e-04
5纯中文上海是国际化大都市0.999999283.1e-091.6e-04
6纯中文我想吃红烧肉0.999998874.3e-092.3e-04
7纯中文深度学习模型需要大量训练数据0.999999233.1e-092.2e-04
8中英混合注意力机制是Transformer的核心0.999999283.2e-092.0e-04
9中英混合华为昇腾NPU支持大模型推理加速0.999999113.7e-091.9e-04
10中英混合BGE embedding model supports semantic search0.999998515.6e-092.2e-04
11纯英文The quick brown fox jumps over the lazy dog0.999998934.5e-092.2e-04
12纯英文NLU0.999997021.2e-083.6e-04
13数字混合第100层神经网络0.999999053.5e-091.9e-04
14标点混合Hello, 世界!0.999999402.7e-091.7e-04

分类统计

类别样本数平均余弦最小余弦
纯中文80.999999210.99999887
中英混合/英文70.999998760.99999702
总计150.999999000.99999702

精度判定

✅ 全局通过:最小余弦相似度 0.99999702,归一化误差 0.0003%,远低于 1% 要求。

🔬 关键诊断:vLLM-Ascend 注意力偏差

问题发现

在初始适配中,通过 vLLM-Ascend 运行时发现中英混合文本存在 10.5% 的余弦误差:

对比方式纯中文最小余弦混合文本最小余弦
HF-NPU vs CPU (本方案)0.999998870.99999702
vLLM-Ascend vs CPU (之前)0.999998870.895158

三重控制变量实验

对比组纯中文英/中混合结论
CPU-f32 vs CPU-f160.9999+0.9999+float16 精度损失 < 0.04%
HF-CPU vs HF-NPU (本方案)0.9999990.999997NPU 硬件精度完全对齐
CPU vs vLLM-Ascend0.9999990.895偏差源 = vLLM 注意力后端

根因

偏差 不是 dtype 转换也不是 NPU 硬件问题,而是 vLLM-Ascend 的 EncoderOnlyAttention 后端在特定注意力分布下的数值差异。HF 直连 NPU 使用相同的 PyTorch 代码路径,所有文本的余弦相似度均 > 0.99999。

⚡ 性能数据

指标CPU (float32)NPU (HF直连 float32)加速比
单文本平均延迟~18 ms~17 ms~1.1x
批处理 (batch=32)—可线性扩展—

注: 该模型仅 30M 参数,CPU 本身已很快。对于更大的 BERT 模型,NPU 加速比将更加显著。

📚 文件说明

文件说明
infer_npu.pyHF 直连 NPU 推理脚本(支持 CLI + HTTP API)
eval_precision_final.py最终精度评估脚本
precision_results.json精度评估结果
adaptation-report_BAAI_bge-small-zh-v1.5.md适配报告(含 vLLM 分析)
eval_precision.py诊断脚本 (HF on NPU 隔离分析)

📚 参考资料

  • BGE 模型官方
  • ModelScope 模型页
  • 昇腾社区