DeepSpeed-FastGen:通过 MII 和 DeepSpeed-Inference 实现大语言模型的高吞吐文本生成

温馨提示:
本篇文章已同步至"AI专题精讲" DeepSpeed-FastGen:通过 MII 和 DeepSpeed-Inference 实现大语言模型的高吞吐文本生成

摘要

随着大语言模型(LLM)被广泛应用,其部署与扩展变得至关重要,用户对高吞吐量与低延迟的推理服务系统提出了更高的要求。现有的推理框架在应对长提示词任务时难以兼顾这两方面的需求。本文提出 DeepSpeed-FastGen,一个使用全新提示与生成阶段融合策略 —— Dynamic SplitFuse 的系统,相较于最先进的系统(如 vLLM),其实现了最多 2.3 倍的有效吞吐量提升、平均 2 倍的延迟降低,以及最多 3.7 倍的 token 级尾部延迟降低。该系统结合了 DeepSpeed-MII与 DeepSpeed-Inference 的优势,为 LLM 提供了高效且易于使用的推理服务平台。

DeepSpeed-FastGen 拥有先进的实现机制,支持多种模型,提供持久化与非持久化两种部署方式,适用于从交互式会话到长时间运行的各种场景。我们提出了详细的基准评估方法,通过 延迟-吞吐曲线 进行性能分析,并从 负载均衡 的角度探讨了系统的可扩展性。实验表明,在不同模型与硬件配置下,DeepSpeed-FastGen 在吞吐量与延迟方面均有显著改进。我们还讨论了未来的发展计划,包括支持更多模型与新型硬件后端。DeepSpeed-FastGen 的代码已开放,鼓励社区使用与贡献。

1 引言

大型语言模型(LLM)如 GPT-4 [1] 和 LLaMA [2] 已成为广泛应用中的主要算力负载。在从通用聊天模型、文档摘要,到自动驾驶及软件栈各层的 AI 助手等场景中,这类模型的部署与服务需求呈爆发式增长。虽然 DeepSpeed、PyTorch [3] 等框架在 LLM 训练期间通常能够实现较高的硬件利用率,但在推理阶段,尤其是涉及开放式文本生成任务时,由于计算强度较低,交互式应用的本质反而成为吞吐性能的瓶颈。

为此,诸如基于 PagedAttention 的 vLLM [4] 和研究系统 Orca [5] 等框架已经大幅提升了 LLM 推理性能。然而,这些系统仍难以为长提示任务提供稳定的服务质量。随着越来越多的模型(如 MPT-StoryWriter [6])和系统(如 DeepSpeed Ulysses [7])支持扩展到数万个 token 的上下文窗口,长提示任务正变得日益重要。

为了更好地理解问题空间,本文展示了文本生成过程的两个关键阶段:提示处理(prompt processing)生成(generation)。当系统将这两个阶段分别处理时,生成过程会被提示阶段中断,从而有可能破坏服务级别协议(SLA)。

对此,本文提出 DeepSpeed-FastGen,该系统通过所提出的 Dynamic SplitFuse 技术克服上述限制,带来了最高 2.3 倍吞吐提升、2 倍延迟下降,以及 3.7 倍 token 级尾延迟降低,超越了现有最先进系统如 vLLM。DeepSpeed-FastGen 结合 DeepSpeed-MII 与 DeepSpeed-Inference,提供一个易于部署、性能卓越的 LLM 服务平台。

2 相关文献中的 LLM 服务技术

一个文本生成任务通常包括两个阶段:
1)提示处理(prompt processing):将用户提供的文本处理为一个 token 批次,并构建注意力机制所需的 key-value(KV)缓存;
2)token 生成(token generation):每次向 KV 缓存添加一个 token,同时生成下一个 token。

在完整生成一个文本序列的过程中,模型会进行多次前向调用,以逐步生成完整序列。已有文献与系统提出了两类主要技术,以应对这两个阶段中可能出现的各种瓶颈与限制。

2.1 分块 KV 缓存

vLLM 指出,传统 LLM 服务系统使用的大型连续 KV 缓存会导致显著的内存碎片问题,从而严重影响并发性能。为了解决这一问题,vLLM 提出了 PagedAttention [8],使缓存可以为非连续的,从而提高系统总吞吐量。

具体来说,PagedAttention 不再为每个请求分配一个可变大小的连续内存块,而是采用固定大小的块(page)进行存储。通过这种“分块 KV 缓存”方式,消除了因 KV 缓存造成的内存碎片,从而显著提升了系统能够同时服务的序列数量。

