<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[7900XTX双卡TP，SGLang & VLLM 多Agent多并发测试对比（续一）- 山重水复]]></title><description><![CDATA[<h1>双 7900 XTX 实测：27B 长上下文、HiCache 与投机解码</h1>
<p dir="auto"><strong>硬件：</strong></p>
<p dir="auto">2× RX 7900 XTX + Ryzen 9600X + 64G DDR5 + GIGABYTE B850 AI TOP + ADATA SX8200PNP1TB  （PCIe Gen3 x4、NVMe 1.3）</p>
<p dir="auto"><strong>平台：</strong><br />
Ubuntu，SGLang TP2，Qwen3.8-27B GPTQ</p>
<h2>① 长上下文唤醒：分钟级重算 → 秒级恢复</h2>
<p dir="auto"><strong>SGLang TP2 / MTP3，HiCache size16。首 token 延迟：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>上下文档位</th>
<th style="text-align:right">冷预填</th>
<th style="text-align:right">显存 L1 命中</th>
<th style="text-align:right">内存 L2 恢复</th>
<th style="text-align:right">L2 比 L1 多等</th>
</tr>
</thead>
<tbody>
<tr>
<td>64K</td>
<td style="text-align:right">50.78s</td>
<td style="text-align:right">0.431s</td>
<td style="text-align:right"><strong>0.546s</strong></td>
<td style="text-align:right"><strong>115ms</strong></td>
</tr>
<tr>
<td>120K</td>
<td style="text-align:right">121.49s</td>
<td style="text-align:right">0.711s</td>
<td style="text-align:right"><strong>0.896s</strong></td>
<td style="text-align:right"><strong>185ms</strong></td>
</tr>
<tr>
<td>192K</td>
<td style="text-align:right">243.81s</td>
<td style="text-align:right">1.055s</td>
<td style="text-align:right"><strong>1.406s</strong></td>
<td style="text-align:right"><strong>351ms</strong></td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>驱逐对照，64K 回访：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>配置</th>
<th style="text-align:right">首 token</th>
<th>结果</th>
</tr>
</thead>
<tbody>
<tr>
<td>无 HiCache</td>
<td style="text-align:right"><strong>48.129s</strong></td>
<td>cached tokens = 0，重新计算</td>
</tr>
<tr>
<td>有 HiCache</td>
<td style="text-align:right"><strong>0.546s</strong></td>
<td>L2 恢复，避免完整重算</td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto">L2 的核心收益不是提高冷预填速度，而是让被挤出显存的历史不用重新计算。额外等待是端到端差额，不是纯 DMA 时间。</p>
</blockquote>
<h2>② 容量账：系统内存承担冷上下文</h2>
<p dir="auto"><strong>对应上表的 size16 实验，不借用其他配置的容量：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>项目</th>
<th style="text-align:right">实测值</th>
</tr>
</thead>
<tbody>
<tr>
<td>不开 HiCache：GPU KV 池</td>
<td style="text-align:right"><strong>263,459 tokens</strong></td>
</tr>
<tr>
<td>开启 HiCache：GPU KV 池</td>
<td style="text-align:right"><strong>219,005 tokens</strong></td>
</tr>
<tr>
<td>Host KV 池</td>
<td style="text-align:right"><strong>319,193 tokens</strong></td>
</tr>
<tr>
<td>Host KV 内存</td>
<td style="text-align:right"><strong>11.11 GB／rank</strong></td>
</tr>
<tr>
<td>Host Mamba 内存</td>
<td style="text-align:right"><strong>4.93 GB／rank</strong></td>
</tr>
<tr>
<td>TP2 Host 缓存预算</td>
<td style="text-align:right"><strong>约 32 GB</strong></td>
</tr>
<tr>
<td>整机内存：已用／可用</td>
<td style="text-align:right"><strong>40／19 GiB</strong></td>
</tr>
<tr>
<td>Swap</td>
<td style="text-align:right"><strong>62 MiB，测试期间未增长</strong></td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>读法：</strong></p>
<ul>
<li>TP2 两 rank 保存分片，<strong>不能把 token 容量乘二</strong>。</li>
<li>L1/L2 可能存在重复副本，<strong>不能直接相加当作独立历史容量</strong>。</li>
<li>HiCache 也有显存开销；它扩大的是<strong>可保留历史</strong>，不是同时解码的 active KV 池。</li>
<li>这轮早期集成有明显解码退化；后续改善见第四组。</li>
</ul>
<h2>③ 单路与并发：分开看</h2>
<h3>单路历史基准</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>方案</th>
<th>测试口径</th>
<th style="text-align:right">解码速度</th>
</tr>
</thead>
<tbody>
<tr>
<td>单卡 llama.cpp Vulkan + MTP</td>
<td>Qwen3.6-27B Q4_K_M，短请求</td>
<td style="text-align:right"><strong>约 44 tok/s</strong></td>
</tr>
<tr>
<td>双卡 vLLM</td>
<td>Qwen3.8-27B GPTQ，64K</td>
<td style="text-align:right"><strong>77.185 tok/s</strong></td>
</tr>
<tr>
<td>双卡 SGLang</td>
<td>同轮、同模型，64K</td>
<td style="text-align:right"><strong>88.815 tok/s</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">单卡仅作演进背景，<strong>不同模型、量化与长度，不计算跨组加速比。</strong></p>
<h3>多路 64K 冷预填</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>并发</th>
<th>引擎</th>
<th>各请求首 token：秒</th>
<th style="text-align:right">聚合预填：tok/s¹</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 路</td>
<td>SGLang</td>
<td><strong>48.15／48.15</strong></td>
<td style="text-align:right"><strong>2720</strong></td>
</tr>
<tr>
<td>2 路</td>
<td>vLLM</td>
<td>48.39／97.38</td>
<td style="text-align:right">1346</td>
</tr>
<tr>
<td>3 路</td>
<td>SGLang</td>
<td><strong>48.26／48.26／48.26</strong></td>
<td style="text-align:right"><strong>4070</strong></td>
</tr>
<tr>
<td>3 路</td>
<td>vLLM</td>
<td>48.46／97.49／100.20</td>
<td style="text-align:right">1962</td>
</tr>
<tr>
<td>4 路</td>
<td>SGLang</td>
<td><strong>48.23／48.23／48.23／48.45</strong></td>
<td style="text-align:right"><strong>5408</strong></td>
</tr>
<tr>
<td>4 路</td>
<td>vLLM</td>
<td>48.40／97.44／100.15／102.87</td>
<td style="text-align:right">2547</td>
</tr>
</tbody>
</table>
<p dir="auto">¹ 归档中的估算值，按每请求约 65,556 tokens 与墙钟推导。此测试输出极少，<strong>证明的是预填表现，不是持续并行解码</strong>；也不能说 vLLM 完全逐请求串行。</p>
<p dir="auto">另有 SGLang <strong>HiCache20 + Mamba48</strong> 的持续解码记录：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>请求组合²</th>
<th>各路首 token</th>
<th style="text-align:right">解码重叠时间</th>
<th style="text-align:right">聚合吞吐</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 × 104,000 tokens</td>
<td>0.44／0.80s</td>
<td style="text-align:right"><strong>16.76s</strong></td>
<td style="text-align:right"><strong>105.9 tok/s</strong></td>
</tr>
<tr>
<td>3 × 64,000 tokens</td>
<td>0.60／0.60／0.31s</td>
<td style="text-align:right"><strong>16.29s</strong></td>
<td style="text-align:right"><strong>143.0 tok/s</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">² 历史目标长度，每路输出 1024 tokens。这组不是与 vLLM 的同轮对照，且不能替代四个独立 Agent 的长期验收。</p>
<h2>④ MTP3 与 DFlash2：两条路线都跑通</h2>
<p dir="auto"><strong><code>f84475c</code> 同树，64K 冷输入、输出 512 tokens，各两次中位数：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>路线</th>
<th style="text-align:right">HiCache OFF</th>
<th style="text-align:right">HiCache ON</th>
<th style="text-align:right">速度保留率</th>
</tr>
</thead>
<tbody>
<tr>
<td>MTP3 / EAGLE</td>
<td style="text-align:right">67.79 tok/s</td>
<td style="text-align:right"><strong>62.93 tok/s</strong></td>
<td style="text-align:right"><strong>92.8%</strong></td>
</tr>
<tr>
<td>DFlash2 / DFLASH</td>
<td style="text-align:right">69.68 tok/s</td>
<td style="text-align:right"><strong>61.63 tok/s</strong></td>
<td style="text-align:right"><strong>88.4%</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">DFlash2 另一次独立三态测试：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th style="text-align:right">冷预填</th>
<th style="text-align:right">L1 命中</th>
<th style="text-align:right">L2 恢复</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right"><strong>47.934s</strong></td>
<td style="text-align:right"><strong>0.337s</strong></td>
<td style="text-align:right">0.467 秒</td>
</tr>
</tbody>
</table>
<p dir="auto">结论：HiCache 不必以解码腰斩为代价。在这组集成下，MTP3 和 DFlash2 均保留大部分吞吐；不同版本的成绩不能互相套用。</p>
<h2>当前进度</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>技术模块</th>
<th>状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>双 7900 XTX + SGLang TP2</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 已跑通</td>
</tr>
<tr>
<td>MTP3 / DFlash2 投机解码</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 均已测试</td>
</tr>
<tr>
<td>HiCache L1 命中 / L2 恢复</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 已验证</td>
</tr>
<tr>
<td>L3 的 FULL KV + Mamba 完整恢复</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f52c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--microscope" style="height:23px;width:auto;vertical-align:middle" title="🔬" alt="🔬" /> 研究中</td>
</tr>
<tr>
<td>多 Agent 长期循环联合验收</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/23f3.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--hourglass_flowing_sand" style="height:23px;width:auto;vertical-align:middle" title="⏳" alt="⏳" /> 待完成</td>
</tr>
</tbody>
</table>
<hr />
<h2>阶段总结</h2>
<p dir="auto">已经取得的成果：</p>
<ul>
<li>双 RX 7900 XTX 上，Qwen3.8-27B 推理跑通。</li>
<li>ROCm 7.14 + SGLang 环境下，MTP3/EAGLE、DFlash2/DFLASH 两种投机解码均已跑通。</li>
<li>HiCache L1 命中、L2 内存恢复均有实测，长上下文可在秒级恢复，避免完整重新预填。</li>
<li>在已测上下文范围内，已验证多请求真实并发解码，而非仅排队完成。</li>
</ul>
<p dir="auto">以上为不同已测配置的阶段成果，不代表全部功能已在最新 upstream 实验树上联合验收。</p>
<p dir="auto">后续目标：</p>
<ul>
<li>L3 的 FULL KV + Mamba 完整恢复。</li>
<li>四个独立 Agent 的长期循环验收。</li>
</ul>
<p dir="auto">发布前说明：持续解码与 DFlash2 部分数字，本轮取自历史研究记录，正式发布前仍需回核原始工件。</p>
<hr />
<h2>附录：小白折腾记</h2>
<hr />
<p dir="auto">话说上一篇折腾到最后，我从犄角旮旯里翻出了一个 SGLang 很不起眼的参数：</p>
<pre><code class="language-bash">--max-consecutive-prefill-batches 1
</code></pre>
<p dir="auto"><strong>N=1</strong> 的效果立竿见影，非常简单粗暴，老特露出了欣慰的笑容。</p>
<p dir="auto">我于是开始飘了，当时产生了一种危险的错觉：</p>
<blockquote>
<p dir="auto"><strong>在 <a class="plugin-mentions-user plugin-mentions-a" href="/user/flyer666" aria-label="Profile: flyer666">@<bdi>flyer666</bdi></a> 大佬魔改的 SGLang 基础上，7900XTX 双卡，Hermes 环境多并发卡顿问题，被我发掘出了解决方案。</strong></p>
</blockquote>
<p dir="auto">生活又双叒叕地证明，每当我产生这种想法的时候，现实一般就会过来狠狠地打脸。</p>
<hr />
<h2>一、N=1 没了，天塌了</h2>
<p dir="auto">前两天升级到了新版 SGLang #f84475c（不可不换的原因下面解释），我准备照抄 production 参数，结果发现：</p>
<pre><code class="language-bash">--max-consecutive-prefill-batches 1
</code></pre>
<p dir="auto"><strong>这个参数没了。</strong>  愣了半天，那种感觉就是：</p>
<blockquote>
<p dir="auto">天塌了！千辛万苦练一个满级小号，被官方封号了<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f635.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--dizzy_face" style="height:23px;width:auto;vertical-align:middle" title=":dizzy_face:" alt="😵" /> 。</p>
</blockquote>
<p dir="auto">幸亏后来又扒拉出一个好东西，精神恢复了正常：</p>
<pre><code class="language-bash">--enable-mixed-chunk
</code></pre>
<p dir="auto">它的思路其实和 N=1 有点像，但做法更漂亮。</p>
<p dir="auto">以前的参数机理，更像是 <strong>prefill 干一批 → 停一下 → decode 插进来。</strong> Mixed Chunk这个参数则是： <strong>直接把新请求的 prefill 和正在运行的 decode 混在同一个 batch 里。</strong></p>
<p dir="auto">于是我又测了一遍原来的卡顿场景，对比如下。</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>调度方式</th>
<th style="text-align:right">A decode 最大断流</th>
<th style="text-align:right">B TTFT</th>
</tr>
</thead>
<tbody>
<tr>
<td>原始调度</td>
<td style="text-align:right">47–48s</td>
<td style="text-align:right">~49s</td>
</tr>
<tr>
<td>旧参数 N=1</td>
<td style="text-align:right"><strong>4.04s</strong></td>
<td style="text-align:right">49.48s</td>
</tr>
<tr>
<td>新参数 Mixed Chunk On</td>
<td style="text-align:right"><strong>3.997s</strong></td>
<td style="text-align:right">48.91s</td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto"><strong>新版实际上把 N=1 的思想吃进去了，而且实现得更自然。</strong> 性能还稍微好了一点。</p>
</blockquote>
<p dir="auto">马上又重跑了单并发，双并发各种测试，效果那是相当满意。见下表。</p>
<ul>
<li>**单并发 - SGLang Decode只是略强<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f44c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--ok_hand" style="height:23px;width:auto;vertical-align:middle" title=":ok_hand:" alt="👌" /> **</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>引擎</th>
<th>配置</th>
<th style="text-align:right">测试上下文</th>
<th style="text-align:right">TTFT</th>
<th style="text-align:right">Prefill tok/s</th>
<th style="text-align:right">Decode tok/s</th>
</tr>
</thead>
<tbody>
<tr>
<td>llama.cpp Vulkan</td>
<td>单 RX 7900 XTX</td>
<td style="text-align:right">~10–15K</td>
<td style="text-align:right">—</td>
<td style="text-align:right"><strong>~614–638</strong></td>
<td style="text-align:right"><strong>~44–54</strong></td>
</tr>
<tr>
<td>vLLM</td>
<td>双 RX 7900 XTX / TP2</td>
<td style="text-align:right">64K</td>
<td style="text-align:right"><strong>48.50s</strong></td>
<td style="text-align:right"><strong>1,352</strong></td>
<td style="text-align:right"><strong>77.2</strong></td>
</tr>
<tr>
<td><strong>SGLang 新树</strong></td>
<td>双 RX 7900 XTX / TP2 / MTP3</td>
<td style="text-align:right">64K</td>
<td style="text-align:right"><strong>48.26s</strong></td>
<td style="text-align:right"><strong>1,358</strong></td>
<td style="text-align:right"><strong>88.8</strong></td>
</tr>
</tbody>
</table>
<ul>
<li>*<em>真实 Agent / 多并发场景对比 - SGLang猛得一批</em><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4aa.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--muscle" style="height:23px;width:auto;vertical-align:middle" title=":muscle:" alt="💪" /> *</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>场景</th>
<th style="text-align:right"><strong>SGLang</strong></th>
<th style="text-align:right">vLLM</th>
<th>差距 / 现象</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2×64K 并发整批完成</strong></td>
<td style="text-align:right"><strong>48.20s</strong></td>
<td style="text-align:right">97.43s</td>
<td><strong>约 2.02× 更快</strong></td>
</tr>
<tr>
<td><strong>3×64K 并发整批完成</strong></td>
<td style="text-align:right"><strong>48.32s</strong></td>
<td style="text-align:right">100.26s</td>
<td><strong>约 2.07× 更快</strong></td>
</tr>
<tr>
<td><strong>4×64K 并发整批完成</strong></td>
<td style="text-align:right"><strong>48.49s</strong></td>
<td style="text-align:right">102.94s</td>
<td><strong>约 2.12× 更快</strong></td>
</tr>
<tr>
<td><strong>长期 Agent 后续轮 TTFT</strong></td>
<td style="text-align:right"><strong>0.402s</strong></td>
<td style="text-align:right">2.254s</td>
<td><strong>5.61× 更快</strong></td>
</tr>
<tr>
<td><strong>图片后返回原长文本 TTFT</strong></td>
<td style="text-align:right"><strong>0.233s</strong></td>
<td style="text-align:right">20.268s</td>
<td><strong>约 87× 更快</strong></td>
</tr>
</tbody>
</table>
<hr />
<h2>二、人飘了</h2>
<p dir="auto">上一篇我也介绍过，我日常主力其实就是两个真正干活的 Agent，再加一个低频使用的管理 Agent。</p>
<p dir="auto">两个主力 Agent 都是 196K context，压缩阈值设在 65%，而且实际工作基本都是脉冲式推理：干一阵，停一阵，当时很少两边同时把上下文顶满。</p>
<p dir="auto">这里后来复盘的时候，我才发现当时我就埋雷了：</p>
<pre><code class="language-bash">196,608 × 65% = 127,795 tokens / Agent
127,795 × 2 = 255,590 tokens
</code></pre>
<p dir="auto">而我当时配置完SGLang后的 GPU KV pool （可用上下文KV池） 是多少呢：</p>
<pre><code class="language-bash">231,914 tokens

小学生也知道 231K &lt; 255K
</code></pre>
<p dir="auto">也就是说：如果两个 Agent 真同时顶到 65%左右，理论 working set 已经比 GPU KV pool 多了几十K tokens。</p>
<p dir="auto">这意味着有一部分上下文将无处安放，被迫扫地出门（从KV池内被丢弃）。<strong>以前陪我看月亮的时候，叫人家小甜甜！现在新人胜旧人，叫人家牛夫人</strong>。再续前缘，就需要重新 prefill / recompute 那部分上下文<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f915.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--face_with_head_bandage" style="height:23px;width:auto;vertical-align:middle" title=":face_with_head_bandage:" alt="🤕" /> 。这就是典型的卡顿便秘。</p>
<p dir="auto">这个问题当时没暴露，其实仅仅是因为我的测试方法不科学和测试时间不够长。</p>
<p dir="auto">然而还没等问题暴露，我的贪心已经开始膨胀：<strong>既然双并发如此丝滑，那四并发也提上日程吧？</strong></p>
<p dir="auto"><strong>命运赠送的礼物，早已在暗中悄悄标好了价格。</strong></p>
<hr />
<h1>三、打脸</h1>
<p dir="auto">上一篇我解释过，我使用 Hermes，日常有三个 Agent。</p>
<p dir="auto">其实我还有一个 OpenClaw 时代留下来的老 Hermes Agent，当年 Hermes 还没有 Windows 版，所以一直养在 WSL 里。</p>
<p dir="auto">启封、升级、维护。然后，我开始了 四 Agent 实战场景测试。</p>
<p dir="auto">当然了，首先要解决的问题就是 KV。</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Active workload</th>
<th>结果</th>
</tr>
</thead>
<tbody>
<tr>
<td>114K × 2</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
</tr>
<tr>
<td>120K × 2</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" /> 开始串行/无法同时容纳</td>
</tr>
<tr>
<td>74K × 3</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
</tr>
<tr>
<td>80K × 3</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" /></td>
</tr>
</tbody>
</table>
<p dir="auto">更不用说我的 4 Agent x 196K了。</p>
<p dir="auto">如果四个都顶到我设置的 65% 压缩阈值：196K × 65% × 4 ≈ 511K tokens，远远超出。</p>
<p dir="auto">这时候就要放大招 - HiCache。</p>
<p dir="auto"><strong>Call back， 这就是前面我说新版 SGLang #f84475c我不可不换的原因</strong></p>
<p dir="auto">又是一番指挥 AI 挖参数、改配置、测试、推翻、重测，最后 production 定在：--hicache-size 20，落到我的 TP2 配置上，大致是：</p>
<pre><code class="language-bash">Host KV Cache     ≈ 14.75 GiB / rank
Host Mamba Cache  ≈  5.26 GB  / rank

两张卡两个 rank 合计：≈ 40GB Host RAM &lt; 我64G内存总量
</code></pre>
<p dir="auto">理论上来讲，此时我的L1 + L2 能兜底的逻辑 KV 总量大约是 655K tokens：</p>
<pre><code class="language-bash">L1 GPU KV pool      = 231,914 tokens
L2 HiCache Host KV  = 423,593 tokens
--------------------------------
L1 + L2             = 655,507 tokens
</code></pre>
<p dir="auto">所以从纯 KV retention 容量看：</p>
<pre><code class="language-bash">4 Agent @ 65%       ≈ 511K
L1 + L2 capacity    ≈ 656K
剩余余量            ≈ 144K
</code></pre>
<p dir="auto">L1 只有 232K，但是加上 20GB/rank 的 HiCache L2以后，整个 KV 保留池理论上来到了约 656K。四个 196K Agent 即使都跑到 65% 压缩线，总 working history 也不过约 511K——看起来绰绰有余，完美！<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f919.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--call_me_hand" style="height:23px;width:auto;vertical-align:middle" title=":call_me_hand:" alt="🤙" /> 。</p>
<p dir="auto">这剧情走向，熟悉不？<strong>对，不出意外的话，要出意外了</strong>。</p>
<p dir="auto">单 Agent给力，双 Agent丝滑，四并发数字绝美，实际呢 - 以为憋了个大招,结果拉了坨大的</p>
<p dir="auto">四并发的剧情走向，可以说跟当年的二并发一摸一样：开测后的一小时内，我和四个 Agent 谈笑风生，相处甚欢，相见很晚。可是<strong>友谊的小船说翻就翻</strong>。吃了顿饭，回来一看：三个 Agent 在原地画圈，剩下一个哑口无言。</p>
<p dir="auto">算上刚才埋得雷，我这货，迄今为止可以说已经被SGLang三擒孟获了。</p>
<p dir="auto">调日志，三个Agent一共卡死了49 分钟，略过细节，可以概括成一句：</p>
<p dir="auto">四个 Agent 都进了餐厅，本来一桌子菜足够四个人分，但是有一个人把桌子霸占了，剩下三个拿着号码牌，在旁边整整站了 49 分钟。</p>
<p dir="auto">说句公道话，这不是“7900XTX四并发跑得慢”，7900XTX其实真的很有潜力，SGLang也确实奥利给，问题的关键是：显存的KV，不是你这么算滴！</p>
<p dir="auto">好吧，其实问题的关键的关键的关键是：我穷，买不起PRO6000。</p>
<hr />
<h1>四、好马要配好鞍</h1>
<p dir="auto">刚才Agent们是怎么给我上课的？</p>
<p dir="auto">我苦水咽肚子里，长话短说。</p>
<p dir="auto">老实憨厚的某Agent，平时负责系统的监控和总管，人不忙话也不多。这一次它的 session 直接一路膨胀，最后从大约 123K 一口气冲到 196K 上限，单次输出甚至干到了 7万多 token。（<strong>超大Skill从未清理</strong>）</p>
<p dir="auto">负责干活的某Agent，表面看起来特别勤快，积极主动“压缩”上下文从不叫苦叫累。日志里一看，几个小时之内触发了 100 多次压缩，感动中国。但是，压缩可以这么快的吗？翻看日志，嗯，压缩前140K+，压缩后140+K，还有一次压缩完了甚至比压缩前上下文还大。这摸鱼的表面功夫，真是比我还炉火纯青。（<strong>压缩机制设置不合理</strong>）</p>
<p dir="auto">最后不点名的某Agent，在几个人里面还算相对正常。它的人生爱好是喜欢输出，嗯，再配上Qwen3.8 27B的雷霆思考，每一次输出都真是随心所欲，滔滔不绝，不死不休。不服山，不服水，就服大哥这张嘴！（<strong>max_tokens没设上限</strong>）</p>
<p dir="auto">我忽然又悟了。</p>
<p dir="auto">青葱的年代陪老外逛酒吧，什么<strong>Screwdrive，On the Rocks</strong>，听的我一个楞一个楞。上了酒一看，就这，Rock原来就是一个大冰疙瘩。</p>
<p dir="auto">最近<strong>Harness</strong>火的一塌糊涂，我却一直一头雾水。比如这几张图，够好了吧，懂得都懂；不懂的人，像我，看了还是似懂非懂。</p>
<p dir="auto"><img src="https://upload.lcz.me/uploads/25262187-62d6-4109-a1ca-071a301e8a18.jpg" alt="v2-a8751f3362425dac31759367e0b350b8_r.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="https://upload.lcz.me/uploads/774c6e91-b606-40f8-a4db-fbe2a32022d2.jpg" alt="v2-a85fef152fb5a0f2de13f59e51246f56_r.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">前两天的折磨，我忽然整明白了，原来<strong>Harness</strong>(挽具)就是调教啊，要不然再好的爱马仕，再牛的XTX，也架不住一帮败家子这么霍霍。这几节课，没白上！</p>
<h1>五、莫言下岭便无难，赚得行人空喜欢。正入万山圈子里，一山放过一山拦。</h1>
<p dir="auto">说罢L1，L2，我们再说说穷人们的救星L3</p>
<p dir="auto">就不说N卡了，说说内存条，猜猜今天Newegg新蛋上的2X64G DDR5内存套装最低报价是多少</p>
<p dir="auto">Crucial Pro 128GB (2 x 64GB) DDR5 5600 (PC5 44800) Desktop Memory Model CP2K64G56C46U5</p>
<p dir="auto"><strong>$1949</strong>。</p>
<p dir="auto">这是最最便宜的，而且还没含税。</p>
<p dir="auto">L3就是SGLang赐予我们的最好的礼物。</p>
<p dir="auto">我一头扎进了梦想编织的泡影。</p>
<p dir="auto">这么说吧，前面讲的所有曲折，抵不过L3给我的一半伤害，如果说前面所有的问题加起来我已是被三擒孟获，到这篇稿子为止，我掉进去的大坑已经早让我被七擒孟获的成就功德圆满。</p>
<p dir="auto">L3，如果天黑之前來得及，我要忘了你的眼睛。</p>
<p dir="auto">这几天的折磨，核心问题可以理解成“寻址问题”，更准确地说是 L3 的哈希链续接地址错了。</p>
<pre><code class="language-bash">L2 里还留着一段上下文
        ↓
剩下那段 KV 在 L3
        ↓
要去 L3 找回来
        ↓
必须拿“正确的前一页 hash”作为起点
        ↓
之前 SGLang 取错了这个起点
        ↓
后面算出来的所有 L3 key 全错
        ↓
文件明明在 SSD 上，却一个都找不到

</code></pre>
<p dir="auto">除此之外，还有anchor 丢失和 Mamba/prefetch 可靠性问题，等等，等等，还有在前面不知道哪个犄角旮旯等着阴我的。。。</p>
<p dir="auto">地雷战大家都看过吧，此时此刻我的心情，和免费做上土飞机的鬼子们没太大差别。</p>
<hr />
<hr />
<h1>不知不觉写这么长了，该收了</h1>
<p dir="auto">这个时代节奏太快，没几个人有耐心看长文，尤其还是这种技术论坛。</p>
<p dir="auto">最后，说说我和 HiCache 之间不吐不快的恩怨情仇吧</p>
<hr />
<p dir="auto">我睡觉前一般喜欢把袜子存放老婆枕头（L1)上，第二天提取起来十分方便。</p>
<p dir="auto">如果找不到，那一定就是老婆给甩到地板上(L2）了。</p>
<p dir="auto">我试过，走两步的事儿，再弯个腰，没有我相像得那么艰难。</p>
<p dir="auto">但是昨天早上袜子找不到了，</p>
<p dir="auto">我找了很久，</p>
<p dir="auto">问老婆，她说，在卫生间（L3）第二个洗衣筐，里面第二件</p>
<p dir="auto">我找了很久，却发现袜子莫名其妙出现在了第三个筐的第八个位置</p>
<p dir="auto">我悟了，</p>
<p dir="auto">老婆已经很久没有夸我2了，我也亲切地回应她8。</p>
<p dir="auto">老婆让我滚，</p>
<p dir="auto">我泪流满面。</p>
<hr />
<p dir="auto">今天早晨袜子又找不到了，</p>
<p dir="auto">问老婆，她说在第五个筐里数到第二十件，</p>
<p dir="auto">我又找了很久，真的找不到。</p>
<p dir="auto">老婆又让我滚，</p>
<p dir="auto">我再次泪流满面。</p>
<hr />
<p dir="auto">我想好了，</p>
<p dir="auto">如果我能破译老婆的密码，</p>
<p dir="auto">下一篇帖子的名字就叫 <strong>“7900XTX双卡TP，SGLang &amp; VLLM 多Agent多并发测试对比（续二）- 柳暗花明”</strong></p>
<p dir="auto">如果公公了，</p>
<p dir="auto">那就是下面没有下面了。<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f616.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--confounded" style="height:23px;width:auto;vertical-align:middle" title=":confounded:" alt="😖" /></p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/terry" aria-label="Profile: terry">@<bdi>terry</bdi></a> 对的特哥，我深井冰又犯了，忘了写正事儿了</p>
<h1>双 7900 XTX 实测：27B 长上下文、HiCache 与投机解码</h1>
<p dir="auto">**硬件：**2× RX 7900 XTX + Ryzen 9600X + 64G DDR5 + GIGABYTE B850 AI TOP + ADATA SX8200PNP1TB  （PCIe Gen3 x4、NVMe 1.3）<br />
**平台：**Ubuntu，SGLang TP2，Qwen3.8-27B GPTQ</p>
<h2>① 长上下文唤醒：分钟级重算 → 秒级恢复</h2>
<p dir="auto"><strong>SGLang TP2 / MTP3，HiCache size16。首 token 延迟：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>上下文档位</th>
<th style="text-align:right">冷预填</th>
<th style="text-align:right">显存 L1 命中</th>
<th style="text-align:right">内存 L2 恢复</th>
<th style="text-align:right">L2 比 L1 多等</th>
</tr>
</thead>
<tbody>
<tr>
<td>64K</td>
<td style="text-align:right">50.78s</td>
<td style="text-align:right">0.431s</td>
<td style="text-align:right"><strong>0.546s</strong></td>
<td style="text-align:right"><strong>115ms</strong></td>
</tr>
<tr>
<td>120K</td>
<td style="text-align:right">121.49s</td>
<td style="text-align:right">0.711s</td>
<td style="text-align:right"><strong>0.896s</strong></td>
<td style="text-align:right"><strong>185ms</strong></td>
</tr>
<tr>
<td>192K</td>
<td style="text-align:right">243.81s</td>
<td style="text-align:right">1.055s</td>
<td style="text-align:right"><strong>1.406s</strong></td>
<td style="text-align:right"><strong>351ms</strong></td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>驱逐对照，64K 回访：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>配置</th>
<th style="text-align:right">首 token</th>
<th>结果</th>
</tr>
</thead>
<tbody>
<tr>
<td>无 HiCache</td>
<td style="text-align:right"><strong>48.129s</strong></td>
<td>cached tokens = 0，重新计算</td>
</tr>
<tr>
<td>有 HiCache</td>
<td style="text-align:right"><strong>0.546s</strong></td>
<td>L2 恢复，避免完整重算</td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto">L2 的核心收益不是提高冷预填速度，而是让被挤出显存的历史不用重新计算。额外等待是端到端差额，不是纯 DMA 时间。</p>
</blockquote>
<h2>② 容量账：系统内存承担冷上下文</h2>
<p dir="auto"><strong>对应上表的 size16 实验，不借用其他配置的容量：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>项目</th>
<th style="text-align:right">实测值</th>
</tr>
</thead>
<tbody>
<tr>
<td>不开 HiCache：GPU KV 池</td>
<td style="text-align:right"><strong>263,459 tokens</strong></td>
</tr>
<tr>
<td>开启 HiCache：GPU KV 池</td>
<td style="text-align:right"><strong>219,005 tokens</strong></td>
</tr>
<tr>
<td>Host KV 池</td>
<td style="text-align:right"><strong>319,193 tokens</strong></td>
</tr>
<tr>
<td>Host KV 内存</td>
<td style="text-align:right"><strong>11.11 GB／rank</strong></td>
</tr>
<tr>
<td>Host Mamba 内存</td>
<td style="text-align:right"><strong>4.93 GB／rank</strong></td>
</tr>
<tr>
<td>TP2 Host 缓存预算</td>
<td style="text-align:right"><strong>约 32 GB</strong></td>
</tr>
<tr>
<td>整机内存：已用／可用</td>
<td style="text-align:right"><strong>40／19 GiB</strong></td>
</tr>
<tr>
<td>Swap</td>
<td style="text-align:right"><strong>62 MiB，测试期间未增长</strong></td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>读法：</strong></p>
<ul>
<li>TP2 两 rank 保存分片，<strong>不能把 token 容量乘二</strong>。</li>
<li>L1/L2 可能存在重复副本，<strong>不能直接相加当作独立历史容量</strong>。</li>
<li>HiCache 也有显存开销；它扩大的是<strong>可保留历史</strong>，不是同时解码的 active KV 池。</li>
<li>这轮早期集成有明显解码退化；后续改善见第四组。</li>
</ul>
<h2>③ 单路与并发：分开看</h2>
<h3>单路历史基准</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>方案</th>
<th>测试口径</th>
<th style="text-align:right">解码速度</th>
</tr>
</thead>
<tbody>
<tr>
<td>单卡 llama.cpp Vulkan + MTP</td>
<td>Qwen3.6-27B Q4_K_M，短请求</td>
<td style="text-align:right"><strong>约 44 tok/s</strong></td>
</tr>
<tr>
<td>双卡 vLLM</td>
<td>Qwen3.8-27B GPTQ，64K</td>
<td style="text-align:right"><strong>77.185 tok/s</strong></td>
</tr>
<tr>
<td>双卡 SGLang</td>
<td>同轮、同模型，64K</td>
<td style="text-align:right"><strong>88.815 tok/s</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">单卡仅作演进背景，<strong>不同模型、量化与长度，不计算跨组加速比。</strong></p>
<h3>多路 64K 冷预填</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>并发</th>
<th>引擎</th>
<th>各请求首 token：秒</th>
<th style="text-align:right">聚合预填：tok/s¹</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 路</td>
<td>SGLang</td>
<td><strong>48.15／48.15</strong></td>
<td style="text-align:right"><strong>2720</strong></td>
</tr>
<tr>
<td>2 路</td>
<td>vLLM</td>
<td>48.39／97.38</td>
<td style="text-align:right">1346</td>
</tr>
<tr>
<td>3 路</td>
<td>SGLang</td>
<td><strong>48.26／48.26／48.26</strong></td>
<td style="text-align:right"><strong>4070</strong></td>
</tr>
<tr>
<td>3 路</td>
<td>vLLM</td>
<td>48.46／97.49／100.20</td>
<td style="text-align:right">1962</td>
</tr>
<tr>
<td>4 路</td>
<td>SGLang</td>
<td><strong>48.23／48.23／48.23／48.45</strong></td>
<td style="text-align:right"><strong>5408</strong></td>
</tr>
<tr>
<td>4 路</td>
<td>vLLM</td>
<td>48.40／97.44／100.15／102.87</td>
<td style="text-align:right">2547</td>
</tr>
</tbody>
</table>
<p dir="auto">¹ 归档中的估算值，按每请求约 65,556 tokens 与墙钟推导。此测试输出极少，<strong>证明的是预填表现，不是持续并行解码</strong>；也不能说 vLLM 完全逐请求串行。</p>
<p dir="auto">另有 SGLang <strong>HiCache20 + Mamba48</strong> 的持续解码记录：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>请求组合²</th>
<th>各路首 token</th>
<th style="text-align:right">解码重叠时间</th>
<th style="text-align:right">聚合吞吐</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 × 104,000 tokens</td>
<td>0.44／0.80s</td>
<td style="text-align:right"><strong>16.76s</strong></td>
<td style="text-align:right"><strong>105.9 tok/s</strong></td>
</tr>
<tr>
<td>3 × 64,000 tokens</td>
<td>0.60／0.60／0.31s</td>
<td style="text-align:right"><strong>16.29s</strong></td>
<td style="text-align:right"><strong>143.0 tok/s</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">² 历史目标长度，每路输出 1024 tokens。这组不是与 vLLM 的同轮对照，且不能替代四个独立 Agent 的长期验收。</p>
<h2>④ MTP3 与 DFlash2：两条路线都跑通</h2>
<p dir="auto"><strong><code>f84475c</code> 同树，64K 冷输入、输出 512 tokens，各两次中位数：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>路线</th>
<th style="text-align:right">HiCache OFF</th>
<th style="text-align:right">HiCache ON</th>
<th style="text-align:right">速度保留率</th>
</tr>
</thead>
<tbody>
<tr>
<td>MTP3 / EAGLE</td>
<td style="text-align:right">67.79 tok/s</td>
<td style="text-align:right"><strong>62.93 tok/s</strong></td>
<td style="text-align:right"><strong>92.8%</strong></td>
</tr>
<tr>
<td>DFlash2 / DFLASH</td>
<td style="text-align:right">69.68 tok/s</td>
<td style="text-align:right"><strong>61.63 tok/s</strong></td>
<td style="text-align:right"><strong>88.4%</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">DFlash2 另一次独立三态测试：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th style="text-align:right">冷预填</th>
<th style="text-align:right">L1 命中</th>
<th style="text-align:right">L2 恢复</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right"><strong>47.934s</strong></td>
<td style="text-align:right"><strong>0.337s</strong></td>
<td style="text-align:right">0.467 秒</td>
</tr>
</tbody>
</table>
<p dir="auto">结论：HiCache 不必以解码腰斩为代价。在这组集成下，MTP3 和 DFlash2 均保留大部分吞吐；不同版本的成绩不能互相套用。</p>
<h2>当前进度</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>技术模块</th>
<th>状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>双 7900 XTX + SGLang TP2</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 已跑通</td>
</tr>
<tr>
<td>MTP3 / DFlash2 投机解码</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 均已测试</td>
</tr>
<tr>
<td>HiCache L1 命中 / L2 恢复</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 已验证</td>
</tr>
<tr>
<td>L3 的 FULL KV + Mamba 完整恢复</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f52c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--microscope" style="height:23px;width:auto;vertical-align:middle" title="🔬" alt="🔬" /> 研究中</td>
</tr>
<tr>
<td>多 Agent 长期循环联合验收</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/23f3.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--hourglass_flowing_sand" style="height:23px;width:auto;vertical-align:middle" title="⏳" alt="⏳" /> 待完成</td>
</tr>
</tbody>
</table>
<hr />
<h2>阶段总结</h2>
<p dir="auto">已经取得的成果：</p>
<ul>
<li>双 RX 7900 XTX 上，Qwen3.8-27B 推理跑通。</li>
<li>ROCm 7.14 + SGLang 环境下，MTP3/EAGLE、DFlash2/DFLASH 两种投机解码均已跑通。</li>
<li>HiCache L1 命中、L2 内存恢复均有实测，长上下文可在秒级恢复，避免完整重新预填。</li>
<li>在已测上下文范围内，已验证多请求真实并发解码，而非仅排队完成。</li>
</ul>
<p dir="auto">以上为不同已测配置的阶段成果，不代表全部功能已在最新 upstream 实验树上联合验收。</p>
<p dir="auto">后续目标：</p>
<ul>
<li>L3 的 FULL KV + Mamba 完整恢复。</li>
<li>四个独立 Agent 的长期循环验收。</li>
</ul>
<p dir="auto">发布前说明：持续解码与 DFlash2 部分数字，本轮取自历史研究记录，正式发布前仍需回核原始工件。</p>
<hr />
<h2>附录：小白折腾记</h2>
<hr />
<p dir="auto">话说上一篇折腾到最后，我从犄角旮旯里翻出了一个 SGLang 很不起眼的参数：</p>
<pre><code class="language-bash">--max-consecutive-prefill-batches 1
</code></pre>
<p dir="auto"><strong>N=1</strong> 的效果立竿见影，非常简单粗暴，老特露出了欣慰的笑容。</p>
<p dir="auto">我于是开始飘了，当时产生了一种危险的错觉：</p>
<blockquote>
<p dir="auto"><strong>在 <a class="plugin-mentions-user plugin-mentions-a" href="/user/flyer666" aria-label="Profile: flyer666">@<bdi>flyer666</bdi></a> 大佬魔改的 SGLang 基础上，7900XTX 双卡，Hermes 环境多并发卡顿问题，被我发掘出了解决方案。</strong></p>
</blockquote>
<p dir="auto">生活又双叒叕地证明，每当我产生这种想法的时候，现实一般就会过来狠狠地打脸。</p>
<hr />
<h2>一、N=1 没了，天塌了</h2>
<p dir="auto">前两天升级到了新版 SGLang #f84475c（不可不换的原因下面解释），我准备照抄 production 参数，结果发现：</p>
<pre><code class="language-bash">--max-consecutive-prefill-batches 1
</code></pre>
<p dir="auto"><strong>这个参数没了。</strong>  愣了半天，那种感觉就是：</p>
<blockquote>
<p dir="auto">天塌了！千辛万苦练一个满级小号，被官方封号了<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f635.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--dizzy_face" style="height:23px;width:auto;vertical-align:middle" title=":dizzy_face:" alt="😵" /> 。</p>
</blockquote>
<p dir="auto">幸亏后来又扒拉出一个好东西，精神恢复了正常：</p>
<pre><code class="language-bash">--enable-mixed-chunk
</code></pre>
<p dir="auto">它的思路其实和 N=1 有点像，但做法更漂亮。</p>
<p dir="auto">以前的参数机理，更像是 <strong>prefill 干一批 → 停一下 → decode 插进来。</strong> Mixed Chunk这个参数则是： <strong>直接把新请求的 prefill 和正在运行的 decode 混在同一个 batch 里。</strong></p>
<p dir="auto">于是我又测了一遍原来的卡顿场景，对比如下。</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>调度方式</th>
<th style="text-align:right">A decode 最大断流</th>
<th style="text-align:right">B TTFT</th>
</tr>
</thead>
<tbody>
<tr>
<td>原始调度</td>
<td style="text-align:right">47–48s</td>
<td style="text-align:right">~49s</td>
</tr>
<tr>
<td>旧参数 N=1</td>
<td style="text-align:right"><strong>4.04s</strong></td>
<td style="text-align:right">49.48s</td>
</tr>
<tr>
<td>新参数 Mixed Chunk On</td>
<td style="text-align:right"><strong>3.997s</strong></td>
<td style="text-align:right">48.91s</td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto"><strong>新版实际上把 N=1 的思想吃进去了，而且实现得更自然。</strong> 性能还稍微好了一点。</p>
</blockquote>
<p dir="auto">马上又重跑了单并发，双并发各种测试，效果那是相当满意。见下表。</p>
<ul>
<li>**单并发 - SGLang Decode只是略强<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f44c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--ok_hand" style="height:23px;width:auto;vertical-align:middle" title=":ok_hand:" alt="👌" /> **</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>引擎</th>
<th>配置</th>
<th style="text-align:right">测试上下文</th>
<th style="text-align:right">TTFT</th>
<th style="text-align:right">Prefill tok/s</th>
<th style="text-align:right">Decode tok/s</th>
</tr>
</thead>
<tbody>
<tr>
<td>llama.cpp Vulkan</td>
<td>单 RX 7900 XTX</td>
<td style="text-align:right">~10–15K</td>
<td style="text-align:right">—</td>
<td style="text-align:right"><strong>~614–638</strong></td>
<td style="text-align:right"><strong>~44–54</strong></td>
</tr>
<tr>
<td>vLLM</td>
<td>双 RX 7900 XTX / TP2</td>
<td style="text-align:right">64K</td>
<td style="text-align:right"><strong>48.50s</strong></td>
<td style="text-align:right"><strong>1,352</strong></td>
<td style="text-align:right"><strong>77.2</strong></td>
</tr>
<tr>
<td><strong>SGLang 新树</strong></td>
<td>双 RX 7900 XTX / TP2 / MTP3</td>
<td style="text-align:right">64K</td>
<td style="text-align:right"><strong>48.26s</strong></td>
<td style="text-align:right"><strong>1,358</strong></td>
<td style="text-align:right"><strong>88.8</strong></td>
</tr>
</tbody>
</table>
<ul>
<li>*<em>真实 Agent / 多并发场景对比 - SGLang猛得一批</em><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f4aa.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--muscle" style="height:23px;width:auto;vertical-align:middle" title=":muscle:" alt="💪" /> *</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>场景</th>
<th style="text-align:right"><strong>SGLang</strong></th>
<th style="text-align:right">vLLM</th>
<th>差距 / 现象</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2×64K 并发整批完成</strong></td>
<td style="text-align:right"><strong>48.20s</strong></td>
<td style="text-align:right">97.43s</td>
<td><strong>约 2.02× 更快</strong></td>
</tr>
<tr>
<td><strong>3×64K 并发整批完成</strong></td>
<td style="text-align:right"><strong>48.32s</strong></td>
<td style="text-align:right">100.26s</td>
<td><strong>约 2.07× 更快</strong></td>
</tr>
<tr>
<td><strong>4×64K 并发整批完成</strong></td>
<td style="text-align:right"><strong>48.49s</strong></td>
<td style="text-align:right">102.94s</td>
<td><strong>约 2.12× 更快</strong></td>
</tr>
<tr>
<td><strong>长期 Agent 后续轮 TTFT</strong></td>
<td style="text-align:right"><strong>0.402s</strong></td>
<td style="text-align:right">2.254s</td>
<td><strong>5.61× 更快</strong></td>
</tr>
<tr>
<td><strong>图片后返回原长文本 TTFT</strong></td>
<td style="text-align:right"><strong>0.233s</strong></td>
<td style="text-align:right">20.268s</td>
<td><strong>约 87× 更快</strong></td>
</tr>
</tbody>
</table>
<hr />
<h2>二、人飘了</h2>
<p dir="auto">上一篇我也介绍过，我日常主力其实就是两个真正干活的 Agent，再加一个低频使用的管理 Agent。</p>
<p dir="auto">两个主力 Agent 都是 196K context，压缩阈值设在 65%，而且实际工作基本都是脉冲式推理：干一阵，停一阵，当时很少两边同时把上下文顶满。</p>
<p dir="auto">这里后来复盘的时候，我才发现当时我就埋雷了：</p>
<pre><code class="language-bash">196,608 × 65% = 127,795 tokens / Agent
127,795 × 2 = 255,590 tokens
</code></pre>
<p dir="auto">而我当时配置完SGLang后的 GPU KV pool （可用上下文KV池） 是多少呢：</p>
<pre><code class="language-bash">231,914 tokens

小学生也知道 231K &lt; 255K
</code></pre>
<p dir="auto">也就是说：如果两个 Agent 真同时顶到 65%左右，理论 working set 已经比 GPU KV pool 多了几十K tokens。</p>
<p dir="auto">这意味着有一部分上下文将无处安放，被迫扫地出门（从KV池内被丢弃）。<strong>以前陪我看月亮的时候，叫人家小甜甜！现在新人胜旧人，叫人家牛夫人</strong>。再续前缘，就需要重新 prefill / recompute 那部分上下文<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f915.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--face_with_head_bandage" style="height:23px;width:auto;vertical-align:middle" title=":face_with_head_bandage:" alt="🤕" /> 。这就是典型的卡顿便秘。</p>
<p dir="auto">这个问题当时没暴露，其实仅仅是因为我的测试方法不科学和测试时间不够长。</p>
<p dir="auto">然而还没等问题暴露，我的贪心已经开始膨胀：<strong>既然双并发如此丝滑，那四并发也提上日程吧？</strong></p>
<p dir="auto"><strong>命运赠送的礼物，早已在暗中悄悄标好了价格。</strong></p>
<hr />
<h1>三、打脸</h1>
<p dir="auto">上一篇我解释过，我使用 Hermes，日常有三个 Agent。</p>
<p dir="auto">其实我还有一个 OpenClaw 时代留下来的老 Hermes Agent，当年 Hermes 还没有 Windows 版，所以一直养在 WSL 里。</p>
<p dir="auto">启封、升级、维护。然后，我开始了 四 Agent 实战场景测试。</p>
<p dir="auto">当然了，首先要解决的问题就是 KV。</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Active workload</th>
<th>结果</th>
</tr>
</thead>
<tbody>
<tr>
<td>114K × 2</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
</tr>
<tr>
<td>120K × 2</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" /> 开始串行/无法同时容纳</td>
</tr>
<tr>
<td>74K × 3</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /></td>
</tr>
<tr>
<td>80K × 3</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/274c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--x" style="height:23px;width:auto;vertical-align:middle" title="❌" alt="❌" /></td>
</tr>
</tbody>
</table>
<p dir="auto">更不用说我的 4 Agent x 196K了。</p>
<p dir="auto">如果四个都顶到我设置的 65% 压缩阈值：196K × 65% × 4 ≈ 511K tokens，远远超出。</p>
<p dir="auto">这时候就要放大招 - HiCache。</p>
<p dir="auto"><strong>Call back， 这就是前面我说新版 SGLang #f84475c我不可不换的原因</strong></p>
<p dir="auto">又是一番指挥 AI 挖参数、改配置、测试、推翻、重测，最后 production 定在：--hicache-size 20，落到我的 TP2 配置上，大致是：</p>
<pre><code class="language-bash">Host KV Cache     ≈ 14.75 GiB / rank
Host Mamba Cache  ≈  5.26 GB  / rank

两张卡两个 rank 合计：≈ 40GB Host RAM &lt; 我64G内存总量
</code></pre>
<p dir="auto">理论上来讲，此时我的L1 + L2 能兜底的逻辑 KV 总量大约是 655K tokens：</p>
<pre><code class="language-bash">L1 GPU KV pool      = 231,914 tokens
L2 HiCache Host KV  = 423,593 tokens
--------------------------------
L1 + L2             = 655,507 tokens
</code></pre>
<p dir="auto">所以从纯 KV retention 容量看：</p>
<pre><code class="language-bash">4 Agent @ 65%       ≈ 511K
L1 + L2 capacity    ≈ 656K
剩余余量            ≈ 144K
</code></pre>
<p dir="auto">L1 只有 232K，但是加上 20GB/rank 的 HiCache L2以后，整个 KV 保留池理论上来到了约 656K。四个 196K Agent 即使都跑到 65% 压缩线，总 working history 也不过约 511K——看起来绰绰有余，完美！<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f919.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--call_me_hand" style="height:23px;width:auto;vertical-align:middle" title=":call_me_hand:" alt="🤙" /> 。</p>
<p dir="auto">这剧情走向，熟悉不？<strong>对，不出意外的话，要出意外了</strong>。</p>
<p dir="auto">单 Agent给力，双 Agent丝滑，四并发数字绝美，实际呢 - 以为憋了个大招,结果拉了坨大的</p>
<p dir="auto">四并发的剧情走向，可以说跟当年的二并发一摸一样：开测后的一小时内，我和四个 Agent 谈笑风生，相处甚欢，相见很晚。可是<strong>友谊的小船说翻就翻</strong>。吃了顿饭，回来一看：三个 Agent 在原地画圈，剩下一个哑口无言。</p>
<p dir="auto">算上刚才埋得雷，我这货，迄今为止可以说已经被SGLang三擒孟获了。</p>
<p dir="auto">调日志，三个Agent一共卡死了49 分钟，略过细节，可以概括成一句：</p>
<p dir="auto">四个 Agent 都进了餐厅，本来一桌子菜足够四个人分，但是有一个人把桌子霸占了，剩下三个拿着号码牌，在旁边整整站了 49 分钟。</p>
<p dir="auto">说句公道话，这不是“7900XTX四并发跑得慢”，7900XTX其实真的很有潜力，SGLang也确实奥利给，问题的关键是：显存的KV，不是你这么算滴！</p>
<p dir="auto">好吧，其实问题的关键的关键的关键是：我穷，买不起PRO6000。</p>
<hr />
<h1>四、好马要配好鞍</h1>
<p dir="auto">刚才Agent们是怎么给我上课的？</p>
<p dir="auto">我苦水咽肚子里，长话短说。</p>
<p dir="auto">老实憨厚的某Agent，平时负责系统的监控和总管，人不忙话也不多。这一次它的 session 直接一路膨胀，最后从大约 123K 一口气冲到 196K 上限，单次输出甚至干到了 7万多 token。（<strong>超大Skill从未清理</strong>）</p>
<p dir="auto">负责干活的某Agent，表面看起来特别勤快，积极主动“压缩”上下文从不叫苦叫累。日志里一看，几个小时之内触发了 100 多次压缩，感动中国。但是，压缩可以这么快的吗？翻看日志，嗯，压缩前140K+，压缩后140+K，还有一次压缩完了甚至比压缩前上下文还大。这摸鱼的表面功夫，真是比我还炉火纯青。（<strong>压缩机制设置不合理</strong>）</p>
<p dir="auto">最后不点名的某Agent，在几个人里面还算相对正常。它的人生爱好是喜欢输出，嗯，再配上Qwen3.8 27B的雷霆思考，每一次输出都真是随心所欲，滔滔不绝，不死不休。不服山，不服水，就服大哥这张嘴！（<strong>max_tokens没设上限</strong>）</p>
<p dir="auto">我忽然又悟了。</p>
<p dir="auto">青葱的年代陪老外逛酒吧，什么<strong>Screwdrive，On the Rocks</strong>，听的我一个楞一个楞。上了酒一看，就这，Rock原来就是一个大冰疙瘩。</p>
<p dir="auto">最近<strong>Harness</strong>火的一塌糊涂，我却一直一头雾水。比如这几张图，够好了吧，懂得都懂；不懂的人，像我，看了还是似懂非懂。</p>
<p dir="auto"><img src="https://upload.lcz.me/uploads/25262187-62d6-4109-a1ca-071a301e8a18.jpg" alt="v2-a8751f3362425dac31759367e0b350b8_r.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="https://upload.lcz.me/uploads/774c6e91-b606-40f8-a4db-fbe2a32022d2.jpg" alt="v2-a85fef152fb5a0f2de13f59e51246f56_r.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">前两天的折磨，我忽然整明白了，原来<strong>Harness</strong>(挽具)就是调教啊，要不然再好的爱马仕，再牛的XTX，也架不住一帮败家子这么霍霍。这几节课，没白上！</p>
<h1>五、莫言下岭便无难，赚得行人空喜欢。正入万山圈子里，一山放过一山拦。</h1>
<p dir="auto">说罢L1，L2，我们再说说穷人们的救星L3</p>
<p dir="auto">就不说N卡了，说说内存条，猜猜今天Newegg新蛋上的2X64G DDR5内存套装最低报价是多少</p>
<p dir="auto">Crucial Pro 128GB (2 x 64GB) DDR5 5600 (PC5 44800) Desktop Memory Model CP2K64G56C46U5</p>
<p dir="auto"><strong>$1949</strong>。</p>
<p dir="auto">这是最最便宜的，而且还没含税。</p>
<p dir="auto">L3就是SGLang赐予我们的最好的礼物。</p>
<p dir="auto">我一头扎进了梦想编织的泡影。</p>
<p dir="auto">这么说吧，前面讲的所有曲折，抵不过L3给我的一半伤害，如果说前面所有的问题加起来我已是被三擒孟获，到这篇稿子为止，我掉进去的大坑已经早让我被七擒孟获的成就功德圆满。</p>
<p dir="auto">L3，如果天黑之前來得及，我要忘了你的眼睛。</p>
<p dir="auto">这几天的折磨，核心问题可以理解成“寻址问题”，更准确地说是 L3 的哈希链续接地址错了。</p>
<pre><code class="language-bash">L2 里还留着一段上下文
        ↓
剩下那段 KV 在 L3
        ↓
要去 L3 找回来
        ↓
必须拿“正确的前一页 hash”作为起点
        ↓
之前 SGLang 取错了这个起点
        ↓
后面算出来的所有 L3 key 全错
        ↓
文件明明在 SSD 上，却一个都找不到

</code></pre>
<p dir="auto">除此之外，还有anchor 丢失和 Mamba/prefetch 可靠性问题，等等，等等，还有在前面不知道哪个犄角旮旯等着阴我的。。。</p>
<p dir="auto">地雷战大家都看过吧，此时此刻我的心情，和免费做上土飞机的鬼子们没太大差别。</p>
<hr />
<hr />
<h1>不知不觉写这么长了，该收了</h1>
<p dir="auto">这个时代节奏太快，没几个人有耐心看长文，尤其还是这种技术论坛。</p>
<p dir="auto">最后，说说我和 HiCache 之间不吐不快的恩怨情仇吧</p>
<hr />
<p dir="auto">我睡觉前一般喜欢把袜子存放老婆枕头（L1)上，第二天提取起来十分方便。</p>
<p dir="auto">如果找不到，那一定就是老婆给甩到地板上(L2）了。</p>
<p dir="auto">我试过，走两步的事儿，再弯个腰，没有我相像得那么艰难。</p>
<p dir="auto">但是昨天早上袜子找不到了，</p>
<p dir="auto">我找了很久，</p>
<p dir="auto">问老婆，她说，在卫生间（L3）第二个洗衣筐，里面第二件</p>
<p dir="auto">我找了很久，却发现袜子莫名其妙出现在了第三个筐的第八个位置</p>
<p dir="auto">我悟了，</p>
<p dir="auto">老婆已经很久没有夸我2了，我也亲切地回应她8。</p>
<p dir="auto">老婆让我滚，</p>
<p dir="auto">我泪流满面。</p>
<hr />
<p dir="auto">今天早晨袜子又找不到了，</p>
<p dir="auto">问老婆，她说在第五个筐里数到第二十件，</p>
<p dir="auto">我又找了很久，真的找不到。</p>
<p dir="auto">老婆又让我滚，</p>
<p dir="auto">我再次泪流满面。</p>
<hr />
<p dir="auto">我想好了，</p>
<p dir="auto">如果我能破译老婆的密码，</p>
<p dir="auto">下一篇帖子的名字就叫 <strong>“7900XTX双卡TP，SGLang &amp; VLLM 多Agent多并发测试对比（续二）- 柳暗花明”</strong></p>
<p dir="auto">如果公公了，</p>
<p dir="auto">那就是下面没有下面了。<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f616.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--confounded" style="height:23px;width:auto;vertical-align:middle" title=":confounded:" alt="😖" /></p>
]]></description><link>https://lcz.me/topic/1740</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 23:19:17 GMT</lastBuildDate><atom:link href="https://lcz.me/topic/1740.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Sep 2026 02:10:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 7900XTX双卡TP，SGLang & VLLM 多Agent多并发测试对比（续一）- 山重水复 on Sat, 19 Sep 2026 12:13:10 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ben-lee" aria-label="Profile: Ben-Lee">@<bdi>Ben-Lee</bdi></a></p>
<h2>当前进度</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>技术模块</th>
<th>状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>双 7900 XTX + SGLang TP2</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 已跑通</td>
</tr>
<tr>
<td>MTP3 / DFlash2 投机解码</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 均已测试</td>
</tr>
<tr>
<td>HiCache L1 命中 / L2 恢复</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 已验证</td>
</tr>
<tr>
<td>L3 的 FULL KV + Mamba 完整恢复</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f52c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--microscope" style="height:23px;width:auto;vertical-align:middle" title="🔬" alt="🔬" /> 研究中</td>
</tr>
<tr>
<td>多 Agent 长期循环联合验收</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/23f3.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--hourglass_flowing_sand" style="height:23px;width:auto;vertical-align:middle" title="⏳" alt="⏳" /> 待完成</td>
</tr>
</tbody>
</table>
<p dir="auto">这个相当牛逼了，后期的其实不那么重要，这已经相当能打了。</p>
]]></description><link>https://lcz.me/post/19346</link><guid isPermaLink="true">https://lcz.me/post/19346</guid><dc:creator><![CDATA[terry]]></dc:creator><pubDate>Sat, 19 Sep 2026 12:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to 7900XTX双卡TP，SGLang & VLLM 多Agent多并发测试对比（续一）- 山重水复 on Sat, 19 Sep 2026 05:13:57 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ben-lee" aria-label="Profile: Ben-Lee">@<bdi>Ben-Lee</bdi></a> <a href="/post/19278">说</a>:</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/terry" aria-label="Profile: terry">@<bdi>terry</bdi></a> 特哥，花了两天时间，把底座调优了，加上DFlash2，原地起飞了，<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title="🙂" alt="🙂" /></p>
</blockquote>
<p dir="auto"><img src="https://upload.lcz.me/uploads/7457a924-db70-47b6-9d01-63615468b99b.jpg" alt="7034f77d-364d-4a27-be6b-1351d2ff6afd.jpg" class=" img-fluid img-markdown" /></p>
<blockquote>
<p dir="auto"><a href="https://lcz.me/topic/1814">https://lcz.me/topic/1814</a></p>
</blockquote>
<p dir="auto">你是我的英雄</p>
]]></description><link>https://lcz.me/post/19302</link><guid isPermaLink="true">https://lcz.me/post/19302</guid><dc:creator><![CDATA[张光璞]]></dc:creator><pubDate>Sat, 19 Sep 2026 05:13:57 GMT</pubDate></item><item><title><![CDATA[Reply to 7900XTX双卡TP，SGLang & VLLM 多Agent多并发测试对比（续一）- 山重水复 on Sat, 19 Sep 2026 03:53:10 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/terry" aria-label="Profile: terry">@<bdi>terry</bdi></a> 特哥，花了两天时间，把底座调优了，加上DFlash2，原地起飞了，<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title="🙂" alt="🙂" /></p>
<p dir="auto"><img src="https://upload.lcz.me/uploads/7457a924-db70-47b6-9d01-63615468b99b.jpg" alt="7034f77d-364d-4a27-be6b-1351d2ff6afd.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto"><a href="https://lcz.me/topic/1814">https://lcz.me/topic/1814</a></p>
]]></description><link>https://lcz.me/post/19278</link><guid isPermaLink="true">https://lcz.me/post/19278</guid><dc:creator><![CDATA[Ben Lee]]></dc:creator><pubDate>Sat, 19 Sep 2026 03:53:10 GMT</pubDate></item><item><title><![CDATA[Reply to 7900XTX双卡TP，SGLang & VLLM 多Agent多并发测试对比（续一）- 山重水复 on Wed, 16 Sep 2026 13:42:09 GMT]]></title><description><![CDATA[<p dir="auto">非常不错，和双3090，尤其是带NVLink的比还是有差距，但是价格也更合适，新卡省心，是个选择。二手能搞到不错的就更好了。</p>
]]></description><link>https://lcz.me/post/18648</link><guid isPermaLink="true">https://lcz.me/post/18648</guid><dc:creator><![CDATA[terry]]></dc:creator><pubDate>Wed, 16 Sep 2026 13:42:09 GMT</pubDate></item><item><title><![CDATA[Reply to 7900XTX双卡TP，SGLang & VLLM 多Agent多并发测试对比（续一）- 山重水复 on Wed, 16 Sep 2026 13:44:49 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/terry" aria-label="Profile: terry">@<bdi>terry</bdi></a> 对的特哥，我深井冰又犯了，忘了写正事儿了</p>
<h1>双 7900 XTX 实测：27B 长上下文、HiCache 与投机解码</h1>
<p dir="auto">**硬件：**2× RX 7900 XTX + Ryzen 9600X + 64G DDR5 + GIGABYTE B850 AI TOP + ADATA SX8200PNP1TB  （PCIe Gen3 x4、NVMe 1.3）<br />
**平台：**Ubuntu，SGLang TP2，Qwen3.8-27B GPTQ</p>
<h2>① 长上下文唤醒：分钟级重算 → 秒级恢复</h2>
<p dir="auto"><strong>SGLang TP2 / MTP3，HiCache size16。首 token 延迟：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>上下文档位</th>
<th style="text-align:right">冷预填</th>
<th style="text-align:right">显存 L1 命中</th>
<th style="text-align:right">内存 L2 恢复</th>
<th style="text-align:right">L2 比 L1 多等</th>
</tr>
</thead>
<tbody>
<tr>
<td>64K</td>
<td style="text-align:right">50.78s</td>
<td style="text-align:right">0.431s</td>
<td style="text-align:right"><strong>0.546s</strong></td>
<td style="text-align:right"><strong>115ms</strong></td>
</tr>
<tr>
<td>120K</td>
<td style="text-align:right">121.49s</td>
<td style="text-align:right">0.711s</td>
<td style="text-align:right"><strong>0.896s</strong></td>
<td style="text-align:right"><strong>185ms</strong></td>
</tr>
<tr>
<td>192K</td>
<td style="text-align:right">243.81s</td>
<td style="text-align:right">1.055s</td>
<td style="text-align:right"><strong>1.406s</strong></td>
<td style="text-align:right"><strong>351ms</strong></td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>驱逐对照，64K 回访：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>配置</th>
<th style="text-align:right">首 token</th>
<th>结果</th>
</tr>
</thead>
<tbody>
<tr>
<td>无 HiCache</td>
<td style="text-align:right"><strong>48.129s</strong></td>
<td>cached tokens = 0，重新计算</td>
</tr>
<tr>
<td>有 HiCache</td>
<td style="text-align:right"><strong>0.546s</strong></td>
<td>L2 恢复，避免完整重算</td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto">L2 的核心收益不是提高冷预填速度，而是让被挤出显存的历史不用重新计算。额外等待是端到端差额，不是纯 DMA 时间。</p>
</blockquote>
<h2>② 容量账：系统内存承担冷上下文</h2>
<p dir="auto"><strong>对应上表的 size16 实验，不借用其他配置的容量：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>项目</th>
<th style="text-align:right">实测值</th>
</tr>
</thead>
<tbody>
<tr>
<td>不开 HiCache：GPU KV 池</td>
<td style="text-align:right"><strong>263,459 tokens</strong></td>
</tr>
<tr>
<td>开启 HiCache：GPU KV 池</td>
<td style="text-align:right"><strong>219,005 tokens</strong></td>
</tr>
<tr>
<td>Host KV 池</td>
<td style="text-align:right"><strong>319,193 tokens</strong></td>
</tr>
<tr>
<td>Host KV 内存</td>
<td style="text-align:right"><strong>11.11 GB／rank</strong></td>
</tr>
<tr>
<td>Host Mamba 内存</td>
<td style="text-align:right"><strong>4.93 GB／rank</strong></td>
</tr>
<tr>
<td>TP2 Host 缓存预算</td>
<td style="text-align:right"><strong>约 32 GB</strong></td>
</tr>
<tr>
<td>整机内存：已用／可用</td>
<td style="text-align:right"><strong>40／19 GiB</strong></td>
</tr>
<tr>
<td>Swap</td>
<td style="text-align:right"><strong>62 MiB，测试期间未增长</strong></td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>读法：</strong></p>
<ul>
<li>TP2 两 rank 保存分片，<strong>不能把 token 容量乘二</strong>。</li>
<li>L1/L2 可能存在重复副本，<strong>不能直接相加当作独立历史容量</strong>。</li>
<li>HiCache 也有显存开销；它扩大的是<strong>可保留历史</strong>，不是同时解码的 active KV 池。</li>
<li>这轮早期集成有明显解码退化；后续改善见第四组。</li>
</ul>
<h2>③ 单路与并发：分开看</h2>
<h3>单路历史基准</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>方案</th>
<th>测试口径</th>
<th style="text-align:right">解码速度</th>
</tr>
</thead>
<tbody>
<tr>
<td>单卡 llama.cpp Vulkan + MTP</td>
<td>Qwen3.6-27B Q4_K_M，短请求</td>
<td style="text-align:right"><strong>约 44 tok/s</strong></td>
</tr>
<tr>
<td>双卡 vLLM</td>
<td>Qwen3.8-27B GPTQ，64K</td>
<td style="text-align:right"><strong>77.185 tok/s</strong></td>
</tr>
<tr>
<td>双卡 SGLang</td>
<td>同轮、同模型，64K</td>
<td style="text-align:right"><strong>88.815 tok/s</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">单卡仅作演进背景，<strong>不同模型、量化与长度，不计算跨组加速比。</strong></p>
<h3>多路 64K 冷预填</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>并发</th>
<th>引擎</th>
<th>各请求首 token：秒</th>
<th style="text-align:right">聚合预填：tok/s¹</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 路</td>
<td>SGLang</td>
<td><strong>48.15／48.15</strong></td>
<td style="text-align:right"><strong>2720</strong></td>
</tr>
<tr>
<td>2 路</td>
<td>vLLM</td>
<td>48.39／97.38</td>
<td style="text-align:right">1346</td>
</tr>
<tr>
<td>3 路</td>
<td>SGLang</td>
<td><strong>48.26／48.26／48.26</strong></td>
<td style="text-align:right"><strong>4070</strong></td>
</tr>
<tr>
<td>3 路</td>
<td>vLLM</td>
<td>48.46／97.49／100.20</td>
<td style="text-align:right">1962</td>
</tr>
<tr>
<td>4 路</td>
<td>SGLang</td>
<td><strong>48.23／48.23／48.23／48.45</strong></td>
<td style="text-align:right"><strong>5408</strong></td>
</tr>
<tr>
<td>4 路</td>
<td>vLLM</td>
<td>48.40／97.44／100.15／102.87</td>
<td style="text-align:right">2547</td>
</tr>
</tbody>
</table>
<p dir="auto">¹ 归档中的估算值，按每请求约 65,556 tokens 与墙钟推导。此测试输出极少，<strong>证明的是预填表现，不是持续并行解码</strong>；也不能说 vLLM 完全逐请求串行。</p>
<p dir="auto">另有 SGLang <strong>HiCache20 + Mamba48</strong> 的持续解码记录：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>请求组合²</th>
<th>各路首 token</th>
<th style="text-align:right">解码重叠时间</th>
<th style="text-align:right">聚合吞吐</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 × 104,000 tokens</td>
<td>0.44／0.80s</td>
<td style="text-align:right"><strong>16.76s</strong></td>
<td style="text-align:right"><strong>105.9 tok/s</strong></td>
</tr>
<tr>
<td>3 × 64,000 tokens</td>
<td>0.60／0.60／0.31s</td>
<td style="text-align:right"><strong>16.29s</strong></td>
<td style="text-align:right"><strong>143.0 tok/s</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">² 历史目标长度，每路输出 1024 tokens。这组不是与 vLLM 的同轮对照，且不能替代四个独立 Agent 的长期验收。</p>
<h2>④ MTP3 与 DFlash2：两条路线都跑通</h2>
<p dir="auto"><strong><code>f84475c</code> 同树，64K 冷输入、输出 512 tokens，各两次中位数：</strong></p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>路线</th>
<th style="text-align:right">HiCache OFF</th>
<th style="text-align:right">HiCache ON</th>
<th style="text-align:right">速度保留率</th>
</tr>
</thead>
<tbody>
<tr>
<td>MTP3 / EAGLE</td>
<td style="text-align:right">67.79 tok/s</td>
<td style="text-align:right"><strong>62.93 tok/s</strong></td>
<td style="text-align:right"><strong>92.8%</strong></td>
</tr>
<tr>
<td>DFlash2 / DFLASH</td>
<td style="text-align:right">69.68 tok/s</td>
<td style="text-align:right"><strong>61.63 tok/s</strong></td>
<td style="text-align:right"><strong>88.4%</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">DFlash2 另一次独立三态测试：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th style="text-align:right">冷预填</th>
<th style="text-align:right">L1 命中</th>
<th style="text-align:right">L2 恢复</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:right"><strong>47.934s</strong></td>
<td style="text-align:right"><strong>0.337s</strong></td>
<td style="text-align:right">0.467 秒</td>
</tr>
</tbody>
</table>
<p dir="auto">结论：HiCache 不必以解码腰斩为代价。在这组集成下，MTP3 和 DFlash2 均保留大部分吞吐；不同版本的成绩不能互相套用。</p>
<h2>当前进度</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>技术模块</th>
<th>状态</th>
</tr>
</thead>
<tbody>
<tr>
<td>双 7900 XTX + SGLang TP2</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 已跑通</td>
</tr>
<tr>
<td>MTP3 / DFlash2 投机解码</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 均已测试</td>
</tr>
<tr>
<td>HiCache L1 命中 / L2 恢复</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 已验证</td>
</tr>
<tr>
<td>L3 的 FULL KV + Mamba 完整恢复</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f52c.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--microscope" style="height:23px;width:auto;vertical-align:middle" title="🔬" alt="🔬" /> 研究中</td>
</tr>
<tr>
<td>多 Agent 长期循环联合验收</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/23f3.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--hourglass_flowing_sand" style="height:23px;width:auto;vertical-align:middle" title="⏳" alt="⏳" /> 待完成</td>
</tr>
</tbody>
</table>
<hr />
<h2>阶段总结</h2>
<p dir="auto">已经取得的成果：</p>
<ul>
<li>双 RX 7900 XTX 上，Qwen3.8-27B 推理跑通。</li>
<li>ROCm 7.14 + SGLang 环境下，MTP3/EAGLE、DFlash2/DFLASH 两种投机解码均已跑通。</li>
<li>HiCache L1 命中、L2 内存恢复均有实测，长上下文可在秒级恢复，避免完整重新预填。</li>
<li>在已测上下文范围内，已验证多请求真实并发解码，而非仅排队完成。</li>
</ul>
<p dir="auto">以上为不同已测配置的阶段成果，不代表全部功能已在最新 upstream 实验树上联合验收。</p>
<p dir="auto">后续目标：</p>
<ul>
<li>L3 的 FULL KV + Mamba 完整恢复。</li>
<li>四个独立 Agent 的长期循环验收。</li>
</ul>
<p dir="auto">发布前说明：持续解码与 DFlash2 部分数字，本轮取自历史研究记录，正式发布前仍需回核原始工件。</p>
]]></description><link>https://lcz.me/post/18645</link><guid isPermaLink="true">https://lcz.me/post/18645</guid><dc:creator><![CDATA[Ben Lee]]></dc:creator><pubDate>Wed, 16 Sep 2026 13:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to 7900XTX双卡TP，SGLang & VLLM 多Agent多并发测试对比（续一）- 山重水复 on Wed, 16 Sep 2026 10:28:55 GMT]]></title><description><![CDATA[<p dir="auto">哥你别上小作文啊，还某Agent，你就直说，论坛很多新人。话说现在还在用openclaw的人，是很念旧的人，念旧的人一般都不坏。<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f602.png?v=ffa14597167" class="not-responsive emoji emoji-android emoji--joy" style="height:23px;width:auto;vertical-align:middle" title="😂" alt="😂" /></p>
]]></description><link>https://lcz.me/post/18601</link><guid isPermaLink="true">https://lcz.me/post/18601</guid><dc:creator><![CDATA[terry]]></dc:creator><pubDate>Wed, 16 Sep 2026 10:28:55 GMT</pubDate></item><item><title><![CDATA[Reply to 7900XTX双卡TP，SGLang & VLLM 多Agent多并发测试对比（续一）- 山重水复 on Wed, 16 Sep 2026 04:04:26 GMT]]></title><description><![CDATA[<p dir="auto">Mixed Chunk 这个方向对，但有一点要说清：它解决的是「decode 断流」，不是「吞吐上限」，两者在并发下会此消彼长。</p>
<ul>
<li><code>--max-consecutive-prefill-batches 1</code> 是老版闸门：强制 prefill 每批只准跑一个，把 decode 插回来，代价是 prefill 变碎、TTFT 和 prefill tok/s 掉。</li>
<li><code>--enable-mixed-chunk</code> 把两者放进同一个 batch（chunked prefill 的标准做法），decode 断流和 TTFT 都能兼顾，所以你看到 4.0s 对 47s。</li>
<li>但它不会凭空增加算力：总 FLOPs 不变，只是调度更公平。并发再往上加、prefill 占比再大时，decode 还是会被拖，只是拖得更平滑。</li>
</ul>
<p dir="auto">验证建议：<br />
1）别只看最大断流，补 p50/p99 的 ITL（inter-token latency）和并发数曲线，断流看 max、体验看 p99；<br />
2）固定同一 prompt 集，扫并发 1/2/4/8，比较 prefill tok/s、decode tok/s、TTFT、ITL 四条曲线，才能看出 mixed chunk 的拐点；<br />
3）有空的话 <code>--enable-mixed-chunk</code> 开/关各跑一遍同样的表，这帖的结论会更硬。</p>
<p dir="auto">N=1 被吃进新版是好事，说明上游认可了这个调度方向；以后升级盯 release notes 里的 scheduler 关键词就行。</p>
]]></description><link>https://lcz.me/post/18522</link><guid isPermaLink="true">https://lcz.me/post/18522</guid><dc:creator><![CDATA[Xiaote]]></dc:creator><pubDate>Wed, 16 Sep 2026 04:04:26 GMT</pubDate></item></channel></rss>