提高 LLM 吞吐量的先进技术
已发表: 2024-04-02在快节奏的技术世界中,大型语言模型 (LLM) 已成为我们与数字信息交互方式的关键角色。 这些强大的工具可以撰写文章、回答问题,甚至进行对话,但它们并非没有挑战。 当我们对这些模型提出更多要求时,我们就会遇到障碍,特别是在让它们更快、更高效地工作时。 这个博客就是关于正面解决这些障碍的。
我们正在深入研究一些明智的策略,旨在提高这些模型的运行速度,同时又不损失其输出的质量。 想象一下,尝试提高赛车的速度,同时确保它仍然可以完美地通过急弯 - 这就是我们使用大型语言模型的目标。 我们将研究诸如连续批处理之类的方法,它有助于更顺利地处理信息,以及诸如分页和 Flash Attention 之类的创新方法,这使得法学硕士在数字推理中更加专注和更快。
因此,如果您对突破这些人工智能巨头的极限感到好奇,那么您来对地方了。 让我们一起探讨这些先进技术如何塑造法学硕士的未来,使它们比以往更快、更好。
法学硕士实现更高吞吐量的挑战
在大型语言模型 (LLM) 中实现更高的吞吐量面临着几个重大挑战,每个挑战都会阻碍这些模型运行的速度和效率。 一个主要障碍是处理和存储这些模型所使用的大量数据所需的绝对内存需求。 随着法学硕士复杂性和规模的增长,对计算资源的需求不断增加,使得维持处理速度变得困难,更不用说提高处理速度了。
另一个主要挑战是法学硕士的自回归性质,特别是在用于生成文本的模型中。 这意味着每个步骤的输出都依赖于之前的输出,从而创建了顺序处理要求,该要求本质上限制了任务的执行速度。 这种顺序依赖性通常会导致瓶颈,因为每个步骤都必须等待其前一个步骤完成才能继续,从而阻碍了实现更高吞吐量的努力。
此外,准确性和速度之间的平衡是一个微妙的平衡。 在不影响输出质量的情况下提高吞吐量就像走钢丝,需要能够驾驭计算效率和模型有效性的复杂环境的创新解决方案。
这些挑战构成了法学硕士优化取得进步的背景,突破了自然语言处理及其他领域的可能性界限。
内存要求
解码阶段在每个时间步生成单个令牌,但每个令牌取决于所有先前令牌的键和值张量(包括预填充时计算的输入令牌的 KV 张量,以及当前时间步之前计算的任何新 KV 张量) 。
因此,为了最大限度地减少每次的冗余计算,并避免在每个时间步重新计算所有标记的所有这些张量,可以将它们缓存在 GPU 内存中。 每次迭代,当计算出新元素时,它们都会被简单地添加到正在运行的缓存中,以便在下一次迭代中使用。 这本质上称为 KV 缓存。
这大大减少了所需的计算量,但引入了内存需求,而且大型语言模型的内存需求已经很高,这使得在商用 GPU 上运行变得困难。 随着模型参数大小(7B 到 33B)的增加和精度的提高(fp16 到 fp32),内存需求也随之增加。 让我们看一个所需内存容量的示例,
众所周知,两个主要的内存占用者是
- 模型本身的权重在内存中,这个自带的没有。 7B 等参数和每个参数的数据类型,例如,fp16 中的 7B(2 字节)~= 内存中的 14GB
- KV缓存:用于self-attention阶段的key值的缓存,避免冗余计算。
每个令牌的 KV 缓存大小(以字节为单位) = 2 * (num_layers) * (hidden_size) * precision_in_bytes
第一个因子 2 说明 K 和 V 矩阵。 这些hidden_size和dim_head可以从模型的卡片或配置文件中获取。
上面的公式是针对每个 token 的,因此对于输入序列,它将是 seq_len * size_of_kv_per_token。 所以上面的公式就会转化为,
KV 缓存的总大小(以字节为单位) = (sequence_length) * 2 * (num_layers) * (hidden_size) * precision_in_bytes
例如,对于 fp16 中的 LLAMA 2,大小将为 (4096) * 2 * (32) * (4096) * 2,即 ~2GB。
以上是针对单个输入的,如果没有导致内存不足和碎片问题,那么这种动态内存分配和管理将成为实现最佳性能的关键步骤。
有时,内存需求超过了 GPU 的容量,在这种情况下,我们需要研究模型并行性、张量并行性,这里没有讨论,但您可以朝这个方向探索。
自回归和内存限制操作
正如我们所看到的,大型语言模型的输出生成部分本质上是自回归的。 表示要生成任何新令牌,它取决于所有先前的令牌及其中间状态。 由于在输出阶段并非所有令牌都可用于进一步计算,并且它只有一个向量(用于下一个令牌)和前一阶段的块,因此这就像一种矩阵向量运算,在以下情况下未充分利用 GPU 计算能力:与预填充阶段相比。 数据(权重、键、值、激活)从内存传输到 GPU 的速度决定了延迟,而不是计算实际发生的速度。 换句话说,这是一个内存限制操作。
克服吞吐量挑战的创新解决方案
连续配料
减少解码阶段内存限制的非常简单的步骤是对输入进行批处理并同时对多个输入进行计算。 但是,由于生成的序列长度不同,简单的常量批处理会导致性能不佳,并且这里批处理的延迟取决于批处理中生成的最长序列,并且由于多个输入是不断增长的,因此内存需求也不断增长。现在立即处理。
因此,单纯的静态配料效果不佳,出现了连续配料。 其本质在于动态聚合传入的请求批次,适应波动的到达率,并在可行的情况下利用并行处理的机会。 这还通过将每个批次中相似长度的序列分组在一起来优化内存利用率,从而最大限度地减少较短序列所需的填充量,并避免在过度填充上浪费计算资源。
它根据当前内存容量、计算资源和输入序列长度等因素自适应调整批量大小。 这可确保模型在不同条件下以最佳方式运行,而不会超出内存限制。 这有助于分页注意力(如下所述)有助于减少延迟并提高吞吐量。
进一步阅读:连续批处理如何在 LLM 推理中实现 23 倍吞吐量,同时减少 p50 延迟
分页关注
当我们通过批处理来提高吞吐量时,它也会以增加 KV 缓存内存需求为代价,因为我们现在一次处理多个输入。 这些序列可能超出可用计算资源的存储容量,从而使得对其整体进行处理是不切实际的。
我们还观察到,KV 缓存的简单内存分配会导致大量内存碎片,就像我们在计算机系统中观察到的那样,由于内存分配不均匀。 vLLM 引入了 Paged Attention,这是一种受操作系统分页和虚拟内存概念启发的内存管理技术,可有效处理 KV 缓存不断增长的需求。
分页注意力通过将注意力机制划分为更小的页面或段来解决内存限制,每个页面或段覆盖输入序列的一个子集。 该模型不是一次计算整个输入序列的注意力分数,而是一次关注一页,按顺序处理它。
在推理或训练期间,模型迭代输入序列的每一页,计算注意力分数并相应地生成输出。 处理完一个页面后,其结果将被存储,并且模型将移至下一页。
通过将注意力机制划分为页面,分页注意力允许大型语言模型在不超出内存限制的情况下处理任意长度的输入序列。 它有效地减少了处理长序列所需的内存占用,从而可以处理大型文档和批次。
进一步阅读:使用 vLLM 和 PagedAttention 进行快速 LLM 服务
闪关注
由于注意力机制对于大型语言模型所基于的 Transformer 模型至关重要,因此它有助于模型在进行预测时关注输入文本的相关部分。 然而,随着基于 Transformer 的模型变得越来越大、越来越复杂,自注意力机制变得越来越慢并且占用大量内存,从而导致前面提到的内存瓶颈问题。 Flash Attention 是另一种优化技术,旨在通过优化注意力操作来缓解此问题,从而实现更快的训练和推理。
Flash Attention 的主要特点:
内核融合:重要的是不仅要最大化 GPU 计算使用率,还要使其能够实现高效操作。 Flash Attention 将多个计算步骤合并到一个操作中,减少了重复数据传输的需要。 这种简化的方法简化了实施过程并提高了计算效率。
平铺:Flash Attention 将加载的数据划分为更小的块,有助于并行处理。 该策略优化了内存使用,为具有更大输入大小的模型提供了可扩展的解决方案。
(融合的 CUDA 内核描述了平铺和融合如何减少计算所需的时间,图片来源:FlashAttention:Fast and Memory-Efficient Exact Attention with IO-Awareness)
内存优化:Flash Attention 仅加载过去几个令牌的参数,重用最近计算的令牌的激活。 这种滑动窗口方法减少了加载权重的 IO 请求数量并最大化闪存吞吐量。
减少数据传输:Flash Attention 可最大程度地减少高带宽存储器 (HBM) 和 SRAM(静态随机存取存储器)等存储器类型之间的来回数据传输。 通过仅加载所有数据(查询、键和值)一次,可以减少重复数据传输的开销。
案例研究 - 通过推测解码优化推理
在自回归语言模型中用于加速文本生成的另一种方法是推测解码。 推测性解码的主要目标是加快文本生成速度,同时将生成文本的质量保持在与目标分布相当的水平。
推测性解码引入了一个小型/草稿模型,该模型预测序列中的后续标记,然后主模型根据预定义的标准接受/拒绝这些标记。 将较小的草稿模型与目标模型集成可以显着提高文本生成的速度,这是由于内存需求的本质。 由于草稿模型较小,因此要求较少。 要加载的神经元权重和数量。 与主模型相比,现在的计算量也更少,这减少了延迟并加快了输出生成过程。 然后,主模型评估生成的结果并确保其符合下一个可能标记的目标分布。
从本质上讲,推测性解码通过利用更小、更快的草稿模型来预测后续标记,从而简化了文本生成过程,从而加快了文本生成的整体速度,同时保持生成内容的质量接近目标分布。
非常重要的是,较小模型生成的令牌并不总是不断被拒绝,这种情况会导致性能下降而不是提高。 通过实验和用例的性质,我们可以选择较小的模型/在推理过程中引入推测解码。
结论
通过增强大语言模型 (LLM) 吞吐量的先进技术的旅程照亮了自然语言处理领域的前进道路,不仅展示了挑战,还展示了可以正面应对这些挑战的创新解决方案。 这些技术,从连续批处理到分页和 Flash Attention,以及有趣的推测解码方法,不仅仅是渐进式改进。 它们代表了我们使大型语言模型更快、更高效并最终更容易被广泛应用程序访问的能力的重大飞跃。
这些进步的重要性怎么强调都不为过。 在优化 LLM 吞吐量和提高性能时,我们不仅仅是调整这些强大模型的引擎; 我们正在重新定义处理速度和效率方面的可能性。 这反过来又为大型语言模型的应用开辟了新的视野,从可以以对话速度运行的实时语言翻译服务,到能够以前所未有的速度处理海量数据集的高级分析工具。
此外,这些技术强调了大型语言模型优化的平衡方法的重要性——一种仔细考虑速度、准确性和计算资源之间相互作用的方法。 当我们突破法学硕士能力的界限时,保持这种平衡对于确保这些模型能够继续作为跨众多行业的多功能且可靠的工具至关重要。
增强大语言模型吞吐量的先进技术不仅仅是技术成果; 它们是人工智能不断发展的里程碑。 他们承诺使法学硕士更具适应性、更高效、更强大,为未来的创新铺平道路,从而继续改变我们的数字格局。
在我们最近的博客文章中了解有关大型语言模型推理优化的 GPU 架构的更多信息