第 6 章. 必备的 LLM 优化技术
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在前几章中,我们阐述了针对服务场景优化LLMs的重要性及其面临的挑战。在接下来的两章中,我们将逐一深入探讨每项关键的LLM优化技术,以便您掌握相关知识,从而能够根据自身的服务需求,决定何时、如何以及为何使用这些技术。
在本章中,我们将重点介绍一些核心技术,这些技术将帮助您理解大多数优化概念,并实现许多优化目标。更高级的技术和行业趋势将在第 7 章中介绍。
在本章中,我们将探讨如何使用:
-
请求批处理与调度,以提升并行处理能力和 GPU 利用率
-
注意力机制优化,以提升计算效率、减少计算需求并优化内存管理
-
模型压缩,以实现更小的模型、更少的内存移动和/或更少的计算量
-
前缀缓存:缓存并复用先前prompt,包括如何高效实现并获得高缓存命中率
请求批处理与调度层面的优化
在第 2 章中,我们将 的服务分为离线服务和实时在线服务。在实时在线服务中,请求是随着用户发送而接收的;而在离线服务中,我们已经拥有这些请求,并可以将其全部批处理,使其形成一个大型张量输入,然后输入到模型中,而不是逐个发送。
在服务过程中将请求分组处理可以实现更高的吞吐量,尽管这可能意味着响应速度会变慢。让我们在此深入探讨一下原因,并运用你在第 5 章学到的概念:算术强度。
为什么实时服务中需要批量处理?
回顾一下,正如第 2 章中首次阐述的那样,LLM 服务包含两个阶段:预填充( )和解码(decode)。预填充阶段是模型理解输入提示的阶段。如第 5 章所分析,输入提示中的令牌可以并行处理并实现高算术强度,从而形成计算密集型工作负载。 解码阶段是 LLM 逐个生成令牌的阶段。由于该阶段的自回归特性,解码有界:模型基本上需要遍历其数十亿级参数,却每次仅生成一个令牌,这在 GPU 内存带宽(以 FLOPS 为单位)方面非常低效(图 6-1)。
图 6-1. 在预填充阶段, input prompt中的令牌 会并行处理,一次性全部处理完毕;而在解码阶段,新令牌则逐个生成
为了充分利用 GPU 计算能力,可以通过批处理添加更多请求并将其批量处理。让我们将这一机制应用到图 6-1 所示的架构中。在本节的所有示例中,我们将假设最大批处理大小为 3。
我们将三个输入提示词prompt1、prompt2 和prompt3 进行批处理,然后将其发送至模型。 解码步骤每轮迭代仍仅生成一个令牌,但由于我们将这些请求批量处理,因此可以一次性生成三个新令牌:每个请求对应一个,如图 6-2 所示。这人为地提高了算术强度:我们仍只需读取模型权重一次,但执行了更多计算并生成更多令牌。
总而言之,在模型每次仅生成一个令牌的解码阶段,批量处理特别有效。通过将多个请求分组,批量处理可提高整体吞吐量并提升 GPU 浮点运算(FLOPS)利用率。相比之下,在预填充阶段,由于模型已并行处理所有输入令牌,批量处理的效益则较为有限。 只要输入 prompt 的规模不小且令牌数量充足(例如,不小于 1,024 个),预填充阶段本身就足以饱和 GPU 的计算能力,因此批处理带来的额外并行化效果微乎其微。
图 6-2. 解码阶段处理 三个批量请求 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access