| 项目 | 说明 |
|---|---|
| 模型名称 | AudioLDM2-Music |
| 模型类型 | 音频生成 (Text-to-Audio) |
| 基座架构 | Latent Diffusion + AudioLDM2 |
| 模型来源 | ModelScope - chaowenguo/audioldm2-music |
| 许可证 | Apache-2.0 |
| 输入 | 文本提示词 (Prompt) |
| 输出 | 音频波形 (WAV, 16kHz) |
| 项目 | 要求 |
|---|---|
| NPU | Ascend 910B / Atlas 800 A2 |
| NPU 显存 | ≥ 16 GB |
| 系统内存 | ≥ 32 GB(CPU 推理需要) |
| 磁盘空间 | ≥ 10 GB(模型约 4.5 GB) |
| 依赖 | 版本 |
|---|---|
| Python | ≥ 3.9 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| CANN | 8.5.1 |
| diffusers | 0.38.0 |
| transformers | ≥ 4.57.0 |
| scipy | ≥ 1.7 |
| soundfile | ≥ 0.12 |
| modelscope | ≥ 1.35 |
| audioldm2 | ≥ 0.1.0 |
cd /opt/atomgit/audioldm2-music
python3 check_env.pymodelscope download --model chaowenguo/audioldm2-music模型默认下载路径: ~/.cache/modelscope/hub/models/chaowenguo/audioldm2-music
python3 inference.py --device npu --steps 20 --duration 10.0python3 inference.py --device cpu --steps 5 --duration 5.0python3 inference.py --device npu \
--prompts "A peaceful piano melody" "Rock music with drums" \
--steps 20 --duration 10.0# 完整验证(可重复性 + 音频质量 + 统计对比 + 性能基准)
python3 verify.py
# 精度与性能评测
python3 eval_accuracy_perf.py --eval_type full
# 仅精度评测
python3 eval_accuracy_perf.py --eval_type precision
# 仅性能评测
python3 eval_accuracy_perf.py --eval_type performanceaudioldm2-music/
├── inference.py # 推理脚本 (CPU/NPU 双模式)
├── verify.py # 精度验证与性能评测脚本
├── eval_accuracy_perf.py # 精度与性能评测脚本(详细版)
├── check_env.py # 环境预检脚本
├── README.md # 本文档
├── outputs/ # 推理输出目录
│ ├── cpu_*.wav # CPU 生成音频
│ ├── npu_*.wav # NPU 生成音频
│ ├── inference_report_cpu.json
│ └── inference_report_npu.json
├── eval_results/ # 评测结果目录
│ ├── full_report_*.json # 完整验证报告
│ ├── precision_report_*.json
│ ├── performance_report_*.json
│ └── cpu_npu_comparison.json
└── logs/ # 日志目录| 参数 | 默认值 | 说明 |
|---|---|---|
--model_path | 自动检测 | 模型权重路径 |
--device | auto | 推理设备 (auto/cpu/npu/npu:0/npu:1) |
--seed | 42 | 随机种子(保证可复现性) |
--steps | 20 | 扩散推理步数(越大质量越高,耗时越长) |
--duration | 10.0 | 生成音频时长(秒) |
--output_dir | ./outputs | 输出目录 |
--mode | single | 推理模式: single=单设备, both=CPU+NPU对比 |
--prompts | 3条默认提示词 | 文本提示词列表 |
language_model/config.json 和 model_index.json 中使用了 GPT2Model,该类缺少 generate() 方法,已替换为 GPT2LMHeadModelnpu::npu_geglu dispatch 错误,已通过 patch diffusers/models/activations.py 将 GEGLU 的 GELU 激活回退为纯 PyTorch 实现GPT2LMHeadModel 的 generate 接口# diffusers/models/activations.py 中 GEGLU 的修改
# 将 self.act_fn = nn.GELU() 替换为:
import torch
class _CpuGelu(nn.Module):
def forward(self, x):
return torch.nn.functional.gelu(x)
self.act_fn = _CpuGelu()测试条件: seed=42, steps=5, duration=5s, torch_dtype=float32
| 设备 | 最大差异 | 结果 |
|---|---|---|
| CPU (同seed两次) | 0.0 | ✅ 完全可重复 |
| NPU (同seed两次) | 0.0 | ✅ 完全可重复 |
| 提示词 | RMS 能量 | 峰值 | NaN | 静音 | 结果 |
|---|---|---|---|---|---|
| A classical piano piece... | 0.0973 | 0.4992 | ❌ | ❌ | ✅ |
| Electronic dance music... | 0.1633 | 0.9021 | ❌ | ❌ | ✅ |
| Ambient soundscape... | 0.0619 | 0.4438 | ❌ | ❌ | ✅ |
| Jazz saxophone solo... | 0.0998 | 0.5423 | ❌ | ❌ | ✅ |
| 提示词 | CPU RMS | NPU RMS | RMS 比值 | CPU Peak | NPU Peak | 结果 |
|---|---|---|---|---|---|---|
| A classical piano piece... | 0.1162 | 0.1116 | 0.960 | 0.6205 | 0.6965 | ✅ |
| Electronic dance music... | 0.1494 | 0.1433 | 0.959 | 0.7342 | 0.7882 | ✅ |
| Ambient soundscape... | 0.0425 | 0.0356 | 0.838 | 0.2159 | 0.2109 | ✅ |
| Jazz saxophone solo... | 0.0972 | 0.0875 | 0.900 | 0.4652 | 0.4739 | ✅ |
说明: AudioLDM2 是扩散模型,CPU 和 NPU 的浮点运算路径存在微小差异,在多步去噪过程中会被放大,导致最终波形差异较大(余弦相似度低)。这是扩散模型的正常特性,不表示 NPU 推理有问题。关键验证指标是:NPU 可重复性(✅通过)、音频质量(✅通过)、统计特征在同一量级(✅通过)。
测试条件: seed=42, prompt="A classical piano piece with gentle melody", 每配置 3 次取平均
| 推理步数 | 音频时长 | 平均耗时 | 标准差 | 最小耗时 | 最大耗时 |
|---|---|---|---|---|---|
| 10 | 5.0s | 0.94s | 0.03s | 0.91s | 0.98s |
| 20 | 5.0s | 1.61s | 0.03s | 1.57s | 1.64s |
| 50 | 5.0s | 3.58s | 0.04s | 3.55s | 3.63s |
| 10 | 10.0s | 0.94s | 0.01s | 0.93s | 0.94s |
| 20 | 10.0s | 1.58s | 0.02s | 1.56s | 1.60s |
测试条件: seed=42, steps=5, duration=5s
| 设备 | 推理耗时 | RMS 能量 | 峰值 | 加速比 |
|---|---|---|---|---|
| CPU | 39.75s | 0.1162 | 0.6205 | 1.00x |
| NPU | 1.01s | 0.1116 | 0.6965 | 39.5x |
2026-05-20 05:47:27 [INFO] 生成音频: 'A classical piano piece with gentle melody' (steps=20, duration=10.0s, device=npu)
2026-05-20 05:47:29 [INFO] 生成完成,耗时 2.09s,音频 shape=(160000,)
2026-05-20 05:47:29 [INFO] 音频已保存: outputs/npu_A_classical_piano_piece_with_g.wav
2026-05-20 05:47:29 [INFO] 生成音频: 'Electronic dance music with strong beat' (steps=20, duration=10.0s, device=npu)
2026-05-20 05:47:31 [INFO] 生成完成,耗时 1.63s,音频 shape=(160000,)
2026-05-20 05:47:31 [INFO] 音频已保存: outputs/npu_Electronic_dance_music_with_st.wav
2026-05-20 05:47:31 [INFO] 生成音频: 'Ambient soundscape with rain and thunder' (steps=20, duration=10.0s, device=npu)
2026-05-20 05:47:33 [INFO] 生成完成,耗时 1.65s,音频 shape=(160000,)
2026-05-20 05:47:33 [INFO] 音频已保存: outputs/npu_Ambient_soundscape_with_rain_a.wav
2026-05-20 05:47:33 [INFO] ===== NPU 推理报告 =====
2026-05-20 05:47:33 [INFO] 总条数: 3, 平均耗时: 1.79s
2026-05-20 05:47:33 [INFO] 报告已保存: outputs/inference_report_npu.json2026-05-20 05:45:37 [INFO] 生成音频: 'A classical piano piece with gentle melody' (steps=5, duration=5.0s, device=cpu)
2026-05-20 05:46:17 [INFO] 生成完成,耗时 39.69s,音频 shape=(80000,)
2026-05-20 05:46:17 [INFO] 音频已保存: outputs/cpu_A_classical_piano_piece_with_g.wav
2026-05-20 05:46:17 [INFO] 生成音频: 'Electronic dance music with strong beat' (steps=5, duration=5.0s, device=cpu)
2026-05-20 05:46:57 [INFO] 生成完成,耗时 39.60s,音频 shape=(80000,)
2026-05-20 05:46:57 [INFO] 音频已保存: outputs/cpu_Electronic_dance_music_with_st.wav
2026-05-20 05:46:57 [INFO] 生成音频: 'Ambient soundscape with rain and thunder' (steps=5, duration=5.0s, device=cpu)
2026-05-20 05:47:37 [INFO] 生成完成,耗时 39.67s,音频 shape=(80000,)
2026-05-20 05:47:37 [INFO] 音频已保存: outputs/cpu_Ambient_soundscape_with_rain_a.wav# 检查输出文件
ls -la outputs/*.wav outputs/*.json
# 验证音频文件有效性
python3 -c "
import scipy.io.wavfile as wavfile
import os
for f in sorted(os.listdir('outputs')):
if f.endswith('.wav'):
sr, data = wavfile.read(os.path.join('outputs', f))
print(f'{f}: sr={sr}, samples={len(data)}, duration={len(data)/sr:.1f}s')
"npu::npu_geglu 错误这是因为 GEGLU 算子在 NPU 上不支持。解决方法:patch diffusers/models/activations.py,将 GEGLU 中的 nn.GELU() 替换为纯 PyTorch 实现。详见"适配说明"部分。
GPT2Model 缺少 generate 方法修改模型的 language_model/config.json 和 model_index.json,将 GPT2Model 改为 GPT2LMHeadModel。
AudioLDM2 模型较大,CPU 推理需要 ≥ 32GB 内存。可减少 --duration 或 --steps 降低内存占用。
这是扩散模型的正常特性。CPU 和 NPU 的浮点运算微小差异在多步去噪中会被放大。关键指标是:NPU 可重复性、音频质量、统计特征在同一量级。
owner does not match 警告不影响推理,可忽略。
可设置镜像: export MODELSCOPE_CACHE=/path/to/cache