使用 Transformers 优化文本转语音模型 Bark
Transformers 提供了许多最新最先进 (state-of-the-art, SoTA) 的模型,这些模型横跨多个领域及任务。为了使这些模型能以最佳性能运行,我们需要优化其推理速度及内存使用。
【资料图】
Hugging Face 生态系统为满足上述需求提供了现成且易于使用的优化工具,这些工具可应用于库中的所有模型。用户只需添加几行代码就可以轻松?减少内存占用并?提高推理速度。
在本实战教程中,我将演示如何用三个简单的优化技巧来优化 Bark 模型。Bark 是 Transformers 支持的一个文本转语音 (Text-To-Speech, TTS) 模型。所有优化仅依赖于 Transformers、Optimum 以及 Accelerate 这三个 生态系统库。
本教程还演示了如何对模型及其不同的优化方案进行性能基准测试。
本文对应的 Google Colab 在:/github/ylacombe/notebooks/blob/main/Benchmark_Bark_
本文结构如下:
目录
Bark 模型简介
不同优化技巧及其优点概述
基准测试结果展示
Bark 模型架构
Bark是 Suno AI 提出的基于 transformer 的 TTS 模型,其原始代码库为 suno-ai/bark。该模型能够生成各种音频输出,包括语音、音乐、背景噪音以及简单的音效。此外,它还可以产生非语言语音,如笑声、叹息声和抽泣声等。
自 起,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。
将模型放到加速器上以优化其速度:
加载处理器,它主要处理分词以及说话人嵌入 (若有)。
优化技巧
本节,我们将探索如何使用 Optimum 和 Accelerate 库中的现成功能来以最少的代码改动达到优化 Bark 模型的目的。
设置实验环境
首先,我们准备一个输入文本并定义一个函数来测量 Bark 生成过程的延迟及其 GPU 显存占用情况。
测量延迟和 GPU 内存占用需要使用特定的 CUDA 函数。我们实现了一个工具函数,用于测量模型的推理延迟及 GPU 内存占用。为了确保结果的准确性,每次测量我们会运行?nb_loops
次求均值:
基线
在优化之前,我们先测量下模型的基线性能并听一下生成的音频,我们测量五次并求均值:
输出:
现在,我们可以播放一下输出音频:
重要说明
上例中运行次数较少。为了测量和后续对比的准确性,运行次数需要增加到至少 100。
增加?nb_loops
一个主要原因是,同一输入的多次运行所生成的语音长度差异也很大。因此当运行次数较少时,有可能通过?measure_latency_and_memory_use
测出的延迟并不能反映出优化方法的实际性能!文末的基准测试取的是 100 次运行的均值,用以逼近模型的真实性能。
1. Better Transformer
Better Transformer 是 ? Optimum 的一个功能,它可以帮助在后台执行算子融合。这意味着模型的某些操作在 GPU 上的性能将会得到进一步优化,从而加速模型的最终运行速度。
再具体一点, Transformers 支持的大多数模型都依赖于注意力,这使得模型在生成输出时可以选择性地关注输入的某些部分,因而能够有效地处理远程依赖关系并捕获数据中复杂的上下文关系。
Dao 等人于 2022 年提出了一项名为 Flash Attention 的技术,极大地优化了朴素注意力的性能。
Flash Attention 是一种更快、更高效的注意力算法,它巧妙地结合了一些传统方法 (如平铺和重计算),以最大限度地减少内存使用并提高速度。与之前的算法不同,Flash Attention 将内存使用量从与序列长度呈平方关系降低到线性关系,这对关注内存效率的应用尤其重要。
Better Transformer 可以开箱即用地支持 Flash Attention!只需一行代码即可将模型导出到 Better Transformer 并启用 Flash Attention:
输出:
利弊
效果不会下降,这意味着你可以获得与基线版本完全相同的结果,同时提速 20% 到 30%!想要了解更多有关 Better Transformer 的详细信息,请参阅此 博文。
2. 半精度
大多数人工智能模型通常使用称为单精度浮点的存储格式,即?fp32
,这在实践中意味着每个数都用 32 比特来存储。
你也可以选择使用 16 比特对每个数进行编码,即所谓的半精度浮点,即?fp16
(译者注: 或?bf16
),这时每个数占用的存储空间就变成了原来的一半!除此以外,你还可以获得计算上的加速!
但天下没有免费的午餐,半精度会带来较小的效果下降,因为模型内部的操作不如?fp32
精确了。
你可以通过简单地在?_pretrained(...)
的入参中添加?torch_dtype=
来将 Transformers 模型加载为半精度!
代码如下:
输出:
利弊
虽然效果略有下降,但内存占用量减少了 50%,速度提高了 5%。
3. CPU 卸载
正如本文第一部分所述,Bark 包含 4 个子模型,这些子模型在音频生成过程中按序调用。换句话说,当一个子模型正在使用时,其他子模型处于空闲状态。
为什么要讨论这个问题呢?因为 GPU 显存在 AI 工作负载中非常宝贵,显存中的运算速度是最快的,而很多情况下显存不足是推理速度的瓶颈。
一个简单的解决方案是将空闲子模型从 GPU 显存中卸载至 CPU 内存,该操作称为 CPU 卸载。
好消息: Bark 的 CPU 卸载已集成至 Transformers 中,只需一行代码即可使能。唯一条件是,仅需确保安装了 Accelerate 即可!
输出:
利弊
速度略有下降 (10%),换得内存占用的巨大降低 (60% )。
启用此功能后,?bark-large
占用空间从原先的 5GB 降至 2GB,与?bark-small
的内存占用相同!
如果你还想要降更多的话,可以试试启用?fp16
,内存占用甚至可以降至 1GB。具体可以参见下一节的数据。
4. 组合优化
我们把上述所有优化组合到一起,这意味着你可以合并 CPU 卸载、半精度以及 Better Transformer 带来的收益!
输出:
利弊
最终,你将获得 23% 的加速并节约 80% 的内存!
批处理
得陇望蜀?
加个批处理吧,上述 3 种优化技巧加上批处理可以进一步提升速度。批处理即将多个样本组合起来一起推理,这样会使这些样本的总生成时间低于逐样本生成时的总生成时间。
下面给出了一个批处理的简单代码:
基准测试结果
上文我们进行的这些小实验更多是想法验证,我们需要将其扩展以更准确地衡量性能。另外,在每次正式测量性能之前,还需要先跑几轮以预热 GPU。
以下是扩展至 100 个样本的基准测量的结果,使用的模型为?大 Bark。
该基准测试在 NVIDIA TITAN RTX 24GB 上运行,最大词元数为 256。
如何解读结果?
延迟
该指标主要测量每次调用生成函数的平均时间,无论 batch size 如何。
换句话说,它等于?。
延迟越小越好。
最大内存占用
它主要测量生成函数在每次调用期间使用的最大内存。
内存占用越小越好。
吞吐量
它测量每秒生成的样本数。这次,batch size 的因素已被考虑在内。
换句话说,它等于?。
吞吐量越高越好。
单样本推理
下表为?batch_size=1
的结果。
不出所料,CPU 卸载极大地减少了内存占用,同时略微增加了延迟。
然而,结合 bettertransformer 和?fp16
,我们得到了两全其美的效果,巨大的延迟和内存降低!
batch size 为 8
以下是?batch_size=8
时的吞吐量基准测试结果。
请注意,由于?bettertransformer
是一种免费优化,它执行与非优化模型完全相同的操作并具有相同的内存占用,同时速度更快,因此所有的基准测试均?默认开启此优化。
这里,我们看到了组合所有三个优化技巧后的性能潜力!
fp16
对延迟的影响在?batch_size = 1
时不太明显,但在?batch_size = 1
时的表现非常有趣,它可以将延迟减少近一半,吞吐量几乎翻倍!
结束语
本文展示了 生态系统中的一些现成的、简单的优化技巧。使用这些技巧中的任何一种或全部三种都可以极大地改善 Bark 的推理速度和内存占用。
使用 Better Transformer 和 CPU 卸载,你可以对大 Bark 模型进行推理,而不会出现任何性能下降,占用空间仅为 2GB (而不是 5GB),同时速度提高 15%。
如果你钟情于高吞吐,可以?把 batch size 打到 8,并利用 Better Transformer 和 fp16。
如果你“既要,又要,还要”,试试?fp16、 Better Transformer 加 CPU 卸载组合优化吧!
英文原文:?/blog/optimizing-bark
原文作者: Yoach Lacombe
译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。
审校/排版: zhongdongy (阿东)
关键词:
您可能也感兴趣:
为您推荐
苏州吴中郭巷街道:“青”风劲吹“廉”花开,良好风气自然来
电商平台发布秋冬服饰七大趋势 甜心芭比风高居榜首
诚达药业跌4.02% 2022年上市即巅峰超募11亿元
排行
最近更新
- 使用 Transformers 优化文本转语音模型 Bark
- 从科学体系上学深悟透新时代党的创新理论(深入学习贯彻习近...
- 小米应用商店发布《红包专场停止服务公告》
- 央行:2023年1月债券市场共发行各类债券37683.5亿元
- 转发提醒!奶茶店遭遇120杯奶茶订单诈骗
- 中国驻非盟使团团长:金砖合作机制成为新兴市场国家和发展中...
- 美国空军再次测试高超声速导弹,但未公布试射结果
- 南方电网回应妻子举报丈夫后遭威胁 基本情况讲解
- 微视频|开启新的金色航程
- 欣旺达:董事长王威提议以1亿元-2亿元回购公司股份 实控人及...
- 2023年8月23日浙江省成品油价格按机制上调
- 冷门常态化?王楚钦、马龙先后翻车,继孙颖莎之后王曼昱也输比赛
- 为何不建议储户存3年定期?银行内部员工道出实情,你存了吗?
- 易车上线国内首个AI虚拟仿真车评人 以知名主持人楚少为原型
- 张家港市南丰镇民乐村系列活动让“七夕”焕发新活力
- “美国几乎一言不发”
- 湖南新宁:交通安全“不放假” 学生安全“警”相随
- 银保渠道手续费无序竞争,监管要求佣金“报行合一”
- 工信部:2022年我国锂离子电池行业产值突破1.2万亿元
- 同宗同源双城地名故事⑥:水头
- 对话COSMO成都“操盘手”:我们唯一的标准就是“反标准”
- 建设银行上半年净利润同比增3.36% 受提前还款影响按揭贷规模下降
- 美媒晒勒布朗下赛季将达成6纪录:411俱乐部前无古人 小里狂赞GOAT
- 滴滴出行:七夕打车前往婚姻登记处订单增长1.5倍
- 晶华新材董监高潘晓婵2023年08月18日减持151,200股,套现77.72万元
- 国华网安:2023年半年度净利润约-2793万元
- 夏威夷野火已致超1100人失踪
- 夫妻有赡养对方父母的义务吗
- 欣旺达:董事长提议1亿元-2亿元回购股份
- 国羽8胜1负!男单遭重创仅剩2人,陈雨菲2-0横扫,何冰娇2-1逆转