SGlang 推理模型优化(PD架构分离)

一、技术背景

随着大型语言模型(LLM)广泛应用于搜索、内容生成、AI助手等领域,对模型推理服务的并发能力、响应延迟和资源利用效率提出了前所未有的高要求。与模型训练相比,推理是一个持续进行、资源消耗巨大的任务,尤其在实际业务中,推理服务需要同时支持大量用户请求,保证实时性和稳定性。

在传统架构中,LLM 的输入处理(Prefill)和输出生成(Decode)阶段往往混合部署在同一批 GPU 上。这种“统一架构”虽然实现简单,但很快暴露出严重的性能瓶颈和资源调度困境:Prefill 阶段计算密集、耗时长,容易阻塞 Decode 阶段对低延迟的需求,导致整体吞吐和响应速度下降;而 Decode 阶段则受制于 KV Cache 带宽和访问延迟,难以并发扩展

二、PD 分离介绍讨论

2.1 Prefill阶段:特征与计算需求

Prefill阶段负责并行处理输入提示中的所有词元,生成第一个输出词元,并计算初始的键值缓存 (Key-Value Cache, KV Cache) 。其主要特征是计算密集型 (computationally intensive),通常受限于计算资源 (compute-bound),尤其是在处理较长提示时。在此阶段,模型对输入序列中的每个词元进行并行计算,通常涉及大规模的矩阵-矩阵运算,能够充分利用GPU的并行计算能力,甚至使其达到饱和状态。

2.3 Decode阶段:特征与计算需求

Decode阶段以自回归的方式逐个生成后续的输出词元。在Decode的每一步中,模型仅处理最新生成的那个词元,并结合先前存储在KV Cache中的上下文信息来预测下一个词元。与Prefill阶段不同,Decode阶段每个词元的计算量相对较小,但其主要瓶颈在于内存带宽 (memory-bandwidth-bound) 。这是因为每个解码步骤都需要频繁访问和读取不断增长的KV Cache,涉及的操作主要是矩阵-向量运算。尽管只处理一个新词元,但其对模型权重和KV Cache的I/O需求与Prefill阶段相似。Decode阶段可以看作是“逐字逐句地续写回应”的过程

2.4. KV Cache 机制

KV Cache 是 LLM 高效推理的核心技术。它将每个词元在 Transformer 计算中生成的 Key 和 Value 向量缓存到 GPU 显存,避免重复计算,大幅提升生成效率。

  • Prefill 阶段:为所有输入词元批量生成 KV Cache,计算密集型、强并行。

  • Decode 阶段:每生成一个新词元,都会增量更新 KV Cache,并频繁读取全部缓存内容,这使得 Decode 主要受内存带宽限制。

KV Cache 的容量会随着输入和生成序列的长度线性增长,是 GPU 显存消耗的主要来源。自回归生成的顺序性决定了 Decode 难以高并发,访问 KV Cache 的效率成为系统瓶颈。高效的 KV Cache 管理和分阶段调优是优化大模型推理的关键。

2.4 统一架构的局限性(PD Fusion)

实现相对简单,无需复杂的跨节点通信,Prefill (计算密集) 和 Decode (内存密集) 两个阶段的资源需求和计算特性差异大,在同一组GPU上运行时容易相互干扰,导致GPU资源利用率不均衡。例如,Prefill 可能会抢占 Decode 的计算资源,导致 Decode 延迟增加;或者为了 Decode 的低延迟,Prefill 的批处理大小受限。

2.5 PD 分离式系统 (PD Disaggregation)

优点:

  • 消除干扰: Prefill 和 Decode 在独立的硬件资源池中运行,避免了相互的性能干扰。

  • 资源优化: 可以为 Prefill 阶段配置计算密集型硬件,为 Decode 阶段配置内存密集型硬件,从而更有效地利用资源。

  • 独立扩展: 可以根据 Prefill 和 Decode 各自的负载情况独立扩展资源。

  • 提升吞吐量和效率: 通过上述优化,通常能实现更高的系统总吞吐量。

