本文作者:meng shao(@shao__meng)。版权归作者所有,未经授权禁止转载。


LLM Inference Handbook 深度解读

这本手册由 Modular @Modular (Mojo 语言与 MAX 推理引擎的开发公司) 编写并公开维护,定位是 “技术词汇表 + 指南 + 参考手册” 三合一。它要解决的问题很实际:LLM 推理的知识碎片化严重,机制散落在论文里,调优经验散落在厂商博客、GitHub issues 和 Discord 里,没有人能把 “从指标定义到 GPU 内存层级再到多云部署” 这条完整链路讲清楚。这本手册就是要把这些碎片做系统化整合。

目标读者是在生产环境中部署、扩展或运营 LLM 的工程师,目标只有一句话:让推理“更快、更便宜或更可靠”。全书 7 大章节 (基础、部署规划、模型准备、模型交互、推理优化、内核优化、基础设施与运维),另附约 20 个交互式可视化工具。每个页面 URL 加 .md 后缀可获取 Markdown 原文,llms.txt 提供完整索引,这本身就是一个对 LLM 时代非常友好的设计。

它的价值不在于任何单点技术的深度,在于体系性​:每个技术都按“解决什么问题 → 机制如何工作 → 代价是什么 → 何时不该用”的统一结构讲解,并明确标注技术之间的依赖关系。

全书的分析骨架:三个核心认知框架

手册篇幅庞大,但真正的骨架只有三个框架。掌握它们,几乎所有章节内容都能自然归位。

框架一:prefill 与 decode 的两阶段二分法

这是全书最重要的主线:LLM 推理不是同质的计算,是两个性质完全相反的阶段​。

  • Prefill (预填充):整个 prompt 并行处理,是大矩阵乘,属于 compute-bound(算力受限),决定 TTFT (Time to First Token),能把 GPU 喂饱。
  • Decode(解码)​:自回归逐 token 生成,每步都要把权重和不断增长的 KV cache 从显存读一遍,属于 memory-bound(带宽受限),决定 ITL/TPOT (逐 token 延迟)。

这个二分法是一切优化技术的出发点:batching 是在利用 decode 闲置的算力;chunked prefill 解决“新请求的 prefill 打断在途 decode”的冲突;prefill-decode disaggregation 干脆把两阶段拆到不同硬件池;量化直接减少 decode 每 token 搬运的字节数;FlashAttention 解决 attention 的内存瓶颈。

手册给出了一个极简的 decode 速度上限公式:单序列 decode 吞吐上限 ≈ 显存带宽 ÷ 每 token 读取字节数​。算例:70B 模型 FP16 权重约 140 GB,H100 带宽 3.35 TB/s,则单条序列理论上限约 24 tokens/s,这与模型多“聪明”无关,纯粹是物理限制。这也解释了为什么 batching 如此重要:权重读取可以跨序列摊销。

框架二:KV cache 是整个系统的中心约束

限制系统并发能力的通常不是模型权重,是 KV cache。

KV cache 随序列长度线性增长且必须驻留显存。手册的量化例子:Llama 3 8B(FP16)权重约 16 GB,一条 8K token 序列的 KV cache 约 1 GB,80 GB GPU 上理论并发上限约 60 条序列。对 70B 模型更夸张:约 320 KB/token,128K context 下单个请求的 KV cache 可达 40 GB。

全书后半部分的技术网络几乎全部围绕 KV cache 展开:

  • PagedAttention:把 KV cache 切成固定大小的 block 分页管理(借鉴 OS 虚拟内存)。关键认知:收益不在 kernel 层而在 serving 层,在它之前,引擎按最坏情况预留连续内存,实测只有 20.4%–38.2% 的 KV 内存真正存了有效 token 状态​,其余全是碎片和浪费。
  • Prefix caching:跨请求复用前缀相同的 KV(精确到逐字节一致)。Anthropic 报告 Claude 的 prompt caching 可省 90% 成本、降 85% 延迟;agent 场景输入输出 token 比可达 100:1,不缓存等于每次都为同一大 prompt 全额付费。
  • KV cache offloading:不活跃的 KV block 分层降级到 CPU RAM / SSD / 远端存储。判据:传输成本必须低于重算成本;NVIDIA 报告多轮对话下 TTFT 最多快 14×。
  • PD disaggregation:prefill 与 decode 独立硬件池,KV 需在池间传输,把“调度问题”升级为“数据传输问题”。
  • Inference routing:因为 KV cache 有状态,传统 round-robin 会把本可命中缓存的请求发到没有缓存的 worker(N 个 worker 时命中概率只有 ~1/N)。

串起来看:现代 LLM serving 的本质,是一个围绕有状态的 KV cache 做内存管理、复用、分层和调度的系统​。这是手册最深刻的一条洞察。

