Continuous Batching:解锁LLM潜力!让LLM推断速度飙升23倍,降低延迟!
©作者 | 时空猫的问答盒
单位 | 北京大学
文章标题:
How continuous batching enables 23x throughput in LLM inference while reducing p50 latency
文章链接:https://www.anyscale.com/blog/continuous-batching-llm-inference
Section 1
Q1. 你能解释一下什么是大型语言模型(LLM)的推断过程吗?以及在传统批处理策略中存在的哪些低效性?
内存消耗高:传统批处理策略可能会导致大量的 GPU 内存被占用,限制了可以同时处理的文本量。 计算资源未被充分利用:由于内存限制,传统批处理策略可能导致 GPU 计算资源未被充分利用,从而降低了推断效率。 高延迟:由于大型模型的计算需求,传统批处理策略可能会导致高延迟,使得生成结果的响应速度变慢。 难以处理长文本:传统批处理策略可能会限制模型处理长文本的能力,因为它们可能无法一次性将整个文本载入内存。
Q2. 为什么传统的处理方法可能会导致在实际应用中服务成为大多数情况下的计算成本主导因素?
Q3. 在文章中提到了 LLMs 被视为“黑匣子”,认为只能通过内部更改(如量化和自定义 CUDA 内核)来进行优化。然而,作者认为这并不完全正确。为什么作者持这样的看法?
Q4. 文章中提到了 LLMs 通常是内存受限而不是计算受限的情况下,有一些出乎意料的系统级批处理优化方法。这些优化方法可以在实际工作负载中产生 10 倍甚至更多的差异。你能解释一下作者指的内存受限和计算受限是什么意思吗?
Q5. 作者提到了一种最近提出的优化方法,即连续批处理,也称为动态批处理或迭代级别调度批处理。你能介绍一下这种优化方法的工作原理吗?
Section2 - The basics of LLM inference
Q1. 在 LLM 推断中,对于每一个请求,我们是如何开始的?可以描述一下“前缀”或“提示”是什么吗?
Q2. LLM 在产生完整的响应之前会产生一个什么样的 token 序列?什么情况下会停止生成?
生成了一个特定的“停止”标记,表明生成过程应该终止。 达到了设定的最大序列长度,这时也会停止生成。
Q3. 作者提到了这是一个迭代的过程,可以举一个例子来说明吗?如果我们以句子“加利福尼亚的首府是什么:”作为提示,需要多少次前向传递才能得到完整的响应?
第一次迭代:LLM 生成第一个 token "S",此时我们有 ["S"]。 第二次迭代:LLM 生成第二个 token "a",此时我们有 ["S", "a"]。 第三次迭代:LLM 生成第三个 token "c",此时我们有 ["S", "a", "c"]。 ... 第十次迭代:LLM 生成第十个 token "o",此时我们有完整的响应:["S", "a", "c", "r", “a”, "m", "e", "n", "t", "o"]。
Q4. 作者在例子中提到了一种简化情况,实际上 token 与 ASCII 字符并不是一一映射的,采用了一种流行的 token 编码技术,叫做 Byte-Pair Encoding。请简要解释一下这种编码技术的作用。
Q5. 这里展示了一个玩具示例,用于说明 LLM 推断的简化过程。你能解释一下图中的元素代表了什么吗?
黄色方框中的 T1, T2, ..., T8:这些代表了一个假设模型,它支持最大长度为 8 个 token 的序列。这里的 T1, T2, ..., T8 是不同的 token。 蓝色的箭头:表示推断过程的迭代。从开始的“前缀”或“提示”(黄色方框中的内容)开始,模型逐步生成一个 token。 红色的方框中的 “end-of-sequence” 标志:这表示了当模型生成了一个特殊的 token,通知推断过程结束。 批处理大小(Batch Size):这里展示的示例只包含一个输入序列,因此批处理大小为1。
Q6. 作者提到了初始摄入(“预填充”)阶段,即提示“加利福尼亚的首府是什么:”的处理,它与生成后续 token 一样需要一定的时间。这是因为预填充阶段预先计算了某些关于注意力机制的输入,这些输入在生成的整个生命周期内保持不变。你能解释一下预填充阶段的具体作用和原理吗?
Q7. 作者指出了 LLM 推断是内存 - IO 受限的,而不是计算受限的。这意味着加载 1MB 的数据到GPU的计算核心所需的时间比在 1MB 的数据上执行 LLM 计算所需的时间更长。这一点对于 LLM 推断的吞吐量有着怎样的影响?可以解释一下 GPU 内存的作用和影响吗?
Q8. GPU 内存的消耗量是如何随着基本模型大小和 token 序列长度的增加而变化的?你能简要说明一下这方面的估算和计算方法吗?
基本模型大小(模型参数):随着模型大小的增加,需要更多的内存来存储模型的权重、偏差等参数。一般来说,模型越大,所需内存就越多。
Token 序列长度:每个 token 都需要一定的内存来存储其编码和相关信息。因此,当序列长度增加时,内存消耗也会随之增加。
模型架构:不同的模型架构可能会对内存消耗产生不同的影响。一些模型可能会有特定的内存优化策略或特性,可以影响其在 GPU 上的内存占用。
GPU 类型和内存容量:不同类型和容量的 GPU 具有不同的内存限制。较大内存的 GPU 可以容纳更大的模型和序列。
其他辅助数据和计算:除了模型参数和 token 序列之外,还可能存在其他计算所需的内存,比如中间结果的存储等。
Q9. 文章中提到了一些策略和方法可以优化内存的使用,可以举一些例子说明吗?
模型量化策略:例如 AutoGPTQ,它可以通过将模型权重从 16 位减少到 8 位表示,从而减少内存使用,为更大批处理提供了更多空间。 FlashAttention 技术:该技术通过重新组织注意力计算,以减少内存 - IO,从而实现了显著的吞吐量提升。 优化模型实现:例如 NVIDIA 的 FasterTransformer,通过优化模型实现可以提高吞吐量。 连续批处理:这是一种内存优化技术,不需要对模型进行修改。它可以提高 LLM 生成的内存效率。
Q10. 连续批处理是另一种不需要修改模型的内存优化技术,它是如何工作的?可以解释一下它相对于朴素批处理的优势吗?
合并前缀:对于多个请求,将它们的前缀合并成一个批次。这样做的好处是可以利用 GPU 的并行计算能力,因为可以一次性地计算多个请求的前缀。
共享计算资源:通过将多个请求的前缀合并成一个批次,模型的计算可以在这些前缀之间共享,从而减少了冗余的计算工作。这使得整体推断的效率得到了提升。
减少前缀处理时间:朴素批处理会为每个请求单独处理前缀,而连续批处理可以一次性地处理多个请求的前缀,从而减少了前缀处理的总时间。 提高内存利用率:连续批处理可以在同样的内存限制下处理更多的请求,因为它将多个请求的前缀合并成一个批次,从而减少了内存的浪费。 提升模型推断效率:通过共享计算资源,连续批处理可以更高效地利用 GPU 的计算能力,从而提升了模型推断的速度。
Section3 - LLM batching explained
Q1. 文章提到 LLMs 尽管具有大量的计算能力,但由于内存带宽主要用于加载模型参数,LLMs 很难实现计算饱和度。请解释一下为什么模型参数的加载对计算饱和度有如此大的影响。
GPU 的计算能力:GPUs 是高度并行化的计算架构,可以以每秒数万亿次(teraflop)甚至百万亿次(petaflop)的浮点运算速度执行计算任务。这意味着它们可以在短时间内完成大量的计算工作。 内存带宽的限制:然而,GPU 的内存带宽相对有限。内存带宽是指 GPU 用于在内存和处理器之间传输数据的速度。加载模型参数意味着将模型的权重和其他相关数据从存储介质(如硬盘或内存)传输到 GPU 的内存中。
Q2. 什么是批处理,以及它如何有助于提高LLM推断的效率?与每次处理一个输入序列加载新模型参数相比,批处理有什么优势?
减少模型参数加载次数:在不使用批处理的情况下,每次处理一个输入序列都需要加载一次模型参数。而批处理可以在一次加载后多次使用这些参数,从而减少了加载的次数。 提高内存带宽的利用率:GPU 的内存带宽是有限的资源,而加载模型参数通常会消耗大量的内存带宽。通过批处理,可以更有效地利用这些内存带宽,使其在计算过程中得到更充分的利用。
提高计算资源的利用率:LLM 推断通常是内存 - IO 受限的,而不是计算受限的,意味着加载数据到 GPU 的计算核心比在计算核心上执行 LLM 计算花费的时间更多。通过批处理,可以更有效地利用计算资源,提高计算速度。
Q3. 传统的批处理方法被称为静态批处理,为什么它被称为静态批处理?它与 LLM 推断中的迭代性质有什么关系?
Q4. 在文章中提到静态批处理的问题在于 GPU 会被低效利用,尤其是当批处理中的不同序列的生成长度不同时。请解释一下为什么这会导致 GPU 低效利用,以及在静态批处理中,如何处理不同生成长度的序列?
等待最长序列完成:在静态批处理中,所有序列都必须等待批处理中生成时间最长的序列完成,然后才能进行下一批次的处理。这意味着一旦有一个生成时间较长的序列存在,其他生成时间较短的序列将被迫等待,导致 GPU 的计算资源无法充分利用。这会浪费 GPU 的计算能力,尤其是当一些序列的生成非常快时。 难以释放资源和添加新请求:由于 LLM 推断是一个迭代过程,一些序列可能会在批次中的不同时间点完成生成。这使得难以及时释放已完成生成的序列所占用的资源,并添加新的请求到批次中。如果没有有效的机制来管理这些生成中和已完成的序列,将导致 GPU 资源的浪费和低效利用。 Variance in Generation Output:在静态批处理中,如果不同序列的生成长度差异较大,那么某些序列可能会迅速完成,而其他序列则需要更长的时间。这种差异性会导致 GPU 的部分计算资源一直处于闲置状态,因为它们无法立即用于生成更多的序列。
Q5. 静态批处理何时会低效利用 GPU?请举一个例子来说明,特别是当输入和输出序列的长度不相等时,静态批处理可能会导致什么情况。
输入序列 1(长度为 512)生成的输出序列长度为 20。 输入序列 2(长度为 512)生成的输出序列长度为 30。
输入序列 1 生成的输出序列长度只有 20,但 GPU 在等待序列 2 完成生成之前无法开始下一个批次的处理。这意味着 GPU 会在这段时间内处于空闲状态,无法充分利用其计算资源。 输入序列 2 生成的输出序列长度为 30,但在整个批次处理期间,GPU 只能等待最长的生成过程完成。这导致 GPU 的计算资源被浪费了 10 个 token 的长度。
Q6. 作者提到了连续批处理是一种更高效的方法,相对于静态批处理。请解释一下连续批处理是如何工作的,以及它是如何提高 GPU 利用率的?
动态确定批次大小:与静态批处理不同,连续批处理采用了迭代级别的调度。它并不等待每个序列在批次中完成生成后再进行下一个序列的处理。相反,它在每个迭代中根据需要确定批次的大小。这意味着一旦某个序列在批次中完成生成,就可以立即将一个新的序列插入到相同位置。 提高 GPU 利用率:连续批处理通过更灵活地利用 GPU 的计算资源来提高 GPU 的利用率。在静态批处理中,如果批次中的不同序列的生成长度不同,GPU 会被低效利用,因为它必须等待批次中的所有序列完成生成才能开始下一个批次。而在连续批处理中,一旦一个序列完成生成,就可以立即开始处理下一个序列,从而最大程度地减少了 GPU 的闲置时间。
Q7. 文章中提到了 Orca 是一个首次解决这一问题的论文,它采用了迭代级别的调度。请解释一下迭代级别调度是如何工作的,以及它相对于静态批处理的优势是什么?
更高的 GPU 利用率:在迭代级别调度中,一旦一个序列完成生成,就可以立即开始处理下一个序列。这意味着 GPU 的计算资源得到更高效的利用,不会因为等待批次中的所有序列完成生成而被浪费。 更高的推断吞吐量:由于 GPU 的计算资源得到更充分的利用,相对于静态批处理,迭代级别调度可以实现更高的推断吞吐量,从而加快了整个推断过程的速度。
Q8. 作者提到 Hugging Face 在他们的文本生成推断 LLM 推断服务器中实现了连续批处理。这个实现是如何管理预填充阶段和生成阶段的?有没有提到的超参数 “waiting_served_ratio”?
Q9. 文章中提到了连续批处理、动态批处理和迭代级别调度这些术语都可以用来描述批处理算法,但选择使用了连续批处理。为什么选择了这个术语,以及它与动态批处理和迭代级别调度有什么区别?
连续批处理:连续批处理是一种优化技术,它允许在生成过程中动态地调整批处理的大小。具体来说,一旦一个序列在批处理中完成生成,就可以立即用新的序列替代它,从而提高了 GPU 的利用率。这种方法的关键在于实时地适应当前的生成状态,而不是等待整个批次的序列都完成。 动态批处理:动态批处理也是一种批处理策略,但它通常指的是在训练过程中动态调整批处理的大小,以便更好地利用硬件资源。在推断过程中,动态批处理的意义可能会略有不同,可能是根据当前生成状态来动态调整批处理的大小。 迭代级别调度:迭代级别调度与连续批处理类似,它也是在生成过程中动态调整批处理的大小。但它强调的是调度是以迭代为单位的,也就是说,在每个迭代中决定批处理的大小,而不是随时随地都可以进行调整
参考文献
https://mp.weixin.qq.com/s/bs3puOXFZYg5K-zfyDfpOw
更多阅读
#投 稿 通 道#
让你的文字被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱:hr@paperweekly.site
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