非连续 KV 缓存的实现也已在 HuggingFace TGI [9] 和 NVIDIA TensorRT-LLM [10] 中得到采用。

2.2 持续批处理

在早期,为提升 GPU 利用率,系统通常采用 动态批处理(dynamic batching):服务器会等待多个请求到达并同步处理。然而,这种方式存在明显缺陷 —— 要么需要对输入进行填充(pad)使其长度一致,要么会为了组建大批次而阻塞系统。

近期的 LLM 推理研究更注重细粒度调度与内存效率的优化。例如,Orca 提出了 迭代级调度(iteration-level scheduling),也称为 持续批处理(continuous batching),在模型的每次前向调用中都进行独立的调度决策。这种方式允许请求按需加入/离开批次,避免了填充输入的需要,从而提升整体吞吐量。

除了 Orca,NVIDIA TRT-LLMHuggingFace TGIvLLM 等系统也实现了持续批处理。

目前的系统中,持续批处理主要有两种实现方式:

  • TGIvLLM 中,生成阶段可能会被中断以处理提示(在 TGI 中称为 infill),之后才继续生成;
  • Orca 中,不再区分提示处理与生成阶段,只要总序列数未超过预设上限,系统就可将新的提示加入正在运行的批次。

这些策略不同程度上都需要 暂停生成过程 来处理长提示(见第 3.2 节)。

为此,我们提出了一种全新的提示与生成融合策略 —— Dynamic SplitFuse,将在下一节详细讨论。

3 Dynamic SplitFuse:一种新颖的提示与生成融合策略

DeepSpeed-FastGen 构建于 持续批处理(continuous batching) 与 非连续 KV 缓存(non-contiguous KV caches)的基础之上,旨在提升 LLM 在数据中心中的并发率与响应能力,类似于 TRT-LLM、TGI 和 vLLM 等框架。为了在此基础上进一步提升性能,DeepSpeed-FastGen 引入了 SplitFuse 技术,它通过 动态提示与生成的拆解与融合(decomposition and unification),进一步优化持续批处理机制并提升系统吞吐能力。

3.1 三个性能洞察

在介绍 Dynamic SplitFuse 之前,我们先回答三个关键的性能问题,这些问题共同构成了其设计动机。

3.1.1 哪些因素会影响单次前向传递的性能?

为了实现有效的调度,有必要理解调度循环应控制哪些关键的独立变量。我们的观察表明,在一次前向传递中,序列的组成(即序列的 batch size)对性能的影响可以忽略不计,相比之下,前向传递中总的 token 数量才是决定性因素。这意味着,一个高效的调度器只需围绕“前向传递中的 token 数量”这一单一信号进行设计即可。

在这里插入图片描述

3.1.2 模型的吞吐量如何随着前向传递中 token 数量的变化而变化?

一个大型语言模型(LLM)在运行中存在两个主要的性能区域,并且它们之间的过渡相对陡峭:

  • 当 token 数量较少 时,GPU 的瓶颈主要是从内存中读取模型参数,因此吞吐量会随着 token 数量的增加而线性提升;
  • 当 token 数量较多 时,模型的瓶颈转为 计算资源,此时吞吐量趋于饱和,基本保持恒定。

因此,如果所有前向传递操作都处于吞吐量饱和区间,模型就能以极高的效率运行。
在这里插入图片描述

3.1.3 应如何在多个前向传递中调度一组 token?

我们在上文中观察到,对于对齐良好的输入,其 token 吞吐曲线是凹形的,这意味着二阶导数小于或等于 0。举例来说,设 f(x)f(x)f(x) 是一个模型从延迟到吞吐量的凹函数。对于凹函数 f(x)f(x)f(x),以下性质成立:
0≥lim⁡h→0f(x+h)−2f(x)+f(x−h)h20≥f(x+h)−2f(x)+f(x−h)2f(x)≥f(x+h)+f(x−h)\begin{array} { c } { 0 \geq \displaystyle \operatorname* { l i m } _ { h \to 0 } \frac { f ( x + h ) - 2 f ( x ) + f ( x - h ) } { h ^ { 2 } } } \\ { 0 \geq f ( x + h ) - 2 f ( x ) + f ( x - h ) } \\ { 2 f ( x ) \geq f ( x + h ) + f ( x - h ) } \end{array} 0h0limh2f(x+h)2f(x)+f(xh)0f(x+h)2f(x)+f(xh)2f(x)f(x+h)+f(xh)
这表明,对于给定的 2x 个 token,如果希望最大化吞吐量,最优的方式是将它们平均分配到两个 batch 中。更一般地说,在一个系统需要在 F 次前向传递中处理总共 P 个 token 的情况下,理想的划分策略是将这些 token 尽可能平均地分配。

