<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>KV Cache on Jiangwan&#39;s Blog</title>
        <link>https://jiangwan.ink/tags/kv-cache/</link>
        <description>Recent content in KV Cache on Jiangwan&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Fri, 28 Aug 2026 12:00:00 +0800</lastBuildDate><atom:link href="https://jiangwan.ink/tags/kv-cache/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>200K Context 到底需要多少显存？从 KV Cache 算到 Qwen3.8 的真实部署</title>
        <link>https://jiangwan.ink/p/qwen38-27b-200k-context-kv-cache/</link>
        <pubDate>Fri, 28 Aug 2026 12:00:00 +0800</pubDate>
        
        <guid>https://jiangwan.ink/p/qwen38-27b-200k-context-kv-cache/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;双 RTX 5060 Ti 部署 Qwen3.8 系列 · 5/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;长上下文显存最容易算错的地方，是把 Hybrid Attention 模型直接当成传统 64 层 Full Attention。Qwen3.8-27B 实际只有 16 层传统 Full Attention，这会把 200K 的 FP8 KV 理论值从约 12.2 GiB/GPU 改写为约 3.05 GiB/GPU，但真实生产边界仍然要看完整 Runtime。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;前面已经把模型权重和 GPU 执行链基本处理清楚了。&lt;/p&gt;
