GitHub · 项目涌现

patchy631/首个令牌生成时间

patchy631/time-to-first-token

二〇二六年八月四日·★ 251·⑂ 22·HTML·Apache-2.0 · GitHub 原仓库

一份为期10周、每天30分钟的学习路线图,面向希望在生产环境运行LLM推理的工程师。通过50次课程交付一个兼容OpenAI的推理服务,部署于租用GPU,进行超1000并发请求的负载测试,使用量化和投机解码优化,部署成本感知路由器,并发布可复现的benchmark。课程涵盖vLLM、SGLang、Grafana监控、Kubernetes部署及单位经济性分析,最终产出含TTFT、token间延迟等指标的仪表盘和benchmark报告。

通过交付一个服务来学习 LLM 推理服务

一份为期 10 周、每天 30 分钟的学习路线图,面向那些真正想在生产环境中运行 LLM 推理,而不仅仅是阅读相关资料的工程师。

五十次课程。每一次都服务于同一个目标产物:一个兼容 OpenAI 的推理服务。你将把它部署在租用的 GPU 上,对其进行监控,进行超过 1000 并发请求的负载测试,使用量化和投机解码进行优化,在其前面部署一个成本感知路由器,并将其发布为可复现的 benchmark。

另一种方法是运行十七个孤立的实验,但这种方法大部分时间都花在了环境搭建上。一个持续演进的服务能让你获得相同的知识覆盖,并最终留下一个可以展示的成果。


适用人群

你应该熟悉 Python、在架构层面了解 transformers,并且能熟练使用命令行。你不需要有 serving、Kubernetes 或 CUDA 的经验。

如果你已经了解某个主题,标记为 skim 的课程可以压缩。但不要压缩 build 课程,它们才是核心。

最终成果

时间投入

每次课程时长 30 分钟
每周课程次数 5 次,外加 2 天缓冲日
总计 10 周,50 次课程,25 小时
GPU 成本 大约一张按半小时租用的 24GB 显卡,外加两次 H100 会话

设置缓冲日是为了防止错过某天的课程导致整个计划崩溃。它们用于追赶进度,而非学习新内容。


路线图的排序逻辑

这里的顺序是经过深思熟虑的,与大多数人列出的清单不同。五个决策决定了这个顺序。

Roofline 模型放在首位。 之后的每一个优化都是在这张图上的一次移动。量化针对的是内存带宽受限的解码阶段。连续 batching 提高了算术强度,使其接近计算上限。投机解码则是在内存受限的情况下,用相对廉价的 FLOPs 来减少顺序内存加载。分离式架构的存在是因为 prefill 是计算密集型的,而 decode 是内存密集型的,它们会在同一块 GPU 上争抢资源。没有这个模型,其余部分就只是一堆技巧。

测量先于优化。 监控工具在第 3 周就位,负载测试在第 5 周进行,远早于调优阶段。没有它们,后续的一切都无法验证,而一个公开的 benchmark 主要就是一个可信的测量工具加上一个模型。

Paged attention 和连续 batching 不是构建练习。 vLLM 实现了这两者,chunked prefill 是 vLLM 和 SGLang 中的默认调度策略。重新实现它们,不如阅读 block manager 和 scheduler 代码,直到你能从代码层面解释为什么内存浪费能降到 4% 以下,以及为什么 GPU 在请求之间不再空闲。

路由器与单位经济性紧密相连。 一个根据成本、延迟和质量来选择后端的路由器,是唯一能强制将美元数字和延迟预算落实到代码中的组件。在同一周学习经济学,能将阅读内容转化为路由策略,而不是一篇你只是赞同的博客文章。

边缘部署是可选的,并且放在最后。 ONNX Runtime、TensorRT-LLM 和 WebLLM 是客户端和嵌入式运行时。它们与其余九周构建的数据中心技术栈几乎没有运维层面的交集。


准备工作

GPU 访问

