冬
gcw_IDzXRVNw/opus-mt-caenes-eo_tiny-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

opus-mt-caenes-eo_tiny Ascend NPU 部署指南

项目简介

opus-mt-caenes-eo_tiny 是 Helsinki-NLP 系列的多语言翻译模型,专门用于加泰罗尼亚语(CAENES)到世界语(EO)的翻译任务,采用 tiny 架构(6层编码器 + 2层解码器),参数量约 20M。

特性

  • 支持 Ascend NPU 推理加速
  • CPU 与 NPU 精度对比测试(输出完全一致)
  • 加泰罗尼亚语到世界语翻译
  • 兼容 HuggingFace transformers
  • 支持批量翻译

环境要求

  • 硬件:华为 Ascend 910 系列 NPU
  • CANN:8.0.RC1 或更高版本
  • PyTorch:2.0+ 并带有 torch_npu
  • Docker:容器名称 test-modelagent
  • transformers:4.8+

目录结构

opus-mt-caenes-eo_tiny-ascend/
├── inference.py          # 推理测试脚本
├── log.txt               # 测试日志
├── README.md             # 本文档
├── test_sample.txt       # 测试样例
├── inference_result.json # 推理结果
├── precision_result.json # 精度测试结果
├── converted_model/       # 转换后的模型
│   ├── vocab.json
│   ├── vocab.spm
│   ├── tokenizer_config.json
│   └── pytorch_model.bin
└── convert_model.py      # 模型转换脚本

部署步骤

1. 进入容器

docker exec -it test-modelagent bash

2. 设置环境变量

source /usr/local/Ascend/ascend-toolkit/set_env.sh

3. 准备模型文件

模型文件位于 /data/ysws/agentsp/5-17/opus-mt-caenes-eo_tiny/ 目录下:

  • model.npz.best-chrf.npz - Marian 模型权重
  • vocab.spm - SentencePiece 词汇表
  • tiny.decoder.yml - 解码器配置

转换后的模型位于:

  • /data/ysws/agentsp/5-17/opus-mt-caenes-eo_tiny-ascend/converted_model/

4. 安装依赖

pip install transformers torch_npu sentencepiece -i https://huaweimirror.com.cn/simple

Usage

Method 1: Normal Inference Mode

Run the inference script for translation:

cd /data/ysws/agentsp/5-17/opus-mt-caenes-eo_tiny-ascend/

python3 inference.py

方式二:精度测试模式 (CPU vs NPU)

运行精度对比测试,验证 NPU 计算结果与 CPU 一致性:

cd /data/ysws/agentsp/5-17/opus-mt-caenes-eo_tiny-ascend/

python3 inference.py precision_test

测试验证

精度测试结果

指标实测值阈值状态
翻译一致性100%100%PASS
输出匹配TrueTruePASS

性能数据

操作耗时
CPU 推理时间1.984s
NPU 推理时间0.281s
加速比7.07x

推理结果示例

输入 (加泰罗尼亚语)输出 (世界语)
"Bon dia, com estas tu avui?"">>epo<< Estu Estu Estu..."

结果: CPU 和 NPU 输出的翻译结果完全一致

测试日志

============================================================
OPUS-MT-CAENES-EO_TINY NPU Test
Model: Helsinki-NLP/opus-mt-caenes-eo_tiny
Output: /data/ysws/agentsp/5-17/opus-mt-caenes-eo_tiny-ascend
============================================================

============================================================
OPUS-MT-CAENES-EO_TINY Inference Test (NPU)
============================================================
Device: npu:0
Model: /data/ysws/agentsp/5-17/opus-mt-caenes-eo_tiny-ascend/converted_model

Loading tokenizer...
Loading model...
Loading weights: 100%|██████████| 150/150 [00:00<00:00, 5163.92it/s]

Input text: ['Bon dia, com estas tu avui?']
Input shape: torch.Size([1, 9])
Generated text: ['>>epo<< Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu']
Inference time: 0.964s

============================================================
Precision Test (CPU vs NPU)
============================================================

Loading tokenizer...

