本文档记录 cointegrated/rubert-tiny2 俄语轻量句嵌入模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
rubert-tiny2 是俄语 TinyBERT 的知识蒸馏版本(312 维隐藏层,极轻量),通过 Mean Pooling + L2 归一化输出句嵌入。模型在俄语语料上预训练,适用于俄语语义搜索、文本聚类和相似度计算。额外包含 LaBSE(Language-Agnostic BERT Sentence Embedding)适配器权重(tinybert-ru-labse-adapter-v2.pt),可将 312 维嵌入映射到多语言联合空间,实现跨语言检索。
TinyBERT 312 维的极轻量设计使其成为俄语 NLP 场景中推理速度最快的嵌入模型之一。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
sentence-transformers | 5.5.0 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n rubert-tiny2 python=3.11 -y
conda activate rubert-tiny2
pip install torch==2.8.0 torch_npu==2.8.0.post4 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers sentence-transformers numpy \
-i https://pypi.tuna.tsinghua.edu.cn/simplepython inference.py --text "Привет мир" --device npu
python inference.py --batch_file russian_texts.txt --device npu编程接口:
from inference import RuBERTEncoder
encoder = RuBERTEncoder(model_path="./rubert-tiny2", device="npu")
embeddings = encoder.encode(["Привет мир", "Как дела?"])
# embeddings.shape → (2, 312)python inference.py --text "Привет мир" --device npu预期输出:312 维归一化嵌入向量,无运行时错误。
测试条件:23 条多样化测试句子(含俄语/英语),batch_size=32,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| NPU 吞吐量 | 1,703.8 sentences/s |
TinyBERT 312 维极轻量设计使 NPU 吞吐高达 1703 sent/s,是目前适配模型中推理最快的嵌入模型。相比 768 维 BERT-base(~900 sent/s),速度提升近 2×。
分别在 CPU 和 NPU 上对 23 条测试句子推理,比较 312 维嵌入向量的余弦相似度和语义相似度矩阵的 Pearson 相关系数。
| 指标 | 数值 |
|---|---|
| 精度误差率 | 0.0000% |
结论:精度误差率 0.0000%,NPU 与 CPU 输出完全一致,评测通过。
tinybert-ru-labse-adapter-v2.pt),312 维 → 768 维多语言空间映射AutoModel.from_pretrained() 加载(BertForPreTraining 兼容 BertModel 接口)model.to("npu:0") 迁移,312 维 TinyBERT 算子编译极快(embeddings * mask).sum(1) / mask.sum(1)modules.json、1_Pooling、sentence_bert_config.json).pt 文件,需通过 torch.load 单独加载并应用于嵌入输出import torch, torch_npu
from transformers import AutoModel, AutoTokenizer
model = AutoModel.from_pretrained("rubert-tiny2").to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("rubert-tiny2")
text = "Привет мир"
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
inputs = {k: v.to("npu:0") for k, v in inputs.items()}
with torch.no_grad():
outputs = model(**inputs)
embeddings = outputs.last_hidden_state
mask = inputs["attention_mask"].unsqueeze(-1).float()
sentence_emb = (embeddings * mask).sum(1) / mask.sum(1)
sentence_emb = torch.nn.functional.normalize(sentence_emb, p=2, dim=1)tinybert-ru-labse-adapter-v2.pt 是一个独立线性映射层,将 312 维嵌入投影到 LaBSE 768 维多语言空间,实现跨语言(俄-英等)相似度计算。适配器需单独加载:adapter = torch.load(adapter_path) → multilingual_emb = adapter(russian_emb)。modules.json + sentence_bert_config.json),可直接用 SentenceTransformer 加载。NPU 适配使用手动 Mean Pooling 替代以简化依赖。