缺点:

  • KV Cache 传输: 在 Prefill 阶段计算完成的 KV Cache 需要传输到 Decode 节点,这个过程会引入额外的延迟和网络开销,是 PD 分离架构需要重点优化的环节。

  • 调度复杂性: 需要一个全局调度器来协调 Prefill 和 Decode 任务的分发和管理。

三、kv 缓存分析

3.1 直传 KV 缓存

通过高速互联(如 NVIDIA NCCL、NVLink、Infiniband 等)在多 GPU 之间直接传递 KV 缓存,无需落盘或经过主机内存。

  • 优点:延迟极低、带宽极高,非常适合同机或高速互联环境下多 GPU 间的数据交互。

  • 典型场景:Prefill 生成 KV 后,直接推送到 Decode GPU,适合高性能集群内部。

3.2 LMCache

利用独立的 KV 缓存服务(如 LMCache),在集群节点间通过高性能网络或主机内存中转和管理 KV 数据。

  • 优点:跨主机节点灵活,缓存可设定有效期,支持异步读写,适合中大型分布式环境。

  • 典型场景:Prefill 结果写入 LMCache,Decode 阶段可在任意节点拉取所需 KV 缓存,实现解耦与弹性扩缩容。

3.3 共享缓存磁盘

将 KV 缓存写入分布式文件系统或本地共享存储(如 NFS、Ceph、HDFS),供多节点共享访问。

  • 优点:实现跨节点持久化、可恢复,可用于极大规模或需要历史缓存复用的场景。

  • 缺点:读写延迟和带宽通常劣于显存直传和内存缓存,仅适合低频访问或大规模冷数据。

  • 典型场景:大规模集群、节点动态加入/重启恢复等需持久化的情况。

3.4 多级缓存

多级缓存是为最大化缓存命中率、降低延迟、平衡成本和容量而设计的一套分层缓存体系,广泛应用于高性能分布式大模型推理服务中。其核心思想是:优先在最快速的存储介质中查找和存取 KV 数据,逐层回退至更慢但容量更大的存储层。

四、SGlang PD 分离实战

4.1 基础环境准备

1) GPU 服务器

这里直接选择单卡双卡/H800配置测试

2) NCCL 通信网卡

# 查看可用于nccl通信的网卡 在SGlang地方需要指定网卡
ibdev2netdev

3) 推理模型环境

这里为了测试方便我直接采用sglang[all]全部下载。如果有需要可以按需下载各个组件

pip install sglang[all]
pip install mooncake-transfer-engine

4) 基础模型准备

4.2 推理模型部署

1) prefil 服务启动

CUDA_VISIBLE_DEVICES=0 python -m sglang.launch_server \--model-path /data/public/model/qwen2.5/qwen2.5-7b-instruct \--port 7000 \--host 0.0.0.0 \--tensor-parallel-size 1 \--disaggregation-mode prefill \--disaggregation-bootstrap-port 8998 \--disaggregation-transfer-backend mooncake \--disaggregation-ib-device mlx5_2 \--max-total-tokens 4096 \--dtype float16 \--trust-remote-code

2) decode 服务启动

 CUDA_VISIBLE_DEVICES=1 python -m sglang.launch_server \--model-path /data/public/model/qwen2.5/qwen2.5-7b-instruct \--port 7001 \--host 0.0.0.0 \--tensor-parallel-size 1 \--disaggregation-mode decode \--disaggregation-bootstrap-port 8999 \--disaggregation-transfer-backend mooncake \--disaggregation-ib-device mlx5_2 \--max-total-tokens 4096 \--dtype float16 \--trust-remote-code

4.3 简易版路由 mini_lb

  python -m sglang.srt.disaggregation.mini_lb \--prefill http://127.0.0.1:7000 \--prefill-bootstrap-ports 8998 \--decode http://127.0.0.1:7001 \--host 0.0.0.0 \--port 8000 

4.4 测试

curl -X POST http://localhost:8000/generate   -H "Content-Type: application/json"   -d '{"text": "请介绍一下你自己","max_new_tokens": 32,"temperature": 0.7}'

