刘孟玄 Blog

「离开世界之前 一切都是过程」

vLLM 学习笔记 03:跟着一个请求走完 vLLM 源码

给新手的图解版:每个函数干什么、数据怎么流

关于本文:01 篇是读 Aleksa Gordic 的 Inside vLLM: Anatomy of a High-Throughput LLM Inference System 后整理的概念笔记,为了好读,省掉了原文里大量的函数名、数据结构和数据流细节。可原文本身也不算好懂:很多函数一笔带过,不解释它干什么;数据在哪几个对象之间传来传去,也缺一张完整的图。 这一篇换个写法:挑...

vLLM 学习笔记 02:nano-vllm 源码逐段精读

用 1400 行 Python 看清一个推理引擎的全部细节

关于本文:上一篇笔记从概念上走了一遍 vLLM,这一篇换个方式:找一个足够小、但该有的都有的实现,把源码从头到尾读一遍。选的是 nano-vllm(作者 Xingkai Yu,MIT 协议),全部核心代码不到 1400 行,却实现了分页 KV 缓存、前缀缓存、分块预填充、抢占、张量并行、CUDA Graph 和 torch.compile。 本文对照的版本是 main 分支 co...

vLLM 学习笔记 01:一个请求在 vLLM 里的一生

从零开始理解高吞吐大模型推理引擎

关于本文:这是我阅读 Aleksa Gordic 的文章 Inside vLLM: Anatomy of a High-Throughput LLM Inference System(vLLM 官方博客,2025-09-05)之后整理的学习笔记,并非原文翻译。文章结构参考了原文的脉络,但文字是我自己的理解和复述,补充了很多原文默认读者已经知道的基础概念;文中所有配图均为我重新绘制,不是...

KV Cache 补充:从最后一行到下一个 Token

为什么只取最后位置的隐藏向量,以及 LM Head 怎样预测词表中的下一个 token

前面的 KV Cache 基础篇 介绍了 Prefill、Decode 和历史 K/V 的复用。这篇作为系列补充,继续沿着“中华人 → 民”的例子,把 Attention 输出、最后位置的隐藏向量和词表预测接起来。 示意图经常把完整 Attention 方阵保留下来,又把 Attention 输出直接连到新 token,容易让人误以为旧分数也被缓存,或者一个 Attention 向量就能直...

Continuous Batching:从请求排队到逐轮调度

借助操作系统调度,理解 LLM 怎样把不同进度的请求放进同一批计算

一个用户让模型回答“好的”,另一个用户让模型写一篇长文章。如果把它们放进同一个 batch,前一个请求很快结束,后一个却还要继续生成很久。此时即使有新用户在排队,固定成员的 batch 也不能马上把空出来的容量交给他。 Continuous Batching(连续批处理)改变的是这个调度方式:每一轮模型计算结束后,完成的请求退出,等待中的请求在资源允许时加入,下一轮可以换一组成员继续算。 ...

从参数量到 FLOPs:手算 Transformer 的规模与开销

用矩阵形状连接模型权重、训练计算量和推理耗时

模型名称里的“7B”描述了参数规模,却没有直接告诉我们处理一段文本要花多少计算,更不能直接换算成生成一个 token 的时间。把这几个量连接起来,需要从矩阵形状出发:矩阵里存了多少个数,决定参数量;矩阵与多少行输入相乘,决定计算量;计算和数据搬运在硬件上的执行效率,才决定时间。 下面用 MHA、SwiGLU 和 RMSNorm 组成的 Decoder-only 模型贯穿计算,再将同一套方法...

归一化:从特征尺度到残差路径与 CUDA 实现

把 BatchNorm、LayerNorm、RMSNorm 与 Pre-Norm 的数据流串起来

一个 token 进入 Transformer 后,会被表示成一个有几千维的向量。Attention 和 FFN 不断加工这些特征,残差连接则把每次加工得到的更新加回原表示。随着计算逐层推进,向量的数值尺度也在变化。 归一化为这些计算提供了尺度受控的输入。理解它,可以沿着一条线展开:先确定哪些数放在一起统计,再看这些数怎样被调整,接着把归一化放回残差结构,最后观察 GPU 如何完成同样的计...

FFN 中的 CUDA Kernel 融合

减少中间张量的显存往返,让逐元素操作留在片上

SwiGLU 的数学表达式很短: $Y=\left[\operatorname{SiLU}(XW_{gate})\odot(XW_{up})\right]W_{down}$ 但如果每个步骤都启动一个独立 CUDA kernel,中间结果就需要反复写回和读出 GPU 显存。Kernel fusion(内核融合)要做的是:把适合连续执行的操作放进同一个 kernel,让中间值留在寄存器或共享...

MoE:从多个 FFN 专家到稀疏激活

Router 如何选择专家,以及为什么参数量增加后计算量仍可控

普通 Transformer 的 FFN 只有一套参数,所有 token 都经过同一个变换。MoE(Mixture of Experts,混合专家)把这一个 FFN 换成多个专家,并让 Router 为每个 token 选择少数几个专家。 它想解决的是一个容量问题:模型可以拥有更多 FFN 参数,但单个 token 不必激活全部参数。 1. 从一个 FFN 到多个专家 普通结构是: ...

FFN 张量并行:从列切分到行切分

为什么两张 GPU 分工后,结果仍然和完整矩阵乘法相同

当 FFN 的权重无法放进一张 GPU 时,可以沿中间维度把它切到多张 GPU 上。关键不是把矩阵随意切开,而是让升维矩阵生成的那部分中间特征,与降维矩阵对应的那部分行保持一致。 这篇文章用两张 GPU 和行向量记法说明:W_up 按列切,W_down 按行切,最后对部分输出做 AllReduce 求和。 1. 先看完整的 FFN 忽略偏置,标准 FFN 是: $h=\phi(xW_...