一个 7-8B 模型大约需要一张 24GB 的 GPU。按半小时租用,并在课程间隙关闭实例。

提供商 优势
RunPod 按秒计费,快速启动 pod
Modal Serverless,最适合 benchmark 批量脚本
Lambda / vast.ai 便宜的按需 GPU 和市场 GPU
Colab 纯 Python 会话,不支持 serving

第 1 周全部、第 3 周大部分、第 6 周讲座日以及第 9 周所有阅读都不需要 GPU。围绕构建日批量租用 GPU。恰好有两个会话需要 H100:第 5 周的 1000 并发测试,以及第 8 周如果实际运行分离式架构的话。

需要安装的工具

pip install vllm
pip install guidellm
pip install sglang

另外,还需要 Docker 来运行 Prometheus 和 Grafana 技术栈,以及 kind 或一个小型托管集群用于第 8 周。


路线图

图例:read 课程用于加载上下文,build 课程用于产出成果。skim 标记你可能已在概念上掌握的材料,其价值在于动手实践部分。


第 1 周:心智模型

重点。 安装贯穿始终的那个模型。Roofline、算术强度,以及为什么 decode 受限于内存而 prefill 受限于计算。

形式。 以视频为主。Roofline 推理受益于现场推导和图表。

交付物。 为你将服务的模型手推一个算术强度数值,并能说明哪个阶段受带宽限制及其原因。

日期 课程
周一 read · 从第一性原理理解深度学习加速 (Horace He),前半部分,涵盖计算 vs 内存带宽 vs 开销区间。
周二 read · 完成该文章。算子融合、开销,以及为什么增加 FLOPs 对内存带宽受限的内核毫无作用。
周三 read · Stanford CS336 第 5 讲:GPU (Percy Liang, Tatsunori Hashimoto),前 30 分钟:执行模型和内存层次结构。幻灯片
周四 read · CS336 第 5 讲,后 30 分钟:算术强度、roofline、为什么数据搬运占主导。文字版:Transformer 推理算术 (kipply)。
周五 build, skim · 为你目标模型手推算术强度。价值在于自己推导出数值,而非重读解释。
缓冲日 CS336 第 10 讲:推理,然后是 Databricks 文章 中关于 prefill vs decode 的开篇部分。

第 2 周:vLLM:先部署,再阅读其内部机制

重点。 启动服务,然后深入 block manager 和 scheduler,直到从代码中理解 paging 设计。

形式。 PagedAttention 以文本为主,论文更精确。V1 架构以视频为主。

交付物。 一个服务于 7-8B 模型的 OpenAI 兼容端点,以及你自己从源码角度解释 PagedAttention 和 V1 scheduler 的笔记。

日期 课程
周一 read, skim · PagedAttention 公告。先前的系统因碎片化和过度预留浪费了 60-80% 的 KV 内存;固定大小的块将浪费降至 4% 以下。然后略读 SOSP 论文 的块表部分。
周二 build · 在 vLLM 的 OpenAI 兼容服务器后面服务 Llama-3.1-8B-Instruct 或 Qwen2.5-7B。保存启动命令,你将在十周内反复使用它。Modal 示例
周三 read · vLLM Office Hours 22: Intro to vLLM V1 (Michael Goin, Red Hat)。文字版:vLLM V1 架构
周四 read · Inside vLLM: Anatomy of a High-Throughput Inference System,scheduler 和 block manager 部分。
周五 build · 在代码仓库中追踪块表代码路径。用三句话写下请求的块是如何被查找的。如果写不出来,再读一遍。
缓冲日 对照代码重读 V1 博客的 scheduler 部分,并记录博客在哪些地方做了简化。

第 3 周:测量基础设施

重点。 在优化之前构建好“透镜”。本周之后的一切之所以可读,都归功于本周。

形式。 以文本为主。关于 benchmark 方法论的文章比任何可用的视频都更有价值。

