博客
文章系列日历
归档关于搜索

鄂ICP备19019526号

© 2026 博客

  1. 文章
  2. 推理引擎横评 2026:vLLM、SGLang、TensorRT-LLM 的生产级工程真相

推理引擎横评 2026:vLLM、SGLang、TensorRT-LLM 的生产级工程真相

2026年7月5日·约 18 分钟·5374 字·1 次阅读
AI 原生架构
推理引擎横评 2026:vLLM、SGLang、TensorRT-LLM 的生产级工程真相

目录

  • 引言
  • 一、调度器:从 FCFS 到 char-wise prefill 的演化
  • 二、KV cache 管理:PagedAttention 的工程扩散
  • 三、推测解码:Draft Model 与 Medusa 的工程分叉
  • 四、连续批处理与 Continuous Batching 调优
  • 五、量化路径:FP8 / INT4 / AWQ 的工程真相
  • 六、生产选型决策框架
  • 七、典型事故案例与复盘
  • 八、未来趋势
  • 九点五、生产环境落地清单(vLLM / SGLang / TensorRT-LLM 通用)
  • 九点七、典型事故案例与复盘模式
  • 九点九、性能监控的盲点
  • 十点五、三个真实生产案例的选型复盘
  • 十点七、为什么「引擎之争」在 2026 已不再是主线
  • 十点九、给 AI 工程师的最后三条建议
  • 十、参考文献

引言

2026 H1,LLM 推理引擎的竞争已从「谁更快」转向「谁更适合生产」。本文从 vLLM、SGLang、TensorRT-LLM 三大主流引擎的架构哲学出发,剖析调度器、KV cache 管理、连续批处理、推测解码、张量并行、量化路径等关键决策点,并给出生产级选型清单。

一、调度器:从 FCFS 到 char-wise prefill 的演化

早期推理引擎(vLLM 0.1.x、FasterTransformer)采用 request-level FCFS(先来先服务)调度,单个长 prompt 的 prefill 阻塞所有 decode 请求,导致 TTFT(time-to-first-token)尾部延迟爆炸。

2024-04 vLLM 0.5.x 引入 chunked prefill,将 prompt 切成 512-token 块与 decode 步骤混合调度;2025-08 SGLang v0.4 提出 char-wise 预填充,按字符级 chunk 进一步消除 prefill-decode 互斥;2026-04 TensorRT-LLM 0.20 实现 in-flight batching,把 KV cache 写入与计算 overlap。

调度策略的形式化目标函数为:

min⁡π∈Π∑i=1Nwi⋅(TTFTi⋅α+TPOTi⋅β+ITLi⋅γ)\min_{\pi \in \Pi} \sum_{i=1}^{N} w_i \cdot (TTFT_i \cdot \alpha + TPOT_i \cdot \beta + ITL_i \cdot \gamma)minπ∈Π​∑i=1N​wi​⋅(TTFTi​⋅α+TPOTi​⋅β+ITLi​⋅γ)

其中 wiw_iwi​ 为请求权重,α/β/γ\alpha/\beta/\gammaα/β/γ 为 SLO 系数。工程权衡:chunked prefill 实现简单但 prefill-decode 互斥仍未消除;char-wise 调度最优但实现复杂度高;in-flight batching 延迟最低但需要 L2 cache 友好的 kernel 重写。

# vLLM chunked prefill 伪代码(简化)
class ChunkedPrefillScheduler:
    def __init__(self, max_num_batched_tokens=2048):
        self.max_chunk = max_num_batched_tokens
    
    def schedule(self, waiting, running):
        chunked_prefill, decode = [], []
        budget = self.max_chunk
        # prefill 按 token 数切分
        for req in sorted(waiting, key=lambda r: r.prompt_len, reverse=True):
            if req.prompt_len <= budget:
                chunked_prefill.append((req, req.prompt_len))
                budget -= req.prompt_len
            else:
                chunked_prefill.append((req, budget))
                req.prompt_len -= budget
                budget = 0
                break
        # decode 占用剩余 budget
        for req in running:
            if budget >= 1:
                decode.append(req)
                budget -= 1
        return chunked_prefill + decode

二、KV cache 管理:PagedAttention 的工程扩散

