本文档记录 MOSS-TTS-Nano-100M-ONNX 在昇腾 NPU(Ascend 910B4)环境的适配与验证结果。
MOSS-TTS-Nano 是 OpenMOSS 开源的多语言轻量级语音合成(TTS)模型,采用 Audio Tokenizer + GPT2 解码器 的纯自回归架构,特点包括:
原仓库提供 ONNX 导出版本(MOSS-TTS-Nano-100M-ONNX),专为浏览器和 CPU 无依赖部署设计。本次昇腾 NPU 适配采用 PyTorch 原生版本作为运行基座,原因如下:
onnxruntime PyPI 包不包含昇腾 CANN Execution Provider;尝试安装 onnxruntime-cann 包但当前环境无法顺利完成。atc 工具将 ONNX 转为 .om 格式时,报错缺少 LayerNorm、Gelu、MatMulV2 等算子的支持(ONNX opset 17 与当前 CANN 8.5.1 OPP 算子库不完全兼容)。torch-npu 已完整支持模型所需全部 PyTorch 算子(Linear、Embedding、Softmax、LayerNorm、GELU、RoPE、Eager Attention 等),可直接在 NPU 上运行,无需额外算子开发。结论:ONNX 与 PyTorch 版本共享同一套权重和架构,PyTorch 路径是当前昇腾 NPU 上最稳定、最快速的跑通方案。
相关获取地址:
参考文档:
| 组件 | 版本 |
|---|---|
torch-npu | 2.9.0.post1+gitee7ba04 |
transformers | 4.57.6 |
torch | 2.5.1 |
npu-smi | 25.5.1 |
1 逻辑卡(Ascend 910B4)/opt/atomgit/models/moss-tts-nano/opt/atomgit/models/moss-audio-tokenizer-nanofloat32~117Mexport ASCEND_RT_VISIBLE_DEVICES=0
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export TASK_QUEUE_ENABLE=1python inference.py \
--text "Hello world." \
--device npu \
--max-new-frames 100 \
--output-tokens output_tokens.json参数说明:
| 参数 | 说明 |
|---|---|
--text | 输入文本(支持中英文) |
--device | 推理设备:npu 或 cpu |
--max-new-frames | 最大生成音频帧数 |
--do-sample | 是否启用采样(默认贪婪解码) |
--attn-impl | Attention 实现:eager 或 sdpa,NPU 下建议 eager |
--output-tokens | 输出 token JSON 路径 |
[NPU] Loading model from /opt/atomgit/models/moss-tts-nano...
[NPU] Model loaded. Params: 117.3M
[NPU] Generating audio tokens for: 'Hello world.'
[NPU] Generated 100 frames, shape=(1, 100, 16)
[NPU] Generation time: 9.265s
[NPU] Throughput: 10.79 frames/s
[NPU] Tokens saved to output_tokens.json已验证通过的推理命令:
# 英文短文本
python inference.py --text "Hello world." --device npu --max-new-frames 50
# 中文短文本
python inference.py --text "你好,世界。" --device npu --max-new-frames 50
# 贪婪解码(默认)
python inference.py --text "The quick brown fox jumps over the lazy dog." --device npu --max-new-frames 100
# CPU 对比
python inference.py --text "Hello world." --device cpu --max-new-frames 50验证结果:
[batch, frames, 16]测试条件:NPU 预热 2 轮后连续 5 轮取平均。
| 场景 | 帧数 | 平均耗时 | 吞吐量 |
|---|---|---|---|
| 短英文 (Hello world.) | 50 | 4.626 s | 10.81 frames/s |
| 短英文 (Hello world.) | 100 | 9.265 s | 10.79 frames/s |
| 中长英文 | 100 | 9.250 s | 10.81 frames/s |
| 短中文 (你好,世界。) | 50 | 4.638 s | 10.78 frames/s |
| 中长中文 | 100 | 9.270 s | 10.79 frames/s |
| 长英文 | 150 | 14.011 s | 10.71 frames/s |
压测脚本:python benchmark.py
使用 accuracy_eval.py 对 CPU (float32) 与 NPU (float32) 做了贪婪解码一致性评测。
| 指标 | 数值 |
|---|---|
| 评测工具 | accuracy_eval.py |
| 对比基线 | CPU (transformers float32) |
| 样本数 | 10(中英混合) |
| 贪婪解码 Token 匹配率 | 100% (8000/8000) |
| 完全一致样本数 | 10/10 |
| 精度判定 | PASSED |
判定说明:TTS 模型在 NPU 上与 CPU 的贪婪解码输出完全一致,说明 torch-npu 对模型所用算子(LayerNorm、GELU、RoPE、Eager Attention 等)的实现与 CPU 端数值对齐良好。
Attention 实现选择:模型默认使用 flash_attention_2,但当前昇腾 NPU 环境建议显式设置为 eager(或 sdpa),以避免 flash_attn 库缺失导致的加载失败。
模型加载路径:inference.py 和 accuracy_eval.py 通过 sys.path.insert 将模型目录加入 Python 路径,以便加载自定义的 modeling_moss_tts_nano.py。请确保模型路径下包含 modeling_moss_tts_nano.py、configuration_moss_tts_nano.py 等自定义代码文件。
音频波形输出:本交付件专注于验证 TTS 核心模型(LLM 部分)在 NPU 上的推理能力,输出为音频 token 序列。如需生成最终 .wav 音频文件,需要额外加载 MOSS-Audio-Tokenizer-Nano 进行编解码,该组件同样可以在 NPU 上运行。
ONNX 路径说明:本次验证基于 PyTorch 原生模型。若后续 onnxruntime-cann 或 CANN ATC 工具链完善了对 opset 17 的 LayerNorm/GELU 等算子支持,可将 ONNX 模型直接通过 CANN EP 或 .om 格式在 NPU 上运行。
| 文件 | 说明 |
|---|---|
inference.py | 离线推理脚本(支持 CPU/NPU、参数自定义、token 输出保存) |
accuracy_eval.py | 精度评测脚本(CPU vs NPU 贪婪解码一致性对比) |
benchmark.py | 性能基准测试脚本(多场景吞吐测试) |
readme.md | 本部署调优文档 |
*.json / *.log | 运行日志与评测结果 |