<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>本地部署 on CAO ZUOHUA</title><link>https://caozuohua.github.io/tags/%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2/</link><description>Recent content in 本地部署 on CAO ZUOHUA</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 14 Sep 2026 10:30:00 +0800</lastBuildDate><atom:link href="https://caozuohua.github.io/tags/%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2/index.xml" rel="self" type="application/rss+xml"/><item><title>让 2B 当侦察兵：投机解码的原理、实测数据与失效边界</title><link>https://caozuohua.github.io/posts/2026-09-14-speculative-decoding-explained/</link><pubDate>Mon, 14 Sep 2026 10:30:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-14-speculative-decoding-explained/</guid><description>&lt;h1 id="让-2b-当侦察兵投机解码的原理实测数据与失效边界"&gt;让 2B 当侦察兵：投机解码的原理、实测数据与失效边界&lt;/h1&gt;&#10;&lt;p&gt;上一篇我们提到，2B 小模型最&amp;quot;值钱&amp;quot;的用法之一是给大模型当草稿机。这个技术的正式名字叫&lt;strong&gt;投机解码（Speculative Decoding）&lt;/strong&gt;。它的效果相当戏剧化：有人实测把 27B 模型的生成速度从 25 tok/s 提到 45 tok/s，也有人实测把 60 tok/s 掉到 45 tok/s——&lt;strong&gt;用的是同一个技术&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;本文面向没有推理优化背景的读者，先讲清&amp;quot;为什么能加速&amp;quot;，再讲清&amp;quot;为什么有时反而变慢&amp;quot;，中间穿插多组真实实测数据。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一先搞懂一个反直觉的事实大模型生成慢不是因为算不过来"&gt;一、先搞懂一个反直觉的事实：大模型生成慢，不是因为算不过来&lt;/h2&gt;&#10;&lt;p&gt;这是理解投机解码的唯一前提。&lt;/p&gt;&#10;&lt;p&gt;大模型生成文字是一个字一个字往外蹦的（术语叫自回归）。每蹦一个字，都要把&lt;strong&gt;整个模型的全部权重&lt;/strong&gt;从显存里完整读一遍。以 27B 模型 Q4 量化为例，权重约 16 GB——也就是说，&lt;strong&gt;每生成一个字，就要搬运 16 GB 数据&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;这带来一个关键结论：瓶颈在&lt;strong&gt;内存带宽&lt;/strong&gt;，不在计算能力。显卡的计算单元绝大部分时间在空转等数据。用一张带宽 936 GB/s 的 RTX 3090 举例，理论上限就是 936 ÷ 16 ≈ 58 tok/s，无论这张卡的算力有多强。&lt;/p&gt;&#10;&lt;p&gt;所以加速的方向有两条：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;减少要搬运的数据量（量化、用小模型）——代价是质量。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;让空转的算力干点活&lt;/strong&gt;——这正是投机解码的思路，且&lt;strong&gt;不损失任何质量&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="二核心思路让便宜的小模型去猜让贵的大模型去批改"&gt;二、核心思路：让便宜的小模型去&amp;quot;猜&amp;quot;，让贵的大模型去&amp;quot;批改&amp;quot;&lt;/h2&gt;&#10;&lt;p&gt;打个比方。大模型是个写文章很慢但水平很高的资深编辑，小模型是个打字飞快但水平一般的实习生。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;传统方式&lt;/strong&gt;：编辑一个字一个字亲自写，写一个字想一下，慢。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;投机解码&lt;/strong&gt;：实习生先一口气猜出接下来 5 个字，编辑拿过来一次性扫一眼——&lt;strong&gt;&amp;ldquo;前 3 个对，第 4 个不对&amp;rdquo;&lt;/strong&gt;。于是前 3 个字直接采纳（几乎白赚），第 4 个字由编辑自己改，第 5 个字扔掉重来。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;关键在于：&lt;strong&gt;编辑一次性检查 5 个字的成本，和检查 1 个字的成本几乎一样&lt;/strong&gt;。因为权重的搬运量在一次前向传播里是固定的，检查 5 个 token 只是把这条数据多算几遍而已——而算力本来就是空闲的。&lt;/p&gt;</description></item><item><title>别把 2B 当小号 GPT-4：llama.cpp + Qwen 2B 的六种实战玩法</title><link>https://caozuohua.github.io/posts/2026-09-13-llamacpp-qwen2b-local-playbook/</link><pubDate>Sun, 13 Sep 2026 12:00:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-13-llamacpp-qwen2b-local-playbook/</guid><description>&lt;h1 id="别把-2b-当小号-gpt-4llamacpp--qwen-2b-的六种实战玩法"&gt;别把 2B 当小号 GPT-4：llama.cpp + Qwen 2B 的六种实战玩法&lt;/h1&gt;&#10;&lt;p&gt;在本地跑一个 2B 级别的模型（Qwen2.5-1.5B、Qwen3-1.7B 这一类），最常见的失望是「它连个像样的回答都给不出来」。于是很容易得出一个结论：小模型没用，还得上 32B 甚至 72B。&lt;/p&gt;&#10;&lt;p&gt;这个结论错在前提。&lt;strong&gt;2B 的定位从来不是&amp;quot;小号 GPT-4&amp;quot;，而是流水线里一个廉价、快速、输出确定的专用零件。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;在一台普通笔记本上，Qwen 2B（Q4_K_M 量化）的生成速度可以轻松跑到 30 tokens/s 以上，显存占用不到 2GB。这意味着它一秒能吞下几十条请求。真正的技术含量不在于它有多聪明，而在于你&lt;strong&gt;如何把任务切到它擅长的那一格&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;一句话概括本文的判断：&lt;strong&gt;不要让小模型去&amp;quot;思考&amp;quot;，要让它去&amp;quot;填空&amp;quot;。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="先确认你的跑法"&gt;先确认你的跑法&lt;/h2&gt;&#10;&lt;p&gt;下文所有玩法都建立在 &lt;code&gt;llama-server&lt;/code&gt; 上——它提供 OpenAI 兼容接口，任何现成的 SDK 都能直接接。一个够用的启动命令：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./llama-server &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -m models/Qwen2.5-1.5B-Instruct-Q4_K_M.gguf &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -np &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; --cont-batching &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --jinja &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --host 127.0.0.1 --port &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;几个参数值得单独说明：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上下文长度，小模型不要盲目开大&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-np&lt;/code&gt; &lt;code&gt;--cont-batching&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;并行槽位 + 连续批处理，是批量吞吐的关键&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--jinja&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;启用模型自带对话模板，工具调用能力依赖它&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-ctk q8_0 -ctv q8_0&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;KV Cache 量化，长上下文时能省一半显存&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--mmproj xxx.gguf&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加载视觉投影层，进入多模态模式&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="玩法一语法约束输出器--最高杠杆的一招"&gt;玩法一：语法约束输出器 —— 最高杠杆的一招&lt;/h2&gt;&#10;&lt;p&gt;llama.cpp 原生支持 &lt;strong&gt;GBNF 语法&lt;/strong&gt;与 &lt;strong&gt;JSON Schema 约束解码&lt;/strong&gt;。这是它相对于 vLLM、Ollama 最显著的差异点，也是让 2B 从&amp;quot;勉强能用&amp;quot;跳到&amp;quot;近乎可靠&amp;quot;的关键。&lt;/p&gt;</description></item></channel></rss>