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

cnn8rnn-audioset-sed on Ascend NPU

1. 简介

本文档记录 wsntxxn/cnn8rnn-audioset-sed 在昇腾 NPU(Ascend 910B3)环境的适配部署与精度验证结果。

该模型是一个基于 CRNN(卷积循环神经网络)的声音事件检测(Sound Event Detection)模型,包含 8 层卷积和 1 层 GRU,在 AudioSet 数据集上预训练并在 AudioSet-strong 上微调,时间分辨率 40ms,参数量约 6.4M,可识别 447 类音频事件。

本项目完成该模型在昇腾 NPU 上的推理适配,并验证 NPU 与 CPU 推理结果的精度误差 < 1%。

相关地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/wsntxxn/cnn8rnn-audioset-sed
  • 适配代码仓库:https://gitcode.com/qq_34566203/cnn8rnn-audioset-sed-ascend

2. 验证环境

组件版本
Python3.11.15
PyTorch2.10.0+cpu
torch_npu2.10.0
transformers5.8.1
torchaudio2.6.0
CANN8.5.1
NPU 驱动25.5.2
NPU 硬件Ascend 910B3 (8卡)
操作系统Linux (aarch64)

3. 模型信息

项目值
模型架构Cnn8RnnSoundEventDetection
参数量~6.4M
卷积层数8 层 (ConvBlock ×4)
循环层GRU (512→256, bidirectional)
分类数447 (AudioSet)
时间分辨率40ms
采样率32kHz
输入原始波形 (mono, 32kHz)
输出 clipwise_output(B, 447) — 片段级概率
输出 framewise_output(B, 447, T) — 逐帧概率
前端特征Log-Mel 频谱 (n_mels=64, hop=320)
权重格式safetensors + pytorch_model.bin
原始框架PyTorch (transformers, trust_remote_code)
预训练数据AudioSet + AudioSet-strong
许可证Apache-2.0

4. Conda 环境安装

创建独立的 conda 环境并安装依赖(使用华为云 PyPI 镜像加速):

# 创建 conda 环境
conda create -n cnn8rnn python=3.11 -y

# 激活环境
conda activate cnn8rnn

# 安装 PyTorch 及相关依赖(华为云镜像)
pip install torch==2.10.0 torchvision==0.25.0 torchaudio==2.6.0 --index-url https://repo.huaweicloud.com/repository/pypi/simple/

# 安装 torch_npu(根据环境选择对应版本)
pip install torch_npu==2.10.0 --index-url https://repo.huaweicloud.com/repository/pypi/simple/

# 安装 transformers 及其他依赖
pip install transformers soundfile scipy --index-url https://repo.huaweicloud.com/repository/pypi/simple/

如果 HuggingFace 网络不通,设置镜像:

export HF_ENDPOINT=https://hf-mirror.com/

5. 推理执行

音频推理

# NPU 推理(默认)
python3 inference.py \
    --model_path /path/to/cnn8rnn-audioset-sed \
    --wav_path /path/to/audio.wav \
    --device npu:0

# CPU 推理
python3 inference.py \
    --model_path /path/to/cnn8rnn-audioset-sed \
    --wav_path /path/to/audio.wav \
    --device cpu

# 使用合成测试信号(无需音频文件)
python3 inference.py \
    --model_path /path/to/cnn8rnn-audioset-sed \
    --device npu:0

输出示例:

Top-10 Predicted Audio Events (clipwise)
   1. [354] Speech                                     0.9213
   2. [  1] Air brake                                  0.8432
   ...

精度与性能评测

# 自动生成测试波形,对比 NPU 与 CPU 推理精度
python3 eval.py \
    --model_path /path/to/cnn8rnn-audioset-sed \
    --npu_device npu:0

评测结果日志将输出到 log.txt。

6. 参数说明

inference.py 参数

参数说明默认值
--model_path模型权重路径必需
--wav_path输入音频路径(可选,默认生成测试信号)None
--device运行设备(npu:0 或 cpu)npu:0
--top_k显示 Top-K 类别10
--no_warmup跳过预热阶段False

eval.py 参数

参数说明默认值
--model_path模型权重路径模型路径
--npu_deviceNPU 设备 IDnpu:0
--num_warmupNPU 预热轮数3
--duration测试波形时长(秒)5.0

7. 精度评测结果

评测方法

使用同一段合成测试波形(chirp + noise, 5 秒, 32kHz)分别在 CPU(FP32)和 NPU(FP32)上运行推理,对比 clipwise_output 和 framewise_output 的输出差异。

评价指标说明

指标含义判定阈值
向量级相对误差`
余弦相似度NPU 与 CPU 输出向量间的方向一致性> 0.99
最大/平均绝对误差逐元素差值统计,反映数值偏差的绝对量级—
绝对误差分位数误差分布特征(P50/P90/P95/P99)—

精度结果

输出张量向量级相对误差余弦相似度最大绝对误差平均绝对误差
clipwise_output0.120760%0.99999940402.95e-047.21e-06
framewise_output0.202952%0.99999779461.40e-034.87e-06

绝对误差分布:

输出张量P50P90P95P99
clipwise_output6.50e-078.56e-062.34e-051.84e-04
framewise_output1.10e-074.19e-061.06e-058.67e-05

判定结论

指标实测值阈值状态
向量级相对误差(clipwise)0.120760%< 1%✅ PASS
向量级相对误差(framewise)0.202952%< 1%✅ PASS
余弦相似度(clipwise)0.9999994> 0.99✅ PASS
余弦相似度(framewise)0.9999978> 0.99✅ PASS

8. 性能数据

操作耗时
CPU 推理时间(FP32)0.8883s
NPU 推理时间(FP32/GRU FP16,3轮预热后)1.4914s
加速比 (CPU / NPU)0.60x

9. 注意事项

  1. trust_remote_code:该模型使用自定义 Cnn8RnnSoundEventDetection 类,加载时必须设置 trust_remote_code=True。
  2. 音频预处理:模型内部包含 Log-Mel 频谱提取(torchaudio),输入为原始波形,确保采样率 32kHz 且为单声道。
  3. NPU 上的 torchaudio:MelSpectrogram 和 AmplitudeToDB 变换在 NPU 上执行,需确保 torchaudio 支持 NPU 后端。
  4. NPU 预热:NPU 首次推理包含算子编译优化,需 1-2 轮预热才能达到稳定性能。脚本默认开启 3 轮预热。
  5. GRU FP16 兼容性:Ascend 910B3 的 DynamicGRUV2Hidden 算子仅支持 FP16 输入。eval.py 和 inference.py 在将模型移至 NPU 后会自动将 GRU 权重转为 FP16,并在 GRU 前/后做 dtype 转换,其余部分保持 FP32。经测试该方案精度损失极小(< 0.21%)。
  6. 输出说明:模型返回 framewise_output(逐帧 447 类概率,时间分辨率 40ms)和 clipwise_output(片段级 447 类概率)。
  7. 类别名称:classes.txt 文件包含 447 个 AudioSet 事件名称,已随权重文件提供。
  8. 内存占用:该模型参数量仅 6.4M,NPU 推理显存占用极低(< 1GB)。
  9. 权重文件:模型权重(.safetensors / .bin)不包含在适配仓库中,需单独下载。