本文档记录 shibing624/macbert4csc-base-chinese 中文拼写纠错(CSC, Chinese Spelling Correction)模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
MacBERT(MLM as Correction BERT)是哈工大 SCIR 实验室提出的创新性中文纠错方案。核心思想是将 CSC 任务转化为 Masked Language Model(MLM)任务:对输入句子中检测到的疑似错字位置进行掩码,通过 BERT 的 token 级词汇预测找回正确字符。该模型为 BertForMaskedLM(BERT-base,12 层 768 维),输出每个位置在 21128 个中文 token 上的概率分布。
适配中的关键坑:该模型是 MLM 模型(非 sequence classification),使用分类模板会得到 6.42% 误差(FAIL),需要使用 MLM logits 展平比较方式。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n shibing624_macbert4csc-base-chinese python=3.11 -y
conda activate shibing624_macbert4csc-base-chinese
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 "今天天气很好。" --device npu编程接口:
from inference import main
# MacBERT 展示每个位置的 Top-5 预测字符python inference.py --text "今天天气很好。" --device npu预期输出:每个 token 位置的 Top-5 预测字符,无运行时错误。
测试条件:4 条中文句子,比 encoder 前向传播时间。
| 指标 | 数值 |
|---|---|
| NPU 加速 | 2.7 × |
比较 MLM logits(model(**inputs).logits,shape (batch, seq_len, 21128))展平后的余弦相似度。MLM 在每个 token 位置输出完整 21128 词表的概率分布,展平后向量维度约为 seq_len × 21128(10-30 万维)。
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 0.999997 |
| 精度误差率 | 0.0003% |
结论:精度误差率 0.0003%,PASS。
AutoModelForMaskedLM.from_pretrained()(非 SequenceClassification)model.to("npu:0") 迁移import torch, torch_npu
from transformers import AutoModelForMaskedLM, AutoTokenizer
model = AutoModelForMaskedLM.from_pretrained(
"macbert4csc-base-chinese"
).to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("macbert4csc-base-chinese")
text = "今天天气很好。"
inputs = tokenizer(text, return_tensors="pt")
inputs = {k: v.to("npu:0") for k, v in inputs.items()}
with torch.no_grad():
logits = model(**inputs).logits # (1, seq_len, 21128)
top5 = torch.topk(logits[0], 5, dim=-1).indices
predictions = [tokenizer.decode(ids) for ids in top5]BertForMaskedLM,不是 BertForSequenceClassification。这是适配过程中最重要的教训——错误使用分类模板导致 FAIL(6.42% 误差)。