Rust in Everything

推理部署:vLLM、SGLang

主线位置:全卷总览。三条主线和九个部分在这里列出,每部分开头再指出自己在「一个请求的一生」上的哪一段。
版本:vLLM v0.32.0、SGLang v0.5.22

这一卷讲两个开源推理引擎怎么把一个大模型变成一个能扛并发的 HTTP 服务。做法是读锁定 tag 的源码,讲机制;能在 CPU 上算的给出算式和小模拟,要 GPU 的数字先空着,统一标「待实测」。

读者会写 Rust,部署过或打算部署开源模型。两个引擎的主体是 Python 加 CUDA,Rust 只占 CPU 一侧的几段边。每部分都会写清这一段在两个引擎里是 Python 还是 Rust,默认走哪条路,打开哪个开关才换成 Rust。

写什么,不写什么

写:

  • 一个请求从 HTTP 进来到流式返回,经过哪些进程、线程、通道。
  • KV cache 怎么分块、怎么复用前缀;调度器每一步怎么挑请求;投机解码、量化、并行和预填充 / 解码分离的机制。
  • Rust 在哪里:两种 Rust 前端、SGLang 调度器里的 Rust 前缀树、路由层、共享的文本栈,再拿纯 Rust 的 mistral.rs 作对照。
  • 部署时的显存账和关键参数,以及本站自己的调用方怎么换成自托管。

不写:

  • 不是 vLLM / SGLang 文档的中文版。不罗列全部参数,不教安装,不翻译 cookbook。参数只在讲到机制时出现,并给出默认值在源码里的位置。
  • 不评哪个引擎更快。速度、显存、命中率都等 GPU 实测(C3),之前只给机制和估算。
  • 不讲模型结构和训练。模型只当作「若干层、每层若干 KV 头」的形状参数。
  • TGI 已于 2026-03 归档,只在历史里提一句,不读源码。

版本

项目版本在本卷的角色
vLLMv0.32.0,commit 5df63a7203cd主角之一;rust/ 下有可选的 Rust 前端 vllm-rs
SGLangv0.5.22,commit baa9befa3815主角之一;rust/ 下有前缀树核心、可选的 Rust 服务等 PyO3 扩展;sgl-model-gateway/ 是路由器
vllm-project/routerv0.1.16,commit db02f358da40SGLang 路由器的分支,只在路由一节出现
mistral.rsv0.9.5,commit 465191d0b0a7只作对照:Rust 跑前向的引擎

所有源码链接都指向这些 tag,行号从 tag 取。commit、链接格式、「默认 / 可选」怎么判断,见怎么读这一卷。

Rust 在哪里,一句话

两个引擎的 GPU 前向都不碰 Rust。Rust 占的是 CPU 一侧:协议、分词与反分词、路由;SGLang 里还有前缀树。集成方式两边相反:vLLM 把整个 API 服务换成一个独立的 Rust 进程,隔着原来的 ZMQ 边界;SGLang 把 Rust 编成 PyO3 扩展,连整个服务都作为线程嵌进调度器进程。细节在 06 部分。

三条主线

  • 一个请求的一生(全卷的轴):HTTP 进来 → 聊天模板与分词 → 调度(排队、预填充、解码步)→ KV 块分配 / 前缀命中 → 采样 → 反分词、流式返回。每页开头的「主线位置」说明这一页在哪一段,以及这一段在两个引擎里是 Python 还是 Rust。
  • 一张 24 GB 的卡上放一个 8B 模型:显存怎么分给权重、KV cache 和激活,能放多少块、多少并发。机制部分用公式和源码给出算法,数字等 C3-1。
  • 在本站中:本站论文资讯栏目每天调用模型做摘要和评审。换成自托管要多大的卡、多少吞吐,用它真实的输入 / 输出长度分布当负载。
flowchart LR
  http["HTTP 进来"] --> tmpl["模板与分词"]
  tmpl --> sched["调度"]
  sched --> kv["KV 块 / 前缀命中"]
  kv --> fwd["前向(GPU)"]
  fwd --> samp["采样"]
  samp --> detok["反分词"]
  detok --> sse["流式返回"]
  p01["01 一个请求的一生"] -.-> http
  p02["02 KV cache"] -.-> kv
  p03["03 调度"] -.-> sched
  p04["04 加速"] -.-> samp
  p05["05 并行与分离"] -.-> fwd
  p06["06 Rust 在哪里"] -.-> tmpl
  p06 -.-> detok

各部分

  1. 00 导读:版本与读法;为什么服务大模型难:预填充算力受限、解码访存受限,KV cache 占显存,请求长度差别大。
  2. 01 一个请求的一生:两个引擎的进程 / 线程结构和通道,每一段由什么语言实现;默认路径和打开 Rust 前端之后。
  3. 02 KV cache:块表、分配与回收;vLLM 按块哈希的前缀缓存对 SGLang 的基数树;驱逐;KV 量化的存法。
  4. 03 调度:连续批处理、分块预填充、抢占。
  5. 04 加速:投机解码、权重量化。
  6. 05 并行与分离:张量 / 流水线 / 数据并行,预填充与解码分离。
  7. 06 Rust 在哪里:两种 Rust 前端、调度器里的 Rust 前缀树、路由层、共享文本栈、纯 Rust 引擎对照。
  8. 07 部署与调参:显存预算公式、关键参数对照、常见报错。
  9. 08 在本站中:论文资讯作为调用方,请求分布与自托管估算。

哪些数字待 GPU

本卷的数分四种,页面上分开写:

  • 源码事实:默认值、通道类型、进程数,给出 tag 上的行号。
  • 估算:按公式和模型公开配置算出来的数,比如 KV cache 每 token 的字节数。明确标「估算」,不当实测用。
  • 实测:写明机器、版本、命令和原始输出。
  • 待实测(C3-n):要 GPU 才能得到的数。编号对应 GPU 待测清单:
编号内容等它的部分
C3-1显存预算:同一个 8B 模型在两个引擎上,gpu-memory-utilization / mem-fraction-static 取几档时的 KV 块数、最大并发00、02、07
C3-2吞吐与延迟曲线:并发 1–256,TTFT、TPOT、总吞吐01、03、07、08
C3-3前缀复用:vLLM 前缀缓存与 SGLang RadixAttention 的命中率和 TTFT02
C3-4连续批处理与分块预填充:长 prompt 混进短请求时短请求的 TPOT03
C3-5投机解码与量化:开关前后的吞吐与输出一致性04
C3-6路由层:Rust 网关在多副本前做缓存感知路由的效果06
C3-7(多卡时)张量并行、预填充与解码分离05
C3-8SGLang 基数树核心 Rust 对 Python:单项操作的 CPU 基准已测(见 06);真实服务里每个调度步的开销随 GPU 那批06

在 GPU 机器到位之前,这些格子都写「待实测(C3-n)」,不填估计值。

💬 关联讨论

发起讨论
加载中...