🤗 Transformers 提供了许多最新最先进 (state-of-the-art, SoTA) 的模型,这些模型横跨多个领域及任务。为了使这些模型能以最佳性能运行,我们需要优化其推理速度及内存使用。
🤗 Hugging Face 生态系统为满足上述需求提供了现成且易于使用的优化工具,这些工具可应用于库中的所有模型。用户只需添加几行代码就可以轻松 减少内存占用 并 提高推理速度。
在本实战教程中,我将演示如何用三个简单的优化技巧来优化 Bark 模型。Bark 是🤗 Transformers 支持的一个文本转语音 (Text-To-Speech, TTS) 模型。所有优化仅依赖于 Transformers、Optimum 以及 Accelerate 这三个 🤗 生态系统库。
本教程还演示了如何对模型及其不同的优化方案进行性能基准测试。
本文对应的 Google Colab 在:https://colab.research.google.com/github/ylacombe/notebooks/blob/main/Benchmark_Bark_HuggingFace.ipynb
本文结构如下:
目录
Bark 模型简介
不同优化技巧及其优点概述
基准测试结果展示
Bark 模型架构
Bark 是 Suno AI 提出的基于 transformer 的 TTS 模型,其原始代码库为 suno-ai/bark。该模型能够生成各种音频输出,包括语音、音乐、背景噪音以及简单的音效。此外,它还可以产生非语言语音,如笑声、叹息声和抽泣声等。
自 v4.31.0 起,Bark 已集成入 🤗 Transformers!
你可以通过 这个 notebook 试试 Bark 并探索其功能。
Bark 主要由 4 个模型组成:
BarkSemanticModel
(也称为 文本 模型): 一个因果自回归 transformer 模型,其输入为分词后的词元序列,并输出能捕获文义的语义词元。BarkCoarseModel
(也称为 粗声学 模型): 一个因果自回归 transformer 模型,其接收BarkSemanticModel
模型的输出,并据此预测 EnCodec 所需的前两个音频码本。BarkFineModel
(也称为 细声学 模型),这次是个非因果自编码器 transformer 模型,它对 先前码本的嵌入和 进行迭代,从而生成最后一个码本。在
EncodecModel
的编码器部分预测出所有码本通道后,Bark 继续用其解码器来解码并输出音频序列。
截至本文撰写时,共有两个 Bark checkpoint 可用,其中一个是 小版,一个是 大版。
加载模型及其处理器
预训练的 Bark 小 checkpoint 和 大 checkpoint 均可从 Hugging Face Hub 上加载。你可根据实际需要加载相应的 repo-id。
为了使实验运行起来快点,我们默认使用小 checkpoint,即 “suno/bark-small”
。但你可以随意改成 “suno/bark”
来尝试大 checkpoint。
from transformers import BarkModel
model = BarkModel.from_pretrained("suno/bark-small")
将模型放到加速器上以优化其速度:
import torch
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model = model.to(device)
加载处理器,它主要处理分词以及说话人嵌入 (若有)。
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained("suno/bark-small")
优化技巧
本节,我们将探索如何使用 🤗 Optimum 和 🤗 Accelerate 库中的现成功能来以最少的代码改动达到优化 Bark 模型的目的。
设置实验环境
首先,我们准备一个输入文本并定义一个函数来测量 Bark 生成过程的延迟及其 GPU 显存占用情况。
text_prompt = "Let'