大语言模型调度(LLM scheduling)是优化大语言模型(LLM)推理性能的关键技术,对提高资源利用率和降低延迟至关重要。然而,LLM 调度面临诸多挑战:模型规模庞大、计算需求动态变化、任务要求多样、硬件资源有限等。有效的 LLM 调度需要综合考虑模型特性、硬件能力和应用需求,是一个复杂的多目标优化问题。
为应对这些挑战,NVIDIA 提供的 LLM 推理加速库
TensorRT-LLM
对 In-flight Batching, StreamingLLM,投机采样(draft-model 和 Medusa),P/D 分离等先进部署优化技术进行了实现。
图 1. SOTA LLM 的 API 定价与技术优化
当前 SOTA(State-of-the-Art)LLM 的 API 定价参差不齐,如图一左侧【1】所示,涵盖国内外各商业公司大部分稠密和稀疏的 LLM。例如,DeepSeek-V2 模型,其每百万 token 的输入和输出价格仅为 0.14 美元和 0.28 美元,相当于人民币 1 元和 2 元。
图一右侧【2】显示 DeepSeek-V2 在下游任务中的 MMLU 评分高达 78 左右,与 Llama3-70B 等大型稠密模型相当,但在实际推理过程中激活的参数量减少约三分之一。
支撑这一低价策略的技术关键点包括:
-
模型创新
:DeepSeek-V2 对 Attention 机制进行了改进,采用 MLA 代替传统 Attention,大幅减少 KV Cache 显存占用,允许更大 batch size 和更高吞吐量。此外,它优化了 MoE 结构,采用了 DeepSeek MoE 架构。
-
LLM 调度优化
:如后文所述的 StreamingLLM、投机采样(Speculative Decoding)、P/D 分离(Prefill/Decoder Disaggregated Serving)等方法。
除了模型和内核层面的优化,还可以通过以下几种方法进一步提升 LLM 服务性能:
-
In-flight Batching
:通过合并多个请求形成更大的批次,提高 GPU 效率。在 TensorRT-LLM 中,这一技术被称为 In-flight Batching,业界类似的实践称为 Continuous Batching。
-
StreamingLLM
:支持无限长度的输入和输出处理,本文将探讨其对吞吐量和性能的影响。
-
投机采样(Speculative Decoding)
:一次性预测多个 tokens,随后由模型验证是否符合预期。这解决了当前生成阶段每次只能输出单个 token 的低效问题。
-
P/D 分离(Prefill/Decoder Disaggregated Serving)
:聚焦于面向 KV Cache 管理的 LLM 服务。这是 2023 年末出现的相关研究,如北大、阶跃星辰和加州大学圣地亚哥分校团队发布的论文《DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving》,以及近期月之暗面和清华大学团队发布的论文《Mooncake: A KVCache-centric Disaggregated Architecture for LLM Serving》。
本文选用了几项对性能至关重要的特性,并利用 TensorRT-LLM 实现了这些技术。这意味着所有提到的功能都可以在使用 TensorRT-LLM 时直接启用,通过简单的配置即可获得显著的性能提升。
LLM 调度方法一:
In-flight Batching
图 2. In-flight Batching 技术
In-flight Batching 是一种成熟的优化技术,已在 2024 年第一季度成为主流引擎的标准配置。它的核心价值在于提升请求处理效率。
-
传统 Static Batching 缺点
:如图二右侧所示,Static Batching 方法导致 GPU 在处理完单个请求后出现空闲(灰色部分),同时所有请求必须完成计算后才能返回结果,增加了端到端延迟,并且 Kernel 执行效率不高。
-
In-flight Batching 优势
:通过持续调度已完成计算的请求,GPU 几乎没有空闲时间,资源利用率大大提高。完成计算的请求可以立即返回结果,并迅速调度新的请求进入处理队列。除了 Multi-Head Attention (MHA) 需要特殊处理外,大多数运算(如 GEMM)能在批次内高效完成。
-
效果
:In-flight Batching 的效果受请求分布 QPS 和输入 ISL 长度分布的影响。在实际生产环境中,通常能带来大约 2 至 3 倍的吞吐量提升。
图 3. 基于 TensorRT-LLM 实现的 StreamingLLM
-
概述
:StreamingLLM 支持近乎无限长度的输入和输出,输出可以持续不断地以 token 形式返回结果,无需限制长度。
-
工作原理
:基于 KV Cache 的优化,在 Context 阶段计算 KV Cache,在 Generation 阶段利用 KV Cache 预测新 token。通过存储初始几个 token(sink token)的 KV Cache 信息解决超长序列处理中的内存瓶颈问题。
-
滑动窗口机制(sliding window)
:针对超长序列,仅保留与当前预测 token 相关的最近几个 token 的 KV Cache 信息。这可能导致下游任务性能下降,而 StreamingLLM 通过 KV Cache 优化保持稳定的 log PPL。
-
性能提升
:图三右下方图表显示,Llama2-7B 在不同方案下的吞吐量显著提升。TensorRT-LLM + StreamingLLM 通过类似滑动窗口的机制,降低 KV Cache 大小,提高了 Generation 阶段的吞吐量。
LLM 调度方法三:
投机采样 - Draft-Model 和 Medusa
图 4. 大模型验证 draft-model 的 token 采样
结合小模型(draft-model)的速度与大模型(target-model)的准确性,实现性能与准确性的平衡。以 draft_length=5 举例,第一步是小模型对原始输入执行 1 次 Context 阶段和 4 次 Generation 阶段,输出 5 个候选 token 及其对应的 logits 向量,然后将原始输入和这 5 个候选 token 一起输入大模型,执行 1 次 batch_size=6 的 Context 阶段,输出 6 个 logits 向量。这里前 5 个 logits 向量用于与小模型输出的 5 个 logits 向量作逐一比较,决定接受或拒绝小模型生成的 5 个 token,若小模型生成的 5 个 token 都被大模型接受了,那么对大模型输出的最后一个 logits 也进行采样,生成第 6 个 token。最后将原始输入和被接受的 token 拼接作为下一轮投机采样的小模型输入,循环进行生成。这种方法能够在保证生成 token 服从大模型预测分布的情况下,借由小模型的快速推理、以及 KV Cache reuse 等特性,显著提升生成速度。
-
验证逻辑(具体见图四)
:对采样出的候选词(比如 greedy-search 下选了 logits 值最高的 token),如果大模型的预测概率 q(x) 大于等于小模型的预测概率 p(x),则接受该 token;否则,仅有一定概率接受该 token,或从大模型中重新采样。图四示例显示,大模型接受前两个候选 token("dogs"和"love"),拒绝第三个 token("chasing"),并且大模型采样出 "sleeping" 替代,后续的候选 token("after"和"cars")被丢弃,最终本轮生成输出为 "Dogs love sleeping"。
图 5. 基于 TensorRT-LLM 的 draft-model 方法的
Benchmark,此图不代表官方最佳性能