本仓库提供 mms-300m-1130-forced-aligner 模型在华为昇腾 NPU(Ascend 910 系列)上的适配与验证结果。
模型概述:
适配要点:
torch_npu.contrib.transfer_to_npu 自动完成 CUDA → NPU 算子映射transformers 原生 Wav2Vec2ForCTC 加载模型,无需修改模型权重ctc_forced_aligner 的文本预处理与 CTC 解码逻辑,确保对齐精度无损| 项目 | 版本 / 型号 |
|---|---|
| 硬件 | Ascend 910B4 |
| OS | Linux 5.10.0 aarch64 |
| CANN | 8.5.1 |
| Python | 3.11.14 |
| PyTorch | 2.9.0+cpu |
| torch_npu | 2.9.0.post1 |
| transformers | 4.57.6 |
| torchaudio | 2.9.0 |
| librosa | 0.11.0 |
| ctc-forced-aligner | 1.0.2 |
# 加载 CANN 环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0
# 安装依赖(使用华为镜像源)
export PIP_INDEX_URL=https://repo.huaweicloud.com/repository/pypi/simple/
pip install torch==2.9.0 torch_npu==2.9.0.post1 transformers librosa soundfile ctc-forced-aligner unidecode# 方式一:从 HuggingFace 镜像下载
export HF_ENDPOINT=https://hf-mirror.com
python3 -c "
from huggingface_hub import snapshot_download
snapshot_download(
repo_id='MahmoudAshraf/mms-300m-1130-forced-aligner',
local_dir='./model_repo',
local_dir_use_symlinks=False,
endpoint='https://hf-mirror.com',
)
"python3 inference.py \
--model_path ./model_repo \
--audio your_audio.wav \
--text your_transcript.txt \
--language eng \
--batch_size 16 \
--output alignment_result.json参数说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
--model_path | 模型目录路径(含 config.json 与权重) | ./model_repo |
--audio | 输入音频路径(16kHz WAV) | 必填 |
--text | 输入文本(字符串或文件路径) | 必填 |
--language | ISO-639-3 语言代码 | eng |
--batch_size | 推理窗口 batch 大小 | 16 |
--output | 输出 JSON 路径 | alignment_result.json |
--dtype | 推理精度:float32 或 float16 | float32 |
[
{"start": 0.02, "end": 0.12, "text": "hello", "score": -20.24},
{"start": 0.16, "end": 0.24, "text": "world", "score": -23.35}
]执行一键基础功能检查(使用 5 秒合成音频):
python3 inference.py --smoke --model_path ./model_repo验证结果:
============================================================
SMOKE TEST: mms-300m-1130-forced-aligner on NPU
============================================================
[INFO] Using device: npu:0, dtype: torch.float32
[INFO] Model loaded in 2.24s
[INFO] Audio duration: 5.00s
[INFO] Emissions generated in 18.17s (0.28x RT)
[INFO] Aligned 9 words
[INFO] Results saved to /tmp/smoke_result.json
[SUCCESS] Smoke test passed!使用 --benchmark 对 60 秒合成音频进行 5 轮推理测试(预热后):
python3 inference.py --benchmark --model_path ./model_repo --benchmark_duration 60性能结果:
| 指标 | 数值 |
|---|---|
| 测试音频时长 | 60 s |
| 平均推理时延 | 0.147 s |
| 最小时延 | 0.130 s |
| 最大时延 | 0.195 s |
| 平均吞吐量 | 417.65 x RT |
| 设备 | npu:0 |
============================================================
PERFORMANCE BENCHMARK: 60s audio
============================================================
Run 1: 0.195s (307.27x RT)
Run 2: 0.146s (411.82x RT)
Run 3: 0.134s (448.44x RT)
Run 4: 0.130s (460.56x RT)
Run 5: 0.130s (460.18x RT)
Latency: mean=0.147s, std=0.025s, min=0.130s, max=0.195s
Throughput: mean=417.65x RT, std=57.99x注:首次运行因算子编译存在额外开销(约 17s),二次运行后稳定在 0.13–0.15s 区间。
使用 accuracy_verify.py 对 CPU 基线 与 NPU 推理 进行端到端结果对比。
评测方法:
inference.py 在 npu:0 上运行 float32精度结果:
| 指标 | 数值 |
|---|---|
| 最大起始时间差异 | 0.00 ms |
| 最大结束时间差异 | 0.00 ms |
| 平均起始时间差异 | 0.00 ms |
| 平均结束时间差异 | 0.00 ms |
| 分数差异(score) | < 0.05(浮点舍入正常范围) |
| 结论 | 通过 |
============================================================
ACCURACY VERIFICATION: CPU baseline vs NPU
============================================================
[INFO] Running CPU baseline...
[INFO] CPU baseline done in 93.88s
[INFO] Running NPU inference...
[INFO] NPU inference done in 41.62s
[RESULT] Alignment comparison:
Max start time diff: 0.00 ms
Max end time diff: 0.00 ms
Mean start diff: 0.00 ms
Mean end diff: 0.00 ms
[SUCCESS] Accuracy verification PASSED (diff < 100ms)时间戳完全一致,说明
transfer_to_npu自动映射 + Wav2Vec2ForCTC 在 NPU 上的前向精度与 CPU 对齐。
source /usr/local/Ascend/ascend-toolkit/set_env.sh,否则可能出现算子找不到或 ERR99999 报错。transfer_to_npu 会自动替换 torch.cuda.* 为 torch.npu.*,但会禁用 torch.jit.script。若需使用 TorchScript,请避免导入 transfer_to_npu 并手动替换设备相关代码。load_audio 会自动通过 librosa 重采样,但会增加少量预处理耗时。generate_emissions 内部已做 30s 窗口 + 2s 上下文的分块处理,可避免长音频 OOM。若仍遇内存不足,请调小 --batch_size。float32 下完成。float16 在 Ascend910 上支持,但可能对极短词的时间戳产生亚毫秒级差异。ctc-forced-aligner 和 unidecode 需从源码/PyPI 安装;若使用预编译 wheel,请确保架构为 aarch64。pytorch_model.bin / model.safetensors 为实际权重(非 Git LFS 指针),可直接加载。标签: #+NPU #Ascend #forced-alignment #Wav2Vec2