1分离式架构

1.1 DistServe

DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving

DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving 讲的是一个将prefill和decoding分离的实现。

论文地址: https://arxiv.org/pdf/2401.09670

代码实现: https://github.com/LLMServe/DistServe

DistServe通过分离预填充和解码计算来提高大型语言模型(LLM)的性能。现有的LLM服务系统将这两个阶段放在一起,并批量处理所有用户和请求的预填充和解码计算。我们发现,这种策略不仅会导致强烈的预填充-解码干扰,还会将两个阶段的资源分配和并行计划耦合在一起。LLM应用程序通常强调每个阶段的个体延迟:预填充阶段的首个token时间(TTFT)和解码阶段每个请求的每个输出token时间(TPOT)。在严格的延迟要求下,现有系统必须优先考虑一个延迟,或者过度配置计算资源以同时满足两者。DistServe将预填充和解码计算分配给不同的GPU,从而消除了预填充-解码干扰。根据应用程序的TTFT和TPOT要求,DistServe为每个阶段定制了资源分配和并行策略的共同优化策略。DistServe还根据服务集群的带宽将这两个阶段放置在一起,以最小化由分解引起的通信。结果,DistServe在每个GPU上在TTFT和TPOT约束下提高了LLM服务性能的最大速率。我们的评估结果显示,在各种流行的LLM、应用程序和延迟要求上,与现有技术系统相比,DistServe可以提供7.4倍的请求量或12.6倍的更严格的SLO(Service Level Objective),并且仍然在90%以上的请求中满足延迟约束。