交付物。 一个实时的 Grafana 仪表盘,在你自己的服务上展示 TTFT、token 间延迟、吞吐量和队列深度。

日期 课程
周一 read · vLLM 指标设计文档。了解 num_requests_runningnum_requests_waiting 和延迟直方图实际测量的是什么。
周二 build · 针对你的服务搭建 Prometheus 和 Grafana 技术栈
周三 build · 导入仪表盘 JSON,确认在少量负载下实时面板有变化。现在就修复 scrape 配置,而不是等到第 5 周在 1000 并发请求下处理。
周四 read · Databricks 性能工程NVIDIA benchmark 基础。将他们定义的每个指标映射到一个面板。没有定义的面板将被删除。
周五 read · 如何对 LLM 引擎进行 Benchmark (Modal)。为什么要扫描请求速率而不是选择一个,以及为什么饱和点会被丢弃。
缓冲日 可选:vLLM Office Hours 21: Production Stack Deep Dive,了解部署环境中的可观测性。

第 4 周:SGLang、RadixAttention 和 batching 内部机制

重点。 通过对比来学习设计空间:固定块 paging 与树状结构前缀复用。

形式。 混合。RadixAttention 讲座由项目负责人主讲。Chunked prefill 仅有文字资料。

交付物。 同一服务的 SGLang 版本,以及与 vLLM 的首次前缀复用对比。

日期 课程
周一 read · RadixAttention 和 SGLang。报告称在前缀密集型工作负载上吞吐量最高可提升 5 倍,而在无缓存命中时没有明显开销,这告诉你它在哪些工作负载上占优。
周二 build · 使用与第 2 周相同的模型部署 SGLang。相同的硬件,相同的 prompt,这样引擎就是唯一的变量。
周三 read · 使用 SGLang 实现高效 LLM 推理 (Lianmin Zheng, SGLang 负责人)。论文:SGLang, NeurIPS 2024
周四 read, skim · 连续 batching (Anyscale),然后是 Orca, OSDI 2022。重点关注迭代级调度和使数据真实可信的重尾长度假设。
周五 read · Sarathi-Serve 关于 chunked prefill 和无停顿调度。这就是 chunked prefill 成为两个引擎默认策略的原因。
缓冲日 SGLang v0.4 零开销调度器,然后针对两个引擎运行共享系统 prompt 的工作负载,观察 TTFT 差距。

第 5 周:负载测试至 1000 并发

重点。 构建可复现的测试工具,并在需要捍卫任何结果之前,了解什么使 benchmark 具有说服力。

形式。 以文本为主。仅限文档和实践。

交付物。 一个脚本化的并发扫描,超过 1000 并发请求,输出 p50、p95 和 p99 指标,并由两个独立工具交叉验证。

日期 课程
周一 read · GuideLLM 介绍 并安装它。它会从同步基线扫描到饱和点,而不是测试一个任意的负载水平。
周二 build · 使用固定的输入和输出 token 长度运行 GuideLLM 扫描。固定长度决定了 KV 缓存大小,从而决定了整个结果。
周三 build · 在相同工作负载上运行 vllm bench serve 作为交叉验证。两个工具结果不一致是信息,而不是问题。
周四 build · genai-perf 并发扫描,从 1、2、4 一直到 128。找到吞吐量饱和而延迟恶化的点。这个拐点是曲线上唯一有趣的点。
周五 build · 仅本次课程租用 H100。将并发推至 1000 以上,观察 KV 缓存利用率和 num_requests_waiting 以了解抢占情况。在运行时阅读 vLLM 调优策略
缓冲日 将发布前检查清单写入你的 benchmark 仓库。

第 6 周:量化权衡

重点。 第一个调优旋钮,也是你的测试工具第一次发挥价值的一周。

形式。 以视频为主。讲座是入门,论文是深入。

交付物。 在吞吐量和质量代理指标上,将 FP8 和 INT4/AWQ 变体与 FP16 基线进行对比 benchmark。

