刘孟玄 Blog

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

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 则对汇聚后的特征进...

FlashAttention:从 Safe Softmax 到分块计算

用在线归一化把 Attention 的中间结果留在片上

FlashAttention 的名字很容易让人以为它提出了一个新的 Attention 公式。实际上,它并没有改变 Attention 的数学结果:给定相同的 Q、K、V,输出仍然是普通的精确 Attention。 它真正改变的是计算过程:不把完整的 N×N 注意力分数矩阵和概率矩阵写回 HBM,而是把 Q、K、V 切成 tile,在 GPU 片上的 SRAM 和 registers 中完...

KV Cache 优化(四):Speculative Decoding 投机解码

不改变大模型答案分布,怎样一次推进多个 token?

前面三篇都在缩小或筛选 KV Cache。这一篇优化的是 Decode 的串行性这一瓶颈。 普通自回归生成一次只产生一个 token: 1 xₜ → xₜ₊₁ → xₜ₊₂ → xₜ₊₃ 每一步都要调用一次大模型,而大模型单 token Decode 的计算规模很小,却要读取大量权重和 KV Cache。Speculative Decoding(投机解码)采用“先猜、后验”的办法: ...