专栏名称: 吃果冻不吐果冻皮
专注于AI工程化(LLM、MLOps、LLMOps、RAG、Agent)落地。
目录
相关文章推荐
51好读  ›  专栏  ›  吃果冻不吐果冻皮

基于 NVIDIA TensorRT-LLM 的大语言模型调度方法

吃果冻不吐果冻皮  · 公众号  ·  · 2024-08-26 11:55

正文

【点击】 加入大模型技术交流群

大语言模型调度(LLM scheduling)是优化大语言模型(LLM)推理性能的关键技术,对提高资源利用率和降低延迟至关重要。然而,LLM 调度面临诸多挑战:模型规模庞大、计算需求动态变化、任务要求多样、硬件资源有限等。有效的 LLM 调度需要综合考虑模型特性、硬件能力和应用需求,是一个复杂的多目标优化问题。


为应对这些挑战,NVIDIA 提供的 LLM 推理加速库 TensorRT-LLM 对 In-flight Batching, StreamingLLM,投机采样(draft-model 和 Medusa),P/D 分离等先进部署优化技术进行了实现。


SOTA LLM 的 API 定价与技术优化


图 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 等大型稠密模型相当,但在实际推理过程中激活的参数量减少约三分之一。


支撑这一低价策略的技术关键点包括:


  1. 模型创新 :DeepSeek-V2 对 Attention 机制进行了改进,采用 MLA 代替传统 Attention,大幅减少 KV Cache 显存占用,允许更大 batch size 和更高吞吐量。此外,它优化了 MoE 结构,采用了 DeepSeek MoE 架构。


  2. 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 倍的吞吐量提升。


LLM 调度方法二:

StreamingLLM


图 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 方法

结合小模型(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 等特性,显著提升生成速度。


  • 工作流程 :小模型执行 Context 和 Generation 阶段,预测多个候选 token,大模型仅执行 Context 阶段验证和筛选这些候选 token。

  • 验证逻辑(具体见图四) :对采样出的候选词(比如 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,此图不代表官方最佳性能


  • 性能测试 :图五展示了基于 TensorRT-LLM 的 draft-model 方法的 benchmark,如使用最新版本的 TensorRT-LLM,可以获得更佳的结果。表中使用了 7B/13B 的模型组合,测试了 FP8 量化以及 FP16 半精度下,不同输入长度、不同输出长度、不同 draft_length 下 draft-model 性能。右侧的彩色区域显示了采用 draft-model 相较于 baseline(仅使用大模型)的加速比。颜色越绿,表示加速比越高,从表中可见,平均加速比约为 1.5 倍,最大达约 2 倍。经验上,大小模型尺寸差异越大,输出长度越大,接受率越高,则加速效果越明显,这一提升远超常规 kernel 优化所能达到的效果。


图 6. Medusa 方法

  • Medusa 方法

    解决了 draft-model 方法的两大痛点:无需维护两个独立模型和承担模型之间的调度开销,无需选择 draft-model。Medusa 的核心思想是在单个模型中实现多头输出,类似于神话中的多头女妖。


  • 工作流程 :在 Transformer 层之上将原有的 1 个 LM head 扩展为多个 LM head,且每个 LM head 可以一次性预测 top K 个 token。例如当 LM head 数量=4,K=1 时,如果 LM head 预测的 token 全部被接受,那么理论上一次 forward 最多可以产生 5 个 tokens(除了第一个 iteration),token 输出效率有很大提升。



    图 7. 2024 年 6 月完成的基准测试,不代表官方最佳性能

  • 效率提升 :图七的测试使用不同参数规模的 Vicuna 模型(7B、13B、33B),在保持输入输出长度不变前提下,调整了不同的 batch size 和 TP size。此外,测试基于 FP16 作为基准,在 Hopper 架构上测试了 FP8 量化的效果,同时启用了 Medusa 特性。图七右侧图表颜色越红,代表加速比越高,测试结果显示,性能提升最高可达 3.67 倍,这是一个显著的成就。







请到「今天看啥」查看全文