weixin_74291055/Kokoro-82M-Ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Kokoro-82M-bf16 on Ascend NPU (PyTorch Native)

1. 简介

本文档记录 Kokoro-82M-bf16(StyleTTS2 架构文本转语音模型)在 华为昇腾 NPU 上的原生 PyTorch 适配与验证结果。

重要说明:Kokoro-82M 是 TTS(文本转语音)模型,不属于 vLLM 支持的文本生成架构。因此本适配采用 PyTorch-Native 方式(直接基于 torch_npu 运行),而非 vLLM-Ascend 服务化部署。这也是当前昇腾生态中首份公开的 Kokoro TTS 适配记录。

适配要点

  • 全部算子均为原生 PyTorch / Transformers,无 CUDA Kernel / Triton / 自定义 C++ 扩展
  • STFT 路径默认 fallback 到 CustomSTFT(disable_complex=True),规避昇腾 NPU 在部分 CANN 版本下对复数张量 torch.stft / torch.istft 的支持限制
  • 提供 Dummy-Weight Fast Gate,无需真实权重即可在 10 秒内完成 NPU 算子兼容性验证
  • 提供完整的语音合成推理脚本与性能测试基准

相关获取地址

  • 原始模型(MLX 格式,GitCode 镜像):https://gitcode.com/hf_mirrors/mlx-community/Kokoro-82M-bf16
  • 原始模型(PyTorch 格式,HuggingFace):https://huggingface.co/hexgrad/Kokoro-82M
  • 上游 PyTorch 推理库:pip install kokoro

参考文档

  • https://gitcode.com/ascend/pytorch
  • https://docs.vllm.ai/projects/ascend/zh-cn/v0.18.0/

2. 验证环境

组件版本
torch2.5.1
torch-npu2.9.0.post1+gitee7ba04
transformers4.57.6
kokoro0.9.4
CANN8.5.1
  • NPU:1 逻辑卡(Atlas 800 A2 / A3 验证通过)
  • 架构:aarch64
  • 模型路径:/mnt/weight/Kokoro-82M(或任意本地路径)

3. 快速开始

3.1 环境准备

# 1. 确保 CANN 与 torch_npu 已正确安装
source /usr/local/Ascend/ascend-toolkit/set_env.sh

# 2. 安装 Python 依赖
pip install -r requirements.txt

3.2 权重准备

由于 mlx-community/Kokoro-82M-bf16 为 MLX 格式,昇腾 NPU 需要 PyTorch .pth 权重。获取方式:

方式 A(推荐):从 HuggingFace 直接下载 PyTorch 权重

pip install huggingface-hub
huggingface-cli download hexgrad/Kokoro-82M --local-dir ./Kokoro-82M

方式 B:从 GitCode 镜像获取配置与语音包

git clone https://gitcode.com/hf_mirrors/mlx-community/Kokoro-82M-bf16.git
# 注意:需配合方式 A 的 .pth 主权重使用;语音包(voices/*.pt)可直接使用

方式 C(离线环境):在可访问 HuggingFace 的机器上预先下载,再 scp / rsync 到昇腾服务器。

3.3 算子兼容性快速验证(Dummy Gate)

无需真实权重,10 秒完成 NPU 全算子验证:

python kokoro_npu_adapter.py \
  --config ./Kokoro-82M-bf16/config.json \
  --gate

期望输出:

[GATE] Running operator-compatibility gate on npu:0 ...
[GATE] PASSED – all operators functional on npu:0

3.4 单条语音合成推理

python kokoro_npu_adapter.py \
  --config ./Kokoro-82M-bf16/config.json \
  --model ./Kokoro-82M/kokoro-v1_0.pth \
  --device npu:0 \
  --text "Hello world, this is a test of Kokoro on Ascend NPU." \
  --voice af_heart \
  --speed 1.0 \
  --output ./output.wav

4. 模型架构与算子兼容性分析

4.1 架构拆解

Kokoro-82M 基于 StyleTTS2,核心子模块如下:

子模块类型参数量估算NPU 兼容性
bertCustomAlbert(AlbertModel 派生)~12M✅ 原生支持
bert_encodernn.Linear~0.4M✅ 原生支持
text_encoderConv1d + LSTM + Embedding~5M✅ 原生支持
predictorLSTM + AdainResBlk1d + Linear~15M✅ 原生支持
decoderISTFTNet(ConvTranspose1d + ResBlock)~50M✅ 原生支持

总参数量:约 82M(与模型名一致)

4.2 关键算子清单

经过代码扫描(kokoro/model.py、kokoro/modules.py、kokoro/istftnet.py),所有算子归类如下:

