本文档记录 Fengshenbang/Erlangshen-RoBERTa-330M-Similarity 在华为昇腾 Ascend910 NPU 环境的适配与验证结果。
Erlangshen-RoBERTa-330M-Similarity 是一个基于 RoBERTa 架构的句子对相似度计算模型,参数量 330M。该模型采用 BertForSequenceClassification 架构,输入两个句子,输出它们是否语义相似。
相关获取地址:
| 组件 | 版本 |
|---|---|
NPU | Ascend910 |
PyTorch | 2.9.0 |
torch_npu | 2.9.0.post1+gitee7ba04 |
transformers | 4.57.6 |
Python | 3.10.x |
~/Fengshenbang/Erlangshen-RoBERTa-330M-Similarity/model由于该模型是 BERT encoder-only 模型(非 decoder-only 生成式模型),推理时不使用 vLLM,而是直接通过 transformers 库加载模型在 NPU 上运行。
已验证的推理命令:
python3 ~/Fengshenbang/Erlangshen-RoBERTa-330M-Similarity/inference.py推理脚本核心逻辑:
import torch
import torch_npu
from transformers import AutoTokenizer, AutoModelForSequenceClassification
model_path = "~/Fengshenbang/Erlangshen-RoBERTa-330M-Similarity/model/Fengshenbang/Erlangshen-RoBERTa-330M-Similarity"
device = torch.device("npu:0")
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForSequenceClassification.from_pretrained(model_path)
model.to(device)
model.eval()
# 句子对相似度推理
inputs = tokenizer(sent1, sent2, return_tensors="pt", padding=True, truncation=True)
inputs = {k: v.to(device) for k, v in inputs.items()}
with torch.no_grad():
logits = model(**inputs).logits
probs = torch.nn.functional.softmax(logits, dim=-1)
pred = torch.argmax(logits, dim=-1).item()对模型进行基本功能验证:
python3 -c "
import torch, torch_npu
from transformers import AutoTokenizer, AutoModelForSequenceClassification
model_path = '~/Fengshenbang/Erlangshen-RoBERTa-330M-Similarity/model/Fengshenbang/Erlangshen-RoBERTa-330M-Similarity'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForSequenceClassification.from_pretrained(model_path)
model.to('npu:0')
model.eval()
pairs = [('我喜欢编程', '我热爱写代码'), ('今天天气真好', '明天可能会下雨')]
for s1, s2 in pairs:
inputs = tokenizer(s1, s2, return_tensors='pt', padding=True, truncation=True, max_length=128)
inputs = {k: v.to('npu:0') for k, v in inputs.items()}
with torch.no_grad():
logits = model(**inputs).logits
pred = torch.argmax(logits, dim=-1).item()
label = 'similar' if pred == 1 else 'not similar'
print(f'{s1} <-> {s2}: {label}')
"验证结果:
测试条件:100 次推理迭代,输入长度 max_length=128。
| 指标 | 数值 |
|---|---|
| 平均延迟 | 12.11 ms |
| 中位数延迟 | 12.11 ms |
| P90 延迟 | 12.25 ms |
| P99 延迟 | 12.33 ms |
| 最小延迟 | 11.93 ms |
| 最大延迟 | 12.38 ms |
| 吞吐量 | 82.58 inferences/sec |
AutoModelForSequenceClassification 加载[CLS] sentence1 [SEP] sentence2 [SEP](tokenizer 自动处理)torch.npu.synchronize() 确保准确测量推理延迟NPU vs CPU 精度对比(CPU 为基线,NPU 为验证目标):
| 指标 | 数值 |
|---|---|
| 测试用例数 | 10 |
| 最大 logits 差异 | 0.001065 (0.107%) |
| 预测一致性 | 10/10 (100.0%) |
| 精度阈值 | 0.01 (1.0%) |
| 精度结论 | ✅ 通过 — NPU 推理精度与 CPU 完全对齐,未引入任何精度损失 |
最大差异用例: "机器学习和深度学习" ↔ "人工智能和神经网络"(差异 0.001065),NPU 预测 probability 0.886 vs CPU 0.885 — 差异极小,不影响分类结果。
NPU 推理的 10 组句子对与 CPU 结果100% 一致,最大 logits 差异仅 0.001065(0.107%),远低于 1% 的阈值。结论:NPU 推理精度与 CPU 完全对齐,未引入任何精度损失。