讲师中心 微信公众号
AI工具推荐 视频效率加速

适用于您的实时应用程序的 Supersonic GPU MelSpectrogram

风芳吖_2439

风芳吖_2439

发布时间:2024-10-16 20:32:55

|

657人浏览过

|

来源于dev.to

转载

适用于您的实时应用程序的 supersonic gpu melspectrogram

在 simli,我们最关心的是延迟。毕竟,这就是我们的目标:低延迟视频。另一方面,音频机器学习中一些最常用的算法的实现速度非常慢。需要明确的是,这些实现通常适合创建模型本身或批量推理。但对于 simli 的我们来说,几毫秒就可能意味着视频是断断续续的混乱还是流畅。
对我来说幸运的是(以及作为读者的代理),本指南不需要太多数学知识,更聪明的人已经弄清楚如何获得正确的答案,我们只是让计算更加高效。如果您需要更多信息来了解 melspectrogram 到底是什么,您可以阅读这篇文章。计算频谱图的方法有多种,这在很大程度上取决于您的应用程序。因此,为了方便作者,我们将重点放在运行内部模型所需的梅尔上。

常见的解决方案:librosa

您很可能是在遇到使用 librosa 的存储库后来到这里的。老实说,这是一个非常方便的图书馆。有大量实用程序、读取磁盘上音频的简单方法以及快速访问许多常用功能(例如音频重采样、通道缩混等)。在我们的例子中,我们对一种特定的功能感兴趣:梅尔谱图计算。在 librosa 中,获取梅尔光谱图非常简单。

import librosa

# load in any audio to test
sampleaudio, sr = librosa.load("sample.mp3", sr=none) # sr=none means the original sampling rate
spectrogram = librosa.feature.melspectrogram(
    y=sampleaudio,
    sr=sr,
    n_fft=int(0.05 * sr),  # 50ms
    hop_length=int(0.0125 * sr),  # 12.5ms
    win_length=int(0.05 * sr),
)

很简单,在 gcp g2 虚拟机上平均需要 2 毫秒左右。嗯,有两个主要问题:

  1. 通常,在使用深度学习模型时,您需要在 gpu 上运行模型。这意味着链的一部分在 cpu 上运行,然后将结果复制回 gpu。对于批量推理,这基本上没问题,因为您应该收集 gpu/传输上能够容纳的尽可能多的数据。然而,在我们的例子中,我们经常一次处理一帧,以减少等待和处理时间。
  2. 我们的总时间预算约为 33 毫秒/帧。这包括从 api 服务器到 ml 推理服务器的传输延迟、cpu 到 gpu 的复制、预处理和模型(包括梅尔谱图)的后处理。当您的预算如此紧张时,每一毫秒都很重要。这两毫秒实际上有助于为 simli 提供一个可工作的实时渲染视频流(当然,这是许多优化,每个优化都值得一两毫秒)。

网上寻找解决方案

在尝试了解其他人是如何做到这一点时(幸运的是,这对我们来说不是一个独特的问题),我发现这篇文章解释了梅尔谱图的工作原理,并提供了一个参考实现,由于某种原因,该实现仅花费了 1 毫秒(50 % 改进)。这是一个好的开始,但仍然存在第一个问题,并非所有内容都在 gpu 上。我们正在使用 pytorch,并一直依赖 torch.compile 和 mode=reduce-overhead 来最大程度地提高速度。然而,像这样的数据传输可能会降低性能,因为 pytorch 编译器也无法优化该函数。解决方案有点繁琐但是相对简单,用torch重写一下即可。 pytorch 团队已确保其许多语法和功能尽可能接近 numpy(一些边缘情况通常都有详细记录,除了让我迷失了几天的情况,但这是另一个博客的故事) .

pytorch 重写

因此,为了成功重写 pytorch 中的所有内容,我们需要执行几个步骤。梅尔谱图可以分为三个步骤:

  • 计算短时傅里叶变换
  • 生成梅尔音阶频率库
  • 生成频谱图。

有好消息也有坏消息。好消息是所有必需的功能都可以在 pytorch 或 torchaudio 中轻松获得。坏消息是默认行为与 librosa 有很大不同,因此需要进行大量配置和反复试验才能使其正确。我经历过这一切,我分享这些信息是因为我什至不希望我最大的敌人遭受这种地狱般的打击。我们需要理解的一件事是,这段代码严重依赖于缓存一些结果以供以后使用。这是在预生成所有静态数组的初始化函数中完成的(例如,梅尔频率库取决于采样率和所需的梅尔数量)。这是我们使用 pytorch 优化的 melspectrogram 函数

import torch

if torch.cuda.is_available
    @torch.compile(mode="reduce-overhead")
else:
    @torch.compile
def melspecrogram_torch(wav:torch.tensor,sample_rate:int, hann_window: torch.tensor, mel_basis: torch.tensor):
    stftwav = torch.stft(
            wav,
            n_fft=int(sample_rate*0.05),
            win_length=int(sample_rate*0.05),
            hop_length=int(sample_rate*0.0125),
            window=hann_window,
            pad_mode="constant",
            return_complex=true,
        ).abs()
    stftwav = stftwav.squeeze()
    mel_stftwav = torch.mm(mel_basis, stftwav)
    return mel_stftwav

device = "cuda" if torch.cuda.is_available() else "cpu"

melspectrogram_torch(
    sampleaudio,
    sr,
    torch.hann_window(int(sample_rate*0.05), device=device, dtype=torch.float32),
    torchaudio.functional.melscale_fbanks(
        sample_rate=sr,
        n_freqs=(int(sample_rate*0.05) // 2 + 1),
        norm="slaney", # this is the normalization algorithm used by librosa
        # this is an example that's related to our own pipeline, check what you need for yours
        n_mels=80,
        f_min=55,
        f_max=7600,
    )
    .t.to(device)
)

初始编译运行后,我们使用 nvidia l4 gpu(缓存 hann_window 和 melscale_fbanks)测量该函数需要 350 微秒。调整后的调用将如下所示:

hann=torch.hann_window(int(sample_rate*0.05), device=device, dtype=torch.float32),
melscale=torchaudio.functional.melscale_fbanks(
        sample_rate=sr,
        n_freqs=(int(sample_rate*0.05) // 2 + 1),
        norm="slaney", # this is the normalization algorithm used by librosa
        # this is an example that's related to our own pipeline, check what you need for yours
        n_mels=80,
        f_min=55,
        f_max=7600,
    )
    .T.to(device)
melspectrogram_torch(
    sampleAudio,
    sr,
    hann,
    melscale,
)

这是关于我们如何优化部署的预训练模型、优化预处理和后处理步骤的一系列文章的一部分。您可以查看 https://www.simli.com/demo 查看已部署的模型以及我们提供的最低延迟的头像

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

5536

2023.08.14

pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

2083

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

68

2025.12.22

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5390

2024.08.16

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

20

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

20

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

0

2026.10.10

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

20

2026.10.10

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

20

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn