Appearance
自托管 LLM 推理:vLLM 与 SGLang
2026 年生产级 LLM 推理的事实标准是三引擎:vLLM、TensorRT-LLM、SGLang。公开并发基准测试中扩展性良好的只有 vLLM 与 SGLang。TensorRT-LLM 用锁定 NVIDIA 换峰值性能。一句话定位:推理引擎的本质,是把"生成一个 token"的边际成本压到最低。vLLM(v0.30.0,2026-09-22 发布)靠 PagedAttention 赢吞吐。SGLang(v0.5.20,2026-09-18 仍在发版)靠 RadixAttention 赢前缀复用。
面试价值:这是区分"会调 API"与"懂推理服务化"的分水岭题,核心考点是 KV cache、批调度与显存账。Token 侧基础先看 LLM基础-Token上下文与幻觉。
1 为什么自托管:API 与自有 GPU 的决策框架
先亮作者的真实答案:个人项目全走智谱 API。对话用 glm-4.5-air、视觉用 glm-4v-flash、文本解析用 glm-5.3,月成本可控。而一台像样 GPU 的月固定成本(租金/折旧 + 运维时间)远高于这份账单。自托管不是技术信仰,是一笔要算的账:
| 维度 | 走 API | 自托管推理 |
|---|---|---|
| 成本模型 | 按 token 计费,随用量线性涨 | GPU 固定成本,边际成本趋零 |
| 数据边界 | 数据出域,靠合同约束 | 权重与数据全在内网 |
| 运维 | 零 | 引擎 + 驱动 + 监控 + 容量规划全自担 |
| 模型选择 | 平台上架的模型 | 任意开源权重,可微调可量化 |
| 时延控制 | 共享池,受配额与限流影响 | 独占算力,TTFT 可控 |
决策框架三问:
- 成本交叉点:把 API 月账单与"GPU 折旧/租金 + 人力运维"画成两条曲线。token 用量过了交叉点,自托管才更便宜。企业规模化推理(日亿级 token)几乎必然越线。个人与早期产品几乎必然没越线;
- 数据边界:医疗、金融、涉密场景"不能出域"一票定夺,不用算账;
- 时延与可控性:要独占算力压首 token 时延、要部署微调后的私有权重、要离线/专有环境交付。这些 API 给不了。
一句话:个人/早期走 API,规模化或强合规再自托管,而自托管的第一课是选引擎。
2 vLLM 核心:PagedAttention + continuous batching
推理服务的吞吐瓶颈几乎总在显存。KV cache(注意力缓存,来龙去脉见 LLM基础-Token上下文与幻觉)随序列增长。传统推理框架按请求的最大序列长度连续预留显存。这产生大量内部碎片(序列没用满)与外部碎片(预留区不连续),实测利用率常年不到一半。显存浪费 = 装不下并发 = 吞吐损失。
PagedAttention 借操作系统的虚拟内存分页思想。KV cache 切成固定大小的 block(如 16 个 token 一块),逻辑上连续、物理上离散,块表维护映射。按需分配、用多少占多少,浪费压到接近零。同前缀的请求(beam search、并行采样)还能共享物理块,写时复制。
传统连续预留: PagedAttention:
seq A [####--------------] 块表: A -> [7][12][3][9]
^按最大长度预留,实际用一半 seq B -> [7][5][21] <- 首块与 A 共享
seq B [############-------] 按块分配,无需连续,碎片~0continuous batching(连续批调度):静态 batching 要等一批里最长的请求生成完才能换批,短请求全程陪跑。连续批调度把调度粒度降到每次迭代(生成一步)。某请求生成完立刻出批、新请求立刻插入,GPU 始终满批运行。两者叠加:同一张卡可服务的并发数与总吞吐成倍提升。
其他关键词:tensor parallel / pipeline parallel 多卡切分。量化加载(FP8/GPTQ/AWQ)。以及对 MoE 稀疏模型的支持(fused MoE kernel 与专家并行)——这决定了它能不能跑 2026 年的国产旗舰开源模型。生态位:OpenAI 兼容 API 开箱即用;NVIDIA/AMD 之外,Google 已于 2026-10-20 发布 vLLM 的 TPU 生产级引擎。
bash
# 典型启动:多卡张量并行 + FP8 权重,直接暴露 OpenAI 兼容 API
vllm serve <模型路径或仓库> \
--tensor-parallel-size 2 \
--quantization fp8 \
--max-model-len 327683 SGLang 核心:RadixAttention 与约束解码
SGLang 的两个杀手锏:
- RadixAttention:把所有请求的 KV cache 挂在一棵基数树(radix tree)上,节点是"前缀段"。新请求先沿树匹配,命中部分直接复用现成 KV,不必重算 prefill。收益场景极其明确:多轮对话(system prompt + 历史轮次逐轮变长但前缀不变)。Few-shot 大提示词、Agent 反复读同一份工具说明。前缀命中一次,省的是一整段 prefill 的计算与 TTFT;
- 结构化输出约束解码:把 JSON Schema / 正则 / 语法约束编译成状态机。生成每一步屏蔽不合法 token 的 logits,从根上保证输出可解析。对比"生成后校验失败重试"既省 token 又稳时延。与 结构化输出工程-Pydantic与LLM 的 schema 定义层正好上下游衔接。
与 vLLM 的差异化一句话:vLLM 是通用默认解,SGLang 在"前缀复用密集 + 约束输出密集"的 Agent / 多轮负载上更强。两边在互相靠近——vLLM 也有自动前缀缓存(automatic prefix caching)。SGLang 的吞吐与量化支持也在追平。差异在"默认好不好"与"上限高不高"。版本侧:SGLang v0.5.20(2026-09-18)仍在高频发版;Google 同样在 2026-10-20 给了 SGLang TPU 生产级引擎。
4 选型决策表
| 维度 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| 定位 | 通用默认解 | 前缀复用 + 约束解码 | NVIDIA 闭源,极致性能 |
| 总吞吐 | 高 | 高;多轮/同前缀场景更高 | 峰值最高(需逐模型编译 engine) |
| TTFT | 良 | 前缀命中时显著更低 | 优 |
| 多轮前缀复用 | 有(自动前缀缓存) | 核心强项(RadixAttention) | 一般 |
| 结构化输出 | 支持 | 核心强项(约束解码成熟) | 支持 |
| 硬件 | NVIDIA/AMD,2026-10 起 TPU | NVIDIA/AMD,2026-10 起 TPU | 仅 NVIDIA |
| 运维成本 | 低,开箱即用 | 低,开箱即用 | 高:编译构建、版本绑定 |
选型口诀:默认 vLLM;Agent 多轮 + JSON 输出密集选 SGLang;锁定 NVIDIA、愿意吃编译运维换极致 SLA 才上 TensorRT-LLM。佐证:2026 年公开并发基准测试中扩展性良好的仅 vLLM 与 SGLang 两家。
5 国产开源模型部署要点:显存账与量化
2026 年的旗舰开源模型清一色 MoE 稀疏架构:
- GLM-5:2026-02-12 发布,MIT 协议,总参数 ~744B / 激活 ~40B,已迭代至 GLM-5.3;
- Qwen3.5:2026-02 发布,原生多模态智能体路线,已演进 3.6 → 3.8;
- DeepSeek-V4 系:2026-04 起陆续发布。
部署前先算三笔账(社区用「总参数-A激活参数」命名模型,如 30B-A3B,A 就是下面第二条账):
总显存 ≈ 权重 + KV cache + 激活与运行时开销
权重 ≈ 参数量 × 每参数字节 (BF16=2 / FP8=1 / INT4=0.5)
KV cache ≈ 2(K/V) × 层数 × KV头数 × head_dim × 每元素字节 × 上下文token数 × 并发数(GQA 架构下 KV 头数远小于注意力头数,这行公式是长上下文能商用的原因之一。)
AxxB 激活结构的意义:MoE 把成本从"计算"搬到了"显存与互连"——
- 算力账看激活参数:每 token 只过激活的那部分参数。FLOPs 与同规模激活量的稠密模型同量级,解码吞吐可观;
- 显存账看总参数:全部专家的权重必须整体装进显存(或做 offload),起步就是多机多卡 + 专家并行的规模。这正是个体与小团队走 API 的根本原因(回到第 1 节的账);自托管请选同家族的中小尺寸模型。以 GLM-5 的权重账为例:
GLM-5 权重显存(仅权重,未含 KV cache 与运行时):
BF16 : 744B × 2 字节 ≈ 1.49 TB -> 多机多卡 + 专家并行起步
FP8 : 744B × 1 字节 ≈ 744 GB -> 单机 8 卡级才能装下
INT4 : 744B × 0.5 字节 ≈ 372 GB -> 量化换显存的极限档量化选择的三条经验:
- 首选 FP8 权重:新卡原生支持,精度损失小,显存直接减半;
- INT4/AWQ/GPTQ 再省一半显存,但长上下文与 MoE 路由对低比特更敏感,先过质量评估再上生产;
- KV cache 也可量化(FP8 KV),长上下文高并发场景收益显著。
6 生产清单:监控指标与多实例
两家引擎都自带 OpenAI 兼容接口与 Prometheus /metrics。指标先挂到一次请求的生命周期上看,口径就统一了:
到达 ──► 排队 ──► prefill(并行,吃满算力)──► decode(逐 token)──► 完成
│ │
└ TTFT:首 token 时延 └ TPOT:后续每 token 的间隔
排队段变长 = 实例过载;TTFT 长 = prefill 慢或队列深;TPOT 长 = decode 慢(批过大/算力不足)落到仪表盘上就是这几项:
| 指标 | 含义 | 信号价值 |
|---|---|---|
| TTFT | 首 token 时延 | prefill 能力 + 队列深度;Agent 链路延迟感受的大头 |
| TPOT/ITL | 逐 token 时延 | 解码速度,决定长输出的延迟感受 |
| 总吞吐 tokens/s | 全局出词速率 | 容量规划的核心数 |
| 前缀/KV 命中率 | 缓存健康度 | SGLang 场景尤其:命中率跌 = 成本涨 |
| 排队数 / 运行并发 | 过载信号 | 限流与扩容依据 |
| GPU util / 显存水位 | 硬件层 | 排除"卡没喂饱"或"显存将爆" |
多实例与负载均衡:
- 多副本 + 网关:横向扩实例,轮询/最少连接起步;
- 前缀感知路由:把相同前缀(同租户、同 system prompt)的请求粘到同一实例,让 radix/前缀缓存真正命中。这层路由的收益常大于多加一台机器;
- 过载保护:引擎侧设最大并发与队列上限,超限快速失败优于无限排队;滚动发布时先 drain 再摘流量。
面试追问链
- 为什么要自托管?→ 数据边界 / 成本交叉点 / 时延与私有权重;个人项目为什么反着选?→ API 月账单远低于 GPU 固定成本,没过交叉点;
- vLLM 为什么快?→ PagedAttention 把显存利用率从不到一半提到接近满 → 装得下更多并发 → continuous batching 让 GPU 满批运行;
- PagedAttention 解决什么问题?→ KV cache 的碎片浪费;怎么做?→ 固定 block 分页 + 块表映射,逻辑连续物理离散,还能共享前缀块;
- continuous batching 与静态 batch 的区别?→ 调度粒度从"一批"降到"一次迭代",完成即出、新请求即入;
- RadixAttention 是什么?→ 基数树组织的全局 KV cache 前缀复用;什么负载收益最大?→ 多轮对话、Few-shot、Agent 同前缀;
- 结构化输出怎么保证合法?→ 约束解码:schema 编译成状态机屏蔽非法 token,而不是生成后校验重试;
- MoE 模型部署,算力看什么、显存看什么?→ 算力看激活参数,显存看总参数;
- 744B 的 GLM-5 为什么个人玩不动?→ 权重显存账 BF16 约 1.5 TB,多机多卡起步;
- 生产监控盯哪几个数?→ TTFT / TPOT / 总吞吐 / 前缀命中率;
- 三引擎怎么选?→ 默认 vLLM;Agent 多轮 + 结构化输出 SGLang;NVIDIA 极致 SLA 上 TensorRT-LLM。
面试官视角小结
这道题分层明显:能报出两个引擎名字只是及格。讲清 PagedAttention 与 continuous batching、RadixAttention 与约束解码,说明读过原理。能现场算显存账(权重 × 每参数字节 + KV cache 公式)、点破 MoE「算力看激活、显存看总量」。说出前缀感知路由与 TTFT/TPOT 监控口径,是有生产经验的信号。
最高级的回答反而是清醒的克制。能论证"我们为什么走 API 不自托管"(没过成本交叉点、744B 的显存账不成立)。这说明工程判断先于技术炫技。引擎版本会过时,决策框架不会。上下文与幻觉基础见 LLM基础-Token上下文与幻觉,schema 工程见 结构化输出工程-Pydantic与LLM。
2026-10 新增(2026 技术栈补全)。