刘孟玄 Blog

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

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_...

Transformer 前馈网络:从 FFN 到 SwiGLU

从逐 token 加工、激活函数到 4 倍与 8/3 倍中间维度

Transformer Block 中,Attention 先汇聚上下文信息,FFN 再对每个位置的表示进行非线性加工。理解 FFN,可以从最基本的“展开—激活—压缩”结构出发,再看激活函数如何演进为 SwiGLU 的门控结构,最后用参数量解释中间维度的选择。 1. FFN 在 Transformer 中的作用 Attention 让 token 之间交换信息,FFN 则对汇聚后的特征进...