日期 课程
周一 read · MIT 6.5940 第 5 讲:量化 第一部分 (Song Han),前半部分。课程页面
周二 read · 完成第 5 讲,开始第 6 讲,深入了解 AWQ、GPTQ 和 SmoothQuant。SmoothQuant 和 AWQ 出自该实验室。
周三 read, skim · Lilian Weng 综述 中的量化部分。写下你运行的每个引擎实际实现了哪种方法。
周四 build · 服务一个 AWQ 或 GPTQ checkpoint 以及一个 FP8 变体。在与第 5 周相同的扫描下捕获吞吐量和内存。vLLM 量化文档
周五 build · 在 FP16、FP8 和 INT4 上运行固定的评估集或 perplexity 代理指标。这个表格是交付物,而不是加速比数字。
缓冲日 QLoRA 讲座 (Tim Dettmers, LLM.int8() 和 QLoRA 的作者),然后是 LLM Compressor office hours

第 7 周:投机解码和 KV 驱逐

重点。 两个概念广为人知但实现细节并非如此的控制旋钮。

形式。 投机解码以视频为主,由编写 vLLM 实现的人讲授。KV 驱逐以文本为主。

交付物。 一个投机解码变体和一个长上下文驱逐配置,均已完成 benchmark,包括负面结果。

日期 课程
周一 read, skim · 投机解码文档 中的方法选择表,然后是 vLLM benchmark 文章:在 QPS 为 1 时最高加速 2.8 倍,但在高 QPS 时减速 1.4-1.8 倍。交叉点是关键发现,而非加速比。
周二 read · GPU MODE 第 22 讲:vLLM 投机解码黑客指南 (Cade Daniel, Anyscale),前半部分:proposer、scorer、verifier、draft model worker。
周三 build · 启用投机解码,并在低和高 QPS 下 benchmark token 间延迟。找到你自己的交叉点就是本次课程的内容。
周四 read · StreamingLLM (Guangxuan Xiao et al, ICLR 2024):相比滑动窗口重计算最高加速 22.2 倍,在超过 4M token 时保持稳定。可选视频:StreamingLLM 和 DuoAttention (MIT CSAIL)。
周五 build · 配置一个长上下文工作负载和驱逐策略,然后测量内存和 TTFT。长上下文是驱逐从理论走向实践的地方。
缓冲日 完成 GPU MODE 第 22 讲,然后略读 speculators其 office hours

第 8 周:分离式服务和 Kubernetes

重点。 第 1 周的 prefill 和 decode 不对称性演变为一种架构,然后是运行它的运维层。

形式。 分离式架构以视频为主。Kubernetes 以文本为主,因为它变化太快,视频难以保持最新。

交付物。 你的服务部署在 Kubernetes 上,自动扩缩容由队列深度而非 CPU 驱动。

日期 课程
周一 read · DistServe at OSDI 2024 (Yinmin Zhong, 报告作者)。报告称可服务 7.4 倍请求或维持 12.6 倍更严格的 SLO。论文
周二 read · Splitwise (Microsoft, ISCA 2024):使用 H100 处理 prefill 和功率受限的 A100 处理 decode,在成本降低 20% 的情况下实现了 1.4 倍吞吐量。然后是 vLLM 分离式 prefill
周三 read · Mooncake (FAST 2025 最佳论文),以 KV 缓存为中心,已在 Kimi 生产环境中运行。然后是 SGLang PD 分离。比较每个引擎如何拆分各阶段。
周四 build · 使用 vLLM 生产技术栈 Helm charts 部署,可在托管集群或 kind 上。
周五 build · 基于 num_requests_waiting 自定义指标进行扩缩容,而非 CPU。在 GPU 服务上基于 CPU 的自动扩缩容正是本次课程要避免的错误。
缓冲日 将生态系统置于地图上:PyTorch 分离式推理NVIDIA Dynamollm-d