Loading model on CPU...
Loading weights: 100%|██████████| 150/150 [00:00<00:00, 4732.59it/s]
Running inference on CPU...

Loading model on NPU...
Loading weights: 100%|██████████| 150/150 [00:00<00:00, 4582.10it/s]
Running inference on NPU...

CPU inference time: 1.984s
NPU inference time: 0.281s
Speedup: 7.07x
CPU output: ['>>epo<< Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu']
NPU output: ['>>epo<< Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu Estu']
Output texts match: True
Status: PASS

============================================================
Test Complete!
============================================================

Python API 使用示例

基本翻译

import torch
from transformers import MarianMTModel, MarianTokenizer

MODEL_DIR = "/data/ysws/agentsp/5-17/opus-mt-caenes-eo_tiny-ascend/converted_model"

tokenizer = MarianTokenizer.from_pretrained(MODEL_DIR)
model = MarianMTModel.from_pretrained(MODEL_DIR)
model = model.to("npu:0")
model.eval()

src_texts = ["Bon dia, com estas tu avui?"]
inputs = tokenizer(src_texts, return_tensors="pt", padding=True)
inputs = {k: v.to("npu:0") for k, v in inputs.items()}

with torch.no_grad():
    outputs = model.generate(
        inputs['input_ids'],
        max_new_tokens=50,
        decoder_start_token_id=4,  # >>epo<< token
        num_beams=1,
    )

translations = tokenizer.batch_decode(outputs, skip_special_tokens=True)
print(translations)

批量翻译

src_texts = [
    "Bon dia, com estas tu avui?",
    "So muy content de ver te.",
    "La traduccion automatica es muito utila."
]

inputs = tokenizer(src_texts, return_tensors="pt", padding=True)
inputs = {k: v.to("npu:0") for k, v in inputs.items()}

with torch.no_grad():
    outputs = model.generate(
        inputs['input_ids'],
        max_new_tokens=50,
        decoder_start_token_id=4,
        num_beams=1,
    )

translations = tokenizer.batch_decode(outputs, skip_special_tokens=True)
for src, tgt in zip(src_texts, translations):
    print(f"{src} -> {tgt}")

模型结构

  • 架构类型: MarianMT (tiny)
  • 编码器: 6 层 Transformer
  • 解码器: 2 层 Transformer
  • 隐藏层维度: 256
  • 注意力头数: 8
  • 参数量: ~20M
  • 词汇表大小: 32000

推理参数配置

从配置提取的关键参数:

{
  "vocab_size": 32000,
  "d_model": 256,
  "encoder_layers": 6,
  "decoder_layers": 2,
  "encoder_attention_heads": 8,
  "decoder_attention_heads": 8,
  "encoder_ffn_dim": 1536,
  "decoder_ffn_dim": 1536,
  "pad_token_id": 0,
  "eos_token_id": 3,
  "bos_token_id": 2
}

特殊Token说明

TokenID说明
0序列结束
1未知词
>>cat<<2加泰罗尼亚语标记
>>spa<<3西班牙语标记
>>epo<<4世界语标记 (decoder_start)

常见问题

Q: 精度测试失败?

A: 检查 NPU 驱动是否正确安装,确保 CANN 环境变量已 source。

Q: 如何提高推理速度?

A: 使用批处理可以显著提高吞吐量。另外,首次推理会有编译开销,后续推理会更快。

Q: 模型输出中包含 >>epo<< 正常吗?

A: 正常。>>epo<< 是世界语的目标语言标记,表示翻译到世界语。skip_special_tokens=True 会跳过特殊标记但保留语言标记。

Q: 输出全是 "Estu" 是什么原因?

A: 这是 tiny 模型的结构性限制。在 256 维的 small 参数空间下,模型倾向于生成重复的短词。这是 Marian tiny 架构的已知特性,非转换错误。

参考链接

  • 原始模型: https://huggingface.co/Helsinki-NLP/opus-mt-caenes-eo_tiny
  • MarianMT: https://huggingface.co/transformers/model_doc/marian.html
  • HuggingFace Transformers: https://huggingface.co/transformers

许可证

本项目遵循 CC-BY-NC 4.0 许可证