背景
每个想法在真实引擎中的位置
当你自己实现过一项技术之后,加深理解最快的方式就是去读别人的版本。这张表把每一章映射到值得一读的引擎上,从数据中心集群到树莓派上 2944 行的 C 程序。
功能矩阵
空白表示该引擎不需要这项功能,并非它有缺陷:batch 为 1 时批处理没有意义,一台机器只服务一个用户时分页同样没有意义。标记为 ? 的条目没有公开文档。
| 技术 | vLLM | SGLang | TRT-LLM | llama.cpp | picoLM | quant.cpp | baseRT |
|---|---|---|---|---|---|---|---|
| S02BPE / SentencePiece | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| S03GQA | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| S05KV 缓存 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| S06PagedAttention | ✓ | radix | ✓ | partial | — | — | ✓ |
| S07前缀缓存 | ✓ | ✓ | ✓ | reuse | save/load | save/load | ✓ |
| S08权重量化 | FP8/AWQ/GPTQ | FP8/AWQ | FP8/INT4 | GGUF K | Q2_K–Q8_0 | IQ2–Q8 | .base Q2–Q8 |
| S08KV 量化 | FP8 | FP8 | INT8/FP8 | Q8/Q4 | fp16 | 4-bit | yes |
| S09连续批处理 | ✓ | ✓ | in-flight | parallel seqs | — | — | ✓ |
| S10抢占 | recompute | recompute | swap | — | — | — | ? |
| S11分块 prefill | ✓ | ✓ | chunked ctx | — | — | — | ? |
| S12FlashAttention | ✓ | ✓ | ✓ | ✓ | online softmax | ✓ | ✓ |
| S13CUDA Graph / 提前编译 | ✓ | ✓ | full AOT | — | n/a (CPU) | n/a | ✓ |
| S14投机解码 | ngram/EAGLE | EAGLE | ✓ | lookahead | — | — | ? |
| S15语法约束 | XGrammar | built-in | ✓ | GBNF | JSON only | — | ? |
| S16MoE | ✓ | ✓ | ✓ | ✓ | — | ✓ | ✓ |
| S17张量并行 | ✓ | ✓ | ✓ | RPC | — | — | — |
| S18P/D 分离部署 | ✓ | ✓ | ✓ | — | — | — | — |
| S19OpenAI 兼容 API | ✓ | ✓ | Triton | ✓ | — | bindings | ✓ |
该读什么,以及为什么
本课程大部分内容的参考实现。提出了 PagedAttention;v1 引擎核心是调度器、block 管理器和模型执行器交汇的地方。
读它是为了:调度器和 KV 缓存管理器。它们是 S06、S07、S10 和 S11 最清晰的生产版本。
RadixAttention 把前缀缓存和分配器合成了一个结构。在结构化输出和跳跃解码上最有说服力。
读它是为了:S07 和 S15,那里它的设计与 vLLM 分歧最大。
提前把整个模型编译成一张固定的图。在 NVIDIA 硬件上最快;对 shape 也最不灵活。
读它是为了:看看把 S13 推到极致是什么样子。
GGUF 生态和 K-quant。哪儿都能跑,也定义了如今所有人都要读的量化格式。
读它是为了:S02 和 S08,也就是分词器和量化 kernel。
2944 行、零依赖,在树莓派上以 45 MB 常驻内存跑 TinyLlama——这 45 MB 是约 2k 上下文下的 KV 缓存;mmap 进来的权重由文件支撑,不计入其中。融合的 dequant+dot、在线 softmax、语法约束的 JSON。
读它是为了:把整个 S01–S05 装进脑子里的那种形态。
专攻 KV 缓存压缩的单头文件引擎:Lloyd-Max 码本、随机 Hadamard 变换、覆盖近期 token 的全精度窗口。(其 README 称「无损」;码本路径实际是有损的,只是接近无损。)
读它是为了:把 S08 用在缓存而不是权重上。多数引擎只把这件事当成事后补充。
一个 CLI 就能拉模型、聊天、并提供 OpenAI 兼容 API。在 Apple Silicon 和 GB10 上支持分页 KV、连续批处理和前缀缓存。
读它是为了:S19,看看当服务面向一台机器而不是一个集群时,它长什么样。
诚实地选一个
- 在 GPU 上服务大量用户: vLLM 或 SGLang。两者都很优秀;SGLang 在结构化输出和前缀密集负载上领先,vLLM 的硬件与功能覆盖面更广。
- 在 NVIDIA 上追求极致吞吐、且愿意编译: TensorRT-LLM。
- 一个用户、一台机器: llama.cpp 或 baseRT。这种规模下批处理和分页帮不上忙,收益几乎全部来自量化。
- 在笔记本上跑超长上下文: quant.cpp,它的整个设计都围绕压缩 KV 缓存而不是权重。
- 为了学习,或嵌入到很小的东西里: picoLM。它是这份清单上唯一一个你能一口气从头读到尾的。