第 9 周:单位经济性和路由器

重点。 将成本阅读转化为代码。这是路线图从关注延迟转向关注利润率的时刻。

形式。 以文本为主。

交付物。 一个根据成本、延迟和质量选择后端的路由器,以及按请求的 token 预算,并将成本显示在仪表盘上。

日期 课程
周一 read · 从第一性原理看 LLM 推理经济学。GPU 小时到 token 的换算,以及为什么利用率而非每小时价格驱动成本。
周二 build · 使用公式(每小时费率 ÷(峰值 token/秒 × 3600 × 利用率)× 1M),并使用你第 5 周的吞吐量,为你自己的 GPU 重新推导每百万 token 的成本。计算示例
周三 read · 优化 Character.AI 的 AI 推理。通过对权重、激活和 KV 缓存使用 int8,加上 multi-query attention 和跨层 KV 共享,服务成本降低了 33 倍。每一个杠杆都是你在第 6 周和第 7 周学过的。
周四 build · 构建路由器。一个轻量服务,在成本/延迟/质量策略下选择便宜的小模型或昂贵的大模型,并将所选路径及其成本记录到 Prometheus。
周五 build · Token 预算中间件,用于限制和核算每个请求的 token。将每请求成本与延迟一起显示在仪表盘上。
缓冲日 掌握 LLM 技术:推理优化 作为对第 1-9 周的巩固复习。

第 10 周:发布,然后建立阅读习惯

重点。 交付成果,并建立使其保持更新的输入源。

交付物。 一个已发布的仓库和报告,包含固定版本号和可复现命令,以及在日历上安排每周研究会议。

日期 课程
周一 build · 起草报告:硬件、模型、精确 token 长度、并发扫描、TTFT 和 ITL 的 p50/p95/p99、吞吐量。首先对照下面的检查清单进行核对。
周二 build · 将量化、投机解码和 KV 驱逐作为标记的变体添加,附带可复现命令和固定版本号。发布。
周三 read · 建立每周习惯。arXiv cs.DCMLSys、OSDI、NeurIPS 效率轨道。加入三个项目。
周四 read · 第一次习惯课程。在 30 分钟内阅读一篇论文的摘要、方法图和评估。不是整篇论文。
周五 可选 · 边缘部署示例:ONNX RuntimeTensorRT-LLMWebLLM。注意这些是客户端运行时,不是你构建内容的扩展。
缓冲日 分发 benchmark 以获取反馈。你能回答的批评是证明测试工具真实性的证据。

跟踪进度

三个选项,按所需设置量从少到多排列。

1. 网页。 打开 index.html 或 GitHub Pages 版本,完成课程后勾选。进度保存在浏览器的本地存储中,因此关闭标签页或重启机器不会丢失。它按浏览器和设备区分,无需账户,也不涉及服务器。

要将进度转移到另一台设备,请使用 复制同步链接,它会将你的状态打包成 URL 中的 12 字符代码,或使用 导出,它会下载一个 JSON 文件供你稍后重新导入。如果你清除浏览器数据,这两者也是你的备份。

如果你在隐私浏览或沙盒框架中打开页面,本地存储可能会被阻止。页面会检测到这一点并发出警告,但勾选操作在本次访问中仍然有效。

2. GitHub issue。 Fork 仓库,从进度模板新建 issue,并在其中勾选复选框。GitHub 将任务列表状态存储在其自己的服务器上,与你的账户关联,因此它可以在你登录的任何设备上使用,并为你提供完成每周课程时的带日期评论历史。如果你希望进度不依赖于浏览器配置文件,这是最佳选择。

3. README 本身。 Fork 仓库并在你的副本中勾选清单。你的提交历史就是记录。

关于使用数据库

