<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Prefix Cache on Jiangwan&#39;s Blog</title>
        <link>https://jiangwan.ink/tags/prefix-cache/</link>
        <description>Recent content in Prefix Cache on Jiangwan&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Fri, 28 Aug 2026 14:00:00 +0800</lastBuildDate><atom:link href="https://jiangwan.ink/tags/prefix-cache/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>长上下文推理优化：Prefix Cache、调度与 MTP</title>
        <link>https://jiangwan.ink/p/long-context-inference-prefix-cache-scheduling-mtp/</link>
        <pubDate>Fri, 28 Aug 2026 14:00:00 +0800</pubDate>
        
        <guid>https://jiangwan.ink/p/long-context-inference-prefix-cache-scheduling-mtp/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;双 RTX 5060 Ti 部署 Qwen3.8 系列 · 6/6&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;导读&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;100K Context 能装下，不代表 100K Context 真正用起来就快。对长代码 Agent 来说，真正值得优先优化的是重复 Prefill、长 Prompt 对 Decode 的阻塞，以及多请求之间的 GPU 利用率；MTP 则属于更靠后的 Decode 优化。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;前一篇最终把双 RTX 5060 Ti 的长上下文配置落在了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2 × RTX 5060 Ti 16GB
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Qwen3.8-27B NVFP4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TP2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FP8 KV
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CUDA Graph ON
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;100K Context
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Maximum Concurrency ≈ 1.07x
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到这里，显存问题基本解决了。&lt;/p&gt;
&lt;p&gt;但“能够容纳 100K Context”和“100K Context 真正用起来足够快”，其实是两个问题。&lt;/p&gt;
&lt;p&gt;对于代码 Agent，一次请求经常包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System Prompt&lt;/li&gt;
&lt;li&gt;Tool Definitions&lt;/li&gt;
&lt;li&gt;项目规则&lt;/li&gt;
&lt;li&gt;Repository Context&lt;/li&gt;
&lt;li&gt;历史对话&lt;/li&gt;
&lt;li&gt;Tool Result&lt;/li&gt;
&lt;li&gt;当前用户输入&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中大量内容在连续几轮请求里几乎不会变化。&lt;/p&gt;
&lt;p&gt;如果每一轮都重新 Prefill 几十 K、甚至接近 100K Token，那么即使 Decode 已经有 30 多 token/s，整体体验仍然可能很慢。&lt;/p&gt;
&lt;p&gt;所以长 Context 解决容量以后，我真正开始关心的是另外三个问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;重复内容能不能不重新计算？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;超长 Prefill 会不会阻塞正在 Decode 的请求？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;多个请求能不能更高效地共享 GPU？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它们分别对应：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefix Cache&lt;/li&gt;
&lt;li&gt;Chunked Prefill&lt;/li&gt;
&lt;li&gt;Continuous Batching&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至于 MTP，它解决的是更后面的 Decode 串行问题。&lt;/p&gt;
&lt;p&gt;这几个功能经常一起出现在“LLM 推理加速”列表里，但实际优化的是完全不同的阶段。&lt;/p&gt;
&lt;p&gt;对于长代码 Agent，我现在的优先级非常明确：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefix Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chunked Prefill / Scheduler
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Continuous Batching
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;最后才评估 MTP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;1-prefill-和-decode-是两种完全不同的负载&#34;&gt;1. Prefill 和 Decode 是两种完全不同的负载
&lt;/h2&gt;&lt;p&gt;一次 LLM 请求大致可以拆成：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prompt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefill
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;第一个输出 Token
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Decode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Decode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prefill 一次处理大量输入 Token。&lt;/p&gt;
&lt;p&gt;如果 Prompt 是 100K，那么模型首先要把这 100K Token 处理一遍，建立 Attention KV、Linear Attention State 等运行状态。&lt;/p&gt;
&lt;p&gt;这个阶段矩阵规模较大，通常更偏 Compute-heavy，也更容易把 Tensor Core 利用起来。&lt;/p&gt;
&lt;p&gt;Decode 则不同。&lt;/p&gt;
&lt;p&gt;每一步只新增一颗 Token，但它仍然要经过整个模型。&lt;/p&gt;
&lt;p&gt;单流 Decode 更容易受到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Weight Traffic&lt;/li&gt;
&lt;li&gt;显存带宽&lt;/li&gt;
&lt;li&gt;小 GEMM&lt;/li&gt;
&lt;li&gt;Kernel Launch&lt;/li&gt;
&lt;li&gt;TP Collective&lt;/li&gt;
&lt;li&gt;Scheduler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;影响。&lt;/p&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prefill 快，不代表 Decode 快；Decode 很快，也不能解决一个 100K Prompt 首次加载很慢的问题。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;后面的优化，第一步就是先分清楚自己到底在优化哪一段。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-prefix-cache先把重复-prefill-消掉&#34;&gt;2. Prefix Cache：先把重复 Prefill 消掉
&lt;/h2&gt;&lt;p&gt;假设第一次请求是：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;内容&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Token&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;System Prompt&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;5K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Tool Definitions&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;5K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Repository Context&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;80K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;History&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;5K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;User Prompt&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;5K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;总计&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;strong&gt;100K&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;第一次没有办法，这 100K 基本都要经历 Prefill。&lt;/p&gt;
&lt;p&gt;但 Agent 完成一次 Tool Call 后，第二轮请求很可能只是末尾发生变化：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;System Prompt       5K   ← 不变
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Tool Definitions    5K   ← 不变
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Repository Context 80K   ← 大部分不变
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;History             8K
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Tool Result          3K
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果没有 Prefix Cache，第二轮还是要从头处理整段 Prompt。&lt;/p&gt;
&lt;p&gt;第三轮又重新来一次。&lt;/p&gt;
&lt;p&gt;Prefix Cache 的思路是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;已经计算过、并且 Token Prefix 完全相同的部分，直接复用对应的 Cache Block / 状态。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;100K Prompt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;其中 90K Prefix 已命中
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;真正重新 Prefill
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 10K
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这带来的收益不是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“把 100K Prefill 优化 20%。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而更接近：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;90K Token 这次根本不重新计算。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于长 Context Agent，这通常比继续挤一点 Kernel 性能更有价值。&lt;/p&gt;
&lt;h3 id=&#34;它改善的是-ttft不是-decode-tps&#34;&gt;它改善的是 TTFT，不是 Decode TPS
&lt;/h3&gt;&lt;p&gt;假设当前单流 Decode 是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;≈ 33.5 token/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;打开 Prefix Cache 以后，即使命中了 90K Prefix，也不会因此让后面的 Decode 自动变成 60 token/s。&lt;/p&gt;
&lt;p&gt;已经进入 Decode 阶段以后，每生成一颗 Token，该走的模型计算仍然要走。&lt;/p&gt;
&lt;p&gt;Prefix Cache 节省的是进入 Decode &lt;strong&gt;之前&lt;/strong&gt;的重复 Prefill。&lt;/p&gt;
&lt;p&gt;所以它最明显影响的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TTFT——Time To First Token。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;测试 Prefix Cache 时，我更关心：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TTFT&lt;/li&gt;
&lt;li&gt;Cached Tokens&lt;/li&gt;
&lt;li&gt;实际重新 Prefill 的 Token 数&lt;/li&gt;
&lt;li&gt;Prefix Cache Hit Rate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而不是只看 Decode token/s。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;代码-agent-天生适合-prefix-cacheprompt-layout-也会直接影响命中率&#34;&gt;代码 Agent 天生适合 Prefix Cache，Prompt Layout 也会直接影响命中率
&lt;/h3&gt;&lt;p&gt;普通聊天历史会持续变化。&lt;/p&gt;
&lt;p&gt;代码 Agent 则经常有一大段非常稳定的 Context：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;System Prompt&lt;/li&gt;
&lt;li&gt;Tool Schema&lt;/li&gt;
&lt;li&gt;项目规则&lt;/li&gt;
&lt;li&gt;AGENTS.md / CLAUDE.md 一类规则文件&lt;/li&gt;
&lt;li&gt;Repository 文件&lt;/li&gt;
&lt;li&gt;大量已经加载的代码&lt;/li&gt;
&lt;li&gt;长时间不变的环境说明&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;真正经常变化的通常只是末尾：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前 User Prompt&lt;/li&gt;
&lt;li&gt;Tool Result&lt;/li&gt;
&lt;li&gt;新生成的 Assistant 内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着代码 Agent 天然具有很高的 Prefix 重复率。&lt;/p&gt;
&lt;p&gt;假设总 Prompt 是 100K，其中 80K～90K 能稳定命中，那么真正需要重新 Prefill 的可能只有最后一小段。&lt;/p&gt;
&lt;p&gt;但 Prefix Cache 不是语义缓存。&lt;/p&gt;
&lt;p&gt;两段 Prompt “意思一样”，不代表能够命中。它要求前面的 Token Prefix 真正一致。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当前时间：10:01&lt;br&gt;
这里是 80K 项目代码……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下一轮变成：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当前时间：10:02&lt;br&gt;
这里是同样的 80K 项目代码……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;虽然后面的 Repository Context 完全没变，但 Prefix 在很靠前的位置已经不同。&lt;/p&gt;
&lt;p&gt;因此我更倾向于让 Agent Prompt 按稳定程度排列：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;最稳定
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;System Prompt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Tool Definitions
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;固定规则
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Repository Context
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;历史内容
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Tool Result
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;当前 User Input
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;最动态
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而不是把当前时间、随机 ID、动态状态放在巨大固定 Context 的前面。&lt;/p&gt;
&lt;p&gt;对于 100K 代码上下文：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt Layout 已经不只是 Prompt Engineering，也属于 Serving Optimization。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一个小动态字段放错位置，可能直接让后面几十 K Token 的缓存价值消失。&lt;/p&gt;
&lt;p&gt;不过对 Qwen3.8-27B 还要多加一个 Hybrid Model 的前提。&lt;/p&gt;
&lt;p&gt;它不是纯 Full Attention，而是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;48 × Gated DeltaNet + 16 × Full Attention&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;因此 vLLM 做 Prefix Cache 时，不只是管理传统 Full-Attention KV Block，还要处理 Linear Attention 的 recurrent state / state checkpoint。&lt;/p&gt;
&lt;p&gt;这意味着 Hybrid Model 的缓存命中粒度、State 保留位置和 Block 对齐，会比纯 Transformer 更复杂。&lt;/p&gt;
&lt;p&gt;所以上面：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;100K Prompt / 90K Prefix Hit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;应该理解成一个便于建立直觉的例子，而不是“只要前 90K Token 相同，就一定能以任意粒度完整命中”。&lt;/p&gt;
&lt;p&gt;真实部署里，我会直接看当前 vLLM 版本实际报告的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cached Tokens&lt;/li&gt;
&lt;li&gt;Prefix Cache Hit Rate&lt;/li&gt;
&lt;li&gt;TTFT&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;来判断 Hybrid Prefix Cache 到底复用了多少计算。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;prefix-cache-不是无限容量多租户还要考虑隔离&#34;&gt;Prefix Cache 不是无限容量，多租户还要考虑隔离
&lt;/h3&gt;&lt;p&gt;Prefix Cache 最终仍然占用实际 Cache Pool。&lt;/p&gt;
&lt;p&gt;假设当前同时存在：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Session A：80K Prefix
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Session B：90K Prefix
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Session C：70K Prefix
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Session D：100K Prefix
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;消费级 GPU 不可能永久保留所有 Prefix。&lt;/p&gt;
&lt;p&gt;当 Cache Pool 需要空间给新的请求时，旧 Block 最终会被淘汰和复用。&lt;/p&gt;
&lt;p&gt;所以 Prefix Cache 的真实收益会受到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cache Capacity&lt;/li&gt;
&lt;li&gt;活跃 Session 数量&lt;/li&gt;
&lt;li&gt;Prefix 大小&lt;/li&gt;
&lt;li&gt;请求是否集中在同一个项目&lt;/li&gt;
&lt;li&gt;请求局部性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;影响。&lt;/p&gt;
&lt;p&gt;这也是为什么它特别适合我的这类 workload：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;长时间围绕同一个 Repository 连续工作。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果变成几百个用户，每个人都有完全不同的 100K Prefix，命中率自然会下降。&lt;/p&gt;
&lt;p&gt;另外，如果是公网多租户 API，还要考虑 Cache 隔离和 Timing Side Channel。&lt;/p&gt;
&lt;p&gt;vLLM 提供 &lt;code&gt;cache_salt&lt;/code&gt; 一类机制，让不同租户可以控制 Prefix Cache 的共享边界。&lt;/p&gt;
&lt;p&gt;个人 Coding Agent 不一定需要重点考虑这一点，但正式多租户服务不能完全忽略。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-chunked-prefillcache-miss-时别让长-prompt-霸占-gpu&#34;&gt;3. Chunked Prefill：Cache Miss 时别让长 Prompt 霸占 GPU
&lt;/h2&gt;&lt;p&gt;Prefix Cache 很强，但它解决不了第一次请求。&lt;/p&gt;
&lt;p&gt;第一次打开一个大型 Repository：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;100K New Prompt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;没有旧 Prefix 可以复用，完整 Prefill 还是必须发生。&lt;/p&gt;
&lt;p&gt;问题随之变成：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一个 100K Prefill 会不会长时间霸占 GPU？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;假设：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Request A
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;已经进入 Decode，正在持续输出
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Request B
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;突然进来一个 100K Prompt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果 B 一次性把整个 Prefill 做完，再让 A 继续 Decode，那么 A 的 Inter-Token Latency 很可能突然升高。&lt;/p&gt;
&lt;p&gt;用户看到的现象就是：本来流式输出很顺，突然卡了一段时间。&lt;/p&gt;
&lt;p&gt;Chunked Prefill 会把一个很大的 Prefill 拆成多个 Chunk：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;100K Prefill
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chunk 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chunk 2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chunk 3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chunk 4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Scheduler 就有机会在这些 Chunk 之间继续安排其他 Decode 工作。&lt;/p&gt;
&lt;p&gt;更接近：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Decode A
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefill B 的一部分
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Decode A
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefill B 的下一部分
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而不是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;先让 B 完整 Prefill 100K
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;A 一直等
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;B 算完以后 A 再继续
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;vLLM V1 的调度思路本身就会优先照顾正在 Decode 的 Sequence，再把剩余 Token Budget 分给 Prefill；Prefill 太大时就拆 Chunk。&lt;/p&gt;
&lt;p&gt;这对 Serving 很有价值，因为 Prefill 和 Decode 的资源特征并不完全相同：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefill
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;更偏大矩阵 / Compute-heavy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Decode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;更偏 Weight Traffic / Memory-bound
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;把两种 workload 更合理地交错调度，有机会同时改善用户延迟和 GPU 利用率。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;max_num_batched_tokens本质上是-ttftitl-和吞吐的交换&#34;&gt;max_num_batched_tokens：本质上是 TTFT、ITL 和吞吐的交换
&lt;/h3&gt;&lt;p&gt;Chunked Prefill / Scheduler 有一个很重要的 Token Budget 概念：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;max_num_batched_tokens&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;可以粗略理解成：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一次 Scheduler Iteration 最多允许处理多少 Token。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果 Budget 较小，大型 Prefill 会被切成更多 Chunk。&lt;/p&gt;
&lt;p&gt;优点是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Decode 更容易持续插入&lt;/li&gt;
&lt;li&gt;ITL 往往更友好&lt;/li&gt;
&lt;li&gt;长 Prefill 不容易长时间阻塞其他请求&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代价则是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefill 被切得更碎&lt;/li&gt;
&lt;li&gt;调度次数更多&lt;/li&gt;
&lt;li&gt;单个大 Prompt 完成 Prefill 可能更慢&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;反过来，Budget 更大时，一轮可以吃下更多 Prefill Token，通常更有利于大 Prompt 吞吐和 TTFT，但也可能让其他 Decode 等得更久。&lt;/p&gt;
&lt;p&gt;所以它不是“越大越好”，也不是“越小越低延迟就一定最好”。&lt;/p&gt;
&lt;p&gt;它本质上是在三项指标之间做取舍：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TTFT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ITL
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Aggregate Throughput
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;个人单用户 Agent 和高并发 API，最优值很可能不一样。&lt;/p&gt;
&lt;p&gt;这类参数最终还是应该用真实 workload Benchmark，而不是只看一个离线吞吐数字。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-continuous-batching把多个请求持续填进-gpu&#34;&gt;4. Continuous Batching：把多个请求持续填进 GPU
&lt;/h2&gt;&lt;p&gt;假设同时有三个请求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;A：生成 100 Token&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;B：生成 500 Token&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C：生成 50 Token&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果它们被绑定成一个传统静态 Batch，C 很快结束以后，它的位置可能空着；A 随后也结束，最后只剩 B 一直跑。&lt;/p&gt;
&lt;p&gt;Batch 利用率会不断降低。&lt;/p&gt;
&lt;p&gt;Continuous Batching 的思路是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;A B C
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;C 完成
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;D 加入
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;A B D
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;A 完成
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;E 加入
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;E B D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;新的 Request 可以持续进入正在运行的 Batch，完成的 Request 及时退出。&lt;/p&gt;
&lt;p&gt;它主要改善的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;多请求 Aggregate Throughput 和 GPU 利用率。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以和 Prefix Cache 一样，不能拿错指标。&lt;/p&gt;
&lt;p&gt;打开 Continuous Batching 后，一条请求原来是 33.5 token/s，并不意味着它一定会突然变成 50、60 token/s。&lt;/p&gt;
&lt;p&gt;真正应该看的，是多条请求同时存在时：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;整张 GPU 每秒总共能够完成多少有效 Token，以及请求吞吐能不能持续保持。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&#34;prefix-cachechunked-prefill-和-continuous-batching-是一起工作的&#34;&gt;Prefix Cache、Chunked Prefill 和 Continuous Batching 是一起工作的
&lt;/h3&gt;&lt;p&gt;真实 Agent Serving 很可能同时出现三种请求。&lt;/p&gt;
&lt;h3 id=&#34;request-a&#34;&gt;Request A
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;已有 90K Prefix Cache&lt;/li&gt;
&lt;li&gt;只新增 5K&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;request-b&#34;&gt;Request B
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;第一次进入系统&lt;/li&gt;
&lt;li&gt;需要完整 Prefill 100K&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;request-c&#34;&gt;Request C
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;已经完成 Prefill&lt;/li&gt;
&lt;li&gt;正在 Decode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这时候三种机制刚好各自解决一个问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A：Prefix Cache&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;90K 不再重复计算。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B：Chunked Prefill&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;100K 不一次霸占整个调度周期。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C：Continuous Batching / Scheduler&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;继续参与 Decode，不需要等其他请求全部处理完。&lt;/p&gt;
&lt;p&gt;所以我更喜欢把它们记成三句话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prefix Cache：重复的别再算。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Chunked Prefill：太长的别一次算完。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Continuous Batching：不同请求尽量一起算。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这三项放到一起，才真正体现出 Serving Runtime 和“单条请求模型推理程序”的区别。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-mtp-用到-speculative-decoding-里才真正开始减少-decode-串行性&#34;&gt;5. MTP 用到 Speculative Decoding 里，才真正开始减少 Decode 串行性
&lt;/h2&gt;&lt;p&gt;前面的优化主要集中在：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefill
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Scheduler
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;多请求利用率
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MTP 则是另一条路线。&lt;/p&gt;
&lt;p&gt;传统自回归 Decode：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Token N
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Forward
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Token N+1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Forward
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Token N+2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一次 Target Forward 通常只让最终输出前进一颗 Token。&lt;/p&gt;
&lt;p&gt;MTP 和 Speculative Decoding 其实不是同一个概念。&lt;/p&gt;
&lt;p&gt;MTP 提供的是“预测后续多颗 Token”的能力；在推理阶段把 MTP Head 当成 Speculative Proposer，再由 Target Model 验证这些候选，才形成真正的 speculative decoding 路径：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MTP Proposal
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Target Verification
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;接受若干 Token
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果一次能够稳定接受多颗 Token，就可能减少平均每颗最终 Token 所需要的串行 Decode Step。&lt;/p&gt;
&lt;p&gt;所以它真正优化的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decode 串行深度和 ITL。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但它不是一个：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ON = 固定 +30% TPS&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;的开关。&lt;/p&gt;
&lt;p&gt;实际收益更接近：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;节省的 Target Decode Step
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Proposal 开销
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Verification 开销
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;最终收益
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最关键的运行指标包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Acceptance Rate&lt;/li&gt;
&lt;li&gt;Mean Accepted Tokens / Step&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而且 Serving 还要考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tool Calling&lt;/li&gt;
&lt;li&gt;Structured Output&lt;/li&gt;
&lt;li&gt;Sampling 配置&lt;/li&gt;
&lt;li&gt;长 Context&lt;/li&gt;
&lt;li&gt;Kernel / CUDA Graph 兼容性&lt;/li&gt;
&lt;li&gt;当前模型与框架版本的稳定性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以我没有把 MTP 放进这套部署的默认基础配置。&lt;/p&gt;
&lt;p&gt;不是因为它理论上“用质量换速度”——标准 Speculative Decoding 本来就会让 Target Model 做验证。&lt;/p&gt;
&lt;p&gt;而是因为它属于：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;模型、Cache、TP、Kernel、CUDA Graph 和 Scheduler 都已经工作以后，再单独 A/B Benchmark 的高级优化。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于我的长代码 Agent workload，前面几个问题的优先级明显更高。&lt;/p&gt;
&lt;p&gt;尤其如果一次请求是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Prompt：100K&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Output：2K&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MTP-based Speculative Decoding 能优化的是后面的 2K Decode。&lt;/p&gt;
&lt;p&gt;如果下一轮有 90K 相同 Prefix，Prefix Cache 则可以直接让 90K 重复 Prefill 不再计算。&lt;/p&gt;
&lt;p&gt;所以我的判断一直是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;先解决“不必要的计算”，再解决“剩下的计算怎么更快”。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-做到这一层以后benchmark-不能再只看-tokens&#34;&gt;6. 做到这一层以后，Benchmark 不能再只看 token/s
&lt;/h2&gt;&lt;p&gt;只记录：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;token/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;已经明显不够了。&lt;/p&gt;
&lt;p&gt;至少应该把性能拆成四类。&lt;/p&gt;
&lt;h3 id=&#34;ttft&#34;&gt;TTFT
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Time To First Token&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;主要受：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prefill&lt;/li&gt;
&lt;li&gt;Prefix Cache&lt;/li&gt;
&lt;li&gt;Scheduler&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;影响。&lt;/p&gt;
&lt;h3 id=&#34;itl&#34;&gt;ITL
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Inter-Token Latency&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;主要反映流式输出是否顺滑，会受到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Decode&lt;/li&gt;
&lt;li&gt;TP&lt;/li&gt;
&lt;li&gt;Kernel&lt;/li&gt;
&lt;li&gt;CUDA Graph&lt;/li&gt;
&lt;li&gt;Scheduler&lt;/li&gt;
&lt;li&gt;MTP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;影响。&lt;/p&gt;
&lt;h3 id=&#34;aggregate-throughput&#34;&gt;Aggregate Throughput
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Total Output Tokens / Second&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;更适合观察：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continuous Batching&lt;/li&gt;
&lt;li&gt;Scheduler&lt;/li&gt;
&lt;li&gt;并发&lt;/li&gt;
&lt;li&gt;Batch 利用率&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;prefix-cache-hit-rate--cached-tokens&#34;&gt;Prefix Cache Hit Rate / Cached Tokens
&lt;/h3&gt;&lt;p&gt;对长 Context Agent 来说，这甚至可能成为最值得长期记录的指标之一。&lt;/p&gt;
&lt;p&gt;如果每轮都能稳定命中 80%、90% 甚至更高，那么系统真实成本和“每次完整 Prefill 100K”已经完全不是一回事。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-双-5060-ti-的最终优化顺序&#34;&gt;7. 双 5060 Ti 的最终优化顺序
&lt;/h2&gt;&lt;p&gt;回到整个系列一直使用的这套部署：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2 × RTX 5060 Ti 16GB
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Qwen3.8-27B NVFP4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TP2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FP8 KV
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CUDA Graph ON
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;100K Context
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;前几篇已经分别解决了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NVFP4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 让权重完整 GPU Resident
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TP2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 聚合双卡计算与显存带宽
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PCIe / P2P 分析
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 判断 TP 的通信成本是否值得
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Kernel / CUDA Graph
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 降低模型执行开销
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FP8 KV
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 把 100K Context 放进显存
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到了最后一层，我真正优先做的是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefix Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 减少长代码重复 Prefill
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chunked Prefill
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ Cache Miss 时避免长 Prompt 阻塞 Decode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Continuous Batching
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 多个 Agent / Session 共享 GPU 时提高总吞吐
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;MTP 则保留成可选项：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;只有实际 A/B Benchmark 证明 Acceptance、稳定性和功能兼容性都足够好，才值得加入默认配置。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它不是这套部署架构成立的前提。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-结论&#34;&gt;8. 结论
&lt;/h2&gt;&lt;p&gt;大模型推理不存在一个统一的“加速开关”。&lt;/p&gt;
&lt;p&gt;不同优化对应不同阶段：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;优化&lt;/th&gt;
          &lt;th&gt;主要解决的问题&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Prefix Cache&lt;/td&gt;
          &lt;td&gt;避免重复 Prefill&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Chunked Prefill&lt;/td&gt;
          &lt;td&gt;长 Prefill 不要一次阻塞整个调度&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Continuous Batching&lt;/td&gt;
          &lt;td&gt;多请求持续填充 GPU&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;MTP-based Speculative Decoding&lt;/td&gt;
          &lt;td&gt;减少 Decode 串行 Step&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对于长 Context 代码 Agent，我最终更认可这样的顺序：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;先减少不必要的计算
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;再改善 GPU 调度
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;再提高多请求利用率
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;最后再优化自回归 Decode
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也就是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefix Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chunked Prefill / Scheduler
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Continuous Batching
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MTP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个系列从最开始的问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“两张 5060 Ti 能不能跑 27B？”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一路走到了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;模型精度
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;显存容量
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;多卡并行
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;跨卡通信
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Kernel / CUDA Graph
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;长 Context Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefix / Scheduler / Decode 优化
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到最后，我觉得真正值得记住的已经不是某一个启动参数，而是一种部署思路：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;在可接受的模型质量下，让有限的显存、显存带宽和计算能力尽可能花在真正需要重新计算的 Token 上。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这也是我这一周折腾双 RTX 5060 Ti + Qwen3.8-27B 以后，最终得到的最有价值的结论。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;系列导航：&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://jiangwan.ink/p/qwen38-27b-200k-context-kv-cache/&#34; &gt;← 上一篇：200K Context 到底需要多少显存？从 KV Cache 算到 Qwen3.8 的真实部署&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
