<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Qwen3.8 on Jiangwan&#39;s Blog</title>
        <link>https://jiangwan.ink/tags/qwen3.8/</link>
        <description>Recent content in Qwen3.8 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/qwen3.8/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>
        <item>
        <title>双卡部署大模型：TP、PP、DP 和 Layer Split 到底有什么区别？</title>
        <link>https://jiangwan.ink/p/multi-gpu-llm-tp-pp-dp-layer-split/</link>
        <pubDate>Mon, 24 Aug 2026 10:00:00 +0800</pubDate>
        
        <guid>https://jiangwan.ink/p/multi-gpu-llm-tp-pp-dp-layer-split/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;双 RTX 5060 Ti 部署 Qwen3.8 系列 · 2/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;模型单卡放不下以后，“再加一张 GPU”并不是完整答案。Layer Split、Pipeline Parallel、Tensor Parallel 和 Data Parallel 看起来都是多卡推理，实际解决的却是容量、单实例加速和并发吞吐三个不同问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上一篇先把显存问题算清楚了：双 16GB 能不能跑 27B，首先取决于权重能不能装下，以及装完以后还剩多少运行空间。&lt;/p&gt;
&lt;p&gt;但模型单卡放不下以后，“加一张 GPU”并不是一个完整答案。&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;Layer Split
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Pipeline Parallel（PP）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Tensor Parallel（TP）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Data Parallel（DP）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;它们表面上都是“多张 GPU 跑一个模型服务”，实际解决的问题却不一样。&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;Layer Split / PP
&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;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;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DP
&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;p&gt;&lt;code&gt;2 × RTX 5060 Ti 16GB + Qwen3.8-27B&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-layer-split最直观的多卡切法&#34;&gt;1. Layer Split：最直观的多卡切法
&lt;/h2&gt;&lt;p&gt;假设模型有 64 层。&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;GPU0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 0 ~ 31
&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;GPU1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 32 ~ 63
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原本一张 16GB GPU 放不下整个模型，现在变成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPU0 放一部分权重。&lt;/li&gt;
&lt;li&gt;GPU1 放另一部分权重。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两张卡的容量都被利用起来了。&lt;/p&gt;
&lt;p&gt;llama.cpp 的多 GPU layer split，可以先把它理解成这一类思路。&lt;/p&gt;
&lt;p&gt;它最大的优势是灵活。&lt;/p&gt;
&lt;p&gt;如果两张卡容量甚至不一样，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GPU0：16GB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPU1：12GB&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;就可以让 GPU0 多放一些层，GPU1 少放一些。&lt;/p&gt;
&lt;p&gt;对于消费级硬件、GGUF、混合显存容量，这种模型放置方式非常实用。&lt;/p&gt;
&lt;h3 id=&#34;layer-split-的问题&#34;&gt;Layer Split 的问题
&lt;/h3&gt;&lt;p&gt;一颗 token 在 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
&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;GPU0 上的前半模型
&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;GPU1 上的后半模型
&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;GPU0 没完成前面的层，GPU1 后面的层就拿不到对应的 Activation。&lt;/p&gt;
&lt;p&gt;所以它首先解决的是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Capacity Scaling——容量扩展。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而不是自动获得：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2× Single-stream Decode Performance。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&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;2-pipeline-parallel也是按层切但它是一套执行策略&#34;&gt;2. Pipeline Parallel：也是按层切，但它是一套执行策略
&lt;/h2&gt;&lt;p&gt;Pipeline Parallel，简称 PP。&lt;/p&gt;
&lt;p&gt;双卡 PP2 可以画成：&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;Stage 0              Stage 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;GPU0                 GPU1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 0~31   ─────→  Layer 32~63
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从模型切分上看，它和 Layer Split 很像：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不同层位于不同 GPU。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但 PP 不只是“把哪些层放哪张卡”的问题。&lt;/p&gt;
&lt;p&gt;推理框架还会显式管理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pipeline Stage&lt;/li&gt;
&lt;li&gt;Stage 间通信&lt;/li&gt;
&lt;li&gt;Micro Batch&lt;/li&gt;
&lt;li&gt;Pipeline Scheduling&lt;/li&gt;
&lt;li&gt;分布式 Runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以我更倾向于这样区分：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Layer Split 更像模型放置方式；PP 是完整的并行执行策略。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;pp-能不能让单请求快一倍&#34;&gt;PP 能不能让单请求快一倍？
&lt;/h3&gt;&lt;p&gt;对于单条请求、单 token 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;GPU0 Stage
&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;GPU1 Stage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样的前后依赖。&lt;/p&gt;
&lt;p&gt;但当 Batch 或并发增加后，可以让不同请求处于不同 Stage：&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;时间 T1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPU0：请求 A
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPU1：空闲
&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;时间 T2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPU0：请求 B
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPU1：请求 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;时间 T3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPU0：请求 C
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPU1：请求 B
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这时候 Pipeline 才真正“流动”起来。&lt;/p&gt;
&lt;p&gt;因此 PP 对吞吐和多请求调度的价值，通常比对单流 Decode 延迟更明显。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-tp不是切-layer而是切-layer-里面的矩阵&#34;&gt;3. TP：不是切 Layer，而是切 Layer 里面的矩阵
&lt;/h2&gt;&lt;p&gt;Tensor Parallel，简称 TP。&lt;/p&gt;
&lt;p&gt;它和前面两种方式最大的区别是：&lt;/p&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;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;              Layer 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;        ┌───────────────┐
&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;      GPU0            GPU1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   Matrix Part 0   Matrix Part 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;        └──────┬────────┘
&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;            Layer N+1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设一个 Linear 是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Y = XW&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;可以把 W 切开：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;W0 → GPU0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;W1 → GPU1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两张卡同时计算：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GPU0：X × W0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPU1：X × W1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后再通过 Collective 把结果组合成下一步需要的形式。&lt;/p&gt;
&lt;p&gt;在 TP2 下，从第一层到最后一层，两张 GPU 都会持续参与。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;为什么-tp-更可能让双卡的单流-decode-变快&#34;&gt;为什么 TP 更可能让双卡的单流 Decode 变快？
&lt;/h3&gt;&lt;p&gt;RTX 5060 Ti 16GB 单卡显存带宽约：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;448 GB/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Layer Split 时，一颗 token 更接近：&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;GPU0 读前半权重并计算
&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;GPU1 读后半权重并计算
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而 TP2 更接近：&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;GPU0 读取这一层的一部分权重
&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;GPU1 读取这一层的另一部分权重
&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;显存带宽&lt;/li&gt;
&lt;li&gt;计算单元&lt;/li&gt;
&lt;li&gt;Tensor Core&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;都有机会同时参与同一个 Layer。&lt;/p&gt;
&lt;p&gt;这也是为什么 TP 是这几种方案里，最值得拿来讨论&lt;strong&gt;单个模型实例加速&lt;/strong&gt;的一种。&lt;/p&gt;
&lt;p&gt;但 TP 不是免费的。&lt;/p&gt;
&lt;p&gt;每层的局部结果需要通过：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AllReduce&lt;/li&gt;
&lt;li&gt;AllGather&lt;/li&gt;
&lt;li&gt;ReduceScatter&lt;/li&gt;
&lt;li&gt;NCCL&lt;/li&gt;
&lt;li&gt;PCIe / P2P&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;等方式交换或聚合。&lt;/p&gt;
&lt;p&gt;所以 TP 的收益实际上是一笔账：&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;最终 Scaling
&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;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;没有 NVLink、甚至没有 CUDA P2P 的消费级双卡，TP 到底还值不值得？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-tp-和-pp-最本质的区别&#34;&gt;4. TP 和 PP 最本质的区别
&lt;/h2&gt;&lt;p&gt;可以直接看图。&lt;/p&gt;
&lt;h3 id=&#34;pp2&#34;&gt;PP2
&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;GPU0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 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;Layer 31
&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;GPU1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 32
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 33
&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;Layer 63
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每个 Layer 基本只属于一个 Stage。&lt;/p&gt;
&lt;h3 id=&#34;tp2&#34;&gt;TP2
&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;Layer 0  → GPU0 + GPU1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 1  → GPU0 + GPU1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 2  → GPU0 + GPU1
&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;Layer 63 → GPU0 + GPU1
&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;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;PP 是切 Layer，TP 是切 Layer 里面的矩阵。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这也是理解二者单流性能差异的关键。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;layer-split-和-pp-为什么看起来那么像&#34;&gt;Layer Split 和 PP 为什么看起来那么像？
&lt;/h3&gt;&lt;p&gt;因为从外面看，它们都可能是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前半模型 → GPU0&lt;/li&gt;
&lt;li&gt;后半模型 → GPU1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;区别更像是关注点不同。&lt;/p&gt;
&lt;h3 id=&#34;layer-split&#34;&gt;Layer Split
&lt;/h3&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;p&gt;典型问题是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这张卡放多少层？&lt;/li&gt;
&lt;li&gt;那张卡放多少层？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;pipeline-parallel&#34;&gt;Pipeline Parallel
&lt;/h3&gt;&lt;p&gt;重点是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;模型如何被划成 Stage，并按 Pipeline 方式运行。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它会进一步涉及 Stage、Micro Batch 和调度。&lt;/p&gt;
&lt;p&gt;所以二者虽然都按层切，但不能完全当成同一个概念。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-dp根本不是用来解决单模型显存的&#34;&gt;5. DP：根本不是用来解决单模型显存的
&lt;/h2&gt;&lt;p&gt;Data Parallel，简称 DP。&lt;/p&gt;
&lt;p&gt;最简单的 DP2：&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;GPU0
&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;GPU1
&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
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两张 GPU 各放一份完整模型。&lt;/p&gt;
&lt;p&gt;所以如果一个模型本身需要：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;23GB VRAM&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;而单张 5060 Ti 只有：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;16GB&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;单纯开 DP2 没有帮助。&lt;/p&gt;
&lt;p&gt;它不会把：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;16 + 16&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;变成一个 32GB 的模型实例。&lt;/p&gt;
&lt;p&gt;因为每个 DP Replica 都需要自己完整的一份权重。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;dp-解决的是并发吞吐&#34;&gt;DP 解决的是并发吞吐
&lt;/h3&gt;&lt;p&gt;假设单个 Replica 能稳定处理一批请求。&lt;/p&gt;
&lt;p&gt;DP2 相当于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GPU0：Replica A&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPU1：Replica B&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两张卡可以独立服务不同请求。&lt;/p&gt;
&lt;p&gt;因此 DP 的核心目标是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Throughput Scaling。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而不是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Single Request Speed。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;请求 A 不会因为 DP2 就自动从 30 token/s 变成 60 token/s。&lt;/p&gt;
&lt;p&gt;但服务可以同时让另一个 Replica 去处理请求 B。&lt;/p&gt;
&lt;p&gt;这和 TP 的目标明显不同。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-tpppdp-可以组合&#34;&gt;6. TP、PP、DP 可以组合
&lt;/h2&gt;&lt;p&gt;真实的大规模部署往往不会只使用一种并行方式。&lt;/p&gt;
&lt;p&gt;例如 8 张 GPU 可以做：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TP4 × DP2&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;GPU0~3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ TP4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ Replica 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;GPU4~7
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ TP4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ Replica 2
&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;TP4
&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;DP2
&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;p&gt;&lt;code&gt;TP2 + PP2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;四张 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;Stage 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPU0 + GPU1
&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;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Stage 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GPU2 + GPU3
&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;也就是层之间用 PP，层内部用 TP。&lt;/p&gt;
&lt;p&gt;所以 TP、PP、DP 并不是互斥选项，它们是在不同维度切模型和请求。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-一个表看懂四种方式&#34;&gt;7. 一个表看懂四种方式
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方式&lt;/th&gt;
          &lt;th&gt;怎么切&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;扩展单实例显存&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;单请求加速潜力&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;并发扩展&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Layer Split&lt;/td&gt;
          &lt;td&gt;按层放到不同 GPU&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;✅&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;较弱&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;一般&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;PP&lt;/td&gt;
          &lt;td&gt;按 Stage 分模型&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;✅&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;有限&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;✅&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;TP&lt;/td&gt;
          &lt;td&gt;每层内部切矩阵&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;✅&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;✅&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;间接&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DP&lt;/td&gt;
          &lt;td&gt;复制完整模型&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;❌&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;❌&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;✅✅&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果换成实际问题：&lt;/p&gt;