服务器端存储(无论是 SQLite 还是其他)在这里是错误的选择,值得解释原因。它需要托管、用于区分用户进度的账户、会话处理、你所持有数据的隐私政策,以及为一个价值仅在于链接列表的项目进行持续维护。SQLite 特别不适合部署的 Web 应用,因为大多数廉价托管使用临时文件系统,在重新部署时会丢弃数据库文件。

对于单个读者来说,本地存储无需上述任何一项即可达到相同效果。它唯一无法提供的是跨设备同步,而同步链接和 JSON 导出可以在没有后端的情况下覆盖这种情况。

如果你确实想要一个托管版本,例如一个小组一起学习并共享排行榜,那么现实的技术栈是 GitHub OAuth 用于身份识别,加上托管的 Postgres 或 Turso 实例,而不是 Web 服务器上的 SQLite 文件。

发布 benchmark 之前

以下是导致公开推理 benchmark 被拆解的错误。在第 5 周阅读它们,在第 10 周应用它们。

决策点

在这些时刻,盲目遵循计划是错误的。

如果 那么
第 5 周。 TTFT 飙升且 num_requests_waiting 在达到目标并发之前就开始攀升。 服务器正在抢占。先停止并调整 --max-num-seqs--gpu-memory-utilization 和 chunked prefill。在抢占点测量的运行结果不可发布。
第 6 周。 INT4 在你的质量代理指标上损失超过 1-2%,而吞吐量收益有限。 保留 FP16 或 FP8 作为默认。将 INT4 视为内存压力杠杆,而非吞吐量默认选项。
第 7 周。 投机解码在你的实际请求速率下反而变慢。 这是预期行为。收益出现在低查询率下,当 GPU 计算饱和时消失。发布交叉点,它比加速比更有用。
第 8 周。 Kubernetes 开始占用整个课程时间处理集群配置。 使用托管集群,或回退到单节点 Docker 加上 KEDA 阅读。自动扩缩容信号比定制集群更重要。

参考资料

论文

论文 会议 主题
PagedAttention / vLLM SOSP 2023 KV 缓存 paging
Orca OSDI 2022 连续 batching
SGLang NeurIPS 2024 RadixAttention,前缀复用
SARATHI / Sarathi-Serve OSDI 2024 Chunked prefill
DistServe OSDI 2024 Prefill/decode 分离
Splitwise ISCA 2024 跨 GPU 类型的阶段拆分
Mooncake FAST 2025 以 KV 缓存为中心的服务
StreamingLLM ICLR 2024 Attention sinks,长上下文
EAGLE arXiv 投机采样

关于 GPTQ、AWQ、SmoothQuant、LLM.int8()、Medusa、H2O、SnapKV 和 FlashAttention 系列,请使用 Lilian Weng 的综述NVIDIA 优化综述,它们直接引用了这些工作。搜索精确标题,而不是猜测 arXiv ID。

课程和系列

工具

工具 用途
vLLM 主要 serving 引擎
SGLang 前缀复用对比
GuideLLM SLO 感知的速率扫描
genai-perf TTFT 和 ITL 测量
LLMPerf 托管端点 benchmark
production-stack Kubernetes 部署

阅读习惯

每周一次 30 分钟课程:浏览 arXiv cs.DC 和系统会议上的标题,精确阅读一篇论文的摘要、方法图和评估,并跟踪 vLLMLMSYS 博客以及 Modal Almanac 上的应用类文章。阅读系统论文,跳过模型发布新闻。


关于资料来源的说明

这里的每个视频都有来自大学、引擎团队或会议的具名演讲者,并配有覆盖相同材料的文字资料,因此你可以选择阅读而非观看。在没有视频达到该标准的地方,该周仅提供文字资料,而不是用低质量视频填充。

有几点需要记住:

贡献

欢迎更正和补充,特别是:

请提交 issue 或 PR。

许可证

CC BY 4.0。可自由使用、改编和用于教学。

译自 GitHub · 项目涌现 · 录于 二〇二六年八月四日