z
zkx_/OpenMOSS-Team_bart-base-chinese-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

OpenMOSS-Team/bart-base-chinese on Ascend NPU

1. 简介

本文档记录 OpenMOSS-Team/bart-base-chinese BART-base 中文摘要模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。

BART(Bidirectional and Auto-Regressive Transformer)是 Facebook 提出的 denoising seq2seq 模型。该中文版本在中文语料上从头预训练,encoder 读取源文本,decoder 生成摘要。BART 的结构与 T5 类似但访问方式不同:encoder 需要通过 model.model.encoder 访问(非 T5 的 model.encoder),且输出需要 .detach() 后才能转 numpy。

评测方式:比较 encoder(model.model.encoder)的 last_hidden_state。

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/OpenMOSS-Team/bart-base-chinese

2. 验证环境

组件版本
torch2.8.0
torch_npu2.8.0.post4
transformers5.8.1
CANN8.5.1
  • NPU:8 × Ascend 910B3

3. 部署使用流程

3.1 环境准备

conda create -n OpenMOSS-Team_bart-base-chinese python=3.11 -y
conda activate OpenMOSS-Team_bart-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/simple

3.2 推理脚本使用

python inference.py --text "今天天气很好,适合出去散步。" --device npu

编程接口:

from inference import BartSummarizer
summarizer = BartSummarizer(
    model_path="./OpenMOSS-Team_bart-base-chinese", device="npu"
)
summary = summarizer.summarize(["这是一篇很长的中文文章..."])
# summary[0] → "文章摘要内容"

4. Smoke 验证

python inference.py --text "今天天气很好,适合出去散步。" --device npu

预期输出:中文摘要文本,无运行时错误。

5. 性能参考

测试条件:3 条中文文本,比较 encoder 前向传播。

指标数值
NPU encoder 加速1.3 ×

6. 精度评测

6.1 评测方法

比较 model.model.encoder(**inputs).last_hidden_state.detach() 展平余弦相似度。

6.2 评测结果

指标数值
平均余弦相似度0.999998
精度误差率0.0002%

结论:精度误差率 0.0002%,PASS。

7. 迁移适配说明

7.1 模型结构

  • Encoder:BartEncoder(6 层,768 维,双向)
  • Decoder:BartDecoder(6 层,768 维,自回归)
  • 参数量:139M(BART-base)
  • Tokenizer:中文 BPE tokenizer

7.2 适配要点

  1. BartForConditionalGeneration.from_pretrained() 加载
  2. 关键差异:encoder 访问为 model.model.encoder(非 model.encoder)——T5 模板直接套用会 FAIL(余弦 0.009)
  3. detach 必须:encoder 输出默认带 grad,需 .detach() 后才能 .cpu().numpy()
  4. model.to("npu:0") 迁移

7.3 关键代码

import torch, torch_npu
from transformers import BartForConditionalGeneration, AutoTokenizer

model = BartForConditionalGeneration.from_pretrained(
    "bart-base-chinese"
).to("npu:0")
tokenizer = AutoTokenizer.from_pretrained("bart-base-chinese")

text = "今天天气很好。"
inputs = tokenizer(text, return_tensors="pt", truncation=True)
enc_inputs = {k: v.to("npu:0") for k, v in inputs.items()
              if k in ["input_ids", "attention_mask"]}

with torch.no_grad():
    # BART encoder 通过 model.model.encoder 访问,并需要 detach()
    encoder_output = model.model.encoder(**enc_inputs).last_hidden_state.detach()

8. 注意事项

  1. encoder 访问路径:BART 的 encoder 路径为 model.model.encoder,不是 T5 的 model.encoder。这是适配过程中遇到的最关键坑点——使用错误的访问路径导致 cosine 仅 -0.047(完全 FAIL)。
  2. detach 必需:model.model.encoder() 输出带 requires_grad=True,直接 .numpy() 报 RuntimeError,必须先 .detach()。这是 BART 与 T5 的另一个差异(T5 encoder 输出默认不带 grad)。
  3. 中文 BPE tokenizer:BART 中文 tokenizer 使用 BPE 算法,中文文本按字符+子词混合分词。长中文文本可能产出较长的 token 序列。
  4. 首次 NPU 推理:BART-base 12 层 encoder+decoder 编译约 5-8 秒。
  5. 与 T5 适配对比:T5 模板直接套用会 FAIL,因为架构差异(encoder 访问路径 + detach 需求)。本适配通过专门编写 BART eval 脚本解决。