一个有效的LLM服务系统应该平衡这些需求,并最大化每个GPU的吞吐量,即在满足SLO达成目标(例如90%)的前提下可以提供的最大请求速率-更高的每个GPU吞吐量直接转化为更低的每个查询成本。由于预填充和解码阶段共享LLM权重和工作内存,现有的LLM服务系统通常将这两个阶段放在一起并通过批量处理预填充和解码步骤来最大化整个系统的吞吐量-跨所有用户和请求生成的token数每秒。然而,为了满足延迟要求,我们发现这些系统必须过度配置计算资源。为了看到这一点,图1说明了在使用现有系统[27]为13B LLM提供服务时,随着请求率的增加,P90 TTFT和TPOT如何变化,其中工作负载模式和两个延迟约束设置以模拟使用LLM为文章生成简短摘要。在满足90%的SLO达成率的情况下,单个A100 GPU的最大可实现吞吐量,受到TTFT和TPOT要求中较严格要求的限制,约为1.6个请求每秒(rps。当每个阶段在不同的GPU上独立进行时,性能有显著差异,如橙色和绿色曲线所示,预填充阶段的每个GPU吞吐量为5.6 rps,解码阶段为10 rps。理想情况下,通过为预填充分配2个GPU和解码分配1个GPU,我们可以有效地提供模型的总体吞吐量为10 rps,或者每个GPU平均为3.3 rps,比现有系统高2.1倍吞吐量差距主要源于预填充和解码的共同放置-两个具有非常不同计算特征和延迟要求的阶段。

 

也就是说在实现相同的TTFT的要求下,一个GPU单独prefill的情况下可以实现每秒5.6 个请求,而prefilling和decode都在一个GPU的llm 系统,只能达到1.6个rps.

在实现相同的TPOT的要求下,一个GPU单独decode的情况下可以实现每秒10 个请求,而prefilling和decode都在一个GPU的llm 系统,只能达到1.6个rps.

  1. 首先,放置在一起会导致强烈的预填充-解码干扰。预填充步骤通常比解码步骤花费更长的时间。当批量处理在一起时,批处理中的解码步骤会被预填充步骤延迟,显著延长其TPOT;同样,解码步骤的包含导致TTFT的显着增加,如图2所示。即使我们将它们分别安排,问题仍然存在,因为它们开始竞争资源。等待GPU执行的解码任务由于正在进行的预填充任务而增加了排队延迟,反之亦然。优先安排一个阶段可能会导致无法满足另一个阶段的延迟。

2.  预填充和解码计算在延迟要求和对不同形式并行性的偏好上有所不同。然而,放置预填充和解码,会耦合它们的资源分配,并阻止实现更适合满足每个阶段特定延迟要求的不同并行性策略。

通过将LLM推理的预填充和解码阶段分离,将它们分配给不同的GPU。我们的方法有两个好处。

  1. 首先,将每个阶段独立地在不同的GPU上运行可以消除预填充-解码干扰。

  2. 其次,它允许根据各自的延迟要求,通过量身定制的资源分配和模型并行性策略,独立地扩展每个阶段。虽然分解会导致在GPU之间通信中间状态,但我们展示了在现代GPU集群中,适当管理时,通信开销是微不足道的,并且分解显著提高了每个GPU的吞吐量。

作者构建了DistServe,一个通过分离预填充和解码阶段来优化吞吐量的LLM服务系统。给定TTFT和TPOT要求:

  1. DistServe首先通过共同优化预填充和解码阶段的GPU分配和并行性策略,假设只提供单个模型副本,来独立地扩展每个阶段。这种优化确保最大化每个GPU的吞吐量,并根据各自的延迟要求可能为每个阶段分配不同数量的GPU和并行性策略。

  2. DistServe通过复制将此分配扩展到多个实例,直到满足用户所需的流量率。

  3. DistServe还具有一种算法,根据其分配方案和集群的带宽,将预填充和解码计算放置在一起,以最小化阶段之间通信的开销。

  4. DistServe实现为LLM推理引擎的编排层。我们使用各种LLM对DistServe进行评估,根据三个重要的现实世界LLM应用程序调整工作负载:聊天机器人、编程助手和文档摘要。与现有解决方案相比,DistServe在延迟约束下可以提供高达4.48倍的请求量。

  5. 使用术语"实例"来表示管理完整模型权重副本的资源单元。当应用模型并行性时,一个实例可以对应多个GPU。需要注意的是,当我们将两个阶段分离到不同的GPU上时,每个阶段管理其自己的模型权重副本,从而产生prefilling实例和decode实例。prefilling实例在接收到请求后,仅执行该请求的prefilling计算以生成第一个输出令牌。然后,它将中间结果(主要是KV缓存)发送到decode实例,decode实例负责后续的解码步骤。由于decode计算通常具有较低的GPU利用率,我们可以为decode实例分配多个prefilling实例。这样可以批处理更多的解码作业,以实现更高的GPU利用率。分离预填充和解码自然地解决了两个阶段之间的干扰,并使每个阶段都能专注于其优化目标 - TTFT或TPOT

调度策略:

DistServe的运行时架构如上图所示。DistServe采用简单的FCFS调度策略运行。所有传入的请求都到达一个集中式控制器,然后根据prefilling处理队列的最短的原则,分派到相应的prefilling实例进行处理,然后再分派到最负载最轻的解码实例进行解码。尽管这种设置简单,但是它经过了几个关键的增强,以适应现实世界工作负载的特点。

 

 

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

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

相关文章

02.SpringBoot常用Utils工具类详解

文章目录 1. BeanUtils详解1.1 什么是BeanUtils?1.2 主要的BeanUtils实现1.2.1 Spring BeanUtils1.2.2 Apache Commons BeanUtils1.2.3 其他实现 1.3 Spring BeanUtils详细使用1.3.1 基本用法1.3.2 指定忽略属性1.3.3 批量拷贝(列表转换) 1.4…

Golang快速开发框架——项目立项与系统配置读取组件viper(一)

Golang快速开发框架——项目立项与系统配置读取组件viper(一) 背景 知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分…

打造可观测的 iOS CICD 流程:调试、追踪与质量保障全记录

随着iOS项目复杂度增加,团队越来越依赖自动化构建、自动化测试等CI/CD流程来保证产品质量。但CI/CD环境下,很多线下调试手段无法直接使用,比如: 无法手动连真机跑Instruments测试包只在分发后才能拿到崩溃模拟器上表现和真机不一…

C++11中 <cinttypes>的入门与精通

文章目录 一、<cinttypes> 是什么1. 固定宽度的整数类型2. 整数操作函数3. 格式化输入输出宏 二、深入理解 <cinttypes>1. 固定宽度整数类型的使用2. 整数操作函数的使用3. 格式化输入输出宏的使用 三、实践和技巧1. 使用固定宽度整数类型的最佳实践2. 使用整数操作…

Pytorhc Lightning进阶:一篇实例玩转Pytorhc Lightning 让训练更高效

Pytorhc Lightning进阶&#xff1a;一篇实例玩转Pytorhc Lightning 让训练更高效 Pytorhc Lightning 主要包含以下几大类&#xff0c;主要围绕以下讲解&#xff1a; 模型&#xff0c;PyTorch Lightning 的核心是继承 pl.LightningModule数据&#xff0c;数据模块继承pl.Light…

大模型算法面试笔记——注意力Transformer流程/面试题篇

学习资料来源于字母站大学 1 Transformer架构 基于编码器-解码器的架构来处理序列对。跟使用注意力的seq2seq不同&#xff0c;Transformer是基于纯注意力。 2 注意力 2.1 自注意力机制 使用注意力&#xff1a;需要根据整个序列进行预测&#xff0c;对于同一input&#xf…

Rust 定义与实例化结构体

文章目录 Rust 定义与实例化结构体5.1 结构体的定义与意义5.2 结构体实例化5.2.1 基本实例化5.2.2 可变性规则5.2.3 字段初始化简写5.2.4 结构体更新语法 5.3 特殊结构体类型5.3.1 元组结构体&#xff08;Tuple Struct&#xff09;5.3.2 类单元结构体&#xff08;Unit-Like Str…

ELK日志分析系统(filebeat+logstash+elasticsearch+kibana)

一、ELK 平台介绍 1、ELK 概述 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措施纠正错误。…

JS基础4—jQuery

jQuery常用内容 jQuery 介绍jQuery 获取方式基本选择器 (最常用)层级选择器 (基于元素间关系)过滤选择器 (基于特定条件) jQuery事件绑定jQuery 方法调用jQuery遍历jQuery 获取与设置jQuery 添加与删除jQuery CSS 类jQuery - AJAX 总结 jQuery 介绍 jQuery 是一个轻量级、快速…

时钟周期是什么?

时钟周期&#xff08;Clock Cycle&#xff09;是什么&#xff1f; 时钟周期&#xff08;Clock Cycle&#xff09;是计算机系统中一个最基础的时间单位&#xff0c;也称为时钟节拍或时钟周期时间&#xff08;Clock Period&#xff09;。它由系统时钟发生器产生的一个周期性脉冲…

如何用SEO优化长尾关键词?

内容概要 在SEO优化领域&#xff0c;长尾关键词扮演着至关重要的角色&#xff0c;它们能有效提升网站在搜索引擎中的可见度和流量转化率。本文将全面解析如何通过系统方法优化长尾关键词&#xff0c;涵盖从基础理论到实战应用的完整流程。核心内容包括利用专业工具进行关键词挖…

电子面单系统开发全解析

一、如果要做电子面单系统&#xff0c;怎么做&#xff1f; 开发电子面单系统是一项复杂且涉及多方面考量的工程&#xff0c;涵盖需求分析、系统架构设计、技术选型、接口对接、安全性保障、第三方服务选择以及部署与维护等关键环节。 电子面单系统开发步骤 需求分析&#xf…

UE5 - 制作《塞尔达传说》中林克的技能 - 18 - 磁力抓取器

让我们继续《塞尔达传说》中林克技能的制作!!! UE版本:5.6.0 VS版本:2022 本章节的核心目标:磁力抓取器 先让我们看一下完成后的效果: 18_磁力抓取器 大纲如下: 引言功能架构与核心逻辑物理材质与场景配置代码实现:从识别到操控操作说明1.引言 在《塞尔达传说》中,林…

基于ApachePOI实现百度POI分类快速导入PostgreSQL数据库实战

目录 前言 一、百度POI分类简介 1、数据表格 2、分类结构 二、从Excel导入到PG数据库 1、Excel解析流程 2、数据入库 3、入库成果及检索 三、总结 前言 在上一篇博文中&#xff0c;我们对高德POI分类进行了深入剖析 并对Excel 中 POI 分类数据的存储结构特点进行了详细介…

学习经验分享【41】YOLOv13:基于超图增强自适应视觉感知的实时目标检测

YOLO算法更新速度很快&#xff0c;已经出到V13版本&#xff0c;后续大家有想发论文或者搞项目可更新自己的baseline了。 摘要&#xff1a;YOLO 系列模型凭借其卓越的精度和计算效率&#xff0c;在实时目标检测领域占据主导地位。然而&#xff0c;YOLOv11 及早期版本的卷积架构&…

Handling outliers in non-blind image deconvolution论文阅读

Handling outliers in non-blind image deconvolution 1. 研究目标与实际意义2. 创新方法:基于EM的异常值建模2.1 新模糊模型2.1.1 目标函数2.2 EM框架:迭代优化二元掩码2.2.1 E步:计算后验权重 E [ m x ] E[m_x] E[mx​]2.2.2 M步:加权正则化反卷积2.3 优化加速技术2.3.1…

Redis 功能扩展:Lua 脚本对 Redis 的扩展

Redis 是一个高性能的内存数据库&#xff0c;支持多种数据结构&#xff0c;如字符串、哈希、列表、集合和有序集合。为了增强其功能&#xff0c;Redis 引入了 Lua 脚本支持&#xff0c;使开发者可以编写自定义的脚本&#xff0c;确保操作的原子性并提高复杂操作的性能。本文将详…

七天学完十大机器学习经典算法-06.支持向量机(SVM):分类边界的艺术——深入浅出指南

接上一篇《七天学完十大机器学习经典算法-05.从投票到分类&#xff1a;K近邻(KNN)算法完全指南》 想象你要在操场上为两个班级划活动区域&#xff0c;如何画出一条最公平的分界线&#xff1f;这条线不仅要分开两班学生&#xff0c;还要让两个班都离分界线尽可能远——这就是支持…

python如何安装PyQt6-stubs依赖包

PyQt6-stubs 是为 PyQt6 提供类型提示&#xff08;Type Hints&#xff09;和 IDE 智能补全支持的第三方补丁包&#xff0c;特别适用于 PyCharm、VS Code 等现代 IDE。它对开发者在编码时帮助极大。 一、安装方法 需要提前安装好git&#xff0c;然后克隆PyQt6-stubs源码&#xf…

创宇智脑 MCP 赋能 AiPy,IP 风险调查效率实现 10 倍飞跃,威胁分析一键生成

还记得上个月那个焦头烂额的凌晨三点吗&#xff1f;监控大屏突然疯狂闪烁&#xff0c;500 多个 IP 地址同时出现异常访问&#xff0c;密密麻麻的数据流在屏幕上跳动&#xff0c;像极了一张让人窒息的大网。我和团队成员瞪着布满血丝的眼睛&#xff0c;手动排查每一个 IP&#x…