3.2 Dynamic SplitFuse

Dynamic SplitFuse 是一种用于 prompt 处理与 token 生成的新型 token 组合策略。DeepSpeed-FastGen 利用 Dynamic SplitFuse 的策略,在每次前向传播中保持一致的 token 数量,具体方法是将 prompt 中的一部分 token 与生成部分组合在一起处理,从而实现统一的前向尺寸。类似的做法曾在 Sarathi [11] 中被提出,它将 prompt 拆分成更小的块,以便将更多的 token 生成与 prompt 处理结合起来,从而使前向传播保持一致的 batch 大小。

具体而言,Dynamic SplitFuse 执行以下两个关键行为:

  1. 将长 prompt 拆分为更小的块,并分配到多个前向传播(迭代)中,仅在最后一次前向传播中执行生成。
  2. 将短 prompt 组合起来以恰好填满目标 token 配额。即使是短 prompt,也可能被拆分,以确保 token 配额被精确满足,从而实现良好的前向对齐。

这两种技术结合在一起,为用户体验带来了如下显著优势:

  1. 更好的响应性:由于长 prompt 不再需要一次性进行极长的前向传播,模型响应客户请求的延迟降低,在同一时间窗口内可以完成更多的前向传播。
  2. 更高的效率:将短 prompt 融合以达到更大的 token 配额,使模型始终运行在高吞吐率的状态下。
  3. 更低的方差与更强的一致性:由于前向传播的 token 数量保持一致,而前向尺寸是性能的主要决定因素,因此每次前向传播的延迟比其他系统更加稳定,同时生成频率也更可预测。系统中不存在像其他系统中那样的中断或长时间运行的 prompt,从而不会导致延迟激增。正如我们在第 4 节所展示的,这种设计可将生成的 P95 延迟最多降低 3.7 倍。
    在这里插入图片描述
    因此,DeepSpeed-FastGen 会以一种既能快速持续生成,又能增加系统利用率的速率消耗来自输入 prompt 的 tokens,从而相比其他先进的服务系统,为所有客户端提供更低延迟和更高吞吐量的流式生成。

温馨提示:
阅读全文请访问"AI深语解构" DeepSpeed-FastGen:通过 MII 和 DeepSpeed-Inference 实现大语言模型的高吞吐文本生成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92785.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统:操作系统的结构(Structures of Operating System)

