使用 🤗 Transformers 优化 Bark

Hugging Face 已详细介绍了一种优化 Bark 文本转语音(TTS)模型的方法,以降低内存使用并提高推理速度。通过结合三种特定的优化技术——Better Transformer、半精度浮点数(fp16)和 CPU 卸载——用户可以实现高达 80% 的内存占用减少和 23% 的速度提升。

Bark 模型架构

Bark 是由 Suno AI 开发的基于 transformer 的 TTS 模型,能够生成语音、音乐、背景噪声和非语言声音(例如笑声和叹息)。其架构由四个按顺序运行的主要组件组成:

  • BarkSemanticModel:一个因果自回归 transformer,用于预测语义文本标记。
  • BarkCoarseModel:一个因果自回归 transformer,用于预测 EnCodec 的前两个音频码本。
  • BarkFineModel:一个非因果自编码 transformer,迭代预测剩余的码本。
  • EncodecModel:将最终码本通道解码为输出音频数组。

优化技术

通过 🤗 Optimum 和 🤗 Accelerate 库实现优化,仅需最少的代码更改。

Better Transformer

Better Transformer 利用内核融合和 Flash Attention 来优化 GPU 操作。Flash Attention 将内存使用从序列长度的二次关系降低到线性关系,从而在不降低模型性能的情况下提高速度。

主要优势:在不损失输出质量的情况下提供 20% 至 30% 的速度提升。

半精度(fp16)

通过将单精度浮点数(fp32,每个数字 32 位)切换为半精度(fp16,每个数字 16 位),模型的存储需求减半。

主要优势:将内存占用减少 50%,并提供适度的速度提升(大约 5%),尽管可能会引入轻微的性能下降。

CPU 卸载

由于 Bark 的四个子模型是按顺序调用的,同一时间只有一个处于活动状态,而其他保持空闲。CPU 卸载将不活动的子模型从 GPU 卸载到 CPU,以释放宝贵的 GPU 内存。

主要优势:将内存占用减少约 60%,同时延迟略增(约 10%)。

性能基准

基准测试在 NVIDIA TITAN RTX 24GB 上使用 Bark 的大型版本进行,最大生成 256 个新 token,平均取 100 个样本的结果。

单样本生成(批量大小 = 1)

生成单个样本时,Better Transformer、CPU 卸载和 fp16 的组合带来最显著的收益:

优化 延迟变化 内存变化
未优化 0% 0%
仅 Better Transformer -27% -1%
卸载 + Better Transformer -15% -59%
卸载 + Better Transformer + fp16 -23% -80%

批量生成(批量大小 = 8)

将多个样本组合在一起可显著提高吞吐量。在默认启用 Better Transformer 的情况下,观察到以下结果:

优化 延迟变化 内存变化 吞吐量变化
基准情况(Better Transformer) 0% 0% 0%
+ fp16 -46% -50% +87%
+ 卸载 +6% -38% -6%
+ 卸载 + fp16 -43% -69% +77%

最优配置摘要

根据使用场景,推荐不同的优化组合:

  • 为了内存效率:使用 Better Transformer 和 CPU 卸载,以 2GB 的占用运行大型 Bark 模型,而不是 5GB。
  • 为了高吞吐量:使用批量(大小 8)结合 Better Transformer 和半精度(fp16)。
  • 为了平衡性能:结合 fp16、Better Transformer 和 CPU 卸载,以在延迟和内存使用方面获得最佳整体降低。

Sources