本文档记录 answerdotai/ModernBERT-base 模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
ModernBERT 是 Answer.AI 推出的现代化 BERT 变体,采用 22 层 Transformer、768 维隐藏层、8192 最大位置编码,支持长文本编码。本适配使用 Mean Pooling 提取句嵌入,适用于语义搜索、文本聚类等场景。
相关获取地址:
answerdotai/ModernBERT-base| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n ModernBERT-base python=3.11 -y
conda activate ModernBERT-base
pip install torch==2.8.0 torch_npu==2.8.0.post4 tiktoken \
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers numpy \
-i https://pypi.tuna.tsinghua.edu.cn/simpleModernBERT 使用 tiktoken 分词器,需要额外安装
tiktoken。
python inference.py --text "Hello world" --device npu
python inference.py --batch_file texts.txt --device npu --batch_size 16编程接口:
from inference import ModernBERTEncoder
encoder = ModernBERTEncoder(model_path="./ModernBERT-base", device="npu")
embeddings = encoder.encode(["Hello world"])
# embeddings.shape -> (1, 768)python inference.py --text "This is a test." --device npu预期输出:嵌入维度 768,无运行时错误。
测试条件:23 条多样化测试句子,batch_size=16。
| 指标 | 数值 |
|---|---|
| CPU 吞吐量 | 24.2 sentences/s |
| NPU 吞吐量 | 286.2 sentences/s |
| CPU/NPU 加速比 | 11.8 × |
分别在 CPU 和 NPU 上对 23 条多样化测试句子推理(含中英文、短句、长句、特殊字符),计算 NPU 与 CPU 嵌入的余弦相似度。
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 0.999873 |
| 最小余弦相似度 | 0.997114 |
| 精度误差率 | 0.0127% |
| 最大元素绝对误差 | 0.010871 |
| MSE | 0.00000033 |
| 相似度矩阵 Pearson r | 0.999975 |
结论:精度误差率 0.0127%,低于 1% 要求,评测通过。
ModernBERT-base 由以下核心组件构成:
head.dense, head.norm, decoder.bias),仅预训练使用,推理时通过 AutoModel 加载忽略tiktoken 包AutoModel.from_pretrained() 加载,MLM head 权重标记为 UNEXPECTED(安全忽略,不影响推理)model.to("npu:0") 迁移到 NPUimport torch, torch_npu
from transformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained("ModernBERT-base").to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("ModernBERT-base")
inputs = tokenizer("Hello world", return_tensors="pt")
inputs = {k: v.to("npu:0") for k, v in inputs.items()}
with torch.no_grad():
outputs = model(**inputs)
embeddings = outputs.last_hidden_state # shape: (1, seq_len, 768)
# Mean pooling over token dimension
mask = inputs["attention_mask"].unsqueeze(-1).float()
sentence_embedding = (embeddings * mask).sum(1) / mask.sum(1)pip install tiktoken。缺少 tiktoken 会导致 tokenizer 初始化失败。AutoModel 加载时 MLM head 权重(head.dense, decoder.bias, head.norm)会标记为 UNEXPECTED,这是预期行为,不影响编码器推理。