&lt;p&gt;接下来真正开始和长上下文抢显存的，就是 Cache。&lt;/p&gt;
&lt;p&gt;但这里有一个非常容易算错的问题。&lt;/p&gt;
&lt;p&gt;如果把 Qwen3.8-27B 当成一个传统的 64 层 Full Attention 模型，那么在 TP2 + FP8 KV 下，200K Context 会算出大约：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;12.2 GiB / GPU&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;对于一张 16GB 的 RTX 5060 Ti，这几乎意味着根本没有正常部署空间。&lt;/p&gt;
&lt;p&gt;但 Qwen3.8-27B 实际不是这种结构。&lt;/p&gt;
&lt;p&gt;它采用混合 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;真正随着 Context 长度线性增长的传统 KV Cache，主要来自其中 16 个 Full Attention Layer。&lt;/p&gt;
&lt;p&gt;重新计算以后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;100K ≈ 1.53 GiB / GPU&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;200K ≈ 3.05 GiB / GPU&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;差了整整四倍。&lt;/p&gt;
&lt;p&gt;不过这仍然不意味着我的双 5060 Ti 最终能稳定跑 200K。&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;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;gpu_memory_utilization = 0.97
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;max-model-len = 100K
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;vLLM Profile 最终显示：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Maximum Concurrency ≈ 1.07x&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这篇真正想回答的就是两个看起来有点矛盾的问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;为什么 200K 的传统 KV Payload 理论上只有约 3.05GiB / GPU，但最终生产配置却停在了 100K？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;以及：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;为什么我最后选择 FP8 KV，而没有继续把 KV 压到 INT4？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-先把-qwen38-的-kv-cache-算对&#34;&gt;1. 先把 Qwen3.8 的 KV Cache 算对
&lt;/h2&gt;&lt;p&gt;自回归生成时，前面 Token 已经算出来的 Key 和 Value 不需要在每一步重新生成，因此会被缓存下来。&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;Token 1 → K1 / V1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Token 2 → K2 / V2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Token 3 → K3 / V3
&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;对于一层传统 Full Attention，每个 Token 的 KV Cache 可以近似写成：&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;KV Heads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× Head Dim
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 2（K + V）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× dtype bytes
&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;Tokens
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× Full Attention Layers
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× KV Heads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× Head Dim
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× dtype bytes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;因此对纯 Full Attention 模型来说，Context 翻倍，KV Cache 基本也会跟着翻倍。&lt;/p&gt;
&lt;p&gt;但这个公式有两个很重要的前提：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模型到底有多少层真正使用 Full Attention；&lt;/li&gt;
&lt;li&gt;每层到底需要缓存多少个 KV Head。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Qwen3.8-27B 在这两个地方都不能按“传统 64 层 Transformer”直接套公式。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;gqa-先把-kv-head-数降了下来&#34;&gt;GQA 先把 KV Head 数降了下来
&lt;/h3&gt;&lt;p&gt;Qwen3.8-27B 的 Full Attention 部分大致是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Query Heads = 24&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KV Heads    = 4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Head Dim    = 256&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虽然 Query 有 24 个 Head，但真正需要长期缓存的 K/V 只有 4 组。&lt;/p&gt;
&lt;p&gt;传统 MHA 更接近：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;24 Q / 24 K / 24 V&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;GQA 则是：&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;24 Q
&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;4 K
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4 V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以算 KV Cache 时，真正需要代入的是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;KV Heads = 4&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;而不是 24。&lt;/p&gt;
&lt;p&gt;这也是 GQA 对长 Context 显存非常直接的价值。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;如果错误地把-64-层全部当成-full-attention&#34;&gt;如果错误地把 64 层全部当成 Full Attention
&lt;/h3&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;64 Layers
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;KV Heads = 4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Head Dim = 256
&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;TP2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TP2 下，4 个 KV Head 分到两张 GPU，每张大致保存 2 个。&lt;/p&gt;
&lt;p&gt;每层、每 Token、每 GPU：&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 KV Heads
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 256
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 2（K + V）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 1 Byte
&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;= 1024 Bytes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;64 层：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1024 × 64 = 64 KiB / Token / GPU&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;200K Context：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;64 KiB × 200,000 ≈ 12.2 GiB / GPU&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果 Qwen3.8-27B 真的是 64 层全部 Full Attention，单是 200K 的 FP8 KV 就接近吃掉一张 16GB 卡的大部分显存。&lt;/p&gt;
&lt;p&gt;这时候再讨论 23GB 权重、CUDA Graph、Runtime，基本就没有意义了。&lt;/p&gt;
&lt;p&gt;问题在于：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Qwen3.8-27B 不是这种结构。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&#34;qwen38-27b-只有-16-层传统-full-attention&#34;&gt;Qwen3.8-27B 只有 16 层传统 Full Attention
&lt;/h3&gt;&lt;p&gt;Qwen3.8-27B 的 64 层按照下面的模式循环：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;3 × Gated DeltaNet + 1 × Full Attention&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一共循环 16 次。&lt;/p&gt;
&lt;p&gt;最终就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;48 × Gated DeltaNet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;16 × Full Attention&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是传统 KV 重新计算：&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 KV Heads / GPU
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 256
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 2（K + V）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 1 Byte
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 16 Layers
&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;16 KiB / Token / GPU
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对应不同 Context：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Context&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;FP8 Full-Attention KV / GPU&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;32K&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;≈0.49 GiB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;64K&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;≈0.98 GiB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;100K&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;≈1.53 GiB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;128K&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;≈1.95 GiB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;200K&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;≈3.05 GiB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;256K&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;≈4.00 GiB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;所以同样是 200K：&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;错误按 64 层 Full Attention：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 12.2 GiB / 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;按实际 16 层 Full Attention：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 3.05 GiB / GPU
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正好差了接近四倍。&lt;/p&gt;
&lt;p&gt;这也是为什么面对 Hybrid Attention 模型时，不能只知道“它有 64 层”，就直接套传统 KV 公式。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;另外-48-层并不是完全没有状态&#34;&gt;另外 48 层并不是完全没有状态
&lt;/h3&gt;&lt;p&gt;Gated DeltaNet 不需要像 Full Attention 一样，为每个历史 Token 保存完整 K/V。&lt;/p&gt;
&lt;p&gt;它更接近维护 recurrent state：&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;不断更新 State
&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;当前 State
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Full Attention 的传统 KV 是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Context 越长 → KV 越大&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;而 Gated DeltaNet 的 recurrent state 本身不是这种“每多一颗历史 Token 就追加一份完整 K/V”的线性增长方式。&lt;/p&gt;
&lt;p&gt;因此 Qwen3.8-27B 的 Cache 更准确地理解为：&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;16 × Full Attention
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 随 Context 增长的传统 KV 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;48 × Gated DeltaNet
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ per-sequence recurrent state
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这解释了为什么它在超长 Context 下，比“64 层全部 Full Attention”的模型省很多传统 KV。&lt;/p&gt;
&lt;p&gt;但同时也提醒我们：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;3.05GiB 只是 Full Attention KV Payload，不是整个 Engine 最终的显存成本。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-153gib-理论-kv不等于只多占-153gib-显存&#34;&gt;2. 1.53GiB 理论 KV，不等于只多占 1.53GiB 显存
&lt;/h2&gt;&lt;p&gt;100K FP8 Full-Attention KV 的理论值只有：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;≈ 1.53 GiB / GPU&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;但 GPU 上同时还需要存在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NVFP4 Weights&lt;/li&gt;
&lt;li&gt;Gated DeltaNet State&lt;/li&gt;
&lt;li&gt;CUDA Runtime&lt;/li&gt;
&lt;li&gt;CUDA Graph&lt;/li&gt;
&lt;li&gt;Peak Activation&lt;/li&gt;
&lt;li&gt;Workspace&lt;/li&gt;
&lt;li&gt;Allocator&lt;/li&gt;
&lt;li&gt;KV Block / Metadata&lt;/li&gt;
&lt;li&gt;通信 Buffer&lt;/li&gt;
&lt;li&gt;框架其他 Buffer&lt;/li&gt;
&lt;/ul&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;16GB
&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;1.53GB
&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Context 每增加一段，传统 Full Attention KV Payload 大概增长多少？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而真实部署要回答的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;模型加载、Graph、Activation、State 和所有 Buffer 都存在以后，到底还能留多少 Cache Capacity？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;前者靠公式。&lt;/p&gt;
&lt;p&gt;后者靠实际 Profile。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-从理论-payload-到真实-runtime-边界&#34;&gt;3. 从理论 Payload 到真实 Runtime 边界
&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;GPU：
&lt;/span&gt;&lt;/span&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;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Model：
&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;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Parallel：
&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;KV Cache：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FP8
&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;CUDA Graph：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ON
&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_memory_utilization：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0.97
&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;max-model-len：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;100K
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;vLLM Profile 给出的：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Maximum Concurrency ≈ 1.07x&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;更准确的理解不是简单说：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;100K × 1.07 = 107K&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后把 107K 当成一个精确的“总 Cache Token 数”。&lt;/p&gt;
&lt;p&gt;它更适合被理解为：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;在当前 &lt;code&gt;max-model-len = 100K&lt;/code&gt; 和当前 Cache 配置下，Profile 估算只能同时容纳大约 1.07 条达到最大长度的 Sequence。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;也就是说，这套配置对：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1 × 100K 长上下文&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;已经比较接近当前 Profile 给出的容量边界，余量并不算大。&lt;/p&gt;
&lt;p&gt;这里还要再加一层保险：Qwen3.8-27B 属于 Full Attention + Gated DeltaNet 的 Hybrid Model，vLLM 的 &lt;code&gt;Maximum Concurrency&lt;/code&gt; 是当前版本 Cache Manager 根据实际 Cache 配置给出的 Profile 指标，不应该被当成一个脱离版本、Backend 和 Hybrid Cache 实现后仍然精确成立的物理常数。&lt;/p&gt;
&lt;p&gt;所以我把：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Maximum Concurrency ≈ 1.07x&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;理解成：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;当前这套 Runtime 配置已经非常接近 1 条最大长度 Sequence 的容量边界。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而不是拿它反推出一个精确的“总 Cache Token 数”。&lt;/p&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;200K 传统 KV Payload ≈ 3.05 GiB / GPU&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;并不能直接推出：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;200K 一定能稳定启动并保留 CUDA Graph 等运行配置&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;决定最终 Context 上限的是整套 Runtime 显存，而不是传统 KV 这一项。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;max-model-len-不是每个请求固定预留这么多-cache&#34;&gt;max-model-len 不是“每个请求固定预留这么多 Cache”
&lt;/h3&gt;&lt;p&gt;设置：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--max-model-len 100000&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;表示的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;单条 Sequence 最大允许达到 100K。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它不等于“每来一个请求，就静态给它预留完整 100K KV”。&lt;/p&gt;
&lt;p&gt;vLLM 实际维护的是共享 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;请求 A：40K
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请求 B：30K
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请求 C：20K
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请求 D：10K
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;它们会共同消耗 Engine 的 Cache Capacity。&lt;/p&gt;
&lt;p&gt;而不是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;4 × 100K = 400K&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;全部提前保留。&lt;/p&gt;
&lt;p&gt;所以生产 Serving 不能只问：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“我设置 100K，可以并发几条？”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;还要看实际请求长度分布、Block 使用情况以及 Hybrid State 的 per-sequence 成本。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;hybrid-model-下总-token-相同也不代表显存完全相同&#34;&gt;Hybrid Model 下，总 Token 相同也不代表显存完全相同
&lt;/h3&gt;&lt;p&gt;只考虑 Full Attention KV：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1 × 100K&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;和：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;5 × 20K&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;总 Token 数一样，传统 KV Payload 也接近。&lt;/p&gt;
&lt;p&gt;但 Qwen3.8-27B 还有 per-sequence recurrent state。&lt;/p&gt;
&lt;p&gt;一条 100K Sequence 只需要一套 Sequence State。&lt;/p&gt;
&lt;p&gt;五条 20K Sequence 则需要五套。&lt;/p&gt;
&lt;p&gt;除此之外还有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scheduler State&lt;/li&gt;
&lt;li&gt;Output Buffer&lt;/li&gt;
&lt;li&gt;Block Fragmentation&lt;/li&gt;
&lt;li&gt;其他 per-request allocation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以在 Hybrid Model 下：&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;这也是为什么 Maximum Concurrency 和实际并发能力，最终还得通过真实 workload 测。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-kv-精度怎么选bf16fp8-与-int4&#34;&gt;4. KV 精度怎么选：BF16、FP8 与 INT4
&lt;/h2&gt;&lt;p&gt;对于这 16 个 Full Attention Layer，TP2 下：&lt;/p&gt;
&lt;h3 id=&#34;100k&#34;&gt;100K
&lt;/h3&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;BF16 KV
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 3.05 GiB / 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;FP8 KV
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 1.53 GiB / GPU
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;200k&#34;&gt;200K
&lt;/h3&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;BF16 KV
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 6.10 GiB / 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;FP8 KV
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 3.05 GiB / GPU
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对一张只有 16GB 的 5060 Ti 来说，每卡节省 1.5GB 或 3GB 已经足以直接改变最终可用 Context。&lt;/p&gt;
&lt;p&gt;所以我的实际组合是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Weights：NVFP4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KV：FP8&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;权重和 KV 根本没有必要追求同一种 bit 数。&lt;/p&gt;
&lt;p&gt;它们走的是不同的数据路径，也有不同的性能瓶颈。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;int4-kv-确实更省但不能只看-bit-数&#34;&gt;INT4 KV 确实更省，但不能只看 bit 数
&lt;/h3&gt;&lt;p&gt;只从数据量来看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FP8 = 1 Byte / element&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INT4 ≈ 0.5 Byte / element&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以理论上传统 KV Payload 还能再减半。&lt;/p&gt;
&lt;p&gt;例如 100K：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FP8 ≈ 1.53 GiB / GPU&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INT4 ≈ 0.76 GiB / GPU&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;200K：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FP8 ≈ 3.05 GiB / GPU&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INT4 ≈ 1.53 GiB / GPU&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;容量收益确实很诱人。&lt;/p&gt;
&lt;p&gt;但 KV Cache 和“硬盘压缩”不一样。&lt;/p&gt;
&lt;p&gt;Attention 每一轮都要频繁读取这些数据。&lt;/p&gt;
&lt;p&gt;INT4 KV 往往还会涉及：&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;packed INT4 read
&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;unpack
&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;scale / dequant
&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;Attention
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Memory Traffic ↓&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;并不自动等于：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Latency ↓&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;额外 unpack、scale 和反量化本身也要花算力与 Kernel 开销。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;为什么这套-5060-ti-最后还是选-fp8-kv&#34;&gt;为什么这套 5060 Ti 最后还是选 FP8 KV？
&lt;/h3&gt;&lt;p&gt;RTX 5060 Ti 属于 Blackwell。&lt;/p&gt;
&lt;p&gt;在这套硬件上，我更关心的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;当前框架的 FP8 Attention / Cache 路径能不能稳定、高效地运行。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而不是单纯追求最低的 KV bit 数。&lt;/p&gt;
&lt;p&gt;INT4 KV 的优势很明确：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更省显存&lt;/li&gt;
&lt;li&gt;更大的理论 Context&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但代价也同样明确：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;packed read / unpack&lt;/li&gt;
&lt;li&gt;dequant / scale&lt;/li&gt;
&lt;li&gt;Kernel 路径更复杂&lt;/li&gt;
&lt;li&gt;可能增加 Decode 计算开销&lt;/li&gt;
&lt;li&gt;精度风险也更激进&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FP8 KV 虽然占用比 INT4 大一倍，但在当前硬件和推理框架里，是一个更自然的平衡点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;容量已经明显低于 BF16&lt;/li&gt;
&lt;li&gt;Kernel 路径更成熟&lt;/li&gt;
&lt;li&gt;不需要为了进一步压缩增加过多低 bit 解码工作&lt;/li&gt;
&lt;li&gt;精度选择也更保守&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更重要的是，这套机器使用 FP8 KV 已经可以做到：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;100K Context + Maximum Concurrency ≈ 1.07x&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;对我的真实代码任务来说，这已经够用了。&lt;/p&gt;
&lt;p&gt;所以没有必要为了“Context 数字更大”而继续把 KV 压到 INT4，最后反而让 Decode 更慢。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;为什么是-nvfp4-权重--fp8-kv&#34;&gt;为什么是 NVFP4 权重 + FP8 KV？
&lt;/h3&gt;&lt;p&gt;表面上看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Weights：4bit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KV：8bit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好像精度“不统一”。&lt;/p&gt;
&lt;p&gt;但实际非常合理。&lt;/p&gt;
&lt;h3 id=&#34;nvfp4-权重&#34;&gt;NVFP4 权重
&lt;/h3&gt;&lt;p&gt;主要目标是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让 27B 权重完整 GPU Resident&lt;/li&gt;
&lt;li&gt;减少 Weight Traffic&lt;/li&gt;
&lt;li&gt;利用 Blackwell 对 NVFP4 的低精度 GEMM 路径&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;fp8-kv&#34;&gt;FP8 KV
&lt;/h3&gt;&lt;p&gt;主要目标是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;降低长 Context 显存&lt;/li&gt;
&lt;li&gt;保持更直接的 Attention 执行路径&lt;/li&gt;
&lt;li&gt;避免更低 bit 带来的额外 unpack / dequant 成本&lt;/li&gt;
&lt;li&gt;保持长上下文稳定性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以实际部署并不是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“整个模型统一选一个 bit 数。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;更合理的思路是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;权重、KV、Activation 分别选择当前 GPU 和当前 Kernel 最合适的数据格式。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这也是低精度推理真正进入工程阶段以后，和“模型量化成几 bit”这种单一描述最大的区别之一。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-最终配置&#34;&gt;5. 最终配置
&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;
&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;
&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;FP8 KV
&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;CUDA Graph ON
&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_memory_utilization = 0.97
&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;max-model-len = 100K
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Maximum Concurrency ≈ 1.07x&lt;/code&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;27B 模型质量
&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 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 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;100K 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;FP8 KV
&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;CUDA Graph
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而不是为了追求一个单独的：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;200K&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;把 KV 精度、Decode 性能和显存稳定性同时推到极限。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-结论&#34;&gt;6. 结论
&lt;/h2&gt;&lt;p&gt;Qwen3.8-27B 的长 Context 显存不能按照：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;64 Layers × 传统 KV Cache&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;直接计算。&lt;/p&gt;
&lt;p&gt;它实际是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;48 × Gated DeltaNet + 16 × Full Attention&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;再加上：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;24 Query Heads / 4 KV Heads&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;的 GQA。&lt;/p&gt;
&lt;p&gt;因此 TP2 + FP8 KV 下，仅计算传统 Full-Attention KV Payload：&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
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 1.53 GiB / 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;200K
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 3.05 GiB / GPU
&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;Weights&lt;/li&gt;
&lt;li&gt;Gated DeltaNet State&lt;/li&gt;
&lt;li&gt;Runtime&lt;/li&gt;
&lt;li&gt;Activation&lt;/li&gt;
&lt;li&gt;CUDA Graph&lt;/li&gt;
&lt;li&gt;Workspace&lt;/li&gt;
&lt;li&gt;Allocator&lt;/li&gt;
&lt;li&gt;其他 Buffer&lt;/li&gt;
&lt;/ul&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 Context
&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;gpu_memory_utilization = 0.97
&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;公式负责解释显存模型，vLLM Profile 负责找边界，真实长上下文压测负责定生产配置。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而 &lt;code&gt;NVFP4 Weights + FP8 KV&lt;/code&gt; 也不是精度选择混乱。&lt;/p&gt;
&lt;p&gt;它只是分别给不同数据路径选择更合适的格式。&lt;/p&gt;
&lt;p&gt;到这里，“100K 能不能装下”的问题基本结束了。&lt;/p&gt;
&lt;p&gt;接下来的问题变成：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;100K Context 真正跑起来以后，怎么避免每一轮 Agent 都重复计算几十 K、甚至接近 100K 的相同 Prompt？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下一篇进入整个系列最后一层：&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://jiangwan.ink/p/long-context-inference-prefix-cache-scheduling-mtp/&#34; &gt;《长上下文推理优化：Prefix Cache、调度与 MTP》&lt;/a&gt;&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/vllm-production-inference-nvfp4-cuda-graph/&#34; &gt;← 上一篇：为什么生产推理我默认 vLLM：从 NVFP4、Kernel 到 CUDA Graph&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;https://jiangwan.ink/p/long-context-inference-prefix-cache-scheduling-mtp/&#34; &gt;下一篇：长上下文推理优化：Prefix Cache、调度与 MTP →&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
