<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>大模型部署 on Jiangwan&#39;s Blog</title>
        <link>https://jiangwan.ink/tags/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/</link>
        <description>Recent content in 大模型部署 on Jiangwan&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Mon, 24 Aug 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://jiangwan.ink/tags/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/index.xml" rel="self" type="application/rss+xml" /><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>
