<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Moe on Tarragon</title><link>https://tarrragon.github.io/blog/tags/moe/</link><description>Recent content in Moe on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 12 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/moe/index.xml" rel="self" type="application/rss+xml"/><item><title>Active Parameter</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/active-parameter/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/active-parameter/</guid><description>&lt;p>Active parameter 的核心概念是「&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/moe/" data-link-title="Mixture of Experts (MoE)" data-link-desc="把 transformer 的 FFN 層拆成多個專家、每 token 只啟用少數、總參數大但每 token 計算量小的架構">MoE&lt;/a> 模型每生成一個 token 實際參與 forward pass 的參數量」。跟模型總參數量是兩個獨立指標：&lt;strong>總參數&lt;/strong>影響記憶體需求（要全部載入）、&lt;strong>active parameter&lt;/strong> 影響推論速度上限（每 token 走的計算量）。Dense 模型的 active parameter 等於總參數；MoE 模型的 active parameter 通常只有總參數的 10% ~ 20%。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>模型命名中的 active parameter 線索：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>命名範例&lt;/th>
 &lt;th>解讀&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>Qwen3-30B-A3B&lt;/code>&lt;/td>
 &lt;td>30B 總參數、A3B 表示 active 約 3B&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Mixtral-8x7B&lt;/code>&lt;/td>
 &lt;td>8 個 7B expert、每 token top-2 啟用 ≈ 14B active（含 shared）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>Llama-3.3-70B&lt;/code>&lt;/td>
 &lt;td>Dense、active = total = 70B&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>DeepSeek-V3&lt;/code>&lt;/td>
 &lt;td>671B 總參數、active 約 37B（依官方文件）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>模型在不同維度的影響：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>受影響因素&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>記憶體需求&lt;/td>
 &lt;td>總參數 × 每權重 bytes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>生字速度上限&lt;/td>
 &lt;td>active parameter × 每 token 讀取量 / &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">memory bandwidth&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>模型能力（社群常見回報）&lt;/td>
 &lt;td>較強相關於總參數、但 active parameter 是底線&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：active parameter 跟模型能力的關係是社群常見回報、不是嚴格定理；具體模型在 coding / reasoning / 對話等任務的表現依訓練資料、RLHF、prompt 風格變化、需以 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/swe-bench/" data-link-title="SWE-bench" data-link-desc="用真實 GitHub issue 量化 LLM coding 能力的 benchmark">SWE-bench&lt;/a> 等公開 benchmark 跟自己工作流校準。&lt;/p>&lt;/blockquote>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>理解 active parameter 後可以解釋兩個現象：為什麼 30B MoE 跟 30B Dense 在同硬體下生字速度差很多（前者每 token 只走 3B active）、為什麼 MoE 模型能力對應的「等價 Dense 大小」不是簡單線性（社群常見回報接近總參數的 60% ~ 80% 等價 Dense 能力、但 case-by-case）。&lt;/p>
&lt;p>選 MoE 模型時、active parameter 是速度判讀軸、總參數是記憶體判讀軸、能力判讀靠自己工作流的 benchmark；不要直接拿「30B」跟 Dense 30B 作能力對等。&lt;/p></description><content:encoded><![CDATA[<p>Active parameter 的核心概念是「<a href="/blog/llm/knowledge-cards/moe/" data-link-title="Mixture of Experts (MoE)" data-link-desc="把 transformer 的 FFN 層拆成多個專家、每 token 只啟用少數、總參數大但每 token 計算量小的架構">MoE</a> 模型每生成一個 token 實際參與 forward pass 的參數量」。跟模型總參數量是兩個獨立指標：<strong>總參數</strong>影響記憶體需求（要全部載入）、<strong>active parameter</strong> 影響推論速度上限（每 token 走的計算量）。Dense 模型的 active parameter 等於總參數；MoE 模型的 active parameter 通常只有總參數的 10% ~ 20%。</p>
<h2 id="概念位置">概念位置</h2>
<p>模型命名中的 active parameter 線索：</p>
<table>
  <thead>
      <tr>
          <th>命名範例</th>
          <th>解讀</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Qwen3-30B-A3B</code></td>
          <td>30B 總參數、A3B 表示 active 約 3B</td>
      </tr>
      <tr>
          <td><code>Mixtral-8x7B</code></td>
          <td>8 個 7B expert、每 token top-2 啟用 ≈ 14B active（含 shared）</td>
      </tr>
      <tr>
          <td><code>Llama-3.3-70B</code></td>
          <td>Dense、active = total = 70B</td>
      </tr>
      <tr>
          <td><code>DeepSeek-V3</code></td>
          <td>671B 總參數、active 約 37B（依官方文件）</td>
      </tr>
  </tbody>
</table>
<p>模型在不同維度的影響：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>受影響因素</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>記憶體需求</td>
          <td>總參數 × 每權重 bytes</td>
      </tr>
      <tr>
          <td>生字速度上限</td>
          <td>active parameter × 每 token 讀取量 / <a href="/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">memory bandwidth</a></td>
      </tr>
      <tr>
          <td>模型能力（社群常見回報）</td>
          <td>較強相關於總參數、但 active parameter 是底線</td>
      </tr>
  </tbody>
</table>
<blockquote>
<p><strong>事實查核註</strong>：active parameter 跟模型能力的關係是社群常見回報、不是嚴格定理；具體模型在 coding / reasoning / 對話等任務的表現依訓練資料、RLHF、prompt 風格變化、需以 <a href="/blog/llm/knowledge-cards/swe-bench/" data-link-title="SWE-bench" data-link-desc="用真實 GitHub issue 量化 LLM coding 能力的 benchmark">SWE-bench</a> 等公開 benchmark 跟自己工作流校準。</p></blockquote>
<h2 id="設計責任">設計責任</h2>
<p>理解 active parameter 後可以解釋兩個現象：為什麼 30B MoE 跟 30B Dense 在同硬體下生字速度差很多（前者每 token 只走 3B active）、為什麼 MoE 模型能力對應的「等價 Dense 大小」不是簡單線性（社群常見回報接近總參數的 60% ~ 80% 等價 Dense 能力、但 case-by-case）。</p>
<p>選 MoE 模型時、active parameter 是速度判讀軸、總參數是記憶體判讀軸、能力判讀靠自己工作流的 benchmark；不要直接拿「30B」跟 Dense 30B 作能力對等。</p>
]]></content:encoded></item><item><title>Mixture of Experts (MoE)</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/moe/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/moe/</guid><description>&lt;p>MoE（Mixture of Experts）的核心概念是「把 transformer block 內的 FFN 層拆成多個專家網路、router 為每個 token 動態挑選少數啟用」。結果是模型總參數可以擴張到很大、但每個 token 實際計算量保持在「&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/active-parameter/" data-link-title="Active Parameter" data-link-desc="MoE 模型每生成一個 token 實際參與計算的參數量、跟模型總參數量不同、影響推論速度上限">active parameter&lt;/a>」這個較小的數目；同硬體下 MoE 模型常比同總參數的 Dense 模型跑得快、且能力強於同 active parameter 的 Dense 模型。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>MoE 在 transformer 架構中的位置：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">transformer block：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> ├── attention 層（所有 token 共用）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> ├── layer norm
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> └── FFN 層
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> ├── Dense 架構：所有 token 走同一組 FFN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> └── MoE 架構：FFN 拆成多個 expert、router 挑選 top-k 個啟用&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>主流 MoE 模型的設計選擇（依模型而異）：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>expert 數量&lt;/strong>：通常 8 ~ 256 個&lt;/li>
&lt;li>&lt;strong>每 token 啟用 expert 數&lt;/strong>：通常 1 ~ 2 個（top-k routing）&lt;/li>
&lt;li>&lt;strong>shared expert&lt;/strong>：部分模型保留少數所有 token 共用的 expert&lt;/li>
&lt;li>&lt;strong>total / active parameter 比&lt;/strong>：常見 5x ~ 10x（如 Qwen3-30B-A3B：30B total / 3B active）&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：MoE 架構的具體實作（router 演算法、load balancing loss、expert 並行策略等）依模型快速演進、引用前以該模型的技術報告或 paper 為準。&lt;/p>&lt;/blockquote>
&lt;p>代表性 MoE 模型（依公開資訊）：Mixtral 8x7B、DeepSeek V3、Qwen3-30B-A3B、Llama 4 Scout 等。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>理解 MoE 後可以解釋三個現象：為什麼 MoE 模型的「30B 總參數」跟「3B active parameter」是兩個獨立指標（前者影響記憶體需求、後者影響速度）、為什麼 MoE 適合 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/moe-cpu-offload/" data-link-title="MoE CPU 卸載" data-link-desc="把 Mixture-of-Experts 模型不活躍的專家層權重放在系統 RAM、用到再走 PCIe 拉回 GPU、讓有限 VRAM 跑得了更大模型">CPU 卸載&lt;/a>（不活躍的 expert 可以留在系統 RAM）、為什麼 MoE 在多 GPU 場景的並行策略跟 Dense 模型不同（expert 可以分到不同卡）。&lt;/p>
&lt;p>選 MoE 模型 vs Dense 模型、需考慮：MoE 對 RAM 容量要求較高（要放所有 expert 權重）、對 GPU 算力要求較低（每 token 走 active parameter）；Dense 對 VRAM 容量要求較低（可全載中型模型）、對 GPU 算力要求較高。詳見 &lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/moe-cpu-offload-strategy/" data-link-title="5.1 MoE 模型與 CPU 卸載策略" data-link-desc="PC 場景把 MoE 不活躍專家層留在系統 RAM 的判讀：何時值得卸載、卸幾層、對 prefill 跟生成的影響各自不同">5.1 MoE 模型與 CPU 卸載策略&lt;/a> 跟 &lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/model-selection-priority-pc/" data-link-title="5.5 PC 場景的模型選型優先順序" data-link-desc="PC 獨立 GPU 場景下、MoE 卸載讓「全載小模型 vs 卸載大 MoE」變成主要的選型軸；對應不同 VRAM 容量的模型推薦">5.5 PC 場景的模型選型優先順序&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>MoE（Mixture of Experts）的核心概念是「把 transformer block 內的 FFN 層拆成多個專家網路、router 為每個 token 動態挑選少數啟用」。結果是模型總參數可以擴張到很大、但每個 token 實際計算量保持在「<a href="/blog/llm/knowledge-cards/active-parameter/" data-link-title="Active Parameter" data-link-desc="MoE 模型每生成一個 token 實際參與計算的參數量、跟模型總參數量不同、影響推論速度上限">active parameter</a>」這個較小的數目；同硬體下 MoE 模型常比同總參數的 Dense 模型跑得快、且能力強於同 active parameter 的 Dense 模型。</p>
<h2 id="概念位置">概念位置</h2>
<p>MoE 在 transformer 架構中的位置：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">transformer block：
</span></span><span class="line"><span class="ln">2</span><span class="cl">  ├── attention 層（所有 token 共用）
</span></span><span class="line"><span class="ln">3</span><span class="cl">  ├── layer norm
</span></span><span class="line"><span class="ln">4</span><span class="cl">  └── FFN 層
</span></span><span class="line"><span class="ln">5</span><span class="cl">        ├── Dense 架構：所有 token 走同一組 FFN
</span></span><span class="line"><span class="ln">6</span><span class="cl">        └── MoE 架構：FFN 拆成多個 expert、router 挑選 top-k 個啟用</span></span></code></pre></div><p>主流 MoE 模型的設計選擇（依模型而異）：</p>
<ul>
<li><strong>expert 數量</strong>：通常 8 ~ 256 個</li>
<li><strong>每 token 啟用 expert 數</strong>：通常 1 ~ 2 個（top-k routing）</li>
<li><strong>shared expert</strong>：部分模型保留少數所有 token 共用的 expert</li>
<li><strong>total / active parameter 比</strong>：常見 5x ~ 10x（如 Qwen3-30B-A3B：30B total / 3B active）</li>
</ul>
<blockquote>
<p><strong>事實查核註</strong>：MoE 架構的具體實作（router 演算法、load balancing loss、expert 並行策略等）依模型快速演進、引用前以該模型的技術報告或 paper 為準。</p></blockquote>
<p>代表性 MoE 模型（依公開資訊）：Mixtral 8x7B、DeepSeek V3、Qwen3-30B-A3B、Llama 4 Scout 等。</p>
<h2 id="設計責任">設計責任</h2>
<p>理解 MoE 後可以解釋三個現象：為什麼 MoE 模型的「30B 總參數」跟「3B active parameter」是兩個獨立指標（前者影響記憶體需求、後者影響速度）、為什麼 MoE 適合 <a href="/blog/llm/knowledge-cards/moe-cpu-offload/" data-link-title="MoE CPU 卸載" data-link-desc="把 Mixture-of-Experts 模型不活躍的專家層權重放在系統 RAM、用到再走 PCIe 拉回 GPU、讓有限 VRAM 跑得了更大模型">CPU 卸載</a>（不活躍的 expert 可以留在系統 RAM）、為什麼 MoE 在多 GPU 場景的並行策略跟 Dense 模型不同（expert 可以分到不同卡）。</p>
<p>選 MoE 模型 vs Dense 模型、需考慮：MoE 對 RAM 容量要求較高（要放所有 expert 權重）、對 GPU 算力要求較低（每 token 走 active parameter）；Dense 對 VRAM 容量要求較低（可全載中型模型）、對 GPU 算力要求較高。詳見 <a href="/blog/llm/05-discrete-gpu/moe-cpu-offload-strategy/" data-link-title="5.1 MoE 模型與 CPU 卸載策略" data-link-desc="PC 場景把 MoE 不活躍專家層留在系統 RAM 的判讀：何時值得卸載、卸幾層、對 prefill 跟生成的影響各自不同">5.1 MoE 模型與 CPU 卸載策略</a> 跟 <a href="/blog/llm/05-discrete-gpu/model-selection-priority-pc/" data-link-title="5.5 PC 場景的模型選型優先順序" data-link-desc="PC 獨立 GPU 場景下、MoE 卸載讓「全載小模型 vs 卸載大 MoE」變成主要的選型軸；對應不同 VRAM 容量的模型推薦">5.5 PC 場景的模型選型優先順序</a>。</p>
]]></content:encoded></item><item><title>MoE CPU 卸載</title><link>https://tarrragon.github.io/blog/llm/knowledge-cards/moe-cpu-offload/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/knowledge-cards/moe-cpu-offload/</guid><description>&lt;p>MoE CPU 卸載的核心概念是「&lt;a href="https://en.wikipedia.org/wiki/Mixture_of_experts">Mixture-of-Experts&lt;/a> 模型每個 token 只啟用少數專家、把不活躍的專家權重留在系統 RAM、用到再走 PCIe 拉回 GPU」。它讓 16GB VRAM 卡能載入 30B / 70B 等級的 MoE 模型、是 &lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/" data-link-title="模組五：Windows / Linux &amp;#43; 獨立 GPU" data-link-desc="消費級 PC（Windows / Linux &amp;#43; NVIDIA / AMD 獨立 GPU）跑本地 LLM 的硬體判讀、MoE CPU 卸載、KV cache 量化與 llama.cpp 調參">獨立 GPU 場景&lt;/a> 相對 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/unified-memory/" data-link-title="Unified Memory Architecture" data-link-desc="Apple Silicon 讓 CPU / GPU / NE 共用同一塊記憶體：跑大模型的優勢來源">統一記憶體&lt;/a> 場景多出的工程選項。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>MoE 卸載屬於「推論時的權重位置管理」、跟 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a> 屬於「權重精度壓縮」是兩個獨立維度、可以疊加（如 30B MoE Q4 + 卸載部分層、模型精度跟記憶體位置同時被處理）。它跟 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache&lt;/a> 量化是 PC 場景常一起使用的兩個工具：卸載騰出 VRAM、KV cache 量化讓騰出的 VRAM 拿去開大 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/context-window/" data-link-title="Context Window" data-link-desc="模型一次能處理的最大 token 數量：prompt 加生成的總和上限">context window&lt;/a>。&lt;/p>
&lt;p>在 llama.cpp 中、對應的旗標是 &lt;code>--n-cpu-moe &amp;lt;N&amp;gt;&lt;/code>、把 N 層的 MoE 專家權重保留在 CPU 記憶體。例如 &lt;code>--n-cpu-moe 30&lt;/code> 表示 30 層的專家層留 RAM、其餘走 GPU。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>以 Qwen3-30B-A3B Q4_K_M（模型體積 10 GB 級、active parameter 約 3B 等級）為例、不同卸載策略下記憶體分布與生字速度的相對方向（具體數值依驅動、CUDA backend、模型版本、PCIe 版本變化、本表用於說明趨勢、不是嚴格 benchmark）：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>配置&lt;/th>
 &lt;th>卸載策略&lt;/th>
 &lt;th>VRAM 佔用方向&lt;/th>
 &lt;th>RAM 佔用方向&lt;/th>
 &lt;th>生字速度方向（同卡比較）&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>全載 VRAM&lt;/td>
 &lt;td>&lt;code>--n-cpu-moe 0&lt;/code>&lt;/td>
 &lt;td>接近 VRAM 上限&lt;/td>
 &lt;td>系統正常&lt;/td>
 &lt;td>上限取決於 VRAM 頻寬&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>中度卸載&lt;/td>
 &lt;td>&lt;code>--n-cpu-moe ~20&lt;/code>&lt;/td>
 &lt;td>顯著下降&lt;/td>
 &lt;td>上升至 10 GB 級&lt;/td>
 &lt;td>較全載小幅下降&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>重度卸載&lt;/td>
 &lt;td>&lt;code>--n-cpu-moe ~30&lt;/code>&lt;/td>
 &lt;td>大幅下降&lt;/td>
 &lt;td>上升較多&lt;/td>
 &lt;td>較全載明顯下降&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>極限卸載&lt;/td>
 &lt;td>&lt;code>--n-cpu-moe ~40&lt;/code>&lt;/td>
 &lt;td>接近最低&lt;/td>
 &lt;td>上升最多&lt;/td>
 &lt;td>較全載大幅下降&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：上表是趨勢示意、不是經本文系統實測的數值。實際數值依顯卡型號、PCIe 版本、CUDA backend、GGUF 量化版本、&lt;code>-ngl&lt;/code> 設定、context 長度與 batch size 變化、建議用 &lt;code>llama-bench&lt;/code> 或實際工作流校準。&lt;/p>&lt;/blockquote>
