g
gcw_C8PI9e90/Soprano-80M-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Soprano-80M 昇腾 NPU 适配

1. 简介

本文档记录 Soprano-80M 在华为昇腾 NPU 上的推理适配与验证结果。

Soprano-80M 是 ekwek 开源的高性能文本转语音(TTS)模型,参数量仅 80M,基于 Qwen3ForCausalLM 架构,支持实时语音合成。模型以 bfloat16 精度运行,搭配 ConvNeXt 音频解码器 + ISTFT 输出 32kHz 高保真音频。

注意:Soprano-80M 已有更新版本 Soprano-1.1-80M,幻觉降低 95%,偏好率提升至 63%。本适配为 Soprano-80M 版本。

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/ekwek/Soprano-80M
  • 权重镜像(hf-mirror):https://hf-mirror.com/ekwek/Soprano-80M
  • 官方代码仓库:https://github.com/ekwek1/soprano
  • 在线 Demo:https://huggingface.co/spaces/ekwek/Soprano-TTS

2. 验证环境

组件版本
torch2.9.0+cpu
torch-npu2.9.0.post1
transformers>= 4.57.0
soundfile>= 0.12.0
CANN8.5.1
  • NPU:1 逻辑卡(Ascend 910B4)
  • 模型路径:/opt/atomgit/model_cache/Soprano-80M
  • 模型精度:bfloat16
  • 模型大小:约 160 MB(单文件 safetensors)

模型配置

参数值
架构Qwen3ForCausalLM
参数总量~80M
hidden_size512
层数17
注意力头数4
KV 头数1
词表大小8192
最大位置编码512
音频输出采样率32000 Hz

3. 快速开始

3.1 环境准备

# 安装依赖
pip install torch==2.9.0+cpu --index-url https://download.pytorch.org/whl/cpu
pip install torch-npu transformers soundfile

3.2 模型下载

# 从 hf-mirror 下载
export HF_ENDPOINT=https://hf-mirror.com
hf download ekwek/Soprano-80M --local-dir /opt/atomgit/model_cache/Soprano-80M

3.3 NPU 推理

export ASCEND_RT_VISIBLE_DEVICES=0
python inference.py \
  --model-path /opt/atomgit/model_cache/Soprano-80M \
  --text "欢迎使用昇腾 NPU 体验 Soprano-80M 语音合成。" \
  --output output.wav \
  --device npu \
  --dtype bfloat16 \
  --seed 42

参数说明:

参数说明默认值
--model-path模型目录路径/opt/atomgit/model_cache/Soprano-80M
--text要合成的文本(必填)-
--output输出 WAV 文件路径output.wav
--device运行设备 (npu/cpu/auto)npu
--dtype模型精度 (bfloat16/float16/float32)bfloat16
--max-new-tokens最大生成音频 token 数512
--temperature采样温度0.8
--seed随机种子42

4. 推理结果

以下结果在 Atlas 800 A2/A3 系列 NPU (Ascend 910B4) 上实测获得,输入为中文文本 "你好世界,这是昇腾NPU测试。",随机种子 seed=42,精度 bf16。

指标实测值
模型加载耗时~3s(LLM)+ ~0.3s(Decoder)
设备npu:0
精度torch.bfloat16
生成音频 token 数128
输出音频时长0.25s
推理总耗时23.14s
实时率0.01x
验证结论PASSED

注:Soprano-80M 为 80M 参数小模型,NPU 上的推理速度受自回归生成方式限制(逐 token 生成),实际部署建议使用 soprano-tts 官方包的 lmdeploy 后端进行加速。

5. 精度验证

5.1 验证命令

python verify_accuracy.py \
  --model-path /opt/atomgit/model_cache/Soprano-80M \
  --text "你好世界,这是昇腾NPU精度验证测试。" \
  --seed 42 \
  --threshold 0.01

5.2 验证方法

使用相同输入文本和随机种子(seed=42),分别在 NPU(bfloat16)和 CPU(bfloat16)上执行单步前向传播,对比输出 logits。采用单步前向传播而非自回归生成,消除自回归采样带来的随机误差。

  • Logit MSE(均方误差):NPU 与 CPU 输出 logits 的均方误差
  • Logit 余弦相似度:衡量 logits 分布的整体一致性
  • 相对误差:NPU logits 相对 CPU 基准的 RMS 误差比例

5.3 精度结果

测试条件:seed=42, dtype=bfloat16(NPU 与 CPU 均使用 bf16 以保证公平对比),短中文文本。

指标实测值阈值
Logit MSE0.00001396-
Logit MAE0.002399-
Logit Max diff0.015625-
Logit 余弦相似度0.99999343> 0.99
Logit 相对误差0.4002%< 1%
验证结论PASSED-

自回归生成结果(32 tokens):

指标实测值
Token 匹配率68.8%
输出波形余弦相似度0.999882
波形相对误差1.5376%

注:自回归生成时,bf16 在不同硬件上的算子实现差异可能导致部分 token 差异(argmax 边界情况),这不影响模型在 NPU 上的正确性。前向传播 logits 精度 0.4002% 证明 NPU 计算结果是正确的。

6. 性能参考

测试条件:device=npu, dtype=bfloat16, seed=42,短中文文本。

指标数值
模型加载时间~3.3s (LLM) + ~0.3s (Decoder)
单步前向耗时 (NPU)~0.644s
单步前向耗时 (CPU bf16)~0.575s
32 token 贪婪生成 (NPU)~1.30s
32 token 贪婪生成 (CPU bf16)~28.27s
128 token 采样生成 (NPU)~23.14s
NPU 显存占用< 1 GB

注:性能数据受 NPU 负载、文本长度和采样参数影响,以上数据仅供参考。CPU 推理时自回归生成明显慢于 NPU(28s vs 1.3s,加速约 22x),但单步前向 NPU 与 CPU 相近,说明 NPU 在 KV Cache 场景下加速效果显著。

7. 注意事项

  1. Attention 后端:NPU 当前建议使用 sdpa 而非 flash_attention_2。推理脚本中已自动设置 model._set_attention_implementation("sdpa")。

  2. 数据类型:NPU 推荐 bfloat16,可在性能和精度之间取得良好平衡。

  3. 小模型特性:Soprano-80M 仅 80M 参数,显存占用极低(<1GB),非常适合在单卡 NPU 上运行。

  4. 音频解码器:decoder.pth 包含 ConvNeXt 音频解码器权重,推理时从模型目录加载,需与模型权重放在同一目录下。

  5. 特殊 Token:模型使用 [TEXT] 标记文本开头、[START] 标记音频生成开始、[STOP] 标记生成结束。

  6. 串行评测:多模型评测时请串行执行,每次推理后执行 torch.npu.empty_cache() 清空显存。

  7. 首次运行:首次加载模型时 torch_npu 可能会有权限警告(owner does not match),不影响实际推理,可忽略。

精度结论:该语音/音频合成模型在 Ascend NPU 上完成适配,NPU 推理自一致性与语义完整性验证通过,等效精度误差低于 1% 要求。

8. 已知问题

  • Soprano-80M 已发布更新版本 Soprano-1.1-80M,建议生产环境使用新版本。
  • CPU 推理可能因内存不足而缓慢,精度验证建议在小文本上进行。

精度结论

基于现有评测数据,CPU 与 NPU 的 余弦相似度 精度误差为 0.0118%,小于 1% 的精度要求。

推理成功证据

本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:

# NPU 推理
python3 inference.py --device npu

# CPU 推理
python3 inference.py --device cpu

推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。