目录 简单结构(Simple Structure) 整体式结构(Monolithic Structure) 什么是 Kernel(内核)? 层次结构(Layered Structure) 微内核结构(Microkernel&#x…

Python柱状图

1.各国GDP柱状图2.各国GDP时间线柱状图

FastGPT:企业级智能问答系统,让知识库触手可及

在信息爆炸的时代,企业如何高效管理和利用海量知识?传统搜索和文档库已难以满足需求。FastGPT正成为企业构建智能知识核心的首选。一、FastGPT:不止于问答的智能知识引擎FastGPT 颠覆了传统知识库的局限,其核心优势在于&#xff1…

探索 MyBatis-Plus

引言在当今的 Java 开发领域,数据库操作是一个至关重要的环节。MyBatis 作为一款优秀的持久层框架,已经被广泛应用。而 MyBatis-Plus 则是在 MyBatis 基础上进行增强的工具,它简化了开发流程,提高了开发效率。本文将详细介绍 MyBa…

Hive【安装 01】hive-3.1.2版本安装配置(含 mysql-connector-java-5.1.47.jar 网盘资源)

我使用的安装文件是 apache-hive-3.1.2-bin.tar.gz ,以下内容均以此版本进行说明。 以下环境测试安装成功: openEuler 22.03 (LTS-SP1)系统 MySQL-8.0.40 1.前置条件 MySQL数据库 我安装的是 mysql-5.7.28 版本的,安装方法可参考《Linux环境…

璞致 PZSDR-P101:ZYNQ7100+AD9361 架构软件无线电平台,重塑宽频信号处理范式

璞致电子 PZSDR-P101 软件无线电平台以 "异构计算 宽频射频 工业级可靠性" 为核心设计理念,基于 Xilinx ZYNQ7100 处理器与 ADI AD9361 射频芯片构建,为工程师提供从 70MHz 到 6GHz 的全频段信号处理解决方案。无论是频谱监测、无线通信原型…

【基础】go基础学习笔记

基础及关键字if for switch都支持使用隐形声明(:)来快速声明一个变量,无需在上面一行额外声明,这可以增加代码简洁性,但不太符合其他常规语言的写法,需要习惯一下if for switch都不需要使用(&am…

AI驱动的企业知识管理革新

Baklib:人工智能引领的知识管理平台Baklib 是领先的 AI 驱动知识管理系统,专为企业打造智能化、模块化的知识共享平台。功能覆盖在线帮助中心、内联网、CMS 网站、客户支持系统、视频中心、活动教学平台和客户社区,全面提升组织在知识管理、员…

使用 FFmpeg 实现 RTP 音频传输与播放

🔊 使用 FFmpeg 实现 RTP 音频传输与播放(Ubuntu) 在音视频开发或远程通信场景中,RTP(Real-time Transport Protocol) 是一种常用的实时音频传输协议。本文将介绍如何使用 FFmpeg 在 Ubuntu 上实现从一台主…

Android 导出联系人为 vCard(.vcf)

有时需要将联系人数据导出为可共享的标准格式:vCard(.vcf)格式,可被系统直接导入通讯录一、导出联系人为 vCard(.vcf)✅ 支持字段我们支持导出的字段包括:姓名个人电话家庭电话工作电话邮箱备注…

大模型-bacth之chunked prefills

一、chunked prefills 1.1 chunked prefills核心思想 ORCA虽然很优秀,但是依然存在两个问题:GPU利用率不高,流水线依然可能导致气泡问题。 我们来看sarathi-serve做的一个实验。左右两图分别刻画了在不同的batch size下,prefil…

multiprocessing模块使用方法(一)

结合Python代码示例说明multiprocessing模块的使用方法、Linux启动命令、服务部署及真实应用场景:一、multiprocessing基础用法 Python的multiprocessing模块通过创建子进程实现并行计算,核心步骤如下(引用):创建进程对…

vector如何判断应该扩容?

std::vector 的扩容机制是 C 容器性能优化的一个核心点。它的判断标准、行为特征和实现细节如下所示:✅ 一、vector 的核心结构 std::vector 内部维护三个指针: begin -> 指向数据起始位置 end -> 指向当前已使用的元素末尾(size…

ICMP考点

在网络工程师、运维工程师、安全工程师等岗位的面试中,​​ICMP(Internet Control Message Protocol,互联网控制报文协议)​​ 是高频必考知识点。ICMP作为IP协议的“辅助协议”,虽然不直接传输用户数据,但…

服务器带宽具体是指什么意思?

企业在选择服务器租用或托管服务时,需要根据自身的业务情况来选择合适的服务器带宽,以便于能够让其业务持续稳定的运行工作,做到及时响应用户的访问请求,但是很多用户对于带宽一词没有过多的概念,本文就来探讨一下服务…

CANape之ASAP2 Studio介绍

提到ECU的测量标定工具,很多小伙伴第一个想到的就是CANape。但其实,除了强大的测量标定功能之外,CANape还有很多其他功能。例如,CANape中集成的小工具——ASAP2 Studio,其支持对A2L文件(由ASAM组织所定义&a…

【debug日记】MONAI SwinUNETR 目标检测项目调试总结(AI自动总结)

MONAI SwinUNETR 目标检测项目调试总结 日期: 2025年7月25日 项目: 使用 MONAI,以预训练的 SwinUNETR 为骨干网络,微调 RetinaNet 进行3D肺结节检测。 本文档旨在记录在项目配置、数据处理和模型训练过程中遇到的一系列问题及其解决方案,作为…

AI同传领域,字节跳动与科大讯飞激战进行时

在AI同声传译市场,行业巨头科大讯飞长期占据主导地位,但新晋玩家字节跳动正以迅猛姿态发起挑战。7月24日,字节旗下火山引擎正式发布豆包同声传译模型 Seed LiveInterpret 2.0,主打“人类级延迟”和“0样本声音复刻”,试…

[C++]string::substr

string substr (size_t pos 0, size_t len npos) const;substr() 主要功能是复制(截取更准确)子字符串,要求从指定位置 pos 开始,并具有指定的长度 len 。如果没有指定长度或者超出了源字符串的长度,则子字符串将延续…

KNN算法:从原理到实战全解析

一 算法介绍 K近邻(K-Nearest Neighbors, KNN)是一种基于实例的监督学习算法,适用于分类和回归任务。其核心思想是通过计算待预测样本与训练集中样本的距离,选取距离最近的K个邻居,根据这些邻居的标签进行投票&#xf…