<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>P2P on Jiangwan&#39;s Blog</title>
        <link>https://jiangwan.ink/tags/p2p/</link>
        <description>Recent content in P2P 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/p2p/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>
        
    </channel>
</rss>
