weixin_72661020/cnn8rnn-audioset-sed
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

CNN8RNN AudioSet SED 在 Ascend NPU 上的适配与验证

1. 简介

本文档记录 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 侧,兼顾功能正确性与硬件加速。

相关获取地址:

  • 权重下载地址(GitCode):https://gitcode.com/hf_mirrors/wsntxxn/cnn8rnn-audioset-sed
  • 权重下载地址(HuggingFace):https://huggingface.co/wsntxxn/cnn8rnn-audioset-sed
  • 原始论文:https://research.google.com/audioset/download.html

2. 验证环境

组件版本
Python3.11.14
PyTorch2.9.0
torch-npu2.9.0.post1+gitee7ba04
CANN8.5.1
librosa0.11.0
transformers4.57.6+
  • NPU:Ascend910(单卡,64GB HBM)
  • OS:Linux 5.10.0(Huawei Cloud EulerOS)
  • 模型路径:/opt/atomgit/cnn8rnn_audioset_sed

3. 服务启动

3.1 环境准备

# 安装依赖
pip install torch torchaudio librosa soundfile transformers numpy

3.2 模型加载与推理

import 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) - 帧级别预测

3.3 命令行推理

python3 inference.py \
  --audio /path/to/audio1.wav /path/to/audio2.wav \
  --device npu:0 \
  --use_fp16 \
  --top_k 5

3.4 参数说明

参数说明默认值
--model_path模型路径脚本所在目录
--audio待处理的音频文件(支持多个)必填
--device设备(npu:0 / cpu)npu:0
--use_fp16使用 FP16 推理(NPU 必须)关闭
--top_k显示 Top-K 类别5
--benchmark基准测试模式关闭

4. Smoke 验证

基础功能检查结果:

# 测试 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)

验证结论:

  • 模型加载正常
  • 单/多音频推理正常
  • 输出张量维度正确(clipwise: [batch, 447], framewise: [batch, time, 447])
  • 类别预测语义合理

5. 性能参考

5.1 单样本时延(稳态,FP16 on NPU,10s 音频)

指标数值
Mean 时延17.9 ms
Median 时延17.7 ms
P99 时延19.1 ms
RTF0.0018

5.2 不同音频长度时延(稳态中位数)

音频长度Median 时延RTF
2s7.3 ms0.0037
5s11.3 ms0.0023
10s17.7 ms0.0018
30s48.0 ms0.0016

5.3 吞吐量(10s 音频)

Batch Size吞吐量RTF
157.3 samples/s0.0017
220.1 samples/s0.0050
420.9 samples/s0.0048

注:该模型参数量较小(6.4M),NPU 加速优势主要体现在批量推理和大音频场景。CPU 上单样本推理约 30-50ms,NPU 由于数据搬运开销,在 batch=1 时提升有限。

6. 精度评测

使用 20 个合成音频样本(白噪声、纯音、多音、调幅音、突发噪声)评估 NPU(FP16)与 CPU(FP32)的输出一致性。

指标数值阈值结果
余弦相似度(均值)0.9748>= 0.95PASS
余弦相似度(最差)0.9287--
Top-1 类别一致率85.0%>= 80%PASS
Top-5 类别重叠率86.0%>= 70%PASS
平均绝对差异0.0014<= 0.05PASS
最大绝对差异0.3792--

结论:NPU FP16 推理结果与 CPU FP32 参考高度一致,精度满足部署要求。

7. 注意事项

  1. NPU GRU 仅支持 FP16:Ascend910 上 DynamicGRUV2 算子的 weight_hidden 输入仅支持 DT_FLOAT16 类型。在 NPU 推理时必须开启 --use_fp16,否则会报 Unsupported_Operator 错误。

  2. 频谱提取在 CPU 上进行:torchaudio 的 MelSpectrogram 内部依赖复数张量运算,当前 Ascend NPU 驱动不支持复数张量的 abs() 操作。适配方案使用 librosa 在 CPU 完成 Log-Mel 特征提取,CNN+GRU 骨干网络运行在 NPU。

  3. 首次推理包含图编译开销:NPU 首次推理会对输入形状进行图编译(约 10-30s),后续相同形状推理显著加速。不同长度音频会触发重新编译。

  4. 模型体积较小:该模型仅 6.4M 参数,对于单样本推理,CPU(~30ms)与 NPU(~18ms)差异不大。NPU 优势在大批量或高并发场景。

  5. 权重下载:推荐使用 GitCode 或 HuggingFace 镜像下载完整权重文件(约 25MB,含 pytorch_model.bin / model.safetensors)。