框架三:一切皆 trade-off,唯一方法论是 benchmark

没有普适最优配置,所有优化都在别处付出代价​:交互负载要低延迟(小 batch、独占算力),批处理要最大吞吐(大 batch、共享算力),方向直接冲突;continuous batching 消除批内等待,但 chunked prefill 的 chunk 越小,活跃请求的 ITL 越平滑、新请求的 TTFT 却越差;speculative decoding 在高并发下收益缩水(batching 已把空闲算力用掉);PD disaggregation 网络没调好反而掉 20–30% 性能;更高 TP 并行度不等于更好性能。

因此手册反复强调的唯一方法论是:在自己的模型、硬件、流量分布下 benchmark。配套的“benchmark 素养”包括:TPOT 与 ITL 统计口径不同(token 加权 vs 请求加权);TPS 必须分清 input/output 口径,且可被短 prompt“刷分”;更有意义的指标是 goodput,满足 SLO 前提下的吞吐。不同场景的目标差异巨大:chatbot 要 TTFT < 500ms 才感觉快,代码补全要 < 100ms,每天看一次的长报告 30 秒也可接受。

推理优化:一张相互咬合的技术网

推理优化章节是全书技术密度最高的部分:

| 技术 | 一句话机制 | 主要代价 |
| --- | --- | --- |
| Continuous batching | 每个 decode iteration 动态调整 batch 组成,完成的请求立即被替换 | 需与内存管理配合 |
| Chunked prefill | prompt 切块分摊到多个 iteration 与 decode 混批,数学上等价于整段处理 | TTFT 上升,chunk 越小越明显 |
| PagedAttention | KV cache 按 block 分页 + block table 间接寻址 | kernel 实现复杂度 |
| Prefix caching | 从请求开头找最长前缀匹配,复用已算好的 KV | 内存压力、命中率敏感于 prompt 结构 |
| Speculative decoding | 小 draft model 先猜 K 个 token,大模型一次 forward 并行验证,输出与原模型完全一致 | 双模型驻留显存,接受率低时白烧算力 |
| PD disaggregation | prefill/decode 独立硬件池,独立扩缩容 | KV 传输成本、缓存格式兼容性 |
| TP/PP/DP/EP | 层内切分 / 按层分段 / 副本复制 / MoE expert 分布 | 通信开销 / 流水线气泡 / 内存复制 / 路由复杂度 |
| KV cache offloading | 不活跃 KV 分层降级到慢介质,命中时异步搬回 | 传输速度、选择性 offload 的质量风险 |
| Inference routing | 按 cache locality、负载、内存压力选 worker | 元数据与协调复杂度 |

几个值得单独展开的点:

Speculative decoding 的完整图景。 核心公式:平均接受长度 τ = (1 − α^(γ+1))/(1 − α)(α 为接受率,γ 为每轮猜测 token 数);经验值 α ≥ 0.6 且 γ ≥ 5 时预期 2–3× 加速(模拟上界)。四族方法各有定位:独立小 draft model(经典)、EAGLE 系列(在特征层 draft,加速最强,3–6.5×)、Medusa(模型内置多头)、N-gram 检索式(零模型零训练,最适合总结、改写这类“从输入复制”的任务)、DeepSeek-V3 原生 MTP(与主模型联合训练)。关键失效场景:高并发 + 单卡、接受率低、tokenizer 不兼容。

并行的经验法则。 FP8 权重约每十亿参数 1 GB,405B 模型仅权重就要 405 GB,必须切分,但切法有讲究:TP 留在节点内走 NVLink(900 GB/s,约 PCIe 5.0 的 7 倍),PP 适合跨节点低带宽链路,DP 为了吞吐和容错(代价是权重完整复制),EP 只为 MoE 服务​。原则:量化后单卡放得下就单卡;一切组合都要实测。

Routing 的层级递进。 从 round-robin(cache-blind)到 prefix-aware 一致性哈希、router 侧近似索引、再到精确 cache-aware 调度(如 llm-d 基于 KV 事件跨 Pod 打分)。重要提醒:饱和 worker 上的大缓存命中,可能不如有富余 worker 上的小命中快,缓存信号必须与负载、内存压力联用。

GPU 与 kernel 层:内存金字塔是唯一的真理

Kernel optimization 章开篇一句话概括全章:“大多数 GPU kernel 优化技术,归根结底就是两件事:少搬数据,或者把数据复用在内存层级中更快的一层。”

H100 内存金字塔 (全章核心数字表):

| 层级 | 容量 | 带宽 | 延迟 |
| --- | --- | --- | --- |
| Registers | 256 KB / SM | 最高 | ~1 cycle |
| Shared memory / L1 | 228 KB(SMEM 上限) | ~20 TB/s | ~20–30 cycles |
| L2 cache | ~50 MB | ~12 TB/s | ~200 cycles |
| HBM | 80 GB | 3.35 TB/s | ~400+ cycles |

