为何torchaudio的InverseMelScale函数运行极慢?多设备测试存疑
我正在研究面向音乐/音频生成的机器学习方案,思路是将音频转换为MEL频谱图后应用图像类算法训练,生成MEL频谱图后再转回音频。
生成MEL频谱图的过程十分顺畅,代码如下:
waveform, _ = torchaudio.load(os.path.join(folder, "drums.mp3"), normalize=True, format="mp3") waveform = waveform.to(device) mel_spectrogram_transform = torchaudio.transforms.MelSpectrogram(sample_rate=44100, hop_length=512, n_fft=2048, n_mels=512, f_max=16384).to(device) mel_spectrogram = mel_spectrogram_transform(waveform)
但逆转换环节的InverseMelScale函数运行速度极慢,代码如下:
inverse_melscale_transform = torchaudio.transforms.InverseMelScale(sample_rate=44100, n_mels=512, n_stft=2048 // 2 + 1).to(device) mel_spectrogram = mel_spectrogram.to(device) spectrogram = inverse_melscale_transform(mel_spectrogram)
多设备测试结果:
- Intel芯片MacBook Pro:耗时极久
- 256核AMD Ryzen服务器:几分钟即可出结果
- Titan XP GPU:满载运行30分钟仍无输出
疑问:我的操作哪里有误?为什么AMD Ryzen服务器的运行速度快这么多?
可能的原因与解决方法
1. InverseMelScale的GPU实现优化不足
torchaudio的InverseMelScale本质是通过线性回归求解Mel频谱到线性频谱的逆映射,这个操作的GPU核函数可能没有针对老款GPU(如Titan XP的Pascal架构)做针对性优化。而正向的MelSpectrogram是简单的矩阵乘法,GPU优化更成熟,因此正向转换快、逆向慢。相比之下,256核AMD Ryzen服务器能充分利用多线程并行计算,发挥CPU的优势。
2. 单样本输入限制GPU并行优势
如果你的输入是单条音频(batch size=1),GPU的大规模并行计算优势无法发挥,反而会因为数据传输、kernel启动等额外开销拖慢速度。而多核心CPU可以通过多线程将单任务拆分为多个子任务并行处理,效率更高。
解决方法:将单条音频的频谱图按时间帧拆分为多个片段,组成batch后再执行逆转换,完成后再将结果拼接回完整音频。
3. 老GPU架构的计算瓶颈
Titan XP属于Pascal架构,对部分浮点运算的支持效率不如后续的Ampere、Ada Lovelace等新架构。而AMD Ryzen的现代CPU在浮点计算的多线程调度上效率很高,大核心数进一步放大了这种优势。
4. torchaudio版本问题
不同版本的torchaudio对InverseMelScale的实现可能存在性能差异,老版本的GPU实现可能存在未修复的性能bug。
解决方法:升级到最新稳定版的torchaudio和PyTorch,验证性能是否有提升。
5. 替代方案
如果GPU逆转换性能始终无法满足需求,可以尝试:
- 将生成的MEL频谱图转移到CPU上执行逆转换,利用服务器多核心优势
- 使用librosa的
librosa.feature.inverse.mel_to_stft实现逆转换,其CPU多线程优化效果较好 - 调整参数:适当降低
n_mels(如从512降至256),在可接受的音频质量损失下提升转换速度
内容的提问来源于stack exchange,提问作者adur