&lt;h3 id=&#34;模型单卡放不下怎么办&#34;&gt;模型单卡放不下怎么办？
&lt;/h3&gt;&lt;p&gt;优先看：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Layer Split / PP / TP&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;想提高单请求-decode-速度&#34;&gt;想提高单请求 Decode 速度？
&lt;/h3&gt;&lt;p&gt;优先研究：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TP&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;模型单卡已经能放下只想扩大并发&#34;&gt;模型单卡已经能放下，只想扩大并发？
&lt;/h3&gt;&lt;p&gt;优先考虑：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DP&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;模型特别大单一-tp-或-pp-都不够&#34;&gt;模型特别大，单一 TP 或 PP 都不够？
&lt;/h3&gt;&lt;p&gt;就会进入：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TP + PP&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这样的组合。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-为什么消费级双卡特别值得测试-tp&#34;&gt;8. 为什么消费级双卡特别值得测试 TP？
&lt;/h2&gt;&lt;p&gt;数据中心 GPU 的多卡环境往往拥有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NVLink&lt;/li&gt;
&lt;li&gt;NVSwitch&lt;/li&gt;
&lt;li&gt;高带宽 GPU 互联&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;消费级 GPU 的现实则经常是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PCIe&lt;/li&gt;
&lt;li&gt;没有 NVLink&lt;/li&gt;
&lt;li&gt;P2P 甚至可能不可用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就出现了一个很自然的担心：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TP 每层都要同步，PCIe 这么慢，是不是直接把双卡并行收益吃光？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但这里不能只拿：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPU 本地显存带宽：几百 GB/s&lt;/code&gt;，而 &lt;code&gt;GPU 间通信：个位数或十几 GB/s&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;直接下结论。&lt;/p&gt;
&lt;p&gt;因为 TP 的收益来自两张卡同时处理自己的权重分片，而跨卡同步的也不是“把几十 GB 模型权重来回传”。&lt;/p&gt;
&lt;p&gt;到底通信量有多大、为什么没有 P2P 也还能跑出不错的 Scaling，必须结合实际模型 hidden size、Collective 次数和实测带宽一起算。&lt;/p&gt;
&lt;p&gt;这就是下一篇的主题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-双-5060-ti我会怎么选&#34;&gt;9. 双 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;单用户 / 单请求
&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;→ DP 才开始有意义
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果模型单卡放不下，又是 llama.cpp / GGUF、希望兼容不同显存容量和 CPU + GPU：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Layer Split&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;通常很自然。&lt;/p&gt;
&lt;p&gt;如果使用 vLLM，希望一个模型实例同时利用两张 GPU 的计算与显存带宽：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TP2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;更值得优先测试。&lt;/p&gt;
&lt;p&gt;如果 TP 不适合当前模型、并行维度受限，或者通信条件实在太差：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PP&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;则可以回到容量优先的方向。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-结论&#34;&gt;10. 结论
&lt;/h2&gt;&lt;p&gt;多 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;多一张卡
&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;p&gt;&lt;strong&gt;Layer Split&lt;/strong&gt;：按层分权重，重点解决容量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PP&lt;/strong&gt;：按 Stage 分模型，重点解决超大模型和 Pipeline 吞吐。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TP&lt;/strong&gt;：切分每一层内部的矩阵，重点解决单实例模型并行和计算性能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DP&lt;/strong&gt;：复制完整模型，重点解决多 Replica 并发吞吐。&lt;/p&gt;
&lt;p&gt;其中最值得先记住的一句话还是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;PP 是切 Layer，TP 是切 Layer 里面的计算，DP 是复制整个模型。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于双 RTX 5060 Ti，真正有意思的问题也从这里开始：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TP2 确实能让两张 GPU 同时工作，但消费级显卡又没有 NVLink。PCIe 通信到底会损失多少性能？&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/rtx-5060-ti-tp2-pcie-p2p/&#34; &gt;《两张 RTX 5060 Ti 为什么没有两倍推理速度？显存带宽、PCIe 与 P2P》&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/dual-rtx-5060-ti-27b-vram/&#34; &gt;← 上一篇：2× RTX 5060 Ti 16GB 能跑 27B 大模型吗？先把显存算清楚&lt;/a&gt; · &lt;a class=&#34;link&#34; href=&#34;https://jiangwan.ink/p/rtx-5060-ti-tp2-pcie-p2p/&#34; &gt;下一篇：两张 RTX 5060 Ti 为什么没有两倍推理速度？显存带宽、PCIe 与 P2P →&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>2× RTX 5060 Ti 16GB 能跑 27B 大模型吗？先把显存算清楚</title>
        <link>https://jiangwan.ink/p/dual-rtx-5060-ti-27b-vram/</link>
        <pubDate>Sun, 23 Aug 2026 10:00:00 +0800</pubDate>
        
        <guid>https://jiangwan.ink/p/dual-rtx-5060-ti-27b-vram/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;双 RTX 5060 Ti 部署 Qwen3.8 系列 · 1/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;从两张 RTX 5060 Ti 16GB 能不能跑好 27B 模型这个问题开始，先把 BF16、FP8、NVFP4 的权重和运行显存拆开算清楚。真正决定能不能长期使用的，不只是模型文件能否塞进 32GB，而是权重之外还能给 Cache、Runtime 和长上下文留下多少空间。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Qwen3.8-27B 在 2026 年 8 月 14 日开放权重。写这篇的时候，它出来已经一个多星期。&lt;/p&gt;
