本文档记录 pysentimiento/robertuito-sentiment-analysis 西班牙语情感分析模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
该模型基于 RoBERTuito(Roberta 的西班牙语移植版,12 层 768 维),在西班牙语推文情感数据集上微调,支持 3 种情感:NEG(negativo,负面)、NEU(neutral,中性)、POS(positivo,正面)。RoBERTuito 使用西班牙语专用 BPE tokenizer,支持重音字符(áéíóúüñ)、倒问号/叹号(¿¡)等西班牙语特有符号。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n pysentimiento_robertuito-sentiment-analysis python=3.11 -y
conda activate pysentimiento_robertuito-sentiment-analysis
pip install torch==2.8.0 torch_npu==2.8.0.post4 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers numpy \
-i https://pypi.tuna.tsinghua.edu.cn/simplepython inference.py --text "Me encanta este producto!" --device npu
python inference.py --text "Qué mal servicio, muy decepcionado." --device npu编程接口:
from inference import PersonalityClassifier
clf = PersonalityClassifier(
model_path="./pysentimiento_robertuito-sentiment-analysis", device="npu"
)
results, probs = clf.predict(["Me encanta este producto!"])
# results[0] → {'POS': 0.92, 'NEU': 0.05, 'NEG': 0.03}python inference.py --text "Me encanta este producto!" --device npu预期输出:NEG/NEU/POS 三类概率,正面文本 POS 概率最高,无运行时错误。
测试条件:10 条西班牙语推文,batch_size=16,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| CPU 吞吐量 | 33.8 texts/s |
| NPU 吞吐量 | 142.0 texts/s |
| CPU/NPU 加速比 | 4.2 × |
西班牙语模型在 NPU 上的加速比(4.2×)低于英文模型,因西班牙语平均 token 数多于英文(重音字符+更长的形态变化),序列更长导致吞吐下降。
分别在 CPU 和 NPU 上推理 10 条西班牙语推文,比较 3 维 softmax 概率向量的余弦相似度、MAE 和 Top-1 一致性。
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 1.000000 |
| MAE | 0.000288 |
| 最大误差 | 0.001056 |
| 精度误差率 | 0.0000% |
| Top-1 准确率 | 100.0% |
结论:精度误差率 0.0000%,评测通过。
AutoModelForSequenceClassification.from_pretrained() 加载model.to("npu:0") 迁移import torch, torch_npu
from transformers import AutoModelForSequenceClassification, AutoTokenizer
model = AutoModelForSequenceClassification.from_pretrained(
"robertuito-sentiment-analysis"
).to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("robertuito-sentiment-analysis")
text = "Me encanta este producto!"
inputs = tokenizer(text, return_tensors="pt", truncation=True)
inputs = {k: v.to("npu:0") for k, v in inputs.items()}
with torch.no_grad():
probs = torch.softmax(model(**inputs).logits, dim=-1)
sentiment = model.config.id2label[int(torch.argmax(probs))]