五、小结

kv 缓存概念理解起来就很痛苦。经过各种查资料问大模型才理解整个过程。相当不容易。现在的示例只是提供了 SGLang 的 Mooncake 框架的直传也属于 NCCL 的方式。还没有体现出分布式多级缓存。如果是生产环境则需要将并行策略和多级缓存融合后再实施。

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

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

相关文章

模型实战(28)之 yolov5分类模型 训练自己的数据集

模型实战(28)之 yolov5分类模型 训练自己的数据集 本文以手写数字数据集为例总结YOLO分类模型如何训练自己的数据集,关于数据集的预处理可以看这篇:https://blog.csdn.net/yohnyang/article/details/148209978?spm=1001.2014.3001.5502 yolov5曾是在 2021-2023 年十分流行…

医学写作人才管理策略

1. 人才选择:精准定位核心能力 1.1 人才筛选标准 1.1.1 硬性要求 初创生物制药公司医学写作岗位对专业背景要求严格,候选人需具备医学、药学或生物学硕士及以上学历,博士优先。同时,熟悉ICH、FDA/EMA等法规指南是必备条件,且至少有1-3年医学写作经验,或相关领域如临床研…

Axure酒店管理系统原型

酒店管理系统通常被设计为包含多个模块或界面,以支持酒店运营的不同方面和参与者。其中,管理端和商户端是两个核心组成部分,它们各自承担着不同的职责和功能。 软件版本:Axure RP 9 预览地址:https://556i1e.axshare.…

云原生安全之HTTP协议:从基础到实战的安全指南

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念:HTTP协议的核心要素 HTTP(HyperText Transfer Protocol)是云原生应用中客户端与服务器通信的基础协议&a…

怎样解决photoshop闪退问题

检查系统资源:在启动 Photoshop 之前,打开任务管理器检查 CPU 和内存的使用情况。如果发现资源占用过高,尝试关闭不必要的程序或重启计算机以释放资源。更新 Photoshop 版本:确保 Photoshop 是最新版本。Adobe 经常发布更新以修复…

修复ubuntu server笔记本合盖导致的无线网卡故障

下班回到家发现走时还好的局域网 ubuntu server 24 连不上了,赶紧打开笔记本查看下原因,发现控制台出了一堆看不懂的内容: 根据搜索结果,笔记本合盖导致无线网卡故障可能与电源管理设置和系统休眠策略有关,以下是具体…

CMake指令:find_package()在Qt中的应用