&lt;p&gt;这一周我基本把空闲的 GPU 时间都花在了它身上。&lt;/p&gt;
&lt;p&gt;最开始的问题其实很简单：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;两张 RTX 5060 Ti 16GB，到底能不能把一个 27B 模型跑好？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一开始我以为这只是一个显存问题：32GB 总显存，算一下权重，挑一个合适的量化，然后把服务启动起来，大概就结束了。&lt;/p&gt;
&lt;p&gt;真正开始部署以后，问题却一层一层冒了出来：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;27B 到底应该选 BF16、FP8、NVFP4，还是普通 4bit？&lt;/li&gt;
&lt;li&gt;2×16GB 为什么不能简单当成一张 32GB？&lt;/li&gt;
&lt;li&gt;模型分到两张卡以后，TP、PP、Layer Split 到底谁真的会让 Decode 变快？&lt;/li&gt;
&lt;li&gt;没有 NVLink，甚至实际机器没有 CUDA P2P，TP 为什么还能有不错的 Scaling？&lt;/li&gt;
&lt;li&gt;同样写着 NVFP4，“能加载”和“真正跑到适合 Blackwell 的低精度 Kernel”是不是一回事？&lt;/li&gt;
&lt;li&gt;100K、200K Context 到底需要多少显存？&lt;/li&gt;
&lt;li&gt;模型终于跑起来以后，Prefix Cache、Continuous Batching、CUDA Graph、MTP 又分别在优化什么？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是原本一个“能不能跑”的问题，最后变成了这组六篇文章。&lt;/p&gt;
&lt;p&gt;整个系列基本按照我实际部署时遇到问题的顺序展开：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;显存与量化 → 多卡并行 → PCIe 与通信 → vLLM 执行栈 → 长上下文显存 → 长上下文 Serving 优化。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;硬件则一直尽量保持在个人开发者真正可能接触到的范围：消费级 RTX 5060 Ti、PCIe 多卡、没有 NVLink。&lt;/p&gt;
&lt;p&gt;所以这组文章并不是讨论“如果我有 8 张 H100 应该怎么部署”，而是想回答另一个更现实的问题：&lt;/p&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;p&gt;双 RTX 5060 Ti 16GB，一共 32GB 显存。27B 模型到底能不能跑？&lt;/p&gt;
&lt;p&gt;结论先说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;可以，但基本要进入高质量 4bit / NVFP4 这一档。BF16 明显不够，FP8 对双 16GB 来说通常也太挤。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;真正需要计算的不是“模型文件有没有小于 32GB”，而是：&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;+ Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ CUDA / Runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ Workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ Activation
&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;2×16GB 也不等于一张 32GB GPU。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-27b-模型到底需要多少显存&#34;&gt;1. 27B 模型到底需要多少显存？
&lt;/h2&gt;&lt;p&gt;27B 表示大约 270 亿参数。&lt;/p&gt;
&lt;p&gt;最简单的权重估算公式是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;权重大小 ≈ 参数量 × 每参数字节数&lt;/code&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 style=&#34;text-align: right&#34;&gt;27B 理论权重大小&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;BF16 / FP16&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;≈54GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;FP8 / INT8&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;≈27GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;FP4 / INT4&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;≈13.5GB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;从理论值已经能看到大致边界：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2 × RTX 5060 Ti 16GB = 32GB 总显存&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;BF16 基本不用考虑。&lt;/p&gt;
&lt;p&gt;FP8 看起来接近能放下。&lt;/p&gt;
&lt;p&gt;4bit 则开始进入比较合理的范围。&lt;/p&gt;
&lt;p&gt;但这里的 13.5GB 只是“27B × 4bit”的理想数学值，不等于实际模型文件大小。&lt;/p&gt;
&lt;p&gt;实际量化模型还可能包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scale&lt;/li&gt;
&lt;li&gt;部分高精度 Tensor&lt;/li&gt;
&lt;li&gt;Embedding&lt;/li&gt;
&lt;li&gt;Norm&lt;/li&gt;
&lt;li&gt;Output Head&lt;/li&gt;
&lt;li&gt;量化元数据&lt;/li&gt;
&lt;li&gt;其他未按同一 bit 数保存的权重&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以“4bit”不能直接理解成“模型一定只有 13.5GB”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-用实际-qwen38-27b-看更直观&#34;&gt;2. 用实际 Qwen3.8-27B 看更直观
&lt;/h2&gt;&lt;p&gt;以这次部署的 Qwen3.8-27B 为例，不同版本大致是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BF16      ≈ 55GB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FP8       ≈ 31GB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NVFP4     ≈ 23GB&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;放到双 5060 Ti 16GB 上就很直观了。&lt;/p&gt;
&lt;h3 id=&#34;bf16&#34;&gt;BF16
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;权重 ≈ 55GB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;总显存 = 32GB&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;明显放不下。&lt;/p&gt;
&lt;p&gt;当然，可以通过 CPU / RAM Offload 把一部分权重留在系统内存，但那已经是另一种性能模型，不能再算正常的“双 GPU 全显存部署”。&lt;/p&gt;
&lt;h3 id=&#34;fp8&#34;&gt;FP8
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;权重 ≈ 31GB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;总显存 = 32GB&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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;Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CUDA Context
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Activation
&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“权重能塞进去”和“模型能正常提供服务”是两回事。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果还希望跑几十 K、100K 甚至更长 Context，FP8 在双 16GB 上就更难留出足够的运行空间。&lt;/p&gt;
&lt;h3 id=&#34;nvfp4&#34;&gt;NVFP4
&lt;/h3&gt;&lt;p&gt;NVFP4 权重进入约 23GB 以后，情况明显不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;总显存 ≈ 32GB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;权重   ≈ 23GB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;名义剩余 ≈ 9GB&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然，这 9GB 也不能全部给 Cache。&lt;/p&gt;
&lt;p&gt;Runtime、Workspace、CUDA Graph 等仍然会吃掉一部分。&lt;/p&gt;
&lt;p&gt;但至少从这里开始，才真正有空间继续规划 Context 和 Serving。&lt;/p&gt;
&lt;p&gt;所以对于：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2 × RTX 5060 Ti 16GB + 27B 模型&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果只谈&lt;strong&gt;这套硬件上的部署适配度&lt;/strong&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 / 4bit
&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;FP8
&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;BF16
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这不是在说 FP4 的模型质量天然高于 FP8，而是双 16GB 的容量约束决定了 FP8 很难给实际推理留下足够空间。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-模型权重不是唯一的显存开销&#34;&gt;3. 模型权重不是唯一的显存开销
&lt;/h2&gt;&lt;p&gt;部署 LLM 时，一个非常常见的误区是：&lt;/p&gt;
&lt;p&gt;模型文件约 &lt;strong&gt;23GB&lt;/strong&gt;、总显存 &lt;strong&gt;32GB&lt;/strong&gt;，表面上看似乎“还剩 9GB”。&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;VRAM
&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;Weights
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ Runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ Workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ Activation
&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;+ Framework Buffer
&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;/p&gt;
&lt;ul&gt;
&lt;li&gt;Context Length&lt;/li&gt;
&lt;li&gt;Batch Size&lt;/li&gt;
&lt;li&gt;并发数量&lt;/li&gt;
&lt;li&gt;CUDA Graph&lt;/li&gt;
&lt;li&gt;Attention Backend&lt;/li&gt;
&lt;li&gt;KV / Cache dtype&lt;/li&gt;
&lt;li&gt;推理框架&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;都会改变最终显存占用。&lt;/p&gt;
&lt;p&gt;所以部署之前，我现在更习惯把问题拆成两步。&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;p&gt;第二步：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;装完权重以后，还剩多少显存能够真正用于推理？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;第二步往往比第一步更重要。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-为什么-216gb-不等于-132gb&#34;&gt;4. 为什么 2×16GB 不等于 1×32GB？
&lt;/h2&gt;&lt;p&gt;假设模型权重是 24GB。&lt;/p&gt;
&lt;p&gt;如果是一张 32GB 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;GPU0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── 24GB 权重
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── Runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── Workspace
&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;总上限：32GB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所有显存都在同一个 GPU 的地址空间和资源预算里。&lt;/p&gt;
&lt;p&gt;双 16GB 则不同：&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;GPU0                  GPU1
&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;├── Runtime            ├── Runtime
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── Cache              ├── Cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── Workspace          └── Workspace
&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;上限 16GB              上限 16GB
&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;&lt;code&gt;GPU0：16.1GB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPU1：13GB&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;即使 GPU1 还剩 3GB，也不能简单理解成 GPU0 可以把这 3GB 当成本地显存继续使用。&lt;/p&gt;
&lt;p&gt;所以多卡部署不仅要看：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;总显存够不够&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;还要看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每张卡分别放了什么？&lt;/li&gt;
&lt;li&gt;每张卡分别占多少？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这也是为什么“模型怎么切”会直接影响能不能启动以及最终能开多大 Context。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-模型分到两张卡只是下一层问题的开始&#34;&gt;5. 模型分到两张卡，只是下一层问题的开始
&lt;/h2&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;GPU0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 0 ~ 31
&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;GPU1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 32 ~ 63
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;另一种是让两张 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;          Layer 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;     GPU0       GPU1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      1/2        1/2
&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;p&gt;所以：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;模型能不能分到两张卡，和两张卡能不能让单请求跑得更快，不是同一个问题。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;具体的 Layer Split、PP、TP、DP，下一篇单独拆开讲。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-双卡-448gbs-能不能直接变成-896gbs&#34;&gt;6. 双卡 448GB/s 能不能直接变成 896GB/s？
&lt;/h2&gt;&lt;p&gt;RTX 5060 Ti 16GB 单卡显存带宽约为：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;448 GB/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;两张卡的物理显存带宽总和当然是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;448 × 2 = 896 GB/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;但推理时能不能真正把它变成接近 2× 的单 token 性能，取决于并行方式。&lt;/p&gt;
&lt;p&gt;按层串行执行时，两张卡并不会一直同时为同一颗 token 读取权重。&lt;/p&gt;
&lt;p&gt;Tensor Parallel 则更有机会让两张卡在同一层同时工作，但又会引入跨卡通信和同步。&lt;/p&gt;
&lt;p&gt;所以这里不能简单写成：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2 张 GPU = 2× token/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;第三篇会直接用 TP2 的实测数据、PCIe、P2P 和 AllReduce 把这笔账算清楚。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-长上下文会继续吃掉剩余显存&#34;&gt;7. 长上下文会继续吃掉剩余显存
&lt;/h2&gt;&lt;p&gt;如果只是跑 4K、8K 对话，权重通常是最大的显存项目之一。&lt;/p&gt;
&lt;p&gt;但我的实际目标还包括长代码 Context，所以还会继续关注：&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;32K
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64K
&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;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;128K
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这时剩余显存会继续被 Cache 消耗。&lt;/p&gt;
&lt;p&gt;经典 Transformer 经常用 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 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;Token 数
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× Layer 数
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× KV Head
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× Head Dimension
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× K/V
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× dtype
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但现代模型不能一律直接套这个公式。&lt;/p&gt;
&lt;p&gt;Qwen3.8-27B 是混合 Attention 架构，并不是 64 层全部使用传统 Full Attention。&lt;/p&gt;
&lt;p&gt;因此：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;200K Context 到底需要多少显存，必须结合模型结构计算。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这部分放到第五篇专门算。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-双-5060-ti-跑-27b我目前会怎么选&#34;&gt;8. 双 5060 Ti 跑 27B，我目前会怎么选？
&lt;/h2&gt;&lt;p&gt;如果硬件固定为：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2 × RTX 5060 Ti 16GB&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;长 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;代码 / Agent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我的选择会是：&lt;/p&gt;
&lt;h3 id=&#34;bf16-1&#34;&gt;BF16
&lt;/h3&gt;&lt;p&gt;不考虑。容量明显不足。&lt;/p&gt;
&lt;h3 id=&#34;fp8-1&#34;&gt;FP8
&lt;/h3&gt;&lt;p&gt;权重本身已经接近吃满 32GB，总体精度很好，但在双 16GB 上很难留下足够的 Runtime 和 Cache 空间。&lt;/p&gt;
&lt;h3 id=&#34;高质量-nvfp4--4bit&#34;&gt;高质量 NVFP4 / 4bit
&lt;/h3&gt;&lt;p&gt;优先考虑。&lt;/p&gt;
&lt;p&gt;权重压到 20 多 GB 后，双 16GB 才真正有空间继续规划：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cache&lt;/li&gt;
&lt;li&gt;Context&lt;/li&gt;
&lt;li&gt;并发&lt;/li&gt;
&lt;li&gt;Runtime&lt;/li&gt;
&lt;li&gt;CUDA Graph&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以对消费级双 16GB GPU 来说：&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;9-结论&#34;&gt;9. 结论
&lt;/h2&gt;&lt;p&gt;双 RTX 5060 Ti 16GB 可以部署 27B 级模型，但不能只用：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;16GB × 2 = 32GB&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;模型权重
&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;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;Runtime
&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;Workspace
&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;对于 Qwen3.8-27B 这类 27B 模型，在双 16GB 上大致可以形成这样的判断：&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;BF16：容量明显不足
&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：权重已经接近吃满总显存
&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;NVFP4 / 高质量 4bit：
&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;2×16GB 不等于 1×32GB。&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;/blockquote&gt;
&lt;p&gt;模型能分到两张卡，只解决了“装不装得下”。&lt;/p&gt;
&lt;p&gt;至于两张卡到底怎么分、谁负责容量、谁负责单请求加速、谁负责并发吞吐，就进入下一篇：&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://jiangwan.ink/p/multi-gpu-llm-tp-pp-dp-layer-split/&#34; &gt;《双卡部署大模型：TP、PP、DP 和 Layer Split 到底有什么区别？》&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/multi-gpu-llm-tp-pp-dp-layer-split/&#34; &gt;下一篇：双卡部署大模型：TP、PP、DP 和 Layer Split 到底有什么区别？ →&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