&lt;p>社群常見的觀察是：MoE 卸載對生字速度的衰減幅度、相對於「Dense 模型把同樣比例的層卸載到 CPU」較小、原因是 MoE 每 token 只啟用少數專家、PCIe 上的權重傳輸量也較少；具體幅度依模型架構（active parameter 比例、專家數）變化。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>理解 MoE 卸載後、可以解釋三個 PC 場景的現象：16GB VRAM 卡能載入 30B 級 MoE 模型（透過部分卸載而非全載 VRAM）、PC 場景 64GB RAM 相對 32GB 在 MoE 卸載空間上明顯更寬裕（可卸載更多層）、Mac 統一記憶體場景較少需要「卸載」這個概念（VRAM 跟 RAM 共用、不需要在兩個區域之間搬資料）。&lt;/p></description><content:encoded><![CDATA[<p>MoE CPU 卸載的核心概念是「<a href="https://en.wikipedia.org/wiki/Mixture_of_experts">Mixture-of-Experts</a> 模型每個 token 只啟用少數專家、把不活躍的專家權重留在系統 RAM、用到再走 PCIe 拉回 GPU」。它讓 16GB VRAM 卡能載入 30B / 70B 等級的 MoE 模型、是 <a href="/blog/llm/05-discrete-gpu/" data-link-title="模組五：Windows / Linux &#43; 獨立 GPU" data-link-desc="消費級 PC（Windows / Linux &#43; NVIDIA / AMD 獨立 GPU）跑本地 LLM 的硬體判讀、MoE CPU 卸載、KV cache 量化與 llama.cpp 調參">獨立 GPU 場景</a> 相對 <a href="/blog/llm/knowledge-cards/unified-memory/" data-link-title="Unified Memory Architecture" data-link-desc="Apple Silicon 讓 CPU / GPU / NE 共用同一塊記憶體：跑大模型的優勢來源">統一記憶體</a> 場景多出的工程選項。</p>
<h2 id="概念位置">概念位置</h2>
<p>MoE 卸載屬於「推論時的權重位置管理」、跟 <a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a> 屬於「權重精度壓縮」是兩個獨立維度、可以疊加（如 30B MoE Q4 + 卸載部分層、模型精度跟記憶體位置同時被處理）。它跟 <a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a> 量化是 PC 場景常一起使用的兩個工具：卸載騰出 VRAM、KV cache 量化讓騰出的 VRAM 拿去開大 <a href="/blog/llm/knowledge-cards/context-window/" data-link-title="Context Window" data-link-desc="模型一次能處理的最大 token 數量：prompt 加生成的總和上限">context window</a>。</p>
<p>在 llama.cpp 中、對應的旗標是 <code>--n-cpu-moe &lt;N&gt;</code>、把 N 層的 MoE 專家權重保留在 CPU 記憶體。例如 <code>--n-cpu-moe 30</code> 表示 30 層的專家層留 RAM、其餘走 GPU。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>以 Qwen3-30B-A3B Q4_K_M（模型體積 10 GB 級、active parameter 約 3B 等級）為例、不同卸載策略下記憶體分布與生字速度的相對方向（具體數值依驅動、CUDA backend、模型版本、PCIe 版本變化、本表用於說明趨勢、不是嚴格 benchmark）：</p>
<table>
  <thead>
      <tr>
          <th>配置</th>
          <th>卸載策略</th>
          <th>VRAM 佔用方向</th>
          <th>RAM 佔用方向</th>
          <th>生字速度方向（同卡比較）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>全載 VRAM</td>
          <td><code>--n-cpu-moe 0</code></td>
          <td>接近 VRAM 上限</td>
          <td>系統正常</td>
          <td>上限取決於 VRAM 頻寬</td>
      </tr>
      <tr>
          <td>中度卸載</td>
          <td><code>--n-cpu-moe ~20</code></td>
          <td>顯著下降</td>
          <td>上升至 10 GB 級</td>
          <td>較全載小幅下降</td>
      </tr>
      <tr>
          <td>重度卸載</td>
          <td><code>--n-cpu-moe ~30</code></td>
          <td>大幅下降</td>
          <td>上升較多</td>
          <td>較全載明顯下降</td>
      </tr>
      <tr>
          <td>極限卸載</td>
          <td><code>--n-cpu-moe ~40</code></td>
          <td>接近最低</td>
          <td>上升最多</td>
          <td>較全載大幅下降</td>
      </tr>
  </tbody>
</table>
<blockquote>
<p><strong>事實查核註</strong>：上表是趨勢示意、不是經本文系統實測的數值。實際數值依顯卡型號、PCIe 版本、CUDA backend、GGUF 量化版本、<code>-ngl</code> 設定、context 長度與 batch size 變化、建議用 <code>llama-bench</code> 或實際工作流校準。</p></blockquote>
<p>社群常見的觀察是：MoE 卸載對生字速度的衰減幅度、相對於「Dense 模型把同樣比例的層卸載到 CPU」較小、原因是 MoE 每 token 只啟用少數專家、PCIe 上的權重傳輸量也較少；具體幅度依模型架構（active parameter 比例、專家數）變化。</p>
<h2 id="設計責任">設計責任</h2>
<p>理解 MoE 卸載後、可以解釋三個 PC 場景的現象：16GB VRAM 卡能載入 30B 級 MoE 模型（透過部分卸載而非全載 VRAM）、PC 場景 64GB RAM 相對 32GB 在 MoE 卸載空間上明顯更寬裕（可卸載更多層）、Mac 統一記憶體場景較少需要「卸載」這個概念（VRAM 跟 RAM 共用、不需要在兩個區域之間搬資料）。</p>
<p>設定 PC 推論伺服器時、卸載層數通常跟 KV cache 量化、context 長度、併發數一起調：先估算想開的 context 長度、扣掉 KV cache 體積算出 VRAM 餘量、再選卸載層數讓模型剛好放得進。詳見 <a href="/blog/llm/05-discrete-gpu/vram-ram-budget/" data-link-title="5.0 VRAM &#43; RAM 分層預算" data-link-desc="PC 獨立 GPU 場景的記憶體預算判讀：VRAM 是快的世界、RAM 是大的世界、PCIe 把兩個世界連起來">5.0 VRAM + RAM 分層預算</a>。</p>
]]></content:encoded></item><item><title>5.1 MoE 模型與 CPU 卸載策略</title><link>https://tarrragon.github.io/blog/llm/05-discrete-gpu/moe-cpu-offload-strategy/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/05-discrete-gpu/moe-cpu-offload-strategy/</guid><description>&lt;p>MoE CPU 卸載是 PC 場景相對 Mac 統一記憶體場景多出來的工程選項：把 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/moe/" data-link-title="Mixture of Experts (MoE)" data-link-desc="把 transformer 的 FFN 層拆成多個專家、每 token 只啟用少數、總參數大但每 token 計算量小的架構">Mixture-of-Experts (MoE)&lt;/a> 模型不活躍的專家層權重留在系統 RAM、活躍時走 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/pcie/" data-link-title="PCIe" data-link-desc="PC 上連接 GPU 跟主機板的高速序列匯流排、影響模型載入速度跟 MoE 卸載時的推論吞吐">PCIe&lt;/a> 拉到 GPU。本章不再重複&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/moe-cpu-offload/" data-link-title="MoE CPU 卸載" data-link-desc="把 Mixture-of-Experts 模型不活躍的專家層權重放在系統 RAM、用到再走 PCIe 拉回 GPU、讓有限 VRAM 跑得了更大模型">卡片定義&lt;/a>、而是處理「實際要不要用、用多少」的判讀。卸載判讀的關鍵變數是 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/active-parameter/" data-link-title="Active Parameter" data-link-desc="MoE 模型每生成一個 token 實際參與計算的參數量、跟模型總參數量不同、影響推論速度上限">active parameter&lt;/a> 比例。&lt;/p>
&lt;p>讀完本章後、你應該能對自己的硬體配置回答：這個模型適不適合用 MoE 卸載、卸幾層是合理起點、卸到讓 prefill 變慢時該怎麼調、跟 KV cache 量化怎麼搭配。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;ol>
&lt;li>理解 MoE 架構為什麼適合卸載（active parameter 少 ≠ 模型小）。&lt;/li>
&lt;li>判讀「該不該用 MoE 卸載」的工作流類型。&lt;/li>
&lt;li>知道卸載層數的調參範圍跟兩端的徵兆。&lt;/li>
&lt;li>區分卸載對 prefill 跟 generation 的影響差異。&lt;/li>
&lt;li>認識 llama.cpp 的 &lt;code>--n-cpu-moe&lt;/code> 旗標與相關旗標的協作。&lt;/li>
&lt;/ol>
&lt;h2 id="moe-架構為什麼適合卸載">MoE 架構為什麼適合卸載&lt;/h2>
&lt;p>MoE 模型適合卸載的關鍵是「總參數大、active parameter 小」這個結構特性：每個 token 只啟用少數專家、走 PCIe 的權重量遠小於 Dense 模型卸載同比例層數的傳輸量。卸載因此變成可行的工程選項、而不是「速度大幅下降的退路」。&lt;/p>
&lt;p>對比 Dense 模型：Dense 模型每個 token 都會用到所有層的所有權重、任何一層放到 RAM 都會讓每個 token 等 PCIe 拉回來、生字速度衰減較明顯。MoE 在每個 transformer block 內把 FFN（feed-forward network）拆成多個「專家」、router 為每個 token 挑選少數啟用、不啟用的專家權重留在 RAM 不參與計算。&lt;/p>
&lt;p>MoE 卸載成立的三個結構要點：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>總參數大、active parameter 小&lt;/strong>：例如 Qwen3-30B-A3B 的 A3B 表示 active parameter 約 3B、總參數約 30B、每個 token 只走 ~10% 的權重。&lt;/li>
&lt;li>&lt;strong>每 token 走 PCIe 的權重量大幅縮減&lt;/strong>：不活躍的專家權重留在 RAM、不參與本 token 的計算。具體幅度依模型 active 比例變化、可透過 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a> 再進一步壓縮。&lt;/li>
&lt;li>&lt;strong>共用層（&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/attention/" data-link-title="Attention" data-link-desc="Transformer 內部讓每個 token 對其他 token 加權平均的核心機制、形成 KV cache 跟 context window 的計算基礎">attention&lt;/a>、layernorm）放 VRAM&lt;/strong>：這些是每 token 必經、放 VRAM 確保速度上限不被拉低、跟 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache&lt;/a> 一起佔用 VRAM 主要區段。&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：MoE 模型的 active / total parameter 比例依模型而異（Qwen3-30B-A3B、Llama 4 Scout、DeepSeek V3 等各有不同設計）。具體比例見各模型的官方技術報告或 Hugging Face model card。&lt;/p>&lt;/blockquote>
&lt;p>對照 Dense 模型的卸載（在 llama.cpp 中、Dense 模型可以用 &lt;code>-ngl&lt;/code> 控制放 GPU 的層數、剩下走 CPU）：Dense 卸載每 token 都要傳輸卸載層權重、生字速度衰減較明顯；MoE 卸載每 token 只傳輸啟用的專家、衰減較小。社群常見回報指出「MoE 卸載比 Dense 同比例卸載友善」、但具體幅度依模型架構（專家數、active 比例）變化、需用 &lt;code>llama-bench&lt;/code> 校準。&lt;/p></description><content:encoded><![CDATA[<p>MoE CPU 卸載是 PC 場景相對 Mac 統一記憶體場景多出來的工程選項：把 <a href="/blog/llm/knowledge-cards/moe/" data-link-title="Mixture of Experts (MoE)" data-link-desc="把 transformer 的 FFN 層拆成多個專家、每 token 只啟用少數、總參數大但每 token 計算量小的架構">Mixture-of-Experts (MoE)</a> 模型不活躍的專家層權重留在系統 RAM、活躍時走 <a href="/blog/llm/knowledge-cards/pcie/" data-link-title="PCIe" data-link-desc="PC 上連接 GPU 跟主機板的高速序列匯流排、影響模型載入速度跟 MoE 卸載時的推論吞吐">PCIe</a> 拉到 GPU。本章不再重複<a href="/blog/llm/knowledge-cards/moe-cpu-offload/" data-link-title="MoE CPU 卸載" data-link-desc="把 Mixture-of-Experts 模型不活躍的專家層權重放在系統 RAM、用到再走 PCIe 拉回 GPU、讓有限 VRAM 跑得了更大模型">卡片定義</a>、而是處理「實際要不要用、用多少」的判讀。卸載判讀的關鍵變數是 <a href="/blog/llm/knowledge-cards/active-parameter/" data-link-title="Active Parameter" data-link-desc="MoE 模型每生成一個 token 實際參與計算的參數量、跟模型總參數量不同、影響推論速度上限">active parameter</a> 比例。</p>
<p>讀完本章後、你應該能對自己的硬體配置回答：這個模型適不適合用 MoE 卸載、卸幾層是合理起點、卸到讓 prefill 變慢時該怎麼調、跟 KV cache 量化怎麼搭配。</p>
<h2 id="本章目標">本章目標</h2>
<ol>
<li>理解 MoE 架構為什麼適合卸載（active parameter 少 ≠ 模型小）。</li>
<li>判讀「該不該用 MoE 卸載」的工作流類型。</li>
<li>知道卸載層數的調參範圍跟兩端的徵兆。</li>
<li>區分卸載對 prefill 跟 generation 的影響差異。</li>
<li>認識 llama.cpp 的 <code>--n-cpu-moe</code> 旗標與相關旗標的協作。</li>
</ol>
<h2 id="moe-架構為什麼適合卸載">MoE 架構為什麼適合卸載</h2>
<p>MoE 模型適合卸載的關鍵是「總參數大、active parameter 小」這個結構特性：每個 token 只啟用少數專家、走 PCIe 的權重量遠小於 Dense 模型卸載同比例層數的傳輸量。卸載因此變成可行的工程選項、而不是「速度大幅下降的退路」。</p>
<p>對比 Dense 模型：Dense 模型每個 token 都會用到所有層的所有權重、任何一層放到 RAM 都會讓每個 token 等 PCIe 拉回來、生字速度衰減較明顯。MoE 在每個 transformer block 內把 FFN（feed-forward network）拆成多個「專家」、router 為每個 token 挑選少數啟用、不啟用的專家權重留在 RAM 不參與計算。</p>
<p>MoE 卸載成立的三個結構要點：</p>
<ol>
<li><strong>總參數大、active parameter 小</strong>：例如 Qwen3-30B-A3B 的 A3B 表示 active parameter 約 3B、總參數約 30B、每個 token 只走 ~10% 的權重。</li>
<li><strong>每 token 走 PCIe 的權重量大幅縮減</strong>：不活躍的專家權重留在 RAM、不參與本 token 的計算。具體幅度依模型 active 比例變化、可透過 <a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a> 再進一步壓縮。</li>
<li><strong>共用層（<a href="/blog/llm/knowledge-cards/attention/" data-link-title="Attention" data-link-desc="Transformer 內部讓每個 token 對其他 token 加權平均的核心機制、形成 KV cache 跟 context window 的計算基礎">attention</a>、layernorm）放 VRAM</strong>：這些是每 token 必經、放 VRAM 確保速度上限不被拉低、跟 <a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a> 一起佔用 VRAM 主要區段。</li>
</ol>
<blockquote>
<p><strong>事實查核註</strong>：MoE 模型的 active / total parameter 比例依模型而異（Qwen3-30B-A3B、Llama 4 Scout、DeepSeek V3 等各有不同設計）。具體比例見各模型的官方技術報告或 Hugging Face model card。</p></blockquote>
<p>對照 Dense 模型的卸載（在 llama.cpp 中、Dense 模型可以用 <code>-ngl</code> 控制放 GPU 的層數、剩下走 CPU）：Dense 卸載每 token 都要傳輸卸載層權重、生字速度衰減較明顯；MoE 卸載每 token 只傳輸啟用的專家、衰減較小。社群常見回報指出「MoE 卸載比 Dense 同比例卸載友善」、但具體幅度依模型架構（專家數、active 比例）變化、需用 <code>llama-bench</code> 校準。</p>
<h2 id="何時值得用-moe-卸載">何時值得用 MoE 卸載</h2>
<p>MoE 卸載的主要用途是「處理 VRAM 容量不足以全載目標模型」的場景。當模型已能全載 VRAM、卸載通常會降低生字速度而沒有對應的收益。下表整理常見的判讀情境：</p>
<table>
  <thead>
      <tr>
          <th>場景</th>
          <th>是否值得卸載</th>
          <th>主要考量</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>16GB VRAM 想跑 30B 級 MoE 模型</td>
          <td>值得</td>
          <td>沒卸載則 VRAM 不足以載入</td>
      </tr>
      <tr>
          <td>24GB VRAM 跑 30B 級 MoE</td>
          <td>視 context 跟併發數需求</td>
          <td>全載也許可行、卸載可換取更大 context 或更多併發</td>
      </tr>
      <tr>
          <td>16GB VRAM 跑 14B Dense</td>
          <td>通常不需要</td>
          <td>模型已可全載 VRAM、卸載反而降速</td>
      </tr>
      <tr>
          <td>跑 70B 級 MoE 模型</td>
          <td>多數情況需要卸載</td>
          <td>即使 32GB VRAM 也通常需要部分卸載</td>
      </tr>
      <tr>
          <td>高頻短補完工作流（追求即時補完）</td>
          <td>評估、可能不適合</td>
          <td>卸載會降速、若工作流對即時體感敏感、改用較小 Dense 模型全載可能更合適</td>
      </tr>
      <tr>
          <td>長 context 工作流（大型 codebase RAG、長對話）</td>
          <td>值得</td>
          <td>卸載換 VRAM 給 KV cache、能開更大 context</td>
      </tr>
  </tbody>
</table>
<p>判讀原則：<strong>先確認瓶頸是「模型載不進」還是「速度不夠」</strong>。前者卸載是解法、後者卸載通常會惡化問題、應該往別的方向調（選較小模型、升級顯卡、提高量化等級）。</p>
<h2 id="卸載層數的調參範圍">卸載層數的調參範圍</h2>
<p>llama.cpp 的 <code>--n-cpu-moe &lt;N&gt;</code> 旗標表示「把 N 層的 MoE 專家權重放 CPU 記憶體」。實際範圍取決於模型結構：</p>
<ol>
<li><strong>下限</strong>：0、表示所有 MoE 專家層都在 VRAM。對 16GB VRAM + 30B MoE 而言通常不可行（VRAM 不足）。</li>
<li><strong>上限</strong>：模型的 MoE 層總數、表示所有 MoE 層的專家都在 CPU。對應 VRAM 佔用最低、生字速度也最低。</li>
</ol>
<p>調參的兩端徵兆：</p>
<table>
  <thead>
      <tr>
          <th>徵兆</th>
          <th>表示</th>
          <th>建議調整</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>llama.cpp 報 CUDA OOM、模型載入失敗</td>
          <td>VRAM 餘量不足</td>
          <td>增加 <code>--n-cpu-moe</code>、把更多層放 RAM</td>
      </tr>
      <tr>
          <td>模型載入成功、但 KV cache 開不大、context 受限</td>
          <td>VRAM 餘量足、但邊際空間少</td>
          <td>增加 <code>--n-cpu-moe</code>、或開 KV cache 量化</td>
      </tr>
      <tr>
          <td>生成速度顯著低於對應 VRAM 頻寬的理論值</td>
          <td>卸載過多、PCIe 跟 CPU 在拖速</td>
          <td>減少 <code>--n-cpu-moe</code>、把更多層放回 VRAM</td>
      </tr>
      <tr>
          <td>系統 RAM 接近上限、page cache 被擠壓</td>
          <td>卸載量超出 RAM 容量</td>
          <td>減少 <code>--n-cpu-moe</code>、或升級 RAM</td>
      </tr>
  </tbody>
</table>
<p>常見起點：對 16GB VRAM + 64GB RAM 跑 30B 級 MoE 模型、社群常見回報的 <code>--n-cpu-moe</code> 落在 25 ~ 35 區間、具體值依模型 MoE 層數而定。建議從中間值（如 30）起步、再依 OOM / 速度徵兆雙向調整。</p>
<h2 id="卸載對-prefill-跟-generation-的影響不同">卸載對 prefill 跟 generation 的影響不同</h2>
<p><a href="/blog/llm/knowledge-cards/prefill/" data-link-title="Prefill" data-link-desc="Prompt 首次處理時的計算階段：把整段輸入跑過模型、產生 KV cache">prefill</a> 跟 generation 是兩個不同的計算階段、對卸載的反應也不同：</p>
<ol>
<li><strong>prefill（處理 prompt）</strong>：一次處理整個 prompt、可用 batch 平行化、屬於 compute-bound 階段。卸載對 prefill 的衰減相對小、因為 batch 大可以攤平 PCIe 傳輸成本。</li>
<li><strong>generation（生字）</strong>：一個 token 接一個 token、每 token 都要走完整個 forward pass、屬於 memory-bandwidth-bound 階段。卸載對 generation 的衰減較明顯、因為每 token 都要走 PCIe 拉部分權重。</li>
</ol>
<p>實務影響：</p>
<ul>
<li><strong>長 prompt + 短回答</strong>（如「總結這份 codebase」）：prefill 主導總時間、卸載的代價較小。</li>
<li><strong>短 prompt + 長回答</strong>（如「從 spec 寫一段功能」）：generation 主導、卸載的代價較大、可能適合用較小 Dense 模型全載。</li>
<li><strong>互動式補完</strong>（每幾秒一次短 prompt 短回答）：prefill 跟 generation 都重要、卸載的整體成本依工作流節奏而定。</li>
</ul>
<blockquote>
<p><strong>事實查核註</strong>：prefill 跟 generation 的具體 t/s 差異依模型、量化、batch size、CUDA backend 變化；建議用 <code>llama-bench</code> 或實際工作流任務分別校準。</p></blockquote>
<h2 id="跟-kv-cache-量化的協調">跟 KV cache 量化的協調</h2>
<p>MoE 卸載騰出 VRAM、KV cache 量化讓騰出的 VRAM 拿去開大 context。兩者的關係是「先後」而非「替代」：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">總 VRAM 預算
</span></span><span class="line"><span class="ln">2</span><span class="cl">├── 模型權重（活躍部分）= 由 --n-cpu-moe 決定
</span></span><span class="line"><span class="ln">3</span><span class="cl">├── KV cache             = 由 -c (context) × cache-type 決定
</span></span><span class="line"><span class="ln">4</span><span class="cl">└── 推論中間結果         = 通常固定</span></span></code></pre></div><p>調參順序（社群常見做法）：</p>
<ol>
<li><strong>先決定目標 context 長度</strong>：例如 32K、128K、256K。</li>
<li><strong>估算 KV cache 體積</strong>：依模型 attention head 配置、context 長度、量化等級。具體值用 llama.cpp 啟動時的 log 確認。</li>
<li><strong>算出 VRAM 餘量</strong>：總 VRAM − KV cache − 推論中間結果。</li>
<li><strong>決定 <code>--n-cpu-moe</code></strong>：讓「模型權重活躍部分」放得進 VRAM 餘量。</li>
</ol>
<p>如果做完上面四步發現 VRAM 仍不夠、就回頭調 KV cache 量化（K=fp16 → Q8 → Q4_0）、或降低 context 長度。</p>
<p>詳細的 KV cache 量化判讀見 <a href="/blog/llm/05-discrete-gpu/kv-cache-quantization-strategy/" data-link-title="5.2 KV cache 量化策略" data-link-desc="PC 場景用 K=Q8 / V=Q4 等量化把 KV cache 壓縮、騰出 VRAM 開大 context window 或加併發數的判讀">5.2 KV cache 量化策略</a>。</p>
<h2 id="llamacpp-的相關旗標">llama.cpp 的相關旗標</h2>
<p>跑 MoE 卸載時、常一起出現的旗標：</p>
<table>
  <thead>
      <tr>
          <th>旗標</th>
          <th>作用</th>
          <th>對 MoE 卸載的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>-ngl &lt;N&gt;</code></td>
          <td>把 N 層丟到 GPU（Dense + MoE 共用層）</td>
          <td>通常設成 99 或 max、表示所有可放 GPU 的都放 GPU</td>
      </tr>
      <tr>
          <td><code>--n-cpu-moe &lt;N&gt;</code></td>
          <td>把 N 層的 MoE 專家權重保留在 CPU 記憶體</td>
          <td>MoE 卸載的核心旗標</td>
      </tr>
      <tr>
          <td><code>--cache-type-k &lt;type&gt;</code></td>
          <td>KV cache 中 K 的量化（如 <code>q8_0</code>、<code>q4_0</code>）</td>
          <td>用於騰出 VRAM 給更大 context</td>
      </tr>
      <tr>
          <td><code>--cache-type-v &lt;type&gt;</code></td>
          <td>KV cache 中 V 的量化</td>
          <td>用於騰出 VRAM 給更大 context</td>
      </tr>
      <tr>
          <td><code>-c &lt;N&gt;</code></td>
          <td>context window 大小</td>
          <td>跟 KV cache 體積線性相關</td>
      </tr>
      <tr>
          <td><code>--parallel &lt;N&gt;</code></td>
          <td>併發處理數</td>
          <td>高併發會增加 KV cache 體積、需重新調預算</td>
      </tr>
      <tr>
          <td><code>-b &lt;N&gt;</code> / <code>-ub &lt;N&gt;</code></td>
          <td>batch size / micro-batch size</td>
          <td>影響 prefill 速度與記憶體用量</td>
      </tr>
  </tbody>
</table>
<p>完整旗標清單見 <a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md">llama.cpp 官方文件</a>；版本更新後參數名稱可能變動、以實際 <code>llama-server --help</code> 為準。</p>
<h2 id="給讀者的判讀步驟">給讀者的判讀步驟</h2>
<p>實際設定 MoE 卸載時、可以照下面的步驟調：</p>
<ol>
<li>
<p><strong>確認模型適合 MoE 卸載</strong>：模型是 MoE 架構（如 Qwen3-30B-A3B、Llama 4 Scout、DeepSeek V3 系列）、且總參數量明顯超過 VRAM 容量。</p>
</li>
<li>
<p><strong>抓取 GGUF 量化版本</strong>：寫 code 場景的常見起點是 Q4_K_M、品質 / 體積平衡較好。</p>
</li>
<li>
<p><strong>設定起點旗標</strong>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">llama-server -m &lt;model.gguf&gt; -ngl <span class="m">99</span> --n-cpu-moe <span class="m">30</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  --cache-type-k q8_0 --cache-type-v q4_0 -c <span class="m">32768</span></span></span></code></pre></div></li>
<li>
<p><strong>觀察啟動 log</strong>：llama.cpp 會列出「實際載入 VRAM 的層數」「KV cache 體積」「剩餘 VRAM」。</p>
</li>
<li>
<p><strong>跑 <code>llama-bench</code> 校準</strong>：用同樣的旗標跑 prefill / generation benchmark、記錄 t/s。</p>
</li>
<li>
<p><strong>依瓶頸調整</strong>：</p>
<ul>
<li>想開更大 context → 加大 <code>-c</code>、若 VRAM 不足則加 <code>--n-cpu-moe</code> 或量化 KV cache</li>
<li>想要更快生字 → 減 <code>--n-cpu-moe</code>、確認 VRAM 仍夠</li>
<li>VRAM OOM → 加 <code>--n-cpu-moe</code> 或降量化</li>
</ul>
</li>
</ol>
<p>完成這六步後、再進入 <a href="/blog/llm/05-discrete-gpu/llama-cpp-on-pc/" data-link-title="5.3 llama.cpp 在 PC 上" data-link-desc="CUDA / ROCm build 取得、核心旗標地圖、llama-bench 校準、多卡 tensor split 的入門設定">5.3 llama.cpp 在 PC 上</a> 了解更全面的旗標組合。</p>
<h2 id="下一章">下一章</h2>
<p>下一章：<a href="/blog/llm/05-discrete-gpu/kv-cache-quantization-strategy/" data-link-title="5.2 KV cache 量化策略" data-link-desc="PC 場景用 K=Q8 / V=Q4 等量化把 KV cache 壓縮、騰出 VRAM 開大 context window 或加併發數的判讀">5.2 KV cache 量化策略</a>、深入 K=Q8 / V=Q4 跟 context 長度的權衡。</p>
]]></content:encoded></item><item><title>模組五：Windows / Linux + 獨立 GPU</title><link>https://tarrragon.github.io/blog/llm/05-discrete-gpu/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/05-discrete-gpu/</guid><description>&lt;p>本模組的核心目標是把 &lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/" data-link-title="模組零：基礎知識與心智模型" data-link-desc="建立本地 LLM 的心智模型、釐清 MLX / MTP / oMLX 等常被混淆的術語、Apple Silicon 記憶體現實">模組零&lt;/a> 的心智模型落地到「Windows / Linux + 獨立 GPU」這條硬體路線。跟 &lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/" data-link-title="模組一：本地 LLM 服務的安裝與應用" data-link-desc="Ollama、LM Studio、llama.cpp 的安裝與差異、VS Code &amp;#43; Continue.dev 整合、模型選型與期望管理">模組一&lt;/a>（Apple Silicon Mac）平行、共用模組零的詞彙跟 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/" data-link-title="Knowledge Cards" data-link-desc="用原子化卡片整理本地 LLM 寫 code 場景所需的概念詞彙">knowledge-cards&lt;/a>、但硬體判讀模型本質不同：Mac 是統一記憶體一塊預算、PC 是 VRAM + 系統 RAM 兩塊分層預算、要分開判讀。&lt;/p>
&lt;p>讀完本模組後、你應該能對自己這台 PC 直接回答：能跑哪些模型、要不要卸載 MoE 專家層到 RAM、KV cache 該量化到哪一級、context 能開多大、併發數能拉到多少。&lt;/p>
&lt;h2 id="為什麼-pc-路線值得獨立模組">為什麼 PC 路線值得獨立模組&lt;/h2>
&lt;p>Mac 統一記憶體的判讀模型把「能載入多大模型」這個問題收斂到一塊預算。PC 場景被獨立 VRAM 拆成兩個記憶體區域、判讀軸增加：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>VRAM&lt;/strong>：高頻寬區。常見消費級 NVIDIA 卡的廠商標稱頻寬大致落在數百 GB/s 到 1 TB/s 級的區間（例如 RTX 5060 Ti 16GB 標稱約 448 GB/s、RTX 5070 Ti 標稱約 896 GB/s、以廠商規格表為準）、生字速度上限主要受 VRAM 頻寬影響。&lt;/li>
&lt;li>&lt;strong>系統 RAM&lt;/strong>：高容量區。DDR5 6000 雙通道的標稱頻寬約 96 GB/s（依主機板與時序變化）、相對 VRAM 慢約一個量級、但 64GB / 128GB 在 PC 平台的擴充成本相對低、適合放容量需求大但存取頻率較低的權重。&lt;/li>
&lt;li>&lt;strong>PCIe&lt;/strong>：兩個區域之間的連線。PCIe 5.0 x16 廠商標稱單向約 64 GB/s（PCIe 4.0 x16 約一半）；實際傳輸吞吐受驅動、檔案系統與工作流影響。&lt;/li>
&lt;/ol>
&lt;p>這三層差異產生兩個 Mac 場景上較少出現的工程選項：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/moe-cpu-offload/" data-link-title="MoE CPU 卸載" data-link-desc="把 Mixture-of-Experts 模型不活躍的專家層權重放在系統 RAM、用到再走 PCIe 拉回 GPU、讓有限 VRAM 跑得了更大模型">MoE 模型 + 專家層 CPU 卸載&lt;/a>&lt;/strong>：MoE 模型每個 token 只啟用少數專家、把不活躍的專家權重放在系統 RAM、用到再走 PCIe 拉回 GPU。讓 16GB VRAM 卡能載入 30B / 70B 等級的 MoE 模型。&lt;/li>
&lt;li>&lt;strong>KV cache 量化開大 context&lt;/strong>：把 K cache 量化到 Q8、V cache 量化到 Q4、KV cache 體積大幅壓縮、騰出的 VRAM 可用於開大 context window 或提高併發數。&lt;/li>
&lt;/ol>
&lt;p>這兩個選項在 Mac 統一記憶體場景下較少使用（VRAM 跟 RAM 共用、不需在兩個區域之間搬資料）、在 PC 場景則是常用的調參工具。&lt;/p>
&lt;h2 id="章節列表">章節列表&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>章節&lt;/th>
 &lt;th>主題&lt;/th>
 &lt;th>關鍵收穫&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/vram-ram-budget/" data-link-title="5.0 VRAM &amp;#43; RAM 分層預算" data-link-desc="PC 獨立 GPU 場景的記憶體預算判讀：VRAM 是快的世界、RAM 是大的世界、PCIe 把兩個世界連起來">5.0&lt;/a>&lt;/td>
 &lt;td>VRAM + RAM 分層預算&lt;/td>
 &lt;td>16GB VRAM × 64GB RAM 等情境的模型對照、跟 Mac 統一記憶體的對比&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/moe-cpu-offload-strategy/" data-link-title="5.1 MoE 模型與 CPU 卸載策略" data-link-desc="PC 場景把 MoE 不活躍專家層留在系統 RAM 的判讀：何時值得卸載、卸幾層、對 prefill 跟生成的影響各自不同">5.1&lt;/a>&lt;/td>
 &lt;td>MoE 模型與 CPU 卸載策略&lt;/td>
 &lt;td>何時把專家層卸到 RAM、卸幾層、prefill / generation 影響各自不同&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/kv-cache-quantization-strategy/" data-link-title="5.2 KV cache 量化策略" data-link-desc="PC 場景用 K=Q8 / V=Q4 等量化把 KV cache 壓縮、騰出 VRAM 開大 context window 或加併發數的判讀">5.2&lt;/a>&lt;/td>
 &lt;td>KV cache 量化策略&lt;/td>
 &lt;td>K=Q8 / V=Q4 跟 context window / 併發數的權衡、flash attention 的關係&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/llama-cpp-on-pc/" data-link-title="5.3 llama.cpp 在 PC 上" data-link-desc="CUDA / ROCm build 取得、核心旗標地圖、llama-bench 校準、多卡 tensor split 的入門設定">5.3&lt;/a>&lt;/td>
 &lt;td>llama.cpp 在 PC 上&lt;/td>
 &lt;td>CUDA / ROCm build、核心旗標地圖、&lt;code>llama-bench&lt;/code> 校準工作流&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/lm-studio-on-windows/" data-link-title="5.4 LM Studio 在 Windows" data-link-desc="Windows &amp;#43; 獨立 GPU 場景用 LM Studio：CUDA / ROCm backend 選擇、GUI 內對應 -ngl / cache-type / cpu-moe 的設定位置">5.4&lt;/a>&lt;/td>
 &lt;td>LM Studio 在 Windows&lt;/td>
 &lt;td>Windows 安裝、CUDA backend 選擇、GUI 欄位對應到 llama.cpp 旗標&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/model-selection-priority-pc/" data-link-title="5.5 PC 場景的模型選型優先順序" data-link-desc="PC 獨立 GPU 場景下、MoE 卸載讓「全載小模型 vs 卸載大 MoE」變成主要的選型軸；對應不同 VRAM 容量的模型推薦">5.5&lt;/a>&lt;/td>
 &lt;td>PC 場景的模型選型優先順序&lt;/td>
 &lt;td>全載 14B Dense vs 卸載 30B MoE 等的選型決策&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/05-discrete-gpu/gpu-vendor-differences/" data-link-title="5.6 GPU 廠商差異" data-link-desc="NVIDIA CUDA、AMD ROCm、Intel ARC 在 llama.cpp 生態的相對位置、選卡時的判讀軸">5.6&lt;/a>&lt;/td>
 &lt;td>GPU 廠商差異&lt;/td>
 &lt;td>NVIDIA / AMD / Intel 的工具鏈支援度、選卡判讀框架&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="跟模組一的對應關係">跟模組一的對應關係&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>模組一（Mac）&lt;/th>
 &lt;th>模組五（PC）&lt;/th>
 &lt;th>關係&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>0.5 Apple Silicon 記憶體預算&lt;/td>
 &lt;td>5.0 VRAM + RAM 分層預算&lt;/td>
 &lt;td>平行、不同硬體模型；都在 &lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/" data-link-title="模組零：基礎知識與心智模型" data-link-desc="建立本地 LLM 的心智模型、釐清 MLX / MTP / oMLX 等常被混淆的術語、Apple Silicon 記憶體現實">模組零&lt;/a> 之下&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>1.0 Ollama&lt;/td>
 &lt;td>（Ollama Windows 同樣可用、不獨立成章）&lt;/td>
 &lt;td>跨平台、不重複&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>1.1 LM Studio&lt;/td>
 &lt;td>5.4 LM Studio 在 Windows&lt;/td>
 &lt;td>Windows 多了 CUDA backend 選擇與 driver 議題&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>1.2 llama.cpp&lt;/td>
 &lt;td>5.3 llama.cpp 在 PC 上&lt;/td>
 &lt;td>PC 多了 CUDA build、tensor split、&lt;code>--n-cpu-moe&lt;/code> 等參數&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>1.3 VS Code + Continue.dev&lt;/td>
 &lt;td>（共用、不獨立成章）&lt;/td>
 &lt;td>介面層跨平台、設定檔幾乎相同&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>1.4 模型選型優先順序&lt;/td>
 &lt;td>5.5 PC 場景的模型選型優先順序&lt;/td>
 &lt;td>選型邏輯類似、但 PC 多了 MoE 卸載這個變數&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>1.5 期望管理&lt;/td>
 &lt;td>（共用、不獨立成章）&lt;/td>
 &lt;td>本地 vs 雲端分工跟硬體無關&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="最短路徑16gb-vram--64gb-ram-跑-qwen3-30b-moe">最短路徑：16GB VRAM + 64GB RAM 跑 Qwen3 30B MoE&lt;/h2>
