内容提要
SGLang 推出实验性统一内存功能(--enable-unified-memory),以单一 GPU 内存区替代按比例划分的独立内存池,使全注意力 KV、滑动窗口 KV 和循环状态可按需动态共享容量,无需预设比例。新 KV 布局按 token 打包各层行,支持不同形状与 dtype 共存,并配合压缩、调度感知的页生命周期与统一准入判断。测试显示默认配置无性能回退,错误比例会损失 12–14% 吞吐,统一内存可容纳更多并发请求。
延伸解读
统一内存解决的是“比例猜错”的成本
文章用两组数据说明传统按比例划分内存池的代价:GPT-OSS-20B 上把 --swa-full-tokens-ratio 设为 0.1,吞吐损失 12%;Qwen3.5-4B 上把 --mamba-full-memory-ratio 设为 0.3,并发被限制在 24,吞吐损失 14%。这些比例在启动时就要确定,而流量特征往往未知。统一内存把比例参数降级为启动时的参考目标,运行时由需求动态决定容量,因此更适合长上下文与大量短请求混合、压力会漂移的场景。
按 token 打包 KV 是共享内存的前提
如果每种状态各自按层分配缓冲区,不同形状和 dtype 的行很难放进同一块内存。SGLang 的新布局把同一 token 在所有层的 KV 行打包成一个条目,页则是一串条目。这样一次分配、释放或整页移动会同时作用于所有层,不同 dtype 的草稿 KV 也能作为额外通道放进目标 KV 的条目里。Kimi K3.1 的 DSA 索引键与 MLA KV 同生命周期,正是这种布局要覆盖的情况。
逻辑释放立即生效,物理复用要等旧任务结束
统一内存在重叠调度下要处理三类风险:请求结束后仍有前向在读取其 KV;页面移动时旧读者仍在读源地址;旧写者尚未完成就复制会导致目标数据陈旧。文章给出的规则是逻辑释放立即计入容量,但物理字节要等可能触碰它的前向被处理或事件被等待后才能复用。移动会创建新的目标页并保护旧源页,避免提前覆盖。这套账本机制是统一内存能安全支持 HiCache、PD 分离和投机解码的基础。
实验性功能的边界比收益更值得先确认
统一内存目前只面向混合模型,纯全注意力模型、带滑动窗口层的 MLA 以及 DeepSeek-V4 都不支持;PD 分离需要 Mooncake,且不能与流水并行、投机解码或 DCP 同时使用,HiCache 也不能与 EAGLE/EAGLE3 组合。此外优先级抢占在统一内存下被禁用,启动时还会拒绝双批次重叠、LMCache、int8 Mamba 检查点和 FP4 KV。评估时应先对照使用指南的兼容矩阵,再判断吞吐收益是否适用于自己的部署组合。
Q&A
SGLang 的统一内存功能怎么开启?需要设置哪些参数?
通过启动参数 --enable-unified-memory 开启。同时使用 --mem-fraction-static 和 --max-total-tokens 来整体设定内存区大小,--max-running-requests 仍然限制并发数。示例命令:python3 -m sglang.launch_server --model-path MODEL_PATH --tp 2 --enable-unified-memory。
统一内存相比传统按比例划分内存池,主要解决了什么问题?
传统设计在启动时通过 --swa-full-tokens-ratio 和 --mamba-full-memory-ratio 固定各子池大小,但最佳比例取决于未知的流量。长上下文工作负载可能耗尽全注意力池,而有界状态池却闲置;大量短请求则相反。统一内存用一个共享内存区替代固定划分,容量按需动态分配,无需预设比例,从而避免内存搁置和浪费。
统一内存如何避免不同大小分配单元造成的内存碎片?
统一内存将整个 GPU 内存视为一个字节区域,而非统一大小的页数组。每个子池保留自己的页或槽大小,并占据一个连续带。有界状态从低端向上增长,全注意力 KV 从高端向下增长,浮动带可移动以腾出空间。通过惰性压缩将活跃数据移向两端,使空闲字节形成中间区域,任何子池都能按自己的单元大小从中分配,从而完全回收释放的页,避免碎片。
新的 KV 布局“每个 token 一个条目”有什么好处?
该布局将每个 token 在所有层的 KV 行打包成一个条目,页是条目的连续序列。这样分配、驱逐或整页移动都同时作用于所有层,层的视图跨条目步进。不同形状和 dtype 的行可以共存于一个条目,因此投机解码的草稿 KV 可以使用与目标 KV 相同的分配和生命周期,即使 dtype 不同。Kimi K3.1 的 DSA 层索引键也能与 MLA KV 打包在一起。
统一内存在调度器重叠执行时如何保证页面安全?
规则是:逻辑释放立即生效,物理重用需等待。请求表持有虚拟 ID,子池映射到物理页。移动页面时复制字节并重定向映射,新前向解析到目标,旧读者可继续读源。释放的页若可能被未处理的前向读写,则变为 pending,直到前向处理或事件等待后才可重用。移动时需处理旧读者和旧写者:旧读者可继续读源,但源重用需等待;旧写者必须排在复制之前。
统一内存的实测性能如何?是否会有性能回退?
默认配置下无性能回退:Qwen3.5-4B 上吞吐 5,830 tokens/s 对比 5,880,GSM8K 得分相同。错误比例会损失 12–14% 吞吐。统一内存能容纳更多并发请求:GPT-OSS-20B 上约 1,000 请求对比 618,吞吐高 14%,首 token 时间 6 秒对比 43 秒;Qwen3.5-4B 长上下文下 32 请求对比 22,快 26%。重试请求也更少。
统一内存目前有哪些限制和不支持的情况?
仍为实验性功能,主要面向混合模型。不支持纯全注意力模型、带滑动窗口层的 MLA 和 DeepSeek-V4,以及 MPS 和 MLX 等后端。优先级抢占当前禁用。窗口行与循环检查点场景下,准入假设检查点推进,若没有空闲状态槽,请求可能持有超出定价的窗口行。启动时拒绝两批重叠、LMCache、int8 Mamba 检查点和 FP4 KV 等组合。