
什么是从零到英雄的推理工程?
从零到英雄的推理工程是一个实践型课程仓库,用于理解大型语言模型服务背后的运行时系统。它不侧重于训练模型或提升模型质量,而是研究请求到达 LLM 后所发生的事情。
项目从最小的实用推理操作开始,逐步构建一个紧凑的推理运行时。其学习进程如下:
分词 → 预填充 → 解码 → KV 缓存 → 采样 → 请求状态 → 调度 → 连续批处理 → 内存管理 → 服务引擎内部机制
这种以实现为先的方法强调直接检查张量、生成结果、缓存状态和内存使用情况。这样可以将模型操作与延迟、吞吐量、GPU 利用率和内存消耗等实际服务问题联系起来。
你将学到什么
本课程旨在建立面向系统的 LLM 推理思维模型,主要主题包括:
- 分词:了解提示词如何转换为模型使用的 token ID。
- 预填充:了解模型如何处理初始提示词,并创建生成所需的状态。
- 解码:了解后续 token 如何逐步生成。
- KV 缓存:了解注意力状态如何增长,以及它如何避免不必要的重复计算。
- 采样:了解如何从模型输出分数中选择一个 token。
- 请求状态:了解运行时如何跟踪提示词、已生成 token 和完成状态。
- 调度:了解引擎如何决定处理哪些请求。
- 连续批处理:了解活动请求如何在进入和离开系统时高效组合。
- 内存管理:了解 GPU 内存的使用位置,以及缓存组织方式如何影响容量。
- 服务引擎内部机制:了解模型执行如何由外围系统支持,以提升效率。
课程状态与结构
仓库分为 Beginner、Intermediate 和 Advanced 三个级别。目前,Beginner 轨道正在进行中。Intermediate 和 Advanced 内容尚未提供。
可用章节
- 第 01 章:从第一性原理手动执行 LLM 推理:位于
beginner/01_manual_llm_inference/,现已可用。
计划中的 Beginner 章节
- 采样
- 请求状态
- 简单调度器
- 连续批处理
- KV 缓存管理
- 分页或分块 KV 缓存
- 前缀缓存
- 推理基准测试
路线图有意保持灵活。随着实现工作发现新的问题,章节可能会增加、删除、拆分或重新排序。
安装与设置
仓库 README 未提供固定的依赖安装命令或环境规范。请先下载或克隆仓库,然后查看第 1 章随附的文件和说明,再进行安装或运行操作。
- 获取 GitHub 仓库的本地副本。
- 在终端、编辑器或 notebook 环境中打开仓库目录。
- 进入
beginner/01_manual_llm_inference/。 - 阅读章节专属说明,并确认该目录中的 notebook。
- 仅安装章节材料要求的依赖。
- 打开 notebook,并按顺序执行其中的单元格。
beginner/01_manual_llm_inference/由于 README 未说明确切的软件包版本、硬件要求或安装命令,请以章节 notebook 作为其运行时设置的权威依据。
基本用法:完成手动推理流程
建议从第 1 章开始。该章旨在从第一性原理研究手动 LLM 推理,而不是将生成过程隐藏在完整的服务 API 之后。
第 1 步:按顺序学习 Notebook
从头到尾运行 notebook。避免跳过设置或检查单元格,因为后续操作可能依赖之前创建的模型对象、分词后的输入或缓存状态。
第 2 步:追踪提示词
观察输入提示词在推理过程中如何变化。一个有用的概念流程如下:
提示词文本
→ token ID
→ 提示词处理或预填充
→ 下一个 token 的分数
→ 选中的 token
→ 更新后的序列
→ 重复解码只要 notebook 展示了张量形状和 token 数量,就记录下来。这样更容易看出处理完整提示词与生成一个额外 token 之间的区别。
第 3 步:区分预填充与解码
预填充处理提示词,并建立生成所需的状态。解码以增量方式生成额外 token。将这两个阶段分开对待非常重要,因为它们具有不同的计算和内存特性。
运行 notebook 时,可以思考以下问题:
- 预填充阶段处理多少个输入 token?
- 每个解码步骤传入的输入是什么?
- 生成新 token 后,哪些张量发生了变化?
- 哪些状态可以复用,而不必重新计算?
第 4 步:直接检查输出
将 token ID 与解码后的文本进行比较,并在 notebook 允许的情况下检查中间输出。目标不仅是生成文本,还要理解产生这些文本的一系列操作。
理解运行时模型
理解该仓库的一种有效方式,是将生成视为一个有状态的循环,而不是一次模型调用:
准备请求
处理提示词
存储可复用状态
选择下一个 token
更新请求状态
重复,直到完成这一视角将为后续章节做好准备。采样决定选择哪个 token,请求状态跟踪每次生成,调度负责选择任务,而连续批处理则合并多个活跃请求的工作。
高级学习技巧
同时跟踪形状、状态与内存
不要孤立地检查张量。对于每个重要操作,记录输入形状、输出形状、序列长度、缓存状态以及预期的内存增长。这有助于将模型的数学执行过程与系统行为联系起来。
比较提示词长度与解码长度
当本章允许你更改输入时,同时比较短提示词与长提示词,以及短生成与长生成。观察哪些开销发生在预填充阶段,哪些开销会在解码过程中累积。不要将基准测试结论扩展到测量结果未能证明的范围之外。
建立请求状态表
在专门介绍请求状态的章节发布之前,你可以使用以下字段整理观察结果:
- 输入 token ID
- 已生成的 token ID
- 当前序列长度
- 缓存状态
- 生成状态
这是一种学习方法,并非当前仓库承诺提供的功能。它有助于揭示为什么推理引擎需要围绕模型本身构建系统。
先测量,再优化
路线图中计划加入推理基准测试章节。在该章节发布之前,请保持实验受控:每次只改变一个输入或生成条件,记录观察结果,并区分测量到的行为与假设。
重新学习前面的章节
随着采样、调度、批处理和缓存管理相关章节陆续添加,请重新回顾手动推理。将每个新的抽象与最初的 token 生成循环联系起来,确保优化始终建立在实际的模型执行过程之上。
当前限制
目前只有 Beginner 第一章被列为可用。采样、调度器、连续批处理、缓存管理策略、基准测试,以及 Intermediate 和 Advanced 学习路径仍处于计划阶段。因此,应将该仓库视为一门不断发展的课程,而不是完整的推理引擎框架。
结语
Inference Engineering Zero to Hero 为学习 LLM 的运行时层面提供了一条实践路径。从 beginner/01_manual_llm_inference/ 开始,按顺序运行 notebook,并重点理解提示词、token、张量和可复用状态如何在生成过程中流动。这一基础将帮助你更容易理解后续计划中的调度、批处理、内存和服务引擎内部机制课程。
