<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Tensor Parallel on Jiangwan&#39;s Blog</title>
        <link>https://jiangwan.ink/tags/tensor-parallel/</link>
        <description>Recent content in Tensor Parallel on Jiangwan&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Tue, 25 Aug 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://jiangwan.ink/tags/tensor-parallel/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>两张 RTX 5060 Ti 为什么没有两倍推理速度？显存带宽、PCIe 与 P2P</title>
        <link>https://jiangwan.ink/p/rtx-5060-ti-tp2-pcie-p2p/</link>
        <pubDate>Tue, 25 Aug 2026 10:00:00 +0800</pubDate>
        
        <guid>https://jiangwan.ink/p/rtx-5060-ti-tp2-pcie-p2p/</guid>
        <description>&lt;blockquote&gt;
&lt;p&gt;📚 &lt;strong&gt;双 RTX 5060 Ti 部署 Qwen3.8 系列 · 3/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;TP2 能让两张 GPU 同时参与同一层，但双卡并不会因此稳定得到 2 倍 token/s。这篇用 33.5 token/s 的真实结果、无 CUDA P2P 的机器环境，以及跨卡拷贝和 AllReduce 数据，把“PCIe 会不会拖垮 TP”这笔账拆开来看。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上一篇讲了 TP：两张 GPU 同时参与同一层的计算。&lt;/p&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;一个很自然的问题是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;既然 TP2 能让两张 GPU 同时读取自己的权重分片，为什么单流 Decode 不能稳定获得 2 倍 token/s？&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;真正的答案不是一句“PCIe 太慢”就能解释的。&lt;/p&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;并行计算与显存带宽收益
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;跨卡通信
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;同步延迟
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Kernel / 调度额外开销
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#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;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;单流 Decode ≈ 33.5 token/s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更特别的是，这台机器甚至没有 CUDA P2P。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-从显存带宽看-tp2-的理论收益&#34;&gt;1. 从显存带宽看 TP2 的理论收益
&lt;/h2&gt;&lt;p&gt;一次 LLM 请求大致可以分成：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Prefill
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;处理 Prompt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Decode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;逐 token 生成
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prefill 一次处理大量 Token，矩阵规模较大，Tensor Core 通常更容易吃起来。&lt;/p&gt;
&lt;p&gt;单请求 Decode 则不同。&lt;/p&gt;
&lt;p&gt;每一步只生成一个 Token，但这个 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;Token N
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Layer 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#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 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;Layer 63
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Token N+1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以单流 Decode 经常表现出明显的 Memory Bound 特征。&lt;/p&gt;
&lt;p&gt;可以用一个非常粗糙、但很适合建立直觉的公式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Decode token/s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#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;每 token 需要处理的权重数据量
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设量化后的 27B 模型文件大约 23GB。&lt;/p&gt;
&lt;p&gt;单张 5060 Ti：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;448 GB/s ÷ 23GB ≈ 19 token/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个数字当然不是严谨 Benchmark。&lt;/p&gt;
&lt;p&gt;模型文件大小并不严格等于每颗 token 的实际 DRAM Traffic，实际性能还会受到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kernel&lt;/li&gt;
&lt;li&gt;量化格式&lt;/li&gt;
&lt;li&gt;Tensor Core&lt;/li&gt;
&lt;li&gt;Cache / State&lt;/li&gt;
&lt;li&gt;模型结构&lt;/li&gt;
&lt;li&gt;Batch&lt;/li&gt;
&lt;li&gt;Attention Backend&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;等因素影响。&lt;/p&gt;
&lt;p&gt;但这个估算能先建立一个重要直觉：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;单流 Decode 里，显卡的峰值 TFLOPS 并不是唯一重要指标；能多快地把权重和状态送进计算单元同样关键。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&#34;tp2-为什么理论上更容易聚合双卡带宽&#34;&gt;TP2 为什么理论上更容易聚合双卡带宽？
&lt;/h3&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;处理前半模型
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对于同一颗 token，两部分存在明显的前后依赖。&lt;/p&gt;
&lt;p&gt;所以虽然每张卡都有 448GB/s，但不能简单理解为始终同时提供 896GB/s。&lt;/p&gt;
&lt;p&gt;TP2 则不同。&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 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;    权重 Part A     权重 Part B
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ↓               ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       计算             计算
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        └──────┬────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;               ↓
&lt;/span&gt;&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;因此从显存带宽角度，TP2 的确更接近：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;448 + 448 ≈ 896 GB/s&lt;/code&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;hr&gt;
&lt;h3 id=&#34;实测-335-tokens和粗略带宽模型处在同一量级&#34;&gt;实测 33.5 token/s：和粗略带宽模型处在同一量级
&lt;/h3&gt;&lt;p&gt;这次双卡 TP2 的单流 Decode 实测大约是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;33.5 token/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;模型权重大约 23.19GB。&lt;/p&gt;
&lt;p&gt;如果只为了建立一个“理想带宽上限”的直觉，可以做：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;896 GB/s ÷ 23.19GB ≈ 38.6 token/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;而实际是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;≈ 33.5 token/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这两个数字处在同一个量级，至少说明一件事：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TP2 确实获得了很明显的双卡并行收益，并没有因为跨卡通信直接退化成接近单卡的状态。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但这里我不会再把 33.5 / 38.6 解释成某个精确的“显存带宽利用率”。&lt;/p&gt;
&lt;p&gt;原因很简单：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;23.19GB checkpoint size ≠ 每 token 精确 DRAM 读取量&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;NVFP4 的 scale、部分高精度 tensor、Cache、量化 Kernel、Activation 以及其他计算都不在这个极简模型里。&lt;/p&gt;
&lt;p&gt;所以这个公式只能告诉我们：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;实测结果与“TP2 聚合了相当一部分双卡权重读取能力”这个解释是一致的。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它不能用来精确计算真实显存带宽利用率，也不能把理论值和实测值之间的全部差距都归因于 PCIe。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-没有-p2ptp2-为什么仍然有效&#34;&gt;2. 没有 P2P，TP2 为什么仍然有效？
&lt;/h2&gt;&lt;p&gt;测试服务器上的 CUDA P2P 检查结果是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;can_device_access_peer = False&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 ←──────→ GPU1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      P2P
&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;&lt;code&gt;大块跨卡拷贝：≈ 6.7 GB/s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AllReduce 基准：≈ 7.8 GB/s&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这两个值来自不同测试，不能直接互相替代，但数量级都远低于单张 GPU 的：&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;ul&gt;
&lt;li&gt;&lt;code&gt;GPU 本地显存：几百 GB/s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPU 间通信：个位数 GB/s&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为什么 TP2 还能跑到 33.5 token/s？&lt;/p&gt;
&lt;p&gt;答案在于：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TP 并不会在两张 GPU 之间传整个模型。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&#34;权重一直在各自-gpu-上跨卡传的是中间结果&#34;&gt;权重一直在各自 GPU 上，跨卡传的是中间结果
&lt;/h3&gt;&lt;p&gt;TP2 下，两张 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;一直保存 W0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#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;一直保存 W1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每生成一颗 token 时，并不会发生“GPU0 把十几 GB 权重传给 GPU1”这种情况。&lt;/p&gt;
&lt;p&gt;真正需要跨 GPU 同步的，主要是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Activation&lt;/li&gt;
&lt;li&gt;Hidden State&lt;/li&gt;
&lt;li&gt;部分中间结果&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些数据量比整个模型小得多。&lt;/p&gt;
&lt;p&gt;以这次模型的 hidden size：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hidden_size = 5120&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;假设中间状态用 BF16：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;5120 × 2 Byte ≈ 10 KiB&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一个 hidden vector 只有大约 10KiB。&lt;/p&gt;
&lt;p&gt;而模型权重是二十多 GB。&lt;/p&gt;
&lt;p&gt;这两个数据量完全不是一个数量级。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;粗略估算一下-tp2-每-token-的-collective-数据量&#34;&gt;粗略估算一下 TP2 每 token 的 Collective 数据量
&lt;/h3&gt;&lt;p&gt;对于典型 Transformer TP，可以做一个数量级估算：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attention 后一次主要 Collective&lt;/li&gt;
&lt;li&gt;MLP 后一次主要 Collective&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;64 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;2 次 / Layer
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;128 次 Collective / token
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;来建立直觉。&lt;/p&gt;
&lt;p&gt;TP2 下，一个约 10KiB 的 BF16 hidden vector，在典型 AllReduce 中每个 rank 传输的数据量也是同一数量级。&lt;/p&gt;
&lt;p&gt;于是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;128 × 10 KiB ≈ 1.25 MiB / token&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;注意，这不是对当前 vLLM 所有 Kernel 和通信操作做出的精确 Trace，只是用来估算数量级。&lt;/p&gt;
&lt;p&gt;它想说明的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;每 token 处理的权重：几十 GB 级&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;每 token 跨卡同步的数据：MB 级&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是为什么：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;PCIe 带宽远低于 GPU 本地显存带宽，并不等于 TP 一定会被 PCIe 卡死。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&#34;只用数据量--78gbs也会低估通信成本&#34;&gt;只用“数据量 ÷ 7.8GB/s”也会低估通信成本
&lt;/h3&gt;&lt;p&gt;如果非常粗暴地拿：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1.25 MiB / token ÷ 7.8 GB/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;得到的纯传输时间只有大约零点几毫秒。&lt;/p&gt;
&lt;p&gt;而：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;33.5 token/s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;对应每颗 token 总时间约：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1000 ÷ 33.5 ≈ 29.9 ms&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;看起来通信似乎几乎可以忽略。&lt;/p&gt;
&lt;p&gt;但这里又会进入另一个误区。&lt;/p&gt;
&lt;p&gt;TP Decode 的通信不是一次连续传 1.25MiB，而更像：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;算一点
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;同步一个小消息
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;再算一点
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;再同步
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;重复很多次
&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;通信时间
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#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;Collective latency × Collective 次数
&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;总字节数 ÷ 大块带宽&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;tp-decode-更应该担心小消息延迟&#34;&gt;TP Decode 更应该担心“小消息延迟”
&lt;/h3&gt;&lt;p&gt;前面的 6.7GB/s、7.8GB/s，更多是在描述较大数据块下能够达到的吞吐。&lt;/p&gt;
&lt;p&gt;但单 token TP 的通信经常是大量小消息和同步点。&lt;/p&gt;
&lt;p&gt;假设一颗 token 要经历一百多次 Collective，那么即使每次数据很小：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;启动、同步和等待延迟也会累积。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NCCL 也会根据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拓扑&lt;/li&gt;
&lt;li&gt;消息大小&lt;/li&gt;
&lt;li&gt;GPU 数量&lt;/li&gt;
&lt;li&gt;Collective 类型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选择不同算法。&lt;/p&gt;
&lt;p&gt;所以“大块 memcpy 带宽是多少”，不能直接拿来预测 LLM TP Decode。&lt;/p&gt;
&lt;p&gt;这也是为什么最终最靠谱的方法还是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;通信微基准 + 真实模型 Benchmark 一起看。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-335-tokens-背后的真实损失&#34;&gt;3. 33.5 token/s 背后的真实损失
&lt;/h2&gt;&lt;p&gt;现在整个模型就比较清楚了。&lt;/p&gt;
&lt;p&gt;TP2 得到的收益是：&lt;/p&gt;
&lt;p&gt;收益来自两部分：&lt;strong&gt;两张 GPU 同时读取各自权重分片&lt;/strong&gt;，以及&lt;strong&gt;两张 GPU 同时执行同一层的部分计算&lt;/strong&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;Collective latency
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PCIe 数据传输
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#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;更小的 GEMM Shape
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Kernel 效率损失
&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;显存带宽不可能永远 100% 有效&lt;/li&gt;
&lt;li&gt;NVFP4 量化与 scale 处理&lt;/li&gt;
&lt;li&gt;Attention / State 计算&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;TP2 聚合了相当一部分双卡显存带宽和计算能力，但不会获得理想 2× Scaling。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;33.5 token/s 对这套消费级双卡、无 P2P 环境来说，已经说明 TP2 是有效的，而不是理论上好看、实际被 PCIe 拖垮。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;gpu-util-99-也不等于-tensor-core-跑满&#34;&gt;GPU Util 99% 也不等于 Tensor Core 跑满
&lt;/h3&gt;&lt;p&gt;Decode Benchmark 时，两张 GPU 的 Util 可以接近：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;99%&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个现象很容易被理解成：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“GPU 算力已经跑满，所以瓶颈一定是纯计算。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但 &lt;code&gt;nvidia-smi&lt;/code&gt; 的 GPU Util 并不是 Tensor Core 利用率。&lt;/p&gt;
&lt;p&gt;它更接近表示：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;采样周期内 GPU 是否持续存在正在执行的工作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPU Util = 99%&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;不能推出：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Tensor Core = 99%&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;也不能直接证明已经从 Memory Bound 变成 Compute Bound。&lt;/p&gt;
&lt;p&gt;GPU 完全可能一直在忙，但相当一部分时间仍然受显存读取、小 GEMM 或同步影响。&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;hr&gt;
&lt;h2 id=&#34;4-p2pnvlink-和-pcie-不要混成一个概念&#34;&gt;4. P2P、NVLink 和 PCIe 不要混成一个概念
&lt;/h2&gt;&lt;p&gt;这几个词经常被混在一起。&lt;/p&gt;
&lt;h3 id=&#34;nvlink&#34;&gt;NVLink
&lt;/h3&gt;&lt;p&gt;GPU 专用高速互联。&lt;/p&gt;
&lt;p&gt;RTX 5060 Ti 没有 NVLink。&lt;/p&gt;
&lt;h3 id=&#34;pcie&#34;&gt;PCIe
&lt;/h3&gt;&lt;p&gt;GPU 与主机、以及多 GPU 通信路径的重要底层总线体系。&lt;/p&gt;
&lt;p&gt;没有 NVLink，多 GPU 仍然可以通过 PCIe 体系完成通信。&lt;/p&gt;
&lt;h3 id=&#34;cuda-p2p&#34;&gt;CUDA P2P
&lt;/h3&gt;&lt;p&gt;指一个 GPU 是否能够直接访问另一张 GPU 的显存。&lt;/p&gt;
&lt;p&gt;它不仅和显卡型号有关，还受到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PCIe 拓扑&lt;/li&gt;
&lt;li&gt;Root Complex&lt;/li&gt;
&lt;li&gt;主板 / 平台&lt;/li&gt;
&lt;li&gt;虚拟化环境&lt;/li&gt;
&lt;li&gt;驱动与平台配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;影响。&lt;/p&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;没有 NVLink ≠ 一定没有 P2P&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;而：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;有 PCIe ≠ 一定支持 CUDA P2P&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;没有 NVLink
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;P2P 不可用
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;反而很适合说明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;判断 TP 是否值得，不能只看“有没有 P2P”一个开关。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-tp2-有收益不代表-tp-越大越好&#34;&gt;5. TP2 有收益，不代表 TP 越大越好
&lt;/h2&gt;&lt;p&gt;从 TP2 继续扩大到：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TP4 / TP8&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;会同时发生几件事。&lt;/p&gt;
&lt;h3 id=&#34;每张卡权重更少&#34;&gt;每张卡权重更少
&lt;/h3&gt;&lt;p&gt;这是好事。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TP2：每卡大约 1/2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TP4：每卡大约 1/4&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;单卡需要读取和计算的权重继续减少。&lt;/p&gt;
&lt;h3 id=&#34;但-gemm-也会被切得更小&#34;&gt;但 GEMM 也会被切得更小
&lt;/h3&gt;&lt;p&gt;单 token Decode 本来就是小 Batch / 小 GEMM 场景。&lt;/p&gt;
&lt;p&gt;继续切矩阵以后，每张卡拿到的 Shape 更小，GPU 不一定还能维持同样高的执行效率。&lt;/p&gt;
&lt;h3 id=&#34;collective-参与者更多&#34;&gt;Collective 参与者更多
&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;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;4 卡
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;8 卡
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同步拓扑和延迟都会变复杂。&lt;/p&gt;
&lt;p&gt;所以 Scaling 往往更接近：&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;TP1 → 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;TP2 → 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;TP4 → TP8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;越来越依赖硬件互联与 Kernel / Collective 实现
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这也是消费级 PCIe 多卡和 NVLink / NVSwitch 平台的差距，会随着 TP Degree 增大而越来越明显的原因之一。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;双-5060-ti-的实际结论&#34;&gt;双 5060 Ti 的实际结论
&lt;/h3&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;单流 Decode ≈ 33.5 token/s
&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;没有 NVLink
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CUDA P2P 不可用
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;大块跨卡拷贝 ≈ 6.7 GB/s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;AllReduce 基准 ≈ 7.8 GB/s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在这种并不理想的跨卡条件下，TP2 仍然获得了明显的单流 Scaling。&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;两张 GPU 同时读取自己的权重分片
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;成本：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;同步 MB 级中间状态
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;大量小消息 Collective latency
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以我现在对消费级双卡 TP 的判断是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;没有 NVLink，不应该直接否定 TP。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;甚至：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;P2P 不可用，也不能单独证明 TP 不值得跑。&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;测单卡 / TP2 token/s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;测实际跨卡通信
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;看 GPU 拓扑
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;估算 Collective 数量级
&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;hr&gt;
&lt;h2 id=&#34;6-结论&#34;&gt;6. 结论
&lt;/h2&gt;&lt;p&gt;双卡推理没有两倍快，不是因为一句：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PCIe 太慢&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;就能解释。&lt;/p&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;双卡显存带宽与计算并行
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#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;PCIe / Collective / 同步 / Kernel 开销
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在这次双 5060 Ti + 27B 的实测中，TP2 的结果说明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;消费级 PCIe 双卡依然可以通过 TP 获得很有价值的单流加速。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下一步问题就从“TP 到底有没有用”变成了：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;既然模型已经能放下、TP 也确实能加速，真正做长期推理服务时，llama.cpp 和 vLLM 到底应该选谁？&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/vllm-production-inference-nvfp4-cuda-graph/&#34; &gt;《为什么生产推理我默认 vLLM：从 NVFP4、Kernel 到 CUDA Graph》&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;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;/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>
        
    </channel>
</rss>
