<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LLM on 我的技术博客</title><link>https://cybersecurityerial.github.io/echo_blog/tags/llm/</link><description>Recent content in LLM on 我的技术博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 10 May 2026 12:46:00 +0800</lastBuildDate><atom:link href="https://cybersecurityerial.github.io/echo_blog/tags/llm/index.xml" rel="self" type="application/rss+xml"/><item><title>LLM System: PD 分离 00 - 学习地图</title><link>https://cybersecurityerial.github.io/echo_blog/posts/llm-system-pd-00-roadmap/</link><pubDate>Tue, 05 May 2026 10:30:00 +0800</pubDate><guid>https://cybersecurityerial.github.io/echo_blog/posts/llm-system-pd-00-roadmap/</guid><description>&lt;blockquote&gt;
&lt;p&gt;这篇文章是 LLM System 系列里 PD 分离子专题的第 0 篇，也是这个主题的学习入口。是笔者让gpt-5.5通过联网搜索帮自己制定的系统性学习方案。笔者会根据这个方案来确定如何学习PD分离的整套机制。目标不是先把所有论文细节读完，而是先建立一张可以持续填充的地图：该读什么、该推导什么、该写什么代码、最后应该能回答什么问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个系列暂时围绕一个问题展开：&lt;strong&gt;为什么现代 LLM serving 系统越来越关心 prefill/decode disaggregation，也就是 PD 分离？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我希望自己最后能回答四个问题：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1. 为什么 prefill 和 decode 要分离？
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2. 一个 workload 到底该配多少 P worker、多少 D worker？
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3. KV cache 从 P 到 D 传输到底传了什么、代价多大？
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4. vLLM / SGLang / Mooncake 里这件事具体怎么落地？
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;先说一个结论：**PD 分离不是一个“拆进程就能变快”的魔法优化。**它真正解决的是服务系统里的资源解耦问题：prefill compute、decode iteration、KV cache 生命周期、网络传输和调度策略，本来在 colocated serving 里被绑在一起；PD 分离试图把它们拆开，让不同阶段按照不同目标优化。&lt;/p&gt;
&lt;h2 id="0-心智模型"&gt;0. 心智模型&lt;/h2&gt;
&lt;p&gt;LLM 推理一个请求大致分成两段。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prefill&lt;/strong&gt;：一次性吃掉 prompt，生成整段 prompt 的 KV cache，并产出第一个 token。长输入时它更像大 GEMM，通常更容易把 GPU 算力吃满。它最直接影响的是 &lt;strong&gt;TTFT&lt;/strong&gt;，也就是 time to first token。&lt;/p&gt;</description></item><item><title>LLM Theory 01: MuP</title><link>https://cybersecurityerial.github.io/echo_blog/posts/llm-theory-01-mup/</link><pubDate>Mon, 04 May 2026 14:10:04 +0800</pubDate><guid>https://cybersecurityerial.github.io/echo_blog/posts/llm-theory-01-mup/</guid><description>&lt;blockquote&gt;
&lt;p&gt;这篇文章是关于 LLM 预训练中 MuP / μP 的学习笔记，主要参考原论文
&lt;a href="https://arxiv.org/abs/2203.03466"&gt;Tensor Programs V: Tuning Large Neural Networks via Zero-Shot Hyperparameter Transfer&lt;/a&gt;
和苏剑林的博客
&lt;a href="https://spaces.ac.cn/archives/10770"&gt;《初探MuP：超参数的跨模型尺度迁移规律》&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="问题背景"&gt;问题背景&lt;/h2&gt;
&lt;p&gt;LLM 预训练的成本很高，因此我们通常不希望直接在目标规模的大模型上反复搜索学习率、初始化、权重衰减等超参数。一个自然想法是：先在同架构的小模型上调参，再把超参数迁移到大模型上。&lt;/p&gt;
&lt;p&gt;MuP（Maximal Update Parametrization）的核心目标，就是让某些关键超参数在模型宽度变化时尽量保持稳定，从而支持从小模型到大模型的 zero-shot hyperparameter transfer。原论文把这个迁移范式称为 μTransfer。&lt;/p&gt;
&lt;p&gt;因为苏老师的博客写得太简洁+深入浅出了，本文也不会重复去讲他讲的很完善的部分，而是对他的内容进行补充和完善。个人在读原博客的时候感觉到一些地方苏老师略过了一些思考过程，导致初次理解时会让人觉得有些跳跃。&lt;/p&gt;
&lt;h2 id="正文"&gt;正文&lt;/h2&gt;
&lt;p&gt;MuP问题的出发点很简单，模型是一个黑盒，因此想训练出一个好模型，无法避免地要做大量的尝试（也就是俗称的调参炼丹）。但对于大模型而言，尝试的时间&amp;amp;金钱&amp;amp;人力成本很高。MuP就是对传统的炼丹过程做了一个剪枝，通过数学推导证明了小模型上已经被验证的某些规律可以直接扩展到大模型上。&lt;/p&gt;
&lt;p&gt;当然，上述的总结是比较泛化的，具体到实践中，肯定还会问几个问题：模型大小如何界定？哪些规律可以扩展？具体如何扩展？在展开具体方法之前笔者可以回答前两个问题，这里模型的大小用神经网络的宽度/隐藏层维度来量化。可扩展的规律主要指学习率的选择。因此MuP解决的具体问题是“在网络加宽的情况下，学习率应该如何跟随着隐藏层维度改变”。&lt;/p&gt;
&lt;h1 id="mup朴素版"&gt;MuP(朴素版)&lt;/h1&gt;
&lt;p&gt;这一节的MuP推导没有用到超过大一高数/线代的知识，也没有用到超过机器学习基本常识的知识。用一种非常简单的视角推导了MuP（虽然有些步骤不够严谨）&lt;/p&gt;
&lt;h2 id="模型宽度的影响无法尽善尽美的参数初始化"&gt;模型宽度的影响：无法尽善尽美的参数初始化&lt;/h2&gt;
&lt;p&gt;为什么要先讲参数初始化呢，因为参数初始化提供了一个最基础的视角，来定量描述“宽度影响稳定性”这件事。&lt;/p&gt;
&lt;p&gt;前传和反传的最优参数初始化无法兼容。
高维的任意两个向量夹角都是几乎正交的，可以算一下任意向量和单位向量的夹角，这里不赘述。
所以苏剑林老师基于这点给了一个推论：
从$N(0,1/n)$
中随机选取$n^2$
个数，组成一个$n×n$
的矩阵，这个矩阵近似为正交矩阵，且$n$
越大，近似程度越好。
其实道理是一样的，列向量两两正交，就是正交矩阵。n越大，相当于维度越高，正交概率越大。每个向量里面的元素都是采样出来的，所以每个元素的值大约是&lt;code&gt;sqrt(1/n)&lt;/code&gt;，所以整个向量的模长平方就是$n * (sqrt(1/n))^2 = 1$&lt;/p&gt;
&lt;p&gt;正交矩阵有一个好的性质，就是它作用于一个向量时，不改变向量模长。神经网络是对一个输入向量做很多次变换，
得到一个输出向量。我们希望输入向量在变换为输出向量的游走过程中，能一直在一个球面上，也就是模长不变。因为这样
从直觉上可以大幅压缩向量遍历的空间。可以想象一下，在一个完整的高维空间里面找最优解,和在空间内的一个球面
找最优解显然是后者更容易。如果向量变换前后都在同一个球面上或者近似在一个厚度比较薄的球壳上，本文将这种性质称为“稳定性”。&lt;/p&gt;
&lt;p&gt;所以最经典的初始化方式是推论里面的采样方式。上述结论也可以通过让变换前后的RMS相等来推导。如果引入了激活函数，初始化的值略有不同，但是推导逻辑类似。&lt;/p&gt;
&lt;p&gt;前传和反传区别不大，都是矩阵乘。&lt;/p&gt;
$$
\frac{\partial \mathcal{L}}{\partial \boldsymbol{X}}
\sim
\frac{\partial \mathcal{L}}{\partial \boldsymbol{Y}}
\boldsymbol{W}^{\top}
$$&lt;p&gt;主要的尺度变化也来自于$W$。输入和输出的维度不相等的时候，就找不到一个两全其美的采样方差。这是一个open的问题，苏老师在原文这里提出这个问题并不是为了直接解决这个问题，而是为了说明模型的宽度和中间层稳定性之间存在着直接的关系。&lt;/p&gt;
&lt;h2 id="loss的稳定性"&gt;Loss的稳定性&lt;/h2&gt;
&lt;p&gt;在苏老师这篇MuP的博客中透露着一个隐含的insight：模型加宽带来的难度就是稳定性下降。（也许这个insight来自于训模型时候的经验）这个稳定性可以是Loss的稳定性，也可以是梯度的稳定性，还可以是每一层输出结果的稳定性。这里考虑了损失增量的稳定性。&lt;/p&gt;
&lt;p&gt;文章中需要推导或注释的地方有两点，第一点是公式6如何近似，第二点是公式4如何得到公式7。&lt;/p&gt;
&lt;p&gt;公式6的近似：
&lt;/p&gt;
$$
\Delta \mathcal{L}=\mathcal{L}(\boldsymbol{W}+\Delta \boldsymbol{W})-\mathcal{L}(\boldsymbol{W})
$$&lt;p&gt;
一阶泰勒近似：
&lt;/p&gt;</description></item><item><title>LLM System: KV Cache 查询 01 - PagedAttention 原理</title><link>https://cybersecurityerial.github.io/echo_blog/posts/llm-system-kvcache-01-pagedattention-principle/</link><pubDate>Sun, 10 May 2026 12:46:00 +0800</pubDate><guid>https://cybersecurityerial.github.io/echo_blog/posts/llm-system-kvcache-01-pagedattention-principle/</guid><description>&lt;blockquote&gt;
&lt;p&gt;TODO: 这里写 PagedAttention 的核心抽象：block/page、block table、逻辑 token 到物理 KV block 的映射。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="基础tensor-级拆请求的形状大量细节"&gt;基础：tensor 级拆请求的形状（大量细节）&lt;/h2&gt;
&lt;p&gt;定义符号：$B$ 是 batch size，$T$ 是 seq_len，$D$ 是 token_dim，$d_q$ 是把 embedding token 投影到 $Q$ 后的维度。&lt;/p&gt;
&lt;p&gt;推理框架拿到的请求是：\(R \in \mathbb{R}^{B \times T}\)。&lt;/p&gt;
&lt;p&gt;$R_{b,t}$ 是一个最最基本的 token id 标量。&lt;/p&gt;
&lt;p&gt;raw 请求经过 embedding lookup，做的操作是把这个 token 标量映射成一个高维向量。假设原先 token 是 &lt;code&gt;1234&lt;/code&gt; 这个标量，现在就把 token 映射成 &lt;code&gt;[0.1, 0.2, 0.3, 0.4]&lt;/code&gt; 这样的向量。&lt;/p&gt;
&lt;p&gt;所以 $R$ 经过 embedding lookup 之后，得到：\(X \in \mathbb{R}^{B \times T \times D}\)。&lt;/p&gt;
&lt;p&gt;因为我们目前只考虑推理场景，所以把 $W_Q$、$W_K$、$W_V$ 之类的矩阵当成固定的模型参数。&lt;/p&gt;
&lt;p&gt;然后很多博客会直接写：\(Q = XW_Q\)。&lt;/p&gt;</description></item><item><title>LLM Theory 02: 第一性原理下的训练设定</title><link>https://cybersecurityerial.github.io/echo_blog/posts/llm-theory-02-initial-setup/</link><pubDate>Wed, 06 May 2026 13:09:10 +0800</pubDate><guid>https://cybersecurityerial.github.io/echo_blog/posts/llm-theory-02-initial-setup/</guid><description>&lt;blockquote&gt;
&lt;p&gt;本文从训练模型要考虑的第一性原理（稳定性和速度）出发，探讨了 LLM 预训练中的初始化设定问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://spaces.ac.cn/archives/11340"&gt;MuP之上：1. 好模型的三个特征&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spaces.ac.cn/archives/11605"&gt;https://spaces.ac.cn/archives/11605&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spaces.ac.cn/archives/11647"&gt;https://spaces.ac.cn/archives/11647&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spaces.ac.cn/archives/11729"&gt;https://spaces.ac.cn/archives/11729&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>