本文档记录 Minej/bert-base-personality 性格分类模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
该模型基于 BERT-base(12 层 Transformer,768 维隐藏层)在大五人格(Big Five)相关数据上微调,支持 5 种性格特质的单标签分类(softmax):Openness(开放性)、Conscientiousness(尽责性)、Extraversion(外向性)、Agreeableness(宜人性)、Neuroticism(神经质)。输入为英文文本描述,输出 5 维 softmax 概率分布。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n Minej--bert-base-personality python=3.11 -y
conda activate Minej--bert-base-personality
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 "I love meeting new people and exploring creative ideas." --device npu编程接口:
from inference import PersonalityClassifier
clf = PersonalityClassifier(model_path="./Minej--bert-base-personality", device="npu")
results, probs = clf.predict(["I enjoy social gatherings and meeting new people."])
# results[0] → {'Extraversion': 0.85, 'Openness': 0.10, ...}python inference.py --text "I love meeting new people and exploring creative ideas." --device npu预期输出:5 种性格特质按概率降序排列,无运行时错误。
测试条件:10 条英文性格描述文本(涵盖不同性格倾向),batch_size=16,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| CPU 吞吐量 | 37.4 texts/s |
| NPU 吞吐量 | 414.3 texts/s |
| CPU/NPU 加速比 | 11.1 × |
BERT-base 12 层模型在 NPU 上获得 11.1× 加速,适合批量文本性格分析场景。
分别在 CPU 和 NPU 上对 10 条性格描述文本推理,比较 5 维 softmax 概率向量:
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 1.000000 |
| MAE | 0.000120 |
| 最大误差 | 0.000363 |
| 精度误差率 | 0.0000% |
| Top-1 准确率 | 100.0% |
结论:精度误差率 0.0000%,NPU 与 CPU 输出完全一致,评测通过。
from_pretrained 自动兼容AutoModelForSequenceClassification.from_pretrained() 加载model.to("npu:0") 一步迁移到 NPU,BERT 标准算子(LayerNorm, GELU, Linear)NPU 原生支持AutoTokenizer 在 CPU 分词后转移至 NPU.cpu().numpy() 转回 CPUimport torch, torch_npu
from transformers import AutoModelForSequenceClassification, AutoTokenizer
model = AutoModelForSequenceClassification.from_pretrained(
"Minej--bert-base-personality"
).to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("Minej--bert-base-personality")
text = "I love meeting new people and exploring creative ideas."
inputs = tokenizer(text, return_tensors="pt", truncation=True)
inputs = {k: v.to("npu:0") for k, v in inputs.items()}
with torch.no_grad():
logits = model(**inputs).logits
probs = torch.softmax(logits, dim=-1)
predicted = model.config.id2label[int(torch.argmax(probs))]from_pretrained 自动兼容但加载速度略慢于 safetensors。建议后续转换为 safetensors 格式以提升加载速度。