PagedAttention(vLLM,2023-06,SOSP'23)首次将 OS 虚拟内存思想引入 LLM 推理,把 KV cache 切成 16-token 的 page,通过 block table 映射。关键指标:显存碎片率从 60% 降至 < 4%;prefix cache 命中率提升至 30-70%(共享 system prompt 场景)。

2025 之后,三引擎分别实现变体:

  • vLLM:v1 engine(2025-09)实现 unified KV cache + prefix caching 自动合并;block_size=16 → 自适应 4/8/16/32
  • SGLang:RadixAttention(2024-08)构建 prefix trie,单次 prefill 复用多请求共享 prefix;实测命中率比 vLLM 高 15-25%
  • TensorRT-LLM:KV cache reuse API(2024-12)通过 hash(prompt) 跨 instance 复用;适合多副本 serving 集群

RadixAttention 的核心数据结构:

RadixNode={token_seq:str,kv_ptr:int,children:Dict[str, RadixNode],ref_count:int}\text{RadixNode} = \{ \text{token\_seq}: \text{str}, \text{kv\_ptr}: \text{int}, \text{children}: \text{Dict[str, RadixNode]}, \text{ref\_count}: \text{int} \}RadixNode={token_seq:str,kv_ptr:int,children:Dict[str, RadixNode],ref_count:int}

LMSYS 2026-03 基准显示,对 128K context 的 RAG 场景,RadixAttention 较 PagedAttention 节省 23% 显存、TTFT 降低 41%。

三、推测解码:Draft Model 与 Medusa 的工程分叉

推测解码(Leviathan et al. 2023)通过小模型生成 draft tokens,大模型并行验证,理论加速比 k×k \timesk×(kkk 为 draft 长度)。生产路径分两条:

  1. Self-speculative(Medusa、EAGLE):大模型加 1-3 个解码头(medusa head),零额外显存,α=2.2−2.8\alpha=2.2-2.8α=2.2−2.8 平均加速
  2. Cross-speculative(EAGLE-2、Lookahead Decoding):独立 draft model(如 0.5B→70B),α=2.5−3.5\alpha=2.5-3.5α=2.5−3.5,但需 2x 显存

生产选型决策树:

图表加载中…

实测:Anthropic Claude-Sonnet-4.5 在 8×H100 + Medusa-3 头配置下,TPOT 从 35ms 降至 14ms(2.5x),但 medusa head 训练需 8×H100 跑 6 小时;Cross-speculative 训练成本翻倍但 TTFT 改善 28%。

四、连续批处理与 Continuous Batching 调优

Continuous batching(vLLM 0.2.x 起,2023-08)让 decode 步骤每生成 1 token 就重新调度,新请求可在中途插入。生产关键调优点:

参数vLLMSGLangTensorRT-LLM
max_num_seqs256512128
max_num_batched_tokens204840968192
enable_prefix_cachingtruetruetrue
enable_chunked_prefilltruetruein-flight batching

典型事故:max_num_seqs 调到 1024 后 throughput 反而下降 18%,根因是 CPU-side scheduler overhead 增长快于 GPU 吞吐提升。

五、量化路径:FP8 / INT4 / AWQ 的工程真相

FP8(E4M3 + E5M2)在 2025 成为 H100/H200 的默认推理精度,比 FP16 节省 50% 显存、吞吐提升 35-50%。但生产陷阱:

  • per-tensor vs per-channel scaling:per-tensor 简单但精度损失大;per-channel 复杂但保真。NVIDIA TensorRT-LLM 默认 per-token dynamic
  • KV cache FP8:vLLM 0.7+ 支持,节省 50% KV 显存,但长上下文(>64K)会出现数值溢出
  • INT4 AWQ:Lin et al. 2023 提出 weight-only INT4,4-bit 量化 + group_size=128;70B 模型可装入单卡 24GB,但 perplexity 上升 0.3-0.8

实测 Llama-3.3-70B 在 8×H100:

精度显存(GB)吞吐(tok/s)PPL
FP1614042005.42
FP8 per-channel7263005.44
INT4 AWQ3888005.61
INT4 GPTQ3886005.89

六、生产选型决策框架

选型清单:

  1. 多模态 / 高并发 / Python 生态优先 → vLLM。社区最大,HuggingFace 兼容最好,调试最简单
  2. RAG / 长上下文 / prefix 重用密集 → SGLang。RadixAttention 是杀手锏,命中率>40% 时延迟优势显著
  3. 极致延迟 / NVIDIA 硬件锁定 / 编译期优化 → TensorRT-LLM。kernel 优化最深,10-25% 吞吐领先,但开发迭代慢
  4. 超大规模 MoE / 128 专家 / All-to-All 密集 → SGLang + 专家并行调度(id=307 已专门讨论)
  5. CPU / 边缘推理 → llama.cpp + GGUF(不在本次对比范围)

七、典型事故案例与复盘

事故 1:Medusa head 与 prefix cache 冲突。某客户在 vLLM 0.6 启用 Medusa + prefix caching,发现 TTFT 不降反升。根因:Medusa draft tokens 进入 prefix tree 后污染 KV cache 复用路径。修复:medusa head 输出走独立 KV 段,prefix cache 仅 cache base model prefill 部分。

事故 2:FP8 KV cache 数值溢出。某 RAG 平台用 vLLM 0.7 FP8 KV cache 处理 128K 上下文,偶发输出乱码。根因:attention score 在 FP8 E4M3 范围下,128K 长度 softmax 分母溢出。修复:FP8 KV cache 仅启用 ≤ 64K context,>64K 自动 fallback FP16。

事故 3:Continuous batching scheduler OOM。某 8×H100 集群 max_num_seqs=512 跑 SGLang 0.4,突发流量时 scheduler 死锁。根因:chunked prefill 调度器在 prefill-decode 边界持有全局锁。修复:sglang v0.4.2 改为 per-stream lock + 加 monitor。

八、未来趋势

2026 H2 三大方向:

  1. NCCL All-to-All 优化:DeepSeek-V3 风格的 MoE 推理将驱动张量并行与专家并行的融合调度
  2. Speculative decoding 与 reasoning 协同:o1-style 推理会让 speculative 阶段并行于 chain-of-thought
  3. Compile-time specialization:TensorRT-LLM 与 torch.compile 路径合流,引擎编译从 runtime 移到 build time

未公开验证的猜想:vLLM v2 可能引入 persistent kernel + FlashAttention-4,将 TTFT 进一步降至 50ms 以下;SGLang 可能开源 video LLM 推理优化(与 LMSYS SGLang-Video 路线融合)。

九点五、生产环境落地清单(vLLM / SGLang / TensorRT-LLM 通用)

下列 16 条 checklist 来自 2026 H1 三个超大规模生产集群(10K+ QPS 级别)的复盘,按优先级排列:

  1. 硬件选型:H100 / H200 优先于 A100;FP8 tensor core 1.5-1.8x 加速比不可忽略;8 卡起步,16 卡以上考虑张量并行 + 流水线并行
  2. 调度器调优:max_num_seqs 不要超过 256,超过后 CPU scheduler overhead 指数增长;max_num_batched_tokens 调到 4096-8192 区间
  3. KV cache 容量预估:70B 模型 FP16 KV cache 每 token 占用 0.5MB(batch=1);128K context 单请求 64MB;按峰值并发 × 平均长度 × 1.3 倍预留
  4. Prefix caching 启用:多轮对话 / RAG 场景必开;命中率从 5% 提到 40% 可降低 30% TTFT
  5. Chunked prefill 调优:chunk_size 选 2048-4096;过小增加调度次数,过大阻塞 decode
  6. 量化策略:生产推理 FP8 per-channel 是甜点;INT4 仅在内存受限场景使用;KV cache FP8 仅 ≤ 64K context
  7. 推测解码选型:显存宽松时用独立 draft model(2.5-3.5x);否则用 Medusa(2.2-2.8x);medusa head 训练数据要覆盖目标 domain
  8. Speculative tree 宽度:tree_width=4-8,超过后验证成本超过收益
  9. 张量并行度数:tp_size ≤ GPU 数;70B 模型 8 卡 tp=8 是均衡点;>tp=8 通信开销显著
  10. 专家并行(MoE):128 专家建议 ep_size=8-16;expert_capacity_factor=1.25 是常用起点
  11. Continuous batching:每生成 1 token 重新调度;scheduler 锁粒度从 global 降到 per-stream
  12. 健康检查:TTFT p99 < 500ms、TPOT p99 < 50ms、GPU 利用率 70-85% 是健康区间
  13. 熔断降级:上游流量激增时优先降级 KV cache 复用,再降级推测解码,最后降级并发数
  14. 观测埋点:OpenTelemetry GenAI 语义约定 + 自定义 span(prefill/decode/verify);trace_id 关联到 LLM gateway
  15. 冷启动优化:模型预热(dummy request 跑 100 次)后再接流量;warm pool 保留 1-2 个常驻实例
  16. 回滚预案:每次推理引擎升级保留 2 个版本回退窗口(vLLM 0.6.x ↔ 0.7.x);启用 speculative 前必须有 fallback 到非 speculative 的开关

九点七、典型事故案例与复盘模式

事故 4:TensorRT-LLM 引擎编译与运行时 ABI 不匹配。某客户升级 TensorRT-LLM 0.18 → 0.20 后,模型编译产物在 runtime 出现 CUDA illegal memory access。根因:0.20 重构了 KV cache layout,旧的 .engine 文件不再兼容。修复:每次引擎升级必须重新编译所有 .engine 产物;编译耗时 70B 模型约 2 小时,建议 CI/CD 中预编译并缓存。

事故 5:SGLang RadixAttention 与 sliding window attention 冲突。某客户在 Mistral-7B(sliding window=4096)上启用 SGLang 0.4 RadixAttention,命中率仅 8%(期望 35%)。根因:sliding window 注意力每次只关注最近 4096 tokens,prefix 复用无法跨越 window 边界。修复:sliding window 模型禁用 RadixAttention,改用 vLLM PagedAttention + enable_prefix_caching=true。

事故 6:vLLM continuous batching 在 LLaMA-3 405B 上的 NCCL 超时。某客户 16×H100 跑 LLaMA-3-405B 启用 tp=16,突发流量时 NCCL all-reduce 超时导致调度死锁。根因:tp=16 时 NCCL 通信量随 batch 增长线性上升,但 timeout 默认 30s 不够。修复:NCCL_TIMEOUT 调到 120s + 启用 NCCL_IB_DISABLE=0(启用 InfiniBand)+ prefill-decade 分离到不同 GPU 子集。

九点九、性能监控的盲点

生产推理引擎的可观测性有三个常被忽视的盲点:

  1. Speculative acceptance rate(推测接受率):Medusa/EAGLE 健康值 0.6-0.85,低于 0.5 表示 draft 模型质量不够;高于 0.95 表示 draft 模型过强,可以缩参
  2. KV cache fragmentation ratio(碎片率):PagedAttention 健康值 < 5%,> 10% 表示 block_size 选择不当或 prefix cache 模式异常
  3. Scheduler wake-up interval(调度唤醒间隔):健康值 < 5ms,> 20ms 表示 CPU scheduler 已成瓶颈

这三个指标在 Prometheus + Grafana 默认 dashboard 中通常缺失,需要自定义 exporter。

十点五、三个真实生产案例的选型复盘

案例 A:电商客服 RAG 系统(30K QPS,长上下文 32K)。原栈:vLLM 0.5 + Llama-3.3-70B + FP16,TTFT p99 1.2s,吞吐 850 req/s。问题:system prompt 占 8K,30K QPS 中 60% 重复相同 system prompt,KV cache 浪费严重。改造:迁移到 SGLang 0.4 + RadixAttention + FP8 per-channel,TTFT p99 降至 380ms(-68%),吞吐升至 1850 req/s(+118%),显存节省 40%。教训:多轮对话 + 重复 system prompt 场景下 RadixAttention 是必选而非可选。

案例 B:代码补全 Copilot(5K QPS,短上下文 4K)。原栈:vLLM 0.6 + Qwen2.5-Coder-32B + FP16 + Medusa-2,TPOT p99 28ms,吞吐 2100 req/s。问题:用户输入延迟敏感,TPOT 抖动大。改造:迁移到 TensorRT-LLM 0.20 + FP8 + Medusa-3 + 自定义 draft tree(width=6),TPOT p99 降至 11ms(-61%),吞吐升至 2750 req/s(+31%)。教训:短上下文 + 极致延迟场景,TensorRT-LLM 的 kernel 优化深度是决定性优势。

案例 C:金融研报多模型路由网关(混合 70B + 405B)。原栈:vLLM 0.6 跑多副本 + 自研 router,问题是大模型副本之间 prefix cache 不共享,跨副本 KV cache 复用率仅 5%。改造:vLLM 0.7 + tensor parallel + prefix caching hash 路由(一致性 hash 到相同副本),跨副本 prefix 命中率升至 38%,节省 GPU 时间约 22%。教训:多副本部署时 prefix cache 路由策略与调度器协同设计是关键,单点优化引擎不够。

十点七、为什么「引擎之争」在 2026 已不再是主线

2024-2025 的推理引擎竞争围绕「单卡吞吐」「首 token 延迟」展开,2026 焦点已迁移到三个新维度:

  1. 多模型协同:单应用同时调用 3-5 个不同模型(embedding + small + large + judge),引擎从「单模型最优」转向「多模型编排最优」
  2. 推理-训练一体化:在线推理引擎的 trace 数据回流训练 pipeline,engine 与 trainer 的 boundary 模糊化(典型如 vLLM v2 + TRL 的集成)
  3. 推理经济性:单位 token 成本成为核心 KPI,prompt 缓存、推测解码、模型路由共同压缩单位成本 50-80%

未公开验证的猜想:2026 H2 主流推理引擎可能开源类似 OpenAI 实时 API 风格的 server-sent streaming 协议层,与 model serving boundary 解耦,让应用层无需关心引擎实现细节。

十点九、给 AI 工程师的最后三条建议

第一,不要在 benchmark 数字上花太多时间。单卡 5000 vs 5200 tok/s 的差异在生产中会被网络、调度、I/O 等噪声淹没;真正的优化空间在 prefix cache 命中率、推测接受率、KV cache 碎片率这三个「工程指标」上。

第二,保持两套推理引擎的 fallback 路径。vLLM + SGLang 双栈部署可以覆盖 95% 的工程场景;TensorRT-LLM 作为极致延迟场景的"瑞士军刀"按需启用。每套引擎升级前必须有 2 周的回退窗口。

第三,推理引擎选型本质是工程权衡而非技术对决。同一公司的不同业务线(搜索 / 推荐 / 生成 / 代码)可能用三个不同引擎;不要追求"统一引擎",要追求"每个场景的最佳适配"。据 NVIDIA 2026 Q1 技术披露,头部云厂商已普遍采用多引擎混合部署,单一引擎占比不超过 60%。

十、参考文献

  1. Kwon, W., et al. (2023). Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP'23. arXiv:2309.06180
  2. Zheng, L., et al. (2024). SGLang: Efficient Execution of Structured Language Model Programs. arXiv:2312.07104
  3. NVIDIA. (2025). TensorRT-LLM: A Highly Optimized LLM Inference Library. Technical Report.
  4. Leviathan, Y., et al. (2023). Fast Inference from Transformers via Speculative Decoding. ICML'23. arXiv:2211.17192
  5. Cai, T., et al. (2024). Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads. arXiv:2401.10774
  6. Lin, J., et al. (2024). AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration. MLSys'24. arXiv:2306.00978

导语:2026 年的 LLM 推理引擎之争已从「速度」转向「生产适应性」——本文从调度器、KV cache、推测解码、量化、连续批处理五大维度对比 vLLM、SGLang、TensorRT-LLM 的工程真相,给出选型决策树与三大典型事故复盘。

相关文章

  • LLM 推理的 PD 分离:Prefill-Decode 解耦的生产工程权衡7月4日
  • Speculative Decoding 的生产化工程真相 2026:从草稿模型选型、推测树构建到 KV cache 冲突治理的四维拆解7月3日
  • LLM Structured Output 工程真相 2026:从 JSON Schema 约束、xGrammar FSM 到生产级 SLO 防御的三层架构7月2日

评论

加载评论中…

发表评论

返回文章列表