每层之间是数量级的差距,这是所有优化的物理基础。decode 的 token 吞吐由 HBM 带宽决定,因为每生成一个 token 都要把权重和 KV cache 从 HBM 搬一遍。

执行模型关键机制​:warp(32 线程)是真正的调度单位;warp divergence 让分支路径串行执行;memory coalescing 要求相邻线程访问相邻地址(访存以 32 字节 sector 为单位,stride 访问会取回 1024 字节只用 128 字节,浪费 8 倍带宽);SM 靠驻留 warp 切换实现 latency hiding,occupancy 由寄存器和 shared memory 用量决定,但 occupancy 不是越高越好:FlashAttention 主动用 occupancy 换取片上存储,从而省掉更昂贵的 HBM 流量​。

Tensor Cores:专用矩阵乘累加单元。精度演进:Volta(FP16)→ Ampere(BF16/TF32/INT8)→ Hopper(FP8)→ Blackwell(FP4/FP6)。两个关键点:输入精度 ≠ 累加精度(可 FP16 输入、FP32 累加);用了 FP8 并不自动激活 Tensor Core,shape、alignment、layout 必须全部命中。对推理的相关性很直接:prefill 吃满 Tensor Core,小 batch decode 时它大量闲置,batching 恢复了矩阵维度,这正是推理服务器激进批处理的根本原因​。

FlashAttention 案例​:标准 attention 必须把 N×N 注意力矩阵写进 HBM 再读回(16K token 的内存需求是 1K 的 256 倍),是 memory-bound。FlashAttention 把 Q/K/V 切成装得进 SRAM 的 tile,在片上完成全部计算,用 online softmax(running max + running sum 的增量重缩放)保证数学等价,N×N 矩阵从不被物化,内存从 O(N²) 降到 O(N),FA-1 获得 2–4× 加速、省 10× 内存,FA-4 在 B200 上达 1613 TFLOPS。FA-4 还给出架构级洞察:Blackwell 上 Tensor Cores 变快但 shared memory 带宽、SFU、寄存器没有同比提升(非对称扩展),瓶颈迁移了,kernel 优化必须逐硬件代次重做​。

工具链“控制阶梯”​:厂商库(cuBLAS/cuDNN)→ AI 编译器(TVM/XLA)→ Triton → 手写 CUDA → Mojo/MAX。注意最后一级是 Modular 自家产品。手册同时给了清醒结论:大多数推理团队不应该自己写 kernel​。

模型准备:降本三部曲

清晰的三层心智模型:蒸馏减少参数数量 → 量化减少每参数位宽 → 运行时优化提升 serving 效率,三者可叠加。 量化是重点。7B 模型仅权重:FP32 约 28 GB → FP16 约 14 GB → INT8 约 7 GB → INT4 约 3.5 GB;H100 上 FP8/INT8 算力是 BF16 的 2 倍(3,958 vs 1,979 TFLOPS)。方法谱系:GPTQ(压到 3–4 bit,175B 模型只需约 4 GPU 小时量化、可跑单张 A100、约 3.25× 加速)、AWQ(基于 activation 分布识别约 1% 的关键权重加以保护)、SmoothQuant(把量化难度从 activation 转移到 weights,实现 W8A8,2× 内存减少、1.56× 加速)。重要区分:权重量化不减少每 token 的 KV cache 大小,那是独立的 KV cache 量化的事​。

蒸馏产出全新模型,标志性案例是 DeepSeek-R1(671B)把推理能力蒸馏到 1.5B–70B 变体;chain-of-thought distillation 对小模型推理能力提升最显著。

微调一页最有价值的是决策顺序:先建 evaluation set → 先改 prompt/示例/检索/工具 → 同一 eval set 度量 → 只有系统性、值得固化进模型的失败才微调​。“几千条高质量样本”常常就够,质量比数量重要。

模型交互:从解码参数到 Agent 生态

这一章把“如何与模型对话”讲成分层控制体系:

  • 推理参数是“软”控制。低温锐化分布、top-p 按累计概率自适应截断(top-k 是硬上限,不适应分布形状)。两个常见误解:低温不保证事实正确(只减少解码随机性,模型仍会自信地答错);调参顺序应是 temperature → greedy → top-p → top-k,一次只改一个变量。
  • Structured outputs 三条路径按保证强度递增:API schema 强制(方便但锁定 vendor)→ re-prompting 校验重试(每次重试都是完整模型调用)→ constrained decoding:生成时实时修改 logits,把违反 schema 的候选 token 移除,按构造保证输出合法(最快最强,vLLM/SGLang/MAX 均已集成)。
  • Agent 生态分工一句话讲透:"​Tools are the actions. Function calling is how the model requests those actions.​" MCP(Host/Client/Server/Protocol 四层)标准化工具接入;harness 提供循环、权限、记忆、验证,"Agent = Model + Harness",同一模型在不同 harness 下同一 benchmark 分数可能差异巨大。对推理侧的实际影响:多并发 agent 会话的 GPU 内存消耗“可能远超对模型权重的直观估算”。
  • API 兼容层:OpenAI-compatible endpoint 已是事实标准(换 base_url 即接入);选择依据是既有技术栈而非模型,同一模型可放在任一 API 形态后面。

