模型: m-a-p/MERT-v1-330M — Acoustic Music Understanding Model
模型大小: 330M 参数 (实际 315M)
论文: MERT: Acoustic Music Understanding Model with Large-Scale Self-supervised Training
昇腾硬件: Ascend 910 (Atlas 800 A2)
| 组件 | 规格 |
|---|---|
| NPU | Ascend 910 (或更高) |
| CPU | ARM64 / x86_64 |
| 内存 | ≥ 16 GB |
| 磁盘 | ≥ 5 GB (模型权重) |
| 软件 | 版本要求 | 说明 |
|---|---|---|
| CANN | ≥ 8.0 | 昇腾 AI 处理器驱动与开发套件 |
| Python | ≥ 3.9 | 推荐 3.10+ |
| PyTorch | ≥ 2.1 | 深度学习框架 |
| torch_npu | 匹配 PyTorch 版本 | 昇腾 NPU PyTorch 插件 |
| transformers | ≥ 4.27 | HuggingFace Transformers |
| torchaudio | ≥ 0.13 | 音频 I/O |
| modelscope | ≥ 1.0 | 模型下载工具 (可选) |
# 安装基础依赖
pip install torch torchaudio transformers librosa soundfile
# 安装 torch_npu (CANN 环境已就绪时)
pip install torch_npu
# 安装 ModelScope (用于下载模型)
pip install modelscope# 方式一: 使用 ModelScope (推荐)
pip install modelscope
modelscope download --model m-a-p/MERT-v1-330M --local_dir ./models/mert-v1-330m
# 方式二: 使用 HuggingFace
# pip install huggingface_hub
# huggingface-cli download m-a-p/MERT-v1-330M --local-dir ./models/mert-v1-330m输出目录结构:
models/mert-v1-330m/
├── config.json # 模型配置
├── configuration_MERT.py # MERT 配置类
├── modeling_MERT.py # MERT 模型定义
├── preprocessor_config.json # 预处理器配置
├── pytorch_model.bin # 模型权重 (1.26 GB)
└── README.md # 原始模型说明# 使用合成测试音频 (默认 5秒)
python inference.py --device auto
# 指定设备运行
python inference.py --device cpu # CPU 推理
python inference.py --device npu # NPU 推理 (需要 Ascend 硬件)
# 使用自定义音频文件
python inference.py --audio_path /path/to/audio.wav
# 指定音频时长 (合成音频)
python inference.py --duration 10 --device npu
# 保存输出 tensor
python inference.py --device npu --save_output ./output/npu_result.pt$ python inference.py --device npu --duration 10
[Info] 使用设备: npu:0
[Info] 加载模型: /opt/atomgit/models/mert-v1-330m
[Info] 模型加载耗时: 1.38s
[Info] 模型参数量: 315,428,992 (315.4M)
[Info] 采样率: 24000Hz
[Info] 生成合成测试音频: 10.0s @ 24000Hz
[Info] 开始推理...
[Info] 输入 shape: torch.Size([1, 240000])
============================================================
推理结果摘要
============================================================
last_hidden_state shape: [749, 1024]
特征序列长度: 749
特征维度: 1024
mean: 0.011473
std: 0.240162
min: -1.505517
max: 1.579898
所有层 hidden_states shape: [25, 749, 1024]
层数: 25, 时间步: 749, 维度: 1024
推理耗时: 0.976s
实时率: 57638.2x
============================================================
推理完成!说明: MERT 模型在 24kHz 音频输入下,每 75Hz 输出一个特征向量 (约 320x 下采样)。
输出last_hidden_stateshape 为[T, 1024],其中T = 采样点数 / 320。
默认output_hidden_states=True时还会返回所有 25 层 (输入嵌入 + 24 Transformer 层) 的 hidden states,shape 为[25, T, 1024]。
MERT (Music audio Encoder Representation from Transformer) 是基于 HuBERT 架构的音乐理解模型,使用 MLM (Masked Language Modeling) 预训练范式,结合 EnCodec 的 8 个码本作为伪标签进行训练。
| 组件 | 配置 |
|---|---|
| CNN 特征提取层 | 7 层 Conv1D |
| Transformer 层数 | 24 |
| Hidden Size | 1024 |
| Attention Heads | 16 |
| Intermediate Size | 4096 |
| 特征率 (Feature Rate) | 75 Hz |
| 输入采样率 | 24 kHz |
| 参数量 | 315.4 M |
last_hidden_state: 最后一层 Transformer 输出 [B, T, 1024]hidden_states: 所有 25 层的输出 (含输入嵌入层) [25, B, T, 1024]attentions: 注意力权重 (可选)python inference.py --device cpu --duration 5预期输出:
[Info] 推理耗时: 5.838s
last_hidden_state shape: [374, 1024]
mean: 0.006875
std: 0.257603python inference.py --device npu --duration 5预期输出:
[Info] 推理耗时: 0.488s
last_hidden_state shape: [374, 1024]
mean: 0.006878
std: 0.257641运行 CPU vs NPU 精度对比测试:
python accuracy_compare.py --duration 5Layer | CosSim | MSE | RMSE | MAE | MaxDiff | Status
------------------------------------------------------------------------------------------
-1 | 0.999963 | 0.0000061838 | 0.002487 | 0.001852 | 0.036846 | ✓
0 | 1.000015 | 0.0002491847 | 0.015786 | 0.011038 | 0.208385 | ✓
1 | 1.000019 | 0.0003648808 | 0.019102 | 0.013720 | 0.223766 | ✓
2 | 1.000012 | 0.0004481609 | 0.021170 | 0.015426 | 0.228177 | ✓
3 | 1.000012 | 0.0005429527 | 0.023301 | 0.017266 | 0.231036 | ✓
4 | 1.000014 | 0.0005832962 | 0.024152 | 0.018042 | 0.230106 | ✓
5 | 1.000012 | 0.0006161684 | 0.024823 | 0.018564 | 0.238156 | ✓
6 | 1.000010 | 0.0006308156 | 0.025116 | 0.018763 | 0.256081 | ✓
7 | 1.000011 | 0.0006535025 | 0.025564 | 0.019056 | 0.272088 | ✓
8 | 1.000010 | 0.0006760694 | 0.026001 | 0.019316 | 0.283578 | ✓
9 | 1.000012 | 0.0007086297 | 0.026620 | 0.019779 | 0.287025 | ✓
10 | 1.000004 | 0.0007583404 | 0.027538 | 0.020549 | 0.289069 | ✓
11 | 1.000008 | 0.0007822671 | 0.027969 | 0.020832 | 0.284596 | ✓
12 | 1.000004 | 0.0008543609 | 0.029229 | 0.021766 | 0.323650 | ✓
13 | 1.000005 | 0.0008990775 | 0.029985 | 0.022266 | 0.325716 | ✓
14 | 1.000006 | 0.0009116417 | 0.030193 | 0.022373 | 0.330151 | ✓
15 | 1.000006 | 0.0009243788 | 0.030404 | 0.022478 | 0.332663 | ✓
16 | 1.000008 | 0.0009454619 | 0.030748 | 0.022699 | 0.357490 | ✓
17 | 1.000004 | 0.0009858970 | 0.031399 | 0.023177 | 0.369810 | ✓
18 | 1.000003 | 0.0010956185 | 0.033100 | 0.024480 | 0.420349 | ✓
19 | 1.000005 | 0.0014330050 | 0.037855 | 0.027914 | 0.668556 | ✓
20 | 0.999998 | 0.0016352780 | 0.040439 | 0.030009 | 0.700607 | ✓
21 | 0.999996 | 0.0023133119 | 0.048097 | 0.035518 | 0.985168 | ✓
22 | 1.000009 | 0.0028185258 | 0.053090 | 0.039366 | 0.974228 | ✓
23 | 1.000024 | 0.0035020777 | 0.059178 | 0.043909 | 1.513214 | ✓
24 | 0.999963 | 0.0000061838 | 0.002487 | 0.001852 | 0.036846 | ✓| 指标 | 值 |
|---|---|
| 平均 Cosine Similarity | 1.000007 |
| 最小 Cosine Similarity | 0.999963 |
| 最大 Cosine Similarity | 1.000024 |
| 平均 MSE | 0.00101 |
| 平均 MaxDiff | 0.415 |
| CosSim ≥ 0.999 通过率 | 25/25 (100%) |
| 判定 | ✅ PASS (所有层 CosSim ≥ 0.999) |
结论: NPU 推理结果与 CPU 推理结果高度一致,所有 25 层的 Cosine Similarity 均 ≥ 0.99996,精度完全达标。
运行性能基准测试:
python perf_benchmark.py --durations "1,3,5,10,30" --iterations 5| 时长(s) | CPU(ms) | NPU(ms) | 加速比 |
|---|---|---|---|
| 1 | 1,123.4 | 12.6 | 89.2x |
| 3 | 3,145.2 | 12.6 | 249.6x |
| 5 | 5,843.9 | 12.6 | 463.8x |
| 10 | 11,634.1 | 12.7 | 916.1x |
| 30 | 34,912.5 | 13.1 | 2665.1x |
结论: Ascend 910 NPU 推理时间仅约 12.6ms,远低于 CPU 推理时间,且推理时间几乎与输入时长无关(计算瓶颈在模型前向,而非 I/O)。
对于长音频场景,NPU 加速比可达 数百倍至数千倍,特别适合批量或长音频的实时推理需求。
| 文件 | 说明 |
|---|---|
inference.py | 主推理脚本,支持 CPU/NPU 双后端,支持合成/真实音频输入 |
accuracy_compare.py | CPU vs NPU 精度对比测试,逐层输出 CosSim/MSE/MaxDiff |
perf_benchmark.py | 性能基准测试,测试不同时长音频的推理性能 |
README.md | 部署文档 (本文档) |
# 1. 下载模型到本地
modelscope download --model m-a-p/MERT-v1-330M --local_dir ./models/mert-v1-330m
# 2. 单条推理验证
cd /opt/atomgit/mert-v1-330m
python inference.py --model_path ./models/mert-v1-330m --device npu --duration 5
# 3. 精度对比
python accuracy_compare.py --model_path ./models/mert-v1-330m --duration 5
# 4. 性能基准
python perf_benchmark.py --model_path ./models/mert-v1-330m --durations "1,3,5,10,30"feature_extractor_cqt requires the library 'nnAudio' 警告这是正常现象,默认配置下不使用 CQT 特征 (config.feature_extractor_cqt = false)。不影响模型推理。
trust_remote_code=TrueMERT 使用自定义模型代码 (modeling_MERT.py),需要设置 trust_remote_code=True。推理脚本已自动处理。
MERT-v1-330M 约 315M 参数,float32 推理约 1.26 GB 显存。输入 30 秒音频时峰值显存约 4-5 GB。如遇到 OOM:
--duration 5 测试支持 wav/mp3/flac 格式,脚本会自动重采样到 24kHz 并混音到单声道:
python inference.py --audio_path /path/to/your/music.mp3 --device npu通过 output_hidden_states=True 获取所有 25 层输出:
outputs = model(input_values, output_hidden_states=True)
all_layers = torch.stack(outputs.hidden_states) # [25, B, T, 1024]
layer_12 = all_layers[12] # 第 12 层 Transformer 输出