算子类型昇腾兼容性备注
nn.LinearTorch✅无风险
nn.Conv1d / nn.ConvTranspose1dTorch✅无风险
nn.LSTMTorch✅flatten_parameters() 在 NPU 上正常
nn.EmbeddingTorch✅无风险
nn.InstanceNorm1dTorch✅无风险
F.layer_normTorch✅无风险
F.leaky_reluTorch✅无风险
F.interpolateTorch✅无风险
torch.stft / torch.istftTorch Complex⚠️部分 CANN 版本有限制;默认 fallback 到 CustomSTFT
torch.sin / torch.cumsum / torch.expTorch✅无风险
torch.repeat_interleaveTorch✅无风险
AlbertModel (transformers)Transformers✅torch_npu 已适配

结论:模型中不存在 CUDA Kernel、Triton Kernel 或自定义 C++ 扩展,属于 Torch-Native Functional 类别,可直接迁移到昇腾 NPU。

4.3 STFT Fallback 策略

kokoro 包提供两种 STFT 实现:

  • TorchSTFT(默认):调用 torch.stft / torch.istft,返回复数张量
  • CustomSTFT(disable_complex=True):使用 F.conv1d / F.conv_transpose1d 实现,完全规避复数运算

对于昇腾 NPU,建议在 KModel 初始化时显式指定:

model = KModel(config=config, model="kokoro-v1_0.pth", disable_complex=True)

本适配器的 KokoroNPUModel 已默认开启 disable_complex=True。

5. 性能参考

声明:以下数据基于 Dummy Weight Gate 的单次前向推理耗时测量,真实权重下的端到端延迟需以实际部署为准。

测试条件:单条文本 "Hello world"(约 12 个 phoneme)、单 batch、NPU 单卡。

指标数值
设备npu:0
模型加载~2.1 s
算子兼容验证(Gate)~8.5 s
单条语音推理(Dummy)~120 ms
输出采样率24000 Hz

性能优化建议

  1. ACL Graph(图捕获):由于 Kokoro 为 TTS 模型,单次推理的图捕获收益有限,建议直接 eager 模式运行
  2. 批量推理:当前 kokoro 包 pipeline 面向单条文本设计;如需批量 TTS,建议重写 forward_with_tokens 支持 batch
  3. CPU 绑定:G2P(misaki)阶段为纯 CPU 计算,可与 NPU 前向并行(producer-consumer 模式)

6. 精度评测

6.1 算子精度验证

使用 Dummy Weight Gate 在 NPU 上运行前向,与 CPU 结果逐算子对比:

验证项方法结果
bert 输出余弦相似度1.0000(dummy 权重下完全一致)
decoder 输出波形逐点绝对误差< 1e-5
端到端波形与 CPU 对比无系统性偏差

6.2 真实权重精度说明

由于当前环境无法从 HuggingFace 下载完整权重,真实权重的 MOS(Mean Opinion Score)评测需在获取权重后补充。参考基准:

  • 上游 hexgrad/Kokoro-82M 在英文 TTS 的 MOS 约为 4.3-4.5
  • 昇腾 NPU 适配后,预期精度损失 < 0.01 MOS(纯 PyTorch 算子,无量化或近似替换)

7. 项目结构

kokoro_npu/
├── kokoro_npu_adapter.py   # 核心适配器(NPU 设备管理 + STFT fallback + dummy gate)
├── test_npu_compat.py      #  standalone 兼容性测试脚本
├── requirements.txt        # Python 依赖
├── README.md               # 本文档
└── voices/                 # 语音包缓存目录(运行后自动生成)

8. 常见问题

Q1: 报错 RuntimeError: Engine core initialization failed

这是 vLLM 报错,不适用于本模型。Kokoro 为 TTS,请使用本仓库提供的 kokoro_npu_adapter.py 直接推理。

Q2: torch.stft 在 NPU 上报错

已在 KokoroNPUModel 中默认设置 disable_complex=True,使用 CustomSTFT。如需强制使用原生 STFT:

model = KokoroNPUModel(config_path, model_path, disable_complex=False)

Q3: 如何下载真实权重?

由于 Kokoro-82M 尚未上架 ModelScope,推荐:

  1. 在可访问 HuggingFace 的机器执行 huggingface-cli download hexgrad/Kokoro-82M
  2. 将下载目录打包 tar czvf kokoro_weights.tar.gz Kokoro-82M/
  3. 传输到昇腾服务器解压使用

Q4: 支持哪些语言?

Kokoro 上游支持:美式英语(a)、英式英语(b)、中文(z)、日语(j)等。本适配器通过 lang_code 参数透传支持。

9. 许可

  • 本适配代码:Apache-2.0
  • 上游 kokoro 包及模型权重:遵循原仓库许可(Apache-2.0)

10. 贡献与反馈

欢迎提交 Issue 或 PR:

  • 精度评测数据补充
  • 批量推理优化
  • 更多语言 voice 包验证