部署与运维:LLM 颠覆了 cloud-native 的前提

本章深层主题:LLM serving 打破了传统 web 服务运维的全部假设,副本从无状态变成有状态 (KV cache),请求从同质变成异质(20 token 与 4,000 token 成本天差地别,RPS 因此失效),扩容从秒级变成分钟级(冷启动),硬件从可分片变成整卡占用。

规划期的关键工具:

  • 内存公式:Memory (GB) = P × (Q/8) × (1 + Overhead)(overhead 通常 10–30%,长上下文负载远超此数);
  • 精度硬门槛:原生 FP8 需要 Hopper(H 系列)或更新架构,A100 不支持;
  • GPU CAP Theorem:任何 GPU 基础设施无法同时保证 Control、on-demand Availability、Price,三者取二(hyperscaler / NeoCloud serverless / 长约 / on-prem 各占一角);
  • 框架版图:vLLM / SGLang / MAX / TensorRT LLM(高吞吐),llama.cpp / MLC-LLM / Ollama(edge,注意 Ollama 仅单请求无并发),HF TGI 已进 maintenance mode。

运维期的核心问题:

  • 冷启动三段​:云供给(30 秒到数小时)→ 容器镜像拉取(3–5 分钟)→ 模型加载(HF 下载未优化大文件吞吐,数据流串行多跳,必须完整落盘才能推理);
  • 扩缩信号选型​:CPU 利用率被 Python GIL 失真;GPU utilization 只要窗口内跑过任意 kernel 就报“已利用”;QPS 不反映请求成本差异;concurrency(排队+处理中请求数)是理想指标​;
  • 多云的真实动因​:同一张 H100 在 GCP 不同区域月租从 $8,074 到 $12,816,差近 60%;加上 data residency 和 lock-in 对冲,跨区/跨云从锦上添花变成经济必需;
  • InferenceOps 四支柱​:标准化发布(canary / blue-green)、安全更新与自动回滚、大规模集中管理(model registry + 统一控制面)、成本与资源卫生(idle GPU 清理)。金句:"Metrics tell you what is happening, but events and logs tell you why."
  • 自建的真实成本​:懂 GPU + K8s + ML framework + 分布式系统的工程师薪资比传统 DevOps 高 30–50%;“搭基础设施的每一周,都是没花在改进模型或交付产品价值上的一周”。Build/buy 决策三要素:volume、control、staffing。

贯穿全书的四个深层洞察

把七个章节叠起来看,可以提炼出四条手册没有明说、但处处体现的洞察:

1. LLM serving 的本质是“有状态异质负载的专用硬件运维”。 传统 SRE 经验失效的根源:状态(KV cache)决定性能、请求异质决定 RPS 失效、专用硬件决定不可分片。手册的“路由 → 分层存储 → 分离部署”技术路线,本质上是在为 KV cache 构建一个分布式缓存系统,PagedAttention 借鉴 OS 分页,prefix caching 近似 CDN 语义,offloading 就是存储分层,几乎是在“为 token 建一个存储引擎”。

2. 优化的空间全部来自“物理特性的错配”。 Prefill 算力受限而 decode 带宽受限,这个错配催生了整个优化谱系。识别“什么在限制我”,算力、带宽、容量还是协调开销,是所有优化的第一步。

3. 系统复杂度正在从 kernel 层转移到调度与状态层。 FlashAttention 这类 kernel 突破正被框架商品化,竞争前沿移到 serving 层:调度、路由、分层、KV 传输。这也是手册把大量篇幅给系统层而非算法层的原因。

4. 测量口径本身就是工程能力。 ITL 与 TPOT 的加权差异、TPS 的口径与刷分、GPU utilization 的失真、benchmark 的变量控制,在一个所有结论都 workload-specific 的领域,测量方法论是唯一可迁移的知识​。

结语

这本手册的最佳用法是两层:通读一遍建立地图,之后当查询表用​。通读建议从 Foundations 开始 (prefill/decode + 指标两页是全书的钥匙),直读推理优化和 kernel 两章建立技术纵深,部署运维章节按需查。最优配置不是理论推导出来的,是在你自己的模型、硬件、流量分布上测出来的,手册能给你的,是知道该测什么、为什么测、以及每个旋钮转动时代价在哪里。