<?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[[实测] RTX 3080 (魔改20G) 跑通 Ternary Bonsai 2 27B + rk4v4，256K 上下文，1000+ prefill  65t/s decode]]></title><description><![CDATA[<p dir="auto">在 <strong>RTX 3080 20GB</strong> 上，用 <a href="https://github.com/iamwavecut/ninfer-all" rel="nofollow ugc"><code>iamwavecut/ninfer-all</code></a><br />
（master <code>d1a0e07</code>）原生构建跑通了 <strong>Ternary Bonsai 2 27B</strong>，使用 <strong><code>rk4v4</code> 4-bit KV 量化</strong>，<br />
完整 <strong>262,144 token</strong> 上下文，<strong>无需任何代码移植</strong>。</p>
<p dir="auto">零编译改动、零源码补丁，<code>CMAKE_CUDA_ARCHITECTURES=86</code> 就是上游默认值。</p>
<hr />
<h2>背景</h2>
<p dir="auto"><code>WaveCut/Ternary-Bonsai-2-27B-NInfer-v3</code> 的模型卡列出了 RTX 3090 / 4090 / 5090 的数据，<br />
但 <strong>RTX 3080 在 <code>docs/gpus.md</code> 里是未测试（<img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2b1c.png?v=ec85ec55bc1" class="not-responsive emoji emoji-android emoji--white_large_square" style="height:1.4em;width:auto;vertical-align:middle" title="⬜" alt="⬜" />）状态</strong>，而且卡片写的是 12/10GB SKU。</p>
<p dir="auto">另一个已知限制：在非 <code>ninfer-all</code> 的 NInfer 分支上，<code>rk8v4</code> 在 sm_86 上<strong>被硬编码拒绝</strong>，<br />
<code>rk4v4</code> 甚至不存在。所以很多人（包括我）一开始以为 3080 需要自己 porting。</p>
<p dir="auto"><strong>实测结论：不需要。</strong> <code>ninfer-all</code> 上游已经把 4-bit KV 全部实现好，并且<br />
"accepted on every build target"。</p>
<hr />
<h2>环境</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>项目</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td>GPU</td>
<td>NVIDIA GeForce RTX 3080 <strong>20480 MiB</strong>（20GB SKU，GA102）</td>
</tr>
<tr>
<td>Compute Capability</td>
<td><strong>8.6</strong></td>
</tr>
<tr>
<td>驱动</td>
<td>610.57.04（CUDA 13.3 toolkit）</td>
</tr>
<tr>
<td>OS</td>
<td>Omarchy（Arch 衍生）+ 内核 6.x</td>
</tr>
<tr>
<td>桌面</td>
<td>Hyprland（<strong>同时运行</strong>，见下文显存部分）</td>
</tr>
<tr>
<td>引擎</td>
<td><code>ninfer-serve 0.12.0-rtx3090+d1a0e07</code></td>
</tr>
<tr>
<td>构建目标</td>
<td><code>CMAKE_CUDA_ARCHITECTURES=86</code>（上游默认）</td>
</tr>
</tbody>
</table>
<h3>验证是真·原生 sm_86</h3>
<p dir="auto"><code>cuobjdump --list-elf</code> 显示二进制里每个 cubin 都是 sm_86 SASS，不是 PTX JIT：</p>
<pre><code>ELF file 1: device_calibration.sm_86.cubin
ELF file 2: ninfer-serve.2.sm_86.cubin
ELF file 7: device_tier.sm_86.cubin
ELF file 8: hyper_connection.sm_86.cubin
</code></pre>
<p dir="auto">编译 flag：</p>
<pre><code>--generate-code=arch=compute_86,code=[compute_86,sm_86]
</code></pre>
<hr />
<h2>转换</h2>
<p dir="auto">从 PrismML 官方的 <code>Ternary-Bonsai-2-27B-PQ2_0.gguf</code>（6.71 GB，GGUF type 142 / <code>PQ2_0</code>）<br />
转换成 NInfer v3 artifact：</p>
<pre><code class="language-bash">python3 -m tools.convert \
  --model /path/to/Qwen3.8-27B-config \
  --recipe bonsai2_27b_ternary \
  --source ternary=Ternary-Bonsai-2-27B-PQ2_0.gguf \
  --components text \
  --name bonsai2-27b \
  --device cpu \
  --out bonsai2-27b.ninfer
</code></pre>
<p dir="auto">结果：<strong>778 objects，771 个张量，70.4 秒，7.20 GB</strong>。</p>
<blockquote>
<p dir="auto">注：<code>--model</code> 需要 Qwen3.8-27B 的 <code>config.json</code> + tokenizer 资源（不需要权重，<br />
recipe 只读 <code>model.config</code>，所有张量都从 GGUF 来）。</p>
</blockquote>
<hr />
<h2>启动</h2>
<pre><code class="language-bash">ninfer-serve bonsai2-27b.ninfer \
  --model-id bonsai2-27b \
  --host 127.0.0.1 --port 1234 \
  --max-context 262144 \
  --kv-capacity auto \
  --kv-headroom-mib 2048 \
  --kv-dtype rk4v4 \
  --gdn-state-fp16 \
  --no-thinking
</code></pre>
<p dir="auto"><strong>关键点是 <code>--kv-capacity auto</code> + <code>--kv-headroom-mib 2048</code></strong>：引擎先加载权重、实测剩余显存，<br />
再选最大合法 KV 容量，并<strong>强制预留 2 GiB</strong>。这是桌面和 CUDA 抢显存问题的正解（见下）。</p>
<hr />
<h2>实测性能</h2>
<h3>合成基准（单请求）</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>项目</th>
<th>数值</th>
</tr>
</thead>
<tbody>
<tr>
<td>Prefill @20K</td>
<td><strong>1998 t/s</strong></td>
</tr>
<tr>
<td>Decode @20K</td>
<td><strong>63.0 t/s</strong></td>
</tr>
<tr>
<td>Decode 短上下文</td>
<td><strong>70.5 t/s</strong></td>
</tr>
</tbody>
</table>
<h3>真实负载（28 次请求，约 12 分钟连续使用）</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>项目</th>
<th>数值</th>
</tr>
</thead>
<tbody>
<tr>
<td>Prefill（平均）</td>
<td><strong>1571 t/s</strong></td>
</tr>
<tr>
<td>Decode（平均）</td>
<td><strong>64.1 t/s</strong></td>
</tr>
<tr>
<td>累计 prefill</td>
<td>70,174 tokens</td>
</tr>
<tr>
<td>累计 decode</td>
<td>10,497 tokens</td>
</tr>
<tr>
<td><strong>失败请求</strong></td>
<td><strong>0</strong></td>
</tr>
<tr>
<td>拒绝请求</td>
<td>0</td>
</tr>
<tr>
<td>引擎恢复事件</td>
<td>0</td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto">Prefill 从 1998 降到 1571 是正常的：真实负载里混入了更长、更碎的前缀，<br />
且 95% 的输入被前缀缓存吃掉（见下），剩余重算部分占比小、统计噪声大。</p>
</blockquote>
<h3><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f525.png?v=ec85ec55bc1" class="not-responsive emoji emoji-android emoji--fire" style="height:1.4em;width:auto;vertical-align:middle" title="🔥" alt="🔥" /> 前缀缓存命中率 95.1%</h3>
<p dir="auto">这是个人助理场景最有价值的数据：</p>
<pre><code>前缀缓存命中: 1,353,465 tokens   ← 直接复用，不重算
实际重算:        70,174 tokens
─────────────────────────────────
总输入:       1,423,639 tokens
节省:              95.1%
</code></pre>
<p dir="auto"><strong>超过 95% 的输入 token 直接从 context cache 恢复，不经过 prefill。</strong></p>
<p dir="auto"><code>/slots</code> 也能看到多级 checkpoint 在复用：</p>
<pre><code class="language-json">{"frontier": 15977, "session_digest": "0b6afd8c..."}
{"frontier": 18602, "session_digest": "0fda02d0..."}
{"frontier": 18962, "session_digest": "706f16d4..."}
</code></pre>
<hr />
<h2>显存：rk4v4 是决定性的</h2>
<p dir="auto">这是 3080 20GB 能开 256K 的核心原因。</p>
<h3>KV 理论占用（16 层全注意力 / 共 64 层）</h3>
<p dir="auto">该模型是 <strong>混合架构</strong>（<code>full_attention_interval = 4</code>），64 层里<strong>只有 16 层有 KV cache</strong>：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>KV 格式</th>
<th style="text-align:right">256K 占用</th>
</tr>
</thead>
<tbody>
<tr>
<td>F16</td>
<td style="text-align:right">16.0 GiB</td>
</tr>
<tr>
<td>Q8</td>
<td style="text-align:right">8.0 GiB</td>
</tr>
<tr>
<td><strong>rk4v4</strong></td>
<td style="text-align:right"><strong>4.36 GiB</strong></td>
</tr>
</tbody>
</table>
<h3>实测整机占用</h3>
<pre><code>nvidia-smi: 13165 MiB used / 20480 MiB total   (剩 6865 MiB)
</code></pre>
<p dir="auto">分解（<code>--max-context 262144 --kv-capacity auto</code>）：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>项目</th>
<th style="text-align:right">占用</th>
</tr>
</thead>
<tbody>
<tr>
<td>模型权重</td>
<td style="text-align:right">6.70 GiB</td>
</tr>
<tr>
<td>rk4v4 KV（动态分配）</td>
<td style="text-align:right">—</td>
</tr>
<tr>
<td>运行时 / workspace / CUDA Graph</td>
<td style="text-align:right">—</td>
</tr>
<tr>
<td><strong>合计</strong></td>
<td style="text-align:right"><strong>12.86 GiB</strong></td>
</tr>
<tr>
<td><strong>剩余</strong></td>
<td style="text-align:right"><strong>6.70 GiB</strong></td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>同时跑桌面 + 256K 上下文，还剩 6.7 GiB 空闲，桌面完全安全。</strong></p>
<hr />
<h2>和 llama.cpp (Prism fork) 的对比</h2>
<p dir="auto">顺手对比了 PrismML 官方 fork（<code>PrismML-Eng/llama.cpp</code>，分支 <code>prism</code>），<br />
它原生支持同一份 GGUF（type 142）：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>指标</th>
<th style="text-align:right">llama.cpp (prism) + Q8 KV</th>
<th style="text-align:right"><strong>ninfer-all + rk4v4</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>上下文</td>
<td style="text-align:right">64,000</td>
<td style="text-align:right"><strong>262,144</strong>（4×）</td>
</tr>
<tr>
<td>KV @256K</td>
<td style="text-align:right">8.0 GiB</td>
<td style="text-align:right"><strong>4.36 GiB</strong>（-45%）</td>
</tr>
<tr>
<td>Prefill @20K</td>
<td style="text-align:right">~1,050 t/s</td>
<td style="text-align:right"><strong>1,998 t/s</strong>（1.9×）</td>
</tr>
<tr>
<td>Decode @20K</td>
<td style="text-align:right">~45 t/s</td>
<td style="text-align:right"><strong>63 t/s</strong>（1.4×）</td>
</tr>
<tr>
<td>Decode 短</td>
<td style="text-align:right">65.5 t/s</td>
<td style="text-align:right"><strong>70.5 t/s</strong></td>
</tr>
</tbody>
</table>
<p dir="auto">llama.cpp 那条路也完全可用，而且胜在零转换（直接读 GGUF）。<br />
但长上下文场景下 ninfer-all 优势明显。</p>
<hr />
<h2>一些说明 / 未做的事</h2>
<ul>
<li><strong>RTX 3080 未在上游 profile 列表</strong>，所以首次启动可能触发设备校准（20 秒 ~ 3.5 分钟），<br />
结果会缓存。我这次没遇到明显延迟，可能命中了同 SM 数的 profile。</li>
<li><strong>没有用投机解码</strong>。模型卡上 3090 的 201 t/s 是 DFlash2 (5 drafts) 的成绩，<br />
需要额外的 MTP / DFlash2 组件文件，我没有下载。<strong>纯 decode 是 ~64-71 t/s。</strong></li>
<li><strong>Vision 未启用</strong>（<code>--components text</code>），Bonsai 的视觉塔是独立组件。</li>
<li>这是纯文本个人助理用途的配置。</li>
</ul>
<hr />
<h2>结论</h2>
<p dir="auto"><strong>RTX 3080 (sm_86) 上跑 Ternary Bonsai 2 27B 是一件"开箱即用"的事：</strong></p>
<ol>
<li><code>ninfer-all</code> 的<strong>默认</strong>构建目标就是 86 —— 不需要 porting</li>
<li><code>rk4v4</code> 等 9 种 KV 格式上游全部实现，sm_86 不再被拒</li>
<li>混合注意力架构（只有 16/64 层占 KV）+ rk4v4，让 20GB 卡能开 <strong>256K 上下文</strong></li>
<li><code>--kv-headroom-mib</code> 让桌面和模型和平共处</li>
<li>实测 <strong>prefill ~1571-1998 t/s、decode ~64-71 t/s、前缀缓存命中 95%+、零失败</strong></li>
</ol>
<p dir="auto">感谢 upstream 的工作 —— 尤其是把 4-bit KV 从"sm_86 拒绝"变成"全平台可用"这件事。</p>
<hr />
<h2>参考</h2>
<ul>
<li>模型：<a href="https://huggingface.co/WaveCut/Ternary-Bonsai-2-27B-NInfer-v3" rel="nofollow ugc">https://huggingface.co/WaveCut/Ternary-Bonsai-2-27B-NInfer-v3</a></li>
<li>引擎：<a href="https://github.com/iamwavecut/ninfer-all" rel="nofollow ugc">https://github.com/iamwavecut/ninfer-all</a> （master <code>d1a0e07</code>）</li>
<li>PrismML llama.cpp fork：<a href="https://github.com/PrismML-Eng/llama.cpp" rel="nofollow ugc">https://github.com/PrismML-Eng/llama.cpp</a> （分支 <code>prism</code>）</li>
<li>上游构建文档：<code>docs/build-linux.md</code>、<code>docs/cli.md#context-and-memory</code></li>
</ul>
]]></description><link>https://lcz.me/topic/2399</link><generator>RSS for Node</generator><lastBuildDate>Sun, 25 Oct 2026 23:44:43 GMT</lastBuildDate><atom:link href="https://lcz.me/topic/2399.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 18 Oct 2026 05:01:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [实测] RTX 3080 (魔改20G) 跑通 Ternary Bonsai 2 27B + rk4v4，256K 上下文，1000+ prefill  65t/s decode on Fri, 23 Oct 2026 05:16:44 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/zrlhk" aria-label="Profile: zrlhk">@<bdi>zrlhk</bdi></a> 有道理</p>
]]></description><link>https://lcz.me/post/26911</link><guid isPermaLink="true">https://lcz.me/post/26911</guid><dc:creator><![CDATA[yangkang5303]]></dc:creator><pubDate>Fri, 23 Oct 2026 05:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to [实测] RTX 3080 (魔改20G) 跑通 Ternary Bonsai 2 27B + rk4v4，256K 上下文，1000+ prefill  65t/s decode on Thu, 22 Oct 2026 16:14:49 GMT]]></title><description><![CDATA[<p dir="auto">Ninfer跑bonsai 2算是浪费了，20g 可跑27b：<br />
; gsq-rco-iq3s           27B   IQ3_S     13.99G 有    有    gsq-rco-iq3s-v3<br />
; swift15-iq3xxs         27B   IQ3_XXS   10.33G 有    有    swift15-gsq-rco-ez<br />
; swift15-iq3s           27B   IQ3_S     11.91G 有    有    swift15-gsq-rco-ez<br />
; coder390-q2            27B   Q2        12.36G 有    无    qwen38-coder390-v3<br />
; coder390-q3            27B   Q3        16.11G 有    无    qwen38-coder390-v3<br />
; swift15-v3             27B   高通量       16.96G 有    有    swift15-v3</p>
<p dir="auto">此外，还有kvmem，也能跑ninfer模型有提速</p>
]]></description><link>https://lcz.me/post/26803</link><guid isPermaLink="true">https://lcz.me/post/26803</guid><dc:creator><![CDATA[zrlhk]]></dc:creator><pubDate>Thu, 22 Oct 2026 16:14:49 GMT</pubDate></item><item><title><![CDATA[Reply to [实测] RTX 3080 (魔改20G) 跑通 Ternary Bonsai 2 27B + rk4v4，256K 上下文，1000+ prefill  65t/s decode on Thu, 22 Oct 2026 14:54:38 GMT]]></title><description><![CDATA[<p dir="auto">我在3080M上测试结果也是：Ternary-Bonsai-2-27B是可以被NInfer直接使用的。</p>
]]></description><link>https://lcz.me/post/26784</link><guid isPermaLink="true">https://lcz.me/post/26784</guid><dc:creator><![CDATA[PhilipShi2026]]></dc:creator><pubDate>Thu, 22 Oct 2026 14:54:38 GMT</pubDate></item><item><title><![CDATA[Reply to [实测] RTX 3080 (魔改20G) 跑通 Ternary Bonsai 2 27B + rk4v4，256K 上下文，1000+ prefill  65t/s decode on Sun, 18 Oct 2026 05:18:54 GMT]]></title><description><![CDATA[<p dir="auto">补充一段真实 agent 负载下的实测，供参考。</p>
<p dir="auto">场景：本地个人 agent（Hermes）连续 8 轮工具调用，每轮约 20 个 tools，上下文从 20K 累积到 34K。</p>
<p dir="auto">结果：<br />
Decode 稳定在 70–72 t/s，上下文从 20K 涨到 34K 几乎不衰减 —— rk4v4 的 KV 压缩有效抑制了注意力随长度的成本增长。<br />
前缀缓存命中率随会话爬升：88.5% → 91.1% → 93.1% → 94.9%。<br />
TTFT 从首轮的 9.8s 降到稳态 1.1–1.5s，正是缓存命中带来的直接收益。<br />
Prefill 稳定 1.7–2.25k t/s，排队延迟仅 10–26 ms，主机 CPU 占用 5–8%。</p>
<p dir="auto">两处配置修正：<br />
--structured-output 是 agent 前端的刚需 —— tool calling 依赖结构化输出，缺了会直接 HTTP 400。</p>
<p dir="auto">原用 --kv-headroom-mib 2048 时出现警告：CUDA graphs used 34.7 MiB but the KV sizing allowed 12.0 MiB。调到 3072 后警告消失，且 KV 容量完整保住 262,144，剩余显存反而略增（7.00 → 7.12 GiB）。</p>
]]></description><link>https://lcz.me/post/25712</link><guid isPermaLink="true">https://lcz.me/post/25712</guid><dc:creator><![CDATA[yangkang5303]]></dc:creator><pubDate>Sun, 18 Oct 2026 05:18:54 GMT</pubDate></item></channel></rss>