本文档记录 wsntxxn/cnn8rnn-audioset-sed 在华为昇腾 Ascend910 NPU 环境下的快速部署与验证结果。
CNN8RNN 是一个用于 AudioSet 声音事件检测(Sound Event Detection, SED)的 CRNN 模型,包含 8 层卷积和一层双向 GRU,参数量约 6.4M,时间分辨率 40ms。
由于 Ascend NPU 对 torchaudio 中复数张量运算(MelSpectrogram / AmplitudeToDB)支持不完整,适配方案将 Log-Mel 频谱提取 放在 CPU 侧(使用 librosa),CNN + GRU 骨干网络 运行在 NPU 侧,兼顾功能正确性与硬件加速。
相关获取地址:
| 组件 | 版本 |
|---|---|
Python | 3.11.14 |
PyTorch | 2.9.0 |
torch-npu | 2.9.0.post1+gitee7ba04 |
CANN | 8.5.1 |
librosa | 0.11.0 |
transformers | 4.57.6+ |
Ascend910(单卡,64GB HBM)Linux 5.10.0(Huawei Cloud EulerOS)/opt/atomgit/cnn8rnn_audioset_sed# 安装依赖
pip install torch torchaudio librosa soundfile transformers numpyimport torch
from inference import load_model, load_audio, infer
# 加载模型(自动在 NPU 上运行,频谱提取在 CPU)
model = load_model("/path/to/model", device="npu:0", use_fp16=True)
# 加载音频
audio, sr = load_audio("/path/to/audio.wav")
# 推理
clipwise, framewise = infer(model, [audio], device="npu:0")
# clipwise: (1, 447) - 音频级别预测
# framewise: list of (time_frames, 447) - 帧级别预测python3 inference.py \
--audio /path/to/audio1.wav /path/to/audio2.wav \
--device npu:0 \
--use_fp16 \
--top_k 5| 参数 | 说明 | 默认值 |
|---|---|---|
--model_path | 模型路径 | 脚本所在目录 |
--audio | 待处理的音频文件(支持多个) | 必填 |
--device | 设备(npu:0 / cpu) | npu:0 |
--use_fp16 | 使用 FP16 推理(NPU 必须) | 关闭 |
--top_k | 显示 Top-K 类别 | 5 |
--benchmark | 基准测试模式 | 关闭 |
基础功能检查结果:
# 测试 2s 噪声音频
python3 inference.py --audio test_2s.wav --device npu:0 --use_fp16 --top_k 3输出示例:
--- test_2s.wav ---
Clip-wise predictions:
Mechanisms: 0.2081
White noise, pink noise: 0.1329
Noise: 0.1268
Waterfall: 0.1229
Generic impact sounds: 0.1099
Framewise shape: (201, 447)验证结论:
[batch, 447], framewise: [batch, time, 447])| 指标 | 数值 |
|---|---|
| Mean 时延 | 17.9 ms |
| Median 时延 | 17.7 ms |
| P99 时延 | 19.1 ms |
| RTF | 0.0018 |
| 音频长度 | Median 时延 | RTF |
|---|---|---|
| 2s | 7.3 ms | 0.0037 |
| 5s | 11.3 ms | 0.0023 |
| 10s | 17.7 ms | 0.0018 |
| 30s | 48.0 ms | 0.0016 |
| Batch Size | 吞吐量 | RTF |
|---|---|---|
| 1 | 57.3 samples/s | 0.0017 |
| 2 | 20.1 samples/s | 0.0050 |
| 4 | 20.9 samples/s | 0.0048 |
注:该模型参数量较小(6.4M),NPU 加速优势主要体现在批量推理和大音频场景。CPU 上单样本推理约 30-50ms,NPU 由于数据搬运开销,在 batch=1 时提升有限。
使用 20 个合成音频样本(白噪声、纯音、多音、调幅音、突发噪声)评估 NPU(FP16)与 CPU(FP32)的输出一致性。
| 指标 | 数值 | 阈值 | 结果 |
|---|---|---|---|
| 余弦相似度(均值) | 0.9748 | >= 0.95 | PASS |
| 余弦相似度(最差) | 0.9287 | - | - |
| Top-1 类别一致率 | 85.0% | >= 80% | PASS |
| Top-5 类别重叠率 | 86.0% | >= 70% | PASS |
| 平均绝对差异 | 0.0014 | <= 0.05 | PASS |
| 最大绝对差异 | 0.3792 | - | - |
结论:NPU FP16 推理结果与 CPU FP32 参考高度一致,精度满足部署要求。
NPU GRU 仅支持 FP16:Ascend910 上 DynamicGRUV2 算子的 weight_hidden 输入仅支持 DT_FLOAT16 类型。在 NPU 推理时必须开启 --use_fp16,否则会报 Unsupported_Operator 错误。
频谱提取在 CPU 上进行:torchaudio 的 MelSpectrogram 内部依赖复数张量运算,当前 Ascend NPU 驱动不支持复数张量的 abs() 操作。适配方案使用 librosa 在 CPU 完成 Log-Mel 特征提取,CNN+GRU 骨干网络运行在 NPU。
首次推理包含图编译开销:NPU 首次推理会对输入形状进行图编译(约 10-30s),后续相同形状推理显著加速。不同长度音频会触发重新编译。
模型体积较小:该模型仅 6.4M 参数,对于单样本推理,CPU(~30ms)与 NPU(~18ms)差异不大。NPU 优势在大批量或高并发场景。
权重下载:推荐使用 GitCode 或 HuggingFace 镜像下载完整权重文件(约 25MB,含 pytorch_model.bin / model.safetensors)。