&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：本模組引用的硬體規格、模型體積、社群實測數量級、廠商工具鏈成熟度、皆以 2026 年 5 月的公開資訊與社群常見回報為基準。GPU 規格、driver 版本、llama.cpp release、模型釋出與量化版本快速演進、引用前請以 &lt;a href="https://github.com/ggml-org/llama.cpp/releases">llama.cpp release notes&lt;/a>、各廠商官方規格表、各模型 Hugging Face model card 為準、並用 &lt;code>llama-bench&lt;/code> 或實際工作流校準。&lt;/p></description><content:encoded><![CDATA[<p>本模組的核心目標是把 <a href="/blog/llm/00-foundations/" data-link-title="模組零：基礎知識與心智模型" data-link-desc="建立本地 LLM 的心智模型、釐清 MLX / MTP / oMLX 等常被混淆的術語、Apple Silicon 記憶體現實">模組零</a> 的心智模型落地到「Windows / Linux + 獨立 GPU」這條硬體路線。跟 <a href="/blog/llm/01-local-llm-services/" data-link-title="模組一：本地 LLM 服務的安裝與應用" data-link-desc="Ollama、LM Studio、llama.cpp 的安裝與差異、VS Code &#43; Continue.dev 整合、模型選型與期望管理">模組一</a>（Apple Silicon Mac）平行、共用模組零的詞彙跟 <a href="/blog/llm/knowledge-cards/" data-link-title="Knowledge Cards" data-link-desc="用原子化卡片整理本地 LLM 寫 code 場景所需的概念詞彙">knowledge-cards</a>、但硬體判讀模型本質不同：Mac 是統一記憶體一塊預算、PC 是 VRAM + 系統 RAM 兩塊分層預算、要分開判讀。</p>
<p>讀完本模組後、你應該能對自己這台 PC 直接回答：能跑哪些模型、要不要卸載 MoE 專家層到 RAM、KV cache 該量化到哪一級、context 能開多大、併發數能拉到多少。</p>
<h2 id="為什麼-pc-路線值得獨立模組">為什麼 PC 路線值得獨立模組</h2>
<p>Mac 統一記憶體的判讀模型把「能載入多大模型」這個問題收斂到一塊預算。PC 場景被獨立 VRAM 拆成兩個記憶體區域、判讀軸增加：</p>
<ol>
<li><strong>VRAM</strong>：高頻寬區。常見消費級 NVIDIA 卡的廠商標稱頻寬大致落在數百 GB/s 到 1 TB/s 級的區間（例如 RTX 5060 Ti 16GB 標稱約 448 GB/s、RTX 5070 Ti 標稱約 896 GB/s、以廠商規格表為準）、生字速度上限主要受 VRAM 頻寬影響。</li>
<li><strong>系統 RAM</strong>：高容量區。DDR5 6000 雙通道的標稱頻寬約 96 GB/s（依主機板與時序變化）、相對 VRAM 慢約一個量級、但 64GB / 128GB 在 PC 平台的擴充成本相對低、適合放容量需求大但存取頻率較低的權重。</li>
<li><strong>PCIe</strong>：兩個區域之間的連線。PCIe 5.0 x16 廠商標稱單向約 64 GB/s（PCIe 4.0 x16 約一半）；實際傳輸吞吐受驅動、檔案系統與工作流影響。</li>
</ol>
<p>這三層差異產生兩個 Mac 場景上較少出現的工程選項：</p>
<ol>
<li><strong><a href="/blog/llm/knowledge-cards/moe-cpu-offload/" data-link-title="MoE CPU 卸載" data-link-desc="把 Mixture-of-Experts 模型不活躍的專家層權重放在系統 RAM、用到再走 PCIe 拉回 GPU、讓有限 VRAM 跑得了更大模型">MoE 模型 + 專家層 CPU 卸載</a></strong>：MoE 模型每個 token 只啟用少數專家、把不活躍的專家權重放在系統 RAM、用到再走 PCIe 拉回 GPU。讓 16GB VRAM 卡能載入 30B / 70B 等級的 MoE 模型。</li>
<li><strong>KV cache 量化開大 context</strong>：把 K cache 量化到 Q8、V cache 量化到 Q4、KV cache 體積大幅壓縮、騰出的 VRAM 可用於開大 context window 或提高併發數。</li>
</ol>
<p>這兩個選項在 Mac 統一記憶體場景下較少使用（VRAM 跟 RAM 共用、不需在兩個區域之間搬資料）、在 PC 場景則是常用的調參工具。</p>
<h2 id="章節列表">章節列表</h2>
<table>
  <thead>
      <tr>
          <th>章節</th>
          <th>主題</th>
          <th>關鍵收穫</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/llm/05-discrete-gpu/vram-ram-budget/" data-link-title="5.0 VRAM &#43; RAM 分層預算" data-link-desc="PC 獨立 GPU 場景的記憶體預算判讀：VRAM 是快的世界、RAM 是大的世界、PCIe 把兩個世界連起來">5.0</a></td>
          <td>VRAM + RAM 分層預算</td>
          <td>16GB VRAM × 64GB RAM 等情境的模型對照、跟 Mac 統一記憶體的對比</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/05-discrete-gpu/moe-cpu-offload-strategy/" data-link-title="5.1 MoE 模型與 CPU 卸載策略" data-link-desc="PC 場景把 MoE 不活躍專家層留在系統 RAM 的判讀：何時值得卸載、卸幾層、對 prefill 跟生成的影響各自不同">5.1</a></td>
          <td>MoE 模型與 CPU 卸載策略</td>
          <td>何時把專家層卸到 RAM、卸幾層、prefill / generation 影響各自不同</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/05-discrete-gpu/kv-cache-quantization-strategy/" data-link-title="5.2 KV cache 量化策略" data-link-desc="PC 場景用 K=Q8 / V=Q4 等量化把 KV cache 壓縮、騰出 VRAM 開大 context window 或加併發數的判讀">5.2</a></td>
          <td>KV cache 量化策略</td>
          <td>K=Q8 / V=Q4 跟 context window / 併發數的權衡、flash attention 的關係</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/05-discrete-gpu/llama-cpp-on-pc/" data-link-title="5.3 llama.cpp 在 PC 上" data-link-desc="CUDA / ROCm build 取得、核心旗標地圖、llama-bench 校準、多卡 tensor split 的入門設定">5.3</a></td>
          <td>llama.cpp 在 PC 上</td>
          <td>CUDA / ROCm build、核心旗標地圖、<code>llama-bench</code> 校準工作流</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/05-discrete-gpu/lm-studio-on-windows/" data-link-title="5.4 LM Studio 在 Windows" data-link-desc="Windows &#43; 獨立 GPU 場景用 LM Studio：CUDA / ROCm backend 選擇、GUI 內對應 -ngl / cache-type / cpu-moe 的設定位置">5.4</a></td>
          <td>LM Studio 在 Windows</td>
          <td>Windows 安裝、CUDA backend 選擇、GUI 欄位對應到 llama.cpp 旗標</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/05-discrete-gpu/model-selection-priority-pc/" data-link-title="5.5 PC 場景的模型選型優先順序" data-link-desc="PC 獨立 GPU 場景下、MoE 卸載讓「全載小模型 vs 卸載大 MoE」變成主要的選型軸；對應不同 VRAM 容量的模型推薦">5.5</a></td>
          <td>PC 場景的模型選型優先順序</td>
          <td>全載 14B Dense vs 卸載 30B MoE 等的選型決策</td>
      </tr>
      <tr>
          <td><a href="/blog/llm/05-discrete-gpu/gpu-vendor-differences/" data-link-title="5.6 GPU 廠商差異" data-link-desc="NVIDIA CUDA、AMD ROCm、Intel ARC 在 llama.cpp 生態的相對位置、選卡時的判讀軸">5.6</a></td>
          <td>GPU 廠商差異</td>
          <td>NVIDIA / AMD / Intel 的工具鏈支援度、選卡判讀框架</td>
      </tr>
  </tbody>
</table>
<h2 id="跟模組一的對應關係">跟模組一的對應關係</h2>
<table>
  <thead>
      <tr>
          <th>模組一（Mac）</th>
          <th>模組五（PC）</th>
          <th>關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>0.5 Apple Silicon 記憶體預算</td>
          <td>5.0 VRAM + RAM 分層預算</td>
          <td>平行、不同硬體模型；都在 <a href="/blog/llm/00-foundations/" data-link-title="模組零：基礎知識與心智模型" data-link-desc="建立本地 LLM 的心智模型、釐清 MLX / MTP / oMLX 等常被混淆的術語、Apple Silicon 記憶體現實">模組零</a> 之下</td>
      </tr>
      <tr>
          <td>1.0 Ollama</td>
          <td>（Ollama Windows 同樣可用、不獨立成章）</td>
          <td>跨平台、不重複</td>
      </tr>
      <tr>
          <td>1.1 LM Studio</td>
          <td>5.4 LM Studio 在 Windows</td>
          <td>Windows 多了 CUDA backend 選擇與 driver 議題</td>
      </tr>
      <tr>
          <td>1.2 llama.cpp</td>
          <td>5.3 llama.cpp 在 PC 上</td>
          <td>PC 多了 CUDA build、tensor split、<code>--n-cpu-moe</code> 等參數</td>
      </tr>
      <tr>
          <td>1.3 VS Code + Continue.dev</td>
          <td>（共用、不獨立成章）</td>
          <td>介面層跨平台、設定檔幾乎相同</td>
      </tr>
      <tr>
          <td>1.4 模型選型優先順序</td>
          <td>5.5 PC 場景的模型選型優先順序</td>
          <td>選型邏輯類似、但 PC 多了 MoE 卸載這個變數</td>
      </tr>
      <tr>
          <td>1.5 期望管理</td>
          <td>（共用、不獨立成章）</td>
          <td>本地 vs 雲端分工跟硬體無關</td>
      </tr>
  </tbody>
</table>
<h2 id="最短路徑16gb-vram--64gb-ram-跑-qwen3-30b-moe">最短路徑：16GB VRAM + 64GB RAM 跑 Qwen3 30B MoE</h2>
<blockquote>
<p><strong>事實查核註</strong>：本模組引用的硬體規格、模型體積、社群實測數量級、廠商工具鏈成熟度、皆以 2026 年 5 月的公開資訊與社群常見回報為基準。GPU 規格、driver 版本、llama.cpp release、模型釋出與量化版本快速演進、引用前請以 <a href="https://github.com/ggml-org/llama.cpp/releases">llama.cpp release notes</a>、各廠商官方規格表、各模型 Hugging Face model card 為準、並用 <code>llama-bench</code> 或實際工作流校準。</p></blockquote>
<p>如果你有類似 RTX 5060 Ti 16GB / 5070 Ti 16GB + 64GB DDR5 的配置、想用一小時搞定 PC 本地 LLM 寫 code、下面是最短路徑：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1"># 1. 裝 llama.cpp 的 CUDA build（Windows / Linux 各有預編好的 release）</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1"># 從 ggml-org/llama.cpp GitHub release 抓 CUDA 12.x 版</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="c1"># 2. 抓一個 MoE 模型（如 Qwen3-30B-A3B 的 GGUF Q4_K_M 版本）</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1"># 從 Hugging Face 下載到 ~/models/</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1"># 3. 啟動 server、把 30 層 MoE 專家層卸載到 CPU</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">./llama-server <span class="se">\
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="se"></span>  -m ~/models/Qwen3-30B-A3B-Q4_K_M.gguf <span class="se">\
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="se"></span>  -ngl <span class="m">99</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="se"></span>  --n-cpu-moe <span class="m">30</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="se"></span>  --cache-type-k q8_0 <span class="se">\
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="se"></span>  --cache-type-v q4_0 <span class="se">\
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="se"></span>  -c <span class="m">32768</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="se"></span>  --port <span class="m">8080</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="c1"># 4. 在 VS Code 裝 Continue 擴充套件、config 指向 http://localhost:8080</span></span></span></code></pre></div><p>關鍵參數的意義先濃縮成一句、詳細推導留給 <a href="/blog/llm/05-discrete-gpu/llama-cpp-on-pc/" data-link-title="5.3 llama.cpp 在 PC 上" data-link-desc="CUDA / ROCm build 取得、核心旗標地圖、llama-bench 校準、多卡 tensor split 的入門設定">5.3 llama.cpp 在 PC 上</a>：</p>
<ul>
<li><code>-ngl 99</code>：把所有可放的層丟到 GPU。</li>
<li><code>--n-cpu-moe 30</code>：把 30 層的 MoE 專家權重留在系統 RAM、不上 VRAM。實際層數視模型結構與 VRAM 餘量微調。</li>
<li><code>--cache-type-k q8_0</code> / <code>--cache-type-v q4_0</code>：KV cache 量化、騰出 VRAM 開大 context。</li>
<li><code>-c 32768</code>：context window。配上 KV cache 量化、單卡 16GB 通常能開到 128K ~ 256K（看模型）。</li>
</ul>
<h2 id="為什麼這個順序">為什麼這個順序</h2>
<p>本模組章節順序的設計脈絡：</p>
<ol>
<li><strong>先 5.0 VRAM + RAM 分層預算</strong>：建立 PC 硬體判讀模型、是後面所有章節的前提。</li>
<li><strong>再 5.1 MoE 卸載</strong>：MoE + CPU 卸載是 PC 場景相對 Mac 的核心優勢、先把這個工程選項說清楚。</li>
<li><strong>接 5.2 KV cache 量化</strong>：跟 5.1 一起決定 VRAM 怎麼切、是 PC 場景的第二個獨有選項。</li>
<li><strong>再 5.3 llama.cpp 在 PC 上</strong>：把前三章的理論落地到實際參數。</li>
<li><strong>再 5.4 LM Studio 在 Windows</strong>：給「不想直接面對 CLI」的讀者另一條路、補上 GUI 內對應 5.1 / 5.2 設定的位置。</li>
<li><strong>然後 5.5 模型選型</strong>：所有工程選項都建立後、回答「具體裝哪個模型」。</li>
<li><strong>最後 5.6 GPU 廠商差異</strong>：選好模型跟參數後、再處理 NVIDIA / AMD / Intel 的工具鏈差異。</li>
</ol>
<h2 id="不在本模組內的主題">不在本模組內的主題</h2>
<p>本模組不討論：</p>
<ol>
<li><strong>多卡 NVLink、tensor parallelism</strong>：消費級 PC 場景通常單卡、多卡分散式推論屬於資料中心級教材。</li>
<li><strong>資料中心級 GPU（H100 / H200 / B200）部署</strong>：本模組聚焦消費級 PC、不涵蓋 vLLM / TGI / Triton 等資料中心 inference server。</li>
<li><strong>Linux 系統管理 / CUDA 驅動安裝細節</strong>：假設讀者已會基本系統管理；具體驅動安裝步驟交給 NVIDIA / AMD 官方文件。</li>
<li><strong>訓練 / fine-tuning</strong>：跟「跑現成模型」是不同工程問題、見 <a href="/blog/llm/03-theoretical-foundations/" data-link-title="模組三：LLM 的理論基礎" data-link-desc="從神經網路、embedding、attention、Transformer 架構、訓練到 sampling：LLM 內部運作的完整理論圖像">模組三</a> 與其推薦課程。</li>
<li><strong>產圖模型</strong>：<a href="/blog/llm/knowledge-cards/diffusion/" data-link-title="Diffusion" data-link-desc="產圖用的生成式 AI 架構：跟寫 code 用的 Transformer 是不同路線">Diffusion</a> 跟 Transformer 是不同架構、見 ComfyUI / Stable Diffusion 專門教材。</li>
</ol>
]]></content:encoded></item><item><title>5.5 PC 場景的模型選型優先順序</title><link>https://tarrragon.github.io/blog/llm/05-discrete-gpu/model-selection-priority-pc/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/05-discrete-gpu/model-selection-priority-pc/</guid><description>&lt;p>跑穩 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/inference-server/" data-link-title="Inference Server" data-link-desc="載入模型權重、處理 prompt、產生 token 的常駐 process">推論伺服器&lt;/a> 後、下一個決策是「該裝哪個模型」。PC 場景的選型有 Mac 沒有的變數：&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/moe/" data-link-title="Mixture of Experts (MoE)" data-link-desc="把 transformer 的 FFN 層拆成多個專家、每 token 只啟用少數、總參數大但每 token 計算量小的架構">MoE&lt;/a> 模型搭配 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/moe-cpu-offload/" data-link-title="MoE CPU 卸載" data-link-desc="把 Mixture-of-Experts 模型不活躍的專家層權重放在系統 RAM、用到再走 PCIe 拉回 GPU、讓有限 VRAM 跑得了更大模型">CPU 卸載&lt;/a> 讓「同樣 16GB &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/vram/" data-link-title="VRAM" data-link-desc="顯卡上的記憶體、跟系統 RAM 是兩塊獨立預算、決定能載入多大模型權重跟 KV cache">VRAM&lt;/a>、要全載 14B Dense 還是卸載 30B MoE」變成主要取捨；MoE 的核心判讀軸是 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/active-parameter/" data-link-title="Active Parameter" data-link-desc="MoE 模型每生成一個 token 實際參與計算的參數量、跟模型總參數量不同、影響推論速度上限">active parameter&lt;/a> 比例。本章用優先順序而不是對比表羅列、依不同 VRAM 容量給出社群常見的候選清單與適用情境。模型檔案格式以 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF&lt;/a> 為主、各等級的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a> 版本是選型的第二軸；coding 能力評估的常見參考是 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/swe-bench/" data-link-title="SWE-bench" data-link-desc="用真實 GitHub issue 量化 LLM coding 能力的 benchmark">SWE-bench&lt;/a> 等公開 benchmark；模型來源信任的判讀見 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/model-card/" data-link-title="Model Card" data-link-desc="Hugging Face 等平台上模型的 metadata 文件、列出模型來源、訓練資料、能力、限制、授權">model card&lt;/a>。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：本章引用的模型名稱、能力等級、量化版本以 2026 年 5 月的社群可用資源為基準。模型發布速度快、3 ~ 6 個月後可能有新候選、本章建議用具體版本日期跟對應的官方 model card / 技術報告校準。&lt;/p>&lt;/blockquote>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;ol>
&lt;li>認識 PC 場景特有的「全載 Dense vs 卸載 MoE」選型軸。&lt;/li>
&lt;li>知道不同 VRAM 容量對應的候選模型清單。&lt;/li>
&lt;li>區分「coding 專用模型」跟「通用模型」對寫 code 任務的差異。&lt;/li>
&lt;li>知道量化版本的取捨（Q4_K_M / Q5_K_M / Q6_K 的選擇）。&lt;/li>
&lt;li>認識選型決策的觀察期跟換模型的時機。&lt;/li>
&lt;/ol>
&lt;h2 id="pc-場景特有的選型軸">PC 場景特有的選型軸&lt;/h2>
&lt;p>Mac 統一記憶體場景下、選型主要看「能不能塞進記憶體」。PC 場景多了 MoE 卸載這個變數、變成三軸選型：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">選型三軸：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">├── VRAM 是否能全載 → 決定是否需要卸載
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">├── MoE vs Dense → 決定卸載的代價大小
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">└── coding vs 通用 → 決定能力對寫 code 任務的契合度&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>兩條典型路線（同樣 16GB VRAM）：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>路線&lt;/th>
 &lt;th>範例模型&lt;/th>
 &lt;th>優勢&lt;/th>
 &lt;th>代價&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>全載 14B Dense&lt;/td>
 &lt;td>Qwen3 14B、CodeLlama 13B、DeepSeek-Coder-V2 16B&lt;/td>
 &lt;td>生字速度上限高、Latency 較穩&lt;/td>
 &lt;td>模型能力 14B 級、跨檔案任務成功率較低&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>卸載 30B MoE&lt;/td>
 &lt;td>Qwen3-30B-A3B、Llama 4 Scout&lt;/td>
 &lt;td>模型能力 30B 級、長 context 友善&lt;/td>
 &lt;td>生字速度低於全載、對 RAM 容量有較高要求&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>社群多數寫 code 場景的回報傾向「卸載 30B MoE 對任務成敗的幫助大於速度損失」、但工作流以高頻短補完為主的使用者、有時偏好全載 14B Dense 的速度。實際取捨需用自己的工作流任務校準。&lt;/p>
