weixin_72661020/Erlangshen-RoBERTa-330M-Similarity
模型介绍文件和版本Pull Requests讨论分析

Erlangshen-RoBERTa-330M-Similarity on Ascend NPU

1. 简介

本文档记录 Fengshenbang/Erlangshen-RoBERTa-330M-Similarity 在华为昇腾 Ascend910 NPU 环境的适配与验证结果。

Erlangshen-RoBERTa-330M-Similarity 是一个基于 RoBERTa 架构的句子对相似度计算模型,参数量 330M。该模型采用 BertForSequenceClassification 架构,输入两个句子,输出它们是否语义相似。

相关获取地址:

  • 权重下载地址(ModelScope):https://modelscope.cn/models/Fengshenbang/Erlangshen-RoBERTa-330M-Similarity
  • 模型架构:BertForSequenceClassification(RoBERTa)
  • 标签映射:{0: "not similar", 1: "similar"}

2. 验证环境

组件版本
NPUAscend910
PyTorch2.9.0
torch_npu2.9.0.post1+gitee7ba04
transformers4.57.6
Python3.10.x
  • NPU:Ascend910 x 2
  • 模型路径:~/Fengshenbang/Erlangshen-RoBERTa-330M-Similarity/model

3. 推理脚本

由于该模型是 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()

4. Smoke 验证

对模型进行基本功能验证:

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}')
"

验证结果:

  • NPU 设备可用:是
  • 模型加载成功:是
  • 相似度推理正常:是
  • 所有句子对均可正确预测

5. 性能参考

测试条件: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

7. 注意事项

  1. 该模型是 BERT encoder-only 模型,不支持 vLLM 推理(vLLM 仅支持 decoder-only 生成式模型)
  2. 推理时使用 transformers 的 AutoModelForSequenceClassification 加载
  3. 输入需要格式化为 [CLS] sentence1 [SEP] sentence2 [SEP](tokenizer 自动处理)
  4. 精度验证建议在 CPU 和 NPU 上分别运行后对比输出 logits 或概率分布
  5. 性能测试前建议先进行 warm-up 推理以稳定 NPU 状态
  6. 使用 torch.npu.synchronize() 确保准确测量推理延迟

Ascend NPU 精度评测

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 完全对齐,未引入任何精度损失。

下载使用量0