目录 1.简介 2.Qt 核心组件与常用模块 3.配置模式的工作流程 4.完整示例:构建 Qt GUI 应用 5.常见问题与解决方案 6.总结 1.简介 在 CMake 中使用 find_package(Qt) 是集成 Qt 库的核心步骤。Qt 从 5.x 版本开始全面支持 配置模式(Config Mode&…

Docker 镜像调试最佳实践

当你已经构建了一个 Docker 镜像,但运行它的容器启动后立即退出(通常是因为服务异常或配置错误),你仍然可以通过以下几种方式进入镜像内部进行调试。 ✅ 最佳实践:如何对一个“启动即退出”的镜像进行命令行调试&#…

使用Java制作贪吃蛇小游戏

在这篇文章中,我将带你一步步实现一个经典的贪吃蛇小游戏。我们将使用Java语言和Swing库来构建这个游戏,它包含了贪吃蛇游戏的基本功能:蛇的移动、吃食物、计分以及游戏结束判定。 游戏设计思路 贪吃蛇游戏的基本原理是:玩家控制…

【linux】umask权限掩码

umask这个接口在一些程序初始化的时候经常会见到,处于安全性,可以缩小进程落盘文件的权限。 1、linux文件系统的权限规则 文件的默认权限由系统决定(通常是 0666,即所有人可读可写)。 目录的默认权限通常是 0777&am…

esp32cmini SK6812 2个方式

1 #include <SPI.h> // ESP32-C系列的SPI引脚 #define MOSI_PIN 7 // ESP32-C3/C6的SPI MOSI引脚 #define NUM_LEDS 30 // LED灯带实际LED数量 - 确保与实际数量匹配&#xff01; #define SPI_CLOCK 10000000 // SPI时钟频率 // 颜色结构体 st…

互联网大厂Java求职面试:Spring Cloud微服务架构设计中的挑战与解决方案

互联网大厂Java求职面试&#xff1a;Spring Cloud微服务架构设计中的挑战与解决方案 面试场景设定 郑薪苦是一位拥有丰富实战经验的Java开发者&#xff0c;他正在参加一场由某知名互联网大厂的技术总监主持的面试。这场面试将围绕Spring Cloud微服务架构展开&#xff0c;涵盖…

品鉴JS的魅力之防抖与节流【JS】

前言 小水一波&#xff0c;函数的防抖与节流。 文章目录 前言介绍实现方式防抖节流 介绍 防抖与节流的优化逻辑&#xff0c;在我们的日常开发中&#xff0c;有着一定的地位。 防抖和节流是两种常用的性能优化技术&#xff0c;用于限制某个函数在一定时间内被触发的次数,减少不…

# 使用 Hugging Face Transformers 和 PyTorch 实现信息抽取

使用 Hugging Face Transformers 和 PyTorch 实现信息抽取 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;信息抽取是一种常见的任务&#xff0c;其目标是从文本中提取特定类型的结构化信息。本文将介绍如何使用 Hugging Face Transformers 和 PyTorch 实现基于大…

Firecrawl MCP Server 深度使用指南

无论是市场分析师洞察行业动态、研究者收集学术资料&#xff0c;还是开发者为智能应用采集数据&#xff0c;都对网络数据采集工具提出了极高的要求。Firecrawl MCP Server 应运而生&#xff0c;它宛如一把犀利的 “数字手术刀”&#xff0c;能够精准地剖析网页&#xff0c;为用…

OceanBase数据库全面指南(基础入门篇)

文章目录 一、OceanBase 简介与安装配置指南1.1 OceanBase 核心特点1.2 架构解析1.3 安装部署实战1.3.1 硬件要求1.3.2 安装步骤详解1.3.3 配置验证二、OceanBase 基础 SQL 语法入门2.1 数据查询(SELECT)2.1.1 基础查询语法2.1.2 实际案例演示2.2 数据操作(INSERT/UPDATE/DE…

几种环境下的Postgres数据库安装

1. Postgres 数据库介绍 PostgreSQL&#xff08;又称 Postgres&#xff09;是一种强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它具备高度的可靠性、稳定性和可扩展性&#xff0c;主要特点如下&#xff1a; 开源&#xff1a;PostgreSQL 是基于开…

函数[x]和{x}在数论中的应用

函数[x]和{x}在数论中的应用 函数[x]和{x}的定义与基本性质&#xff08;定义1&#xff0c;命题1&#xff09;定义1例1命题1 函数[x]和{x}的应用&#xff08;定理1&#xff0c;推论1-推论3&#xff09;例2定理1注解5推论1例3例4推论2推论3命题2 函数[x]和{x}的定义与基本性质&am…

Python爬虫(32)Python爬虫高阶:动态页面处理与Scrapy+Selenium+BeautifulSoup分布式架构深度解析实战

目录 引言一、动态页面爬取的技术背景1.1 动态页面的核心特征1.2 传统爬虫的局限性 二、技术选型与架构设计2.1 核心组件分析2.2 架构设计思路1. 分层处理2. 数据流 三、代码实现与关键技术3.1 Selenium与Scrapy的中间件集成3.2 BeautifulSoup与Scrapy Item的整合3.3 分布式爬取…

FreeSWITCH rtcp-mux 测试

rtcp 跟 rtp 占用同一个端口&#xff0c;这就是 rtcp 复用 Fs 呼出是这样的&#xff1a; originate [rtcp_muxtrue][rtcp_audio_interval_msec5000]user/1001 &echo 需要同时指定 rtcp_audio_interval_msec&#xff0c;否则 rtcp_mux 不能生效 Fs 呼入不需要配置&#xf…