&lt;h2 id="16gb-vram--64gb-ram-的候選清單">16GB VRAM + 64GB RAM 的候選清單&lt;/h2>
&lt;p>這是 2026 年 5 月 PC 場景最常被討論的配置、對應幾個主要候選：&lt;/p></description><content:encoded><![CDATA[<p>跑穩 <a href="/blog/llm/knowledge-cards/inference-server/" data-link-title="Inference Server" data-link-desc="載入模型權重、處理 prompt、產生 token 的常駐 process">推論伺服器</a> 後、下一個決策是「該裝哪個模型」。PC 場景的選型有 Mac 沒有的變數：<a href="/blog/llm/knowledge-cards/moe/" data-link-title="Mixture of Experts (MoE)" data-link-desc="把 transformer 的 FFN 層拆成多個專家、每 token 只啟用少數、總參數大但每 token 計算量小的架構">MoE</a> 模型搭配 <a href="/blog/llm/knowledge-cards/moe-cpu-offload/" data-link-title="MoE CPU 卸載" data-link-desc="把 Mixture-of-Experts 模型不活躍的專家層權重放在系統 RAM、用到再走 PCIe 拉回 GPU、讓有限 VRAM 跑得了更大模型">CPU 卸載</a> 讓「同樣 16GB <a href="/blog/llm/knowledge-cards/vram/" data-link-title="VRAM" data-link-desc="顯卡上的記憶體、跟系統 RAM 是兩塊獨立預算、決定能載入多大模型權重跟 KV cache">VRAM</a>、要全載 14B Dense 還是卸載 30B MoE」變成主要取捨；MoE 的核心判讀軸是 <a href="/blog/llm/knowledge-cards/active-parameter/" data-link-title="Active Parameter" data-link-desc="MoE 模型每生成一個 token 實際參與計算的參數量、跟模型總參數量不同、影響推論速度上限">active parameter</a> 比例。本章用優先順序而不是對比表羅列、依不同 VRAM 容量給出社群常見的候選清單與適用情境。模型檔案格式以 <a href="/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF</a> 為主、各等級的 <a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a> 版本是選型的第二軸；coding 能力評估的常見參考是 <a href="/blog/llm/knowledge-cards/swe-bench/" data-link-title="SWE-bench" data-link-desc="用真實 GitHub issue 量化 LLM coding 能力的 benchmark">SWE-bench</a> 等公開 benchmark；模型來源信任的判讀見 <a href="/blog/llm/knowledge-cards/model-card/" data-link-title="Model Card" data-link-desc="Hugging Face 等平台上模型的 metadata 文件、列出模型來源、訓練資料、能力、限制、授權">model card</a>。</p>
<blockquote>
<p><strong>事實查核註</strong>：本章引用的模型名稱、能力等級、量化版本以 2026 年 5 月的社群可用資源為基準。模型發布速度快、3 ~ 6 個月後可能有新候選、本章建議用具體版本日期跟對應的官方 model card / 技術報告校準。</p></blockquote>
<h2 id="本章目標">本章目標</h2>
<ol>
<li>認識 PC 場景特有的「全載 Dense vs 卸載 MoE」選型軸。</li>
<li>知道不同 VRAM 容量對應的候選模型清單。</li>
<li>區分「coding 專用模型」跟「通用模型」對寫 code 任務的差異。</li>
<li>知道量化版本的取捨（Q4_K_M / Q5_K_M / Q6_K 的選擇）。</li>
<li>認識選型決策的觀察期跟換模型的時機。</li>
</ol>
<h2 id="pc-場景特有的選型軸">PC 場景特有的選型軸</h2>
<p>Mac 統一記憶體場景下、選型主要看「能不能塞進記憶體」。PC 場景多了 MoE 卸載這個變數、變成三軸選型：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">選型三軸：
</span></span><span class="line"><span class="ln">2</span><span class="cl">├── VRAM 是否能全載      → 決定是否需要卸載
</span></span><span class="line"><span class="ln">3</span><span class="cl">├── MoE vs Dense          → 決定卸載的代價大小
</span></span><span class="line"><span class="ln">4</span><span class="cl">└── coding vs 通用        → 決定能力對寫 code 任務的契合度</span></span></code></pre></div><p>兩條典型路線（同樣 16GB VRAM）：</p>
<table>
  <thead>
      <tr>
          <th>路線</th>
          <th>範例模型</th>
          <th>優勢</th>
          <th>代價</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>全載 14B Dense</td>
          <td>Qwen3 14B、CodeLlama 13B、DeepSeek-Coder-V2 16B</td>
          <td>生字速度上限高、Latency 較穩</td>
          <td>模型能力 14B 級、跨檔案任務成功率較低</td>
      </tr>
      <tr>
          <td>卸載 30B MoE</td>
          <td>Qwen3-30B-A3B、Llama 4 Scout</td>
          <td>模型能力 30B 級、長 context 友善</td>
          <td>生字速度低於全載、對 RAM 容量有較高要求</td>
      </tr>
  </tbody>
</table>
<p>社群多數寫 code 場景的回報傾向「卸載 30B MoE 對任務成敗的幫助大於速度損失」、但工作流以高頻短補完為主的使用者、有時偏好全載 14B Dense 的速度。實際取捨需用自己的工作流任務校準。</p>
<h2 id="16gb-vram--64gb-ram-的候選清單">16GB VRAM + 64GB RAM 的候選清單</h2>
<p>這是 2026 年 5 月 PC 場景最常被討論的配置、對應幾個主要候選：</p>
<h3 id="候選一qwen3-30b-a3bmoe卸載">候選一：Qwen3-30B-A3B（MoE、卸載）</h3>
<p><strong>模型定位</strong>：MoE 架構、總參數約 30B、active parameter 約 3B、coding / 通用混合訓練。</p>
<p><strong>啟動旗標起點</strong>（GGUF Q4_K_M、需配合 <a href="/blog/llm/05-discrete-gpu/moe-cpu-offload-strategy/" data-link-title="5.1 MoE 模型與 CPU 卸載策略" data-link-desc="PC 場景把 MoE 不活躍專家層留在系統 RAM 的判讀：何時值得卸載、卸幾層、對 prefill 跟生成的影響各自不同">5.1</a>）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">llama-server -m Qwen3-30B-A3B-Q4_K_M.gguf <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -ngl <span class="m">99</span> --n-cpu-moe <span class="m">30</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>  --cache-type-k q8_0 --cache-type-v q4_0 -fa <span class="se">\
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="se"></span>  -c <span class="m">32768</span></span></span></code></pre></div><p><strong>主要使用情境</strong>：</p>
<ol>
<li>跨檔案重構、需要理解較多上下文的任務。</li>
<li>長 context 場景（RAG、大型 codebase 索引）。</li>
<li>中文 + 英文混合的 prompt。</li>
</ol>
<h3 id="候選二qwen3-14bdense全載">候選二：Qwen3 14B（Dense、全載）</h3>
<p><strong>模型定位</strong>：Dense 架構、14B 參數、通用 + coding 混合訓練。</p>
<p><strong>啟動旗標起點</strong>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">llama-server -m Qwen3-14B-Q4_K_M.gguf <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -ngl <span class="m">99</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>  --cache-type-k q8_0 --cache-type-v q8_0 -fa <span class="se">\
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="se"></span>  -c <span class="m">32768</span></span></span></code></pre></div><p><strong>主要使用情境</strong>：</p>
<ol>
<li>工作流以高頻短補完為主、對生字即時體感要求高。</li>
<li>想保持較穩的 latency、避開 MoE 卸載的調參。</li>
<li>系統 RAM 只有 32GB、卸載空間有限。</li>
</ol>
<h3 id="候選三qwen3-coder-30b--codellama-13b-等-coding-專用模型">候選三：Qwen3-Coder 30B / CodeLlama 13B 等 coding 專用模型</h3>
<p><strong>模型定位</strong>：在通用訓練後、用 code corpus 做了額外的 instruction tuning 或 continued pre-training。</p>
<p><strong>社群常見回報</strong>：</p>
<ul>
<li>在「補完 / 行內編輯」這種純 code-completion 任務上、coding 專用模型通常表現較好。</li>
<li>在「需要解釋程式碼 / 設計討論」混合任務上、通用模型有時更自然。</li>
</ul>
<p><strong>選擇邏輯</strong>：若你的工作流以純補完為主、coding 專用模型是合理優先；若以 chat-based 設計討論為主、通用模型也許更合適。</p>
<h3 id="量化版本的取捨">量化版本的取捨</h3>
<p>GGUF 量化版本對同一模型的選擇：</p>
<table>
  <thead>
      <tr>
          <th>量化</th>
          <th>bits/權重</th>
          <th>適用情境</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Q8_0</td>
          <td>8</td>
          <td>VRAM / RAM 充裕、想接近原始品質</td>
      </tr>
      <tr>
          <td>Q6_K</td>
          <td>6.56</td>
          <td>平衡、品質損失社群回報為輕微</td>
      </tr>
      <tr>
          <td>Q5_K_M</td>
          <td>5.5</td>
          <td>VRAM 介於 Q4 跟 Q8 之間時的選擇</td>
      </tr>
      <tr>
          <td>Q4_K_M</td>
          <td>4.5</td>
          <td>寫 code 場景的常見起點、體積 / 品質平衡</td>
      </tr>
      <tr>
          <td>Q3_K_M</td>
          <td>3.5</td>
          <td>VRAM 緊張時退一步、品質衰減社群回報為明顯</td>
      </tr>
  </tbody>
</table>
<p><strong>選擇邏輯</strong>：先用 Q4_K_M 起步、若品質符合需求且 VRAM 有餘量、可試 Q5 / Q6；若 VRAM 不足、優先考慮「換小一級的模型 + Q5/Q6」而非「同模型 + Q3」、因為品質衰減在小模型上較易感知。</p>
<h2 id="24gb-vram-的候選清單">24GB VRAM 的候選清單</h2>
<p>24GB VRAM（如 RTX 4090、RTX 3090）能跑全載 32B Dense 或重度卸載 70B MoE：</p>
<table>
  <thead>
      <tr>
          <th>模型</th>
          <th>路線</th>
          <th>適用情境</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Qwen3-32B、Qwen2.5-Coder-32B</td>
          <td>Dense 全載 Q4_K_M</td>
          <td>寫 code 場景能力較 14B 顯著提升</td>
      </tr>
      <tr>
          <td>Qwen3-30B-A3B 全載 / 輕度卸載</td>
          <td>MoE</td>
          <td>比 16GB 卸載速度快、可開更大 context</td>
      </tr>
      <tr>
          <td>Llama 3.3 70B Q3 全載 / Q4 卸載</td>
          <td>Dense + 重度卸載</td>
          <td>對能力極限有需求、可接受較慢生字</td>
      </tr>
      <tr>
          <td>DeepSeek V3 / Llama 4 Scout 卸載</td>
          <td>大型 MoE</td>
          <td>適合需要長 context + 多領域的工作流</td>
      </tr>
  </tbody>
</table>
<p>選擇邏輯：24GB 是「Dense 32B 級」跟「MoE 70B 級」的分水嶺；多數寫 code 場景在 Dense 32B 級已能勝任、再往 70B 級的邊際效益依任務變化。</p>
<h2 id="32gb-vram-的候選清單">32GB VRAM 的候選清單</h2>
<p>32GB VRAM（如 RTX 5090）能跑 70B Dense Q4 全載：</p>
<table>
  <thead>
      <tr>
          <th>模型</th>
          <th>路線</th>
          <th>適用情境</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Llama 3.3 70B Q4_K_M</td>
          <td>Dense 全載</td>
          <td>通用能力強、Latency 穩定</td>
      </tr>
      <tr>
          <td>Qwen2.5-72B Q4_K_M</td>
          <td>Dense 全載</td>
          <td>中文 / 多語言場景</td>
      </tr>
      <tr>
          <td>Llama 4 Maverick 等大型 MoE</td>
          <td>MoE 全載 / 輕度卸載</td>
          <td>長 context、多任務、active parameter 友善生字速度</td>
      </tr>
  </tbody>
</table>
<p>32GB VRAM 場景下、選型回到「能力 vs 生字速度」的傳統取捨、MoE 卸載這個變數的影響相對減弱。</p>
<h2 id="8gb--12gb-vram-的候選清單">8GB / 12GB VRAM 的候選清單</h2>
<p>VRAM 較小的場景、候選清單較短：</p>
<table>
  <thead>
      <tr>
          <th>VRAM</th>
          <th>候選模型</th>
          <th>適用情境</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>8GB</td>
          <td>Qwen3 7B、Gemma 4 8B、Llama 3.2 8B</td>
          <td>入門體驗、補完任務尚可、跨檔案任務通常需混用雲端</td>
      </tr>
      <tr>
          <td>12GB</td>
          <td>Qwen3 14B Q4 全載、20B MoE Q4 卸載部分層</td>
          <td>介於入門跟主流之間、可選 Dense 或 MoE 起步</td>
      </tr>
  </tbody>
</table>
<p>8GB 場景下、本地 LLM 的「跑得起來但能力有限」需先設好期望、見 <a href="/blog/llm/01-local-llm-services/expectation-management/" data-link-title="1.5 期望管理：本地 LLM 的擅長領域與分工" data-link-desc="本地 LLM 是免費的初階 pair programmer：辨識它的擅長領域、跟雲端旗艦做結構性分工">1.5 期望管理</a>（跨平台共用）。</p>
<h2 id="coding-專用-vs-通用模型">coding 專用 vs 通用模型</h2>
<p>選型的另一條軸是「coding 專用模型 vs 通用模型」：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>coding 專用模型</th>
          <th>通用模型</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>補完 / 行內編輯品質</td>
          <td>社群多數回報較佳</td>
          <td>視具體模型而定</td>
      </tr>
      <tr>
          <td>跨檔案重構</td>
          <td>視訓練資料涵蓋程度而定</td>
          <td>大型通用模型的推理能力有時表現較好</td>
      </tr>
      <tr>
          <td>設計討論 / 解釋程式碼</td>
          <td>視訓練模式（純 completion vs instruction tuned）而定</td>
          <td>instruction tuned 的通用模型通常較自然</td>
      </tr>
      <tr>
          <td>中文 / 英文 prompt</td>
          <td>視模型語言訓練比例</td>
          <td>視模型語言訓練比例</td>
      </tr>
      <tr>
          <td>Tool use / function calling</td>
          <td>視模型是否做過對應訓練</td>
          <td>視模型是否做過對應訓練</td>
      </tr>
  </tbody>
</table>
<p><strong>選擇邏輯</strong>：純補完場景優先 coding 專用；chat-based 工作流通用模型也許更合適；多數使用者可以用兩個（一個 coding 專用 + 一個通用）、依任務切換。</p>
<h2 id="選型決策步驟">選型決策步驟</h2>
<p>實際選模型時、可以照下面的步驟：</p>
<ol>
<li><strong>盤點硬體</strong>：VRAM 容量、系統 RAM 容量、CPU 性能。</li>
<li><strong>盤點工作流</strong>：補完為主 vs 跨檔案任務為主、短 prompt 為主 vs 長 prompt 為主、純 code vs 設計討論混合。</li>
<li><strong>依 VRAM 級別查上面候選清單</strong>：選 1 ~ 2 個起點模型。</li>
<li><strong>用 Q4_K_M 量化版本起步</strong>：跑一週實測、用代表性任務記錄品質、速度、VRAM 用量。</li>
<li><strong>依瓶頸調整</strong>：
<ul>
<li>品質不夠 → 試更大模型 / 更高量化等級 / 不同訓練取向</li>
<li>速度不夠 → 試較小 Dense 全載 / 減少卸載</li>
<li>VRAM 不夠 → 加量化（Q5 → Q4）、加 MoE 卸載、量化 KV cache</li>
</ul>
</li>
<li><strong>建立可重複的校準腳本</strong>：把代表性任務寫成 prompt 集、新模型來時跑一次回歸測試。</li>
</ol>
<h2 id="觀察期與換模型時機">觀察期與換模型時機</h2>
<p>社群常見的換模型節奏：</p>
<ol>
<li><strong>新模型發布</strong>：本地 LLM 模型平均每 2 ~ 3 個月有新候選。</li>
<li><strong>觀察期</strong>：新模型剛發布時、量化版本可能不全、社群實測案例較少；建議等 2 ~ 4 週、看是否有 Q4_K_M / Q5_K_M 等常用量化、社群回報是否穩定。</li>
<li><strong>回歸測試</strong>：用自己的校準腳本跑一次、比較跟現有主力模型的品質、速度、VRAM。</li>
<li><strong>切換</strong>：明顯優於現有主力 + 校準腳本通過 + 旗標設定穩定 → 才切換。</li>
</ol>
<p>過早跳到新模型的常見代價：量化版本不穩、社群 issue 還在湧現、自己的旗標設定要從頭調。</p>
<h2 id="下一章">下一章</h2>
<p>下一章：<a href="/blog/llm/05-discrete-gpu/gpu-vendor-differences/" data-link-title="5.6 GPU 廠商差異" data-link-desc="NVIDIA CUDA、AMD ROCm、Intel ARC 在 llama.cpp 生態的相對位置、選卡時的判讀軸">5.6 GPU 廠商差異</a>、處理 NVIDIA / AMD / Intel 在 llama.cpp 生態的相對位置。</p>
]]></content:encoded></item></channel></rss>