<?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>Discrete-Gpu on Tarragon</title><link>https://tarrragon.github.io/blog/tags/discrete-gpu/</link><description>Recent content in Discrete-Gpu 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/discrete-gpu/index.xml" rel="self" type="application/rss+xml"/><item><title>5.0 VRAM + RAM 分層預算</title><link>https://tarrragon.github.io/blog/llm/05-discrete-gpu/vram-ram-budget/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/05-discrete-gpu/vram-ram-budget/</guid><description>&lt;p>PC 場景跑本地 LLM 的判讀模型本質跟 &lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/hardware-memory-budget/" data-link-title="0.5 Apple Silicon 記憶體預算" data-link-desc="記憶體決定能跑什麼，Q4 量化下的可運作模型對照與系統保留">Mac 統一記憶體&lt;/a> 不同：Mac 是一塊預算切系統 / 模型 / &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 是 &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> 跟系統 RAM 兩塊&lt;strong>分層預算&lt;/strong>、靠 &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> 連起來。本章把「16GB 5060 Ti 能跑 30B 嗎」這類含糊說法、換成可操作的兩塊預算判讀。生字速度上限主要受 &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;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> 的 Mac 場景判讀軸不同。&lt;/p>
&lt;p>讀完本章後、你可以對自己這台 PC 直接回答：能跑哪些模型、要不要做 MoE 卸載、KV cache 該量化到哪一級、context 能開多大、系統 RAM 容量該不該升級。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後、你應該能：&lt;/p>
&lt;ol>
&lt;li>看 PC 規格（VRAM + RAM）立刻知道能跑哪一級的模型、需不需要卸載。&lt;/li>
&lt;li>理解為什麼 16GB VRAM + 64GB RAM 跑 30B MoE 比跑 14B Dense 全載 VRAM 划算。&lt;/li>
&lt;li>判讀 KV cache 量化跟 context 長度的權衡。&lt;/li>
&lt;li>判斷自己這台 PC 適不適合跑本地 LLM、瓶頸在 VRAM 還是 RAM。&lt;/li>
&lt;/ol>
&lt;h2 id="pc-記憶體預算的基本算式">PC 記憶體預算的基本算式&lt;/h2>
&lt;p>PC 跑本地 LLM 的預算拆成兩塊、各有自己的容量上限：&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">VRAM = 顯卡記憶體（GDDR6/7）= 高頻寬區
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> └── 通常需放：當前活躍模型層 + KV cache + 推論中間結果
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">系統 RAM = 主機板上的 DDR4/5 = 高容量區
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> └── 可以放：MoE 不活躍專家層（透過 --n-cpu-moe）、暫存權重、context cache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> └── 通常需保留：作業系統 + 應用程式 + GPU driver pinned memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">PCIe = 兩塊預算之間的橋
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">9&lt;/span>&lt;span class="cl"> └── 5.0 x16 廠商標稱單向約 64 GB/s、模型載入時較常成為瓶頸、推論時通常較少&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>兩塊預算各自的估算原則（具體數值依硬體世代、廠商規格與驅動版本而變化、本章引用的數字以廠商規格表為主、實際吞吐受系統配置影響）：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>VRAM 容量&lt;/strong>：決定能放多少模型層。Dense 模型若要生字快、所有層都該在 VRAM；MoE 模型可以只放「共用層 + 部分專家」、其餘走 RAM。&lt;/li>
&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）；生字 t/s 約等於「VRAM 頻寬 ÷ 模型每 token 讀取的 bytes」、但實際吞吐還受 CUDA backend、量化方式與 batch size 影響。&lt;/li>
&lt;li>&lt;strong>系統 RAM 容量&lt;/strong>：影響 MoE 卸載與多模型併存的彈性。對 16GB VRAM 卡而言、64GB DDR5 通常足以支撐重度 MoE 卸載、128GB 對多模型併存或長 context cache 更從容、32GB 則會限縮可卸載的層數。&lt;/li>
&lt;li>&lt;strong>系統 RAM 頻寬&lt;/strong>：影響卸載到 CPU 的層走多快。DDR5 6000 雙通道的標稱頻寬約 96 GB/s（依主機板、CMK 模組與時序變動）、相對 VRAM 慢約一個量級、所以卸載層數要跟可接受的生字速度損失一起調。&lt;/li>
&lt;li>&lt;strong>PCIe 頻寬&lt;/strong>：模型載入時通常是瓶頸、單人推論時較少成為主要瓶頸（除非每 token 都需要把大量卸載權重拉回 VRAM）。&lt;/li>
&lt;/ol>
&lt;h2 id="pc-配置與可運作模型對照">PC 配置與可運作模型對照&lt;/h2>
&lt;p>下表整理 2026 年 5 月常見消費級 NVIDIA GPU 加上不同 RAM 容量、可運作模型的數量級對照。體感標籤是社群常見回報的相對描述、實際因 llama.cpp / Ollama 版本、CUDA backend、模型量化版本、&lt;code>--n-cpu-moe&lt;/code> 設定與工作流類型而變動、需自行實測校準。&lt;/p></description><content:encoded><![CDATA[<p>PC 場景跑本地 LLM 的判讀模型本質跟 <a href="/blog/llm/00-foundations/hardware-memory-budget/" data-link-title="0.5 Apple Silicon 記憶體預算" data-link-desc="記憶體決定能跑什麼，Q4 量化下的可運作模型對照與系統保留">Mac 統一記憶體</a> 不同：Mac 是一塊預算切系統 / 模型 / <a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a>、PC 是 <a href="/blog/llm/knowledge-cards/vram/" data-link-title="VRAM" data-link-desc="顯卡上的記憶體、跟系統 RAM 是兩塊獨立預算、決定能載入多大模型權重跟 KV cache">VRAM</a> 跟系統 RAM 兩塊<strong>分層預算</strong>、靠 <a href="/blog/llm/knowledge-cards/pcie/" data-link-title="PCIe" data-link-desc="PC 上連接 GPU 跟主機板的高速序列匯流排、影響模型載入速度跟 MoE 卸載時的推論吞吐">PCIe</a> 連起來。本章把「16GB 5060 Ti 能跑 30B 嗎」這類含糊說法、換成可操作的兩塊預算判讀。生字速度上限主要受 <a href="/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">memory bandwidth</a> 影響、跟 <a href="/blog/llm/knowledge-cards/unified-memory/" data-link-title="Unified Memory Architecture" data-link-desc="Apple Silicon 讓 CPU / GPU / NE 共用同一塊記憶體：跑大模型的優勢來源">統一記憶體</a> 的 Mac 場景判讀軸不同。</p>
<p>讀完本章後、你可以對自己這台 PC 直接回答：能跑哪些模型、要不要做 MoE 卸載、KV cache 該量化到哪一級、context 能開多大、系統 RAM 容量該不該升級。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後、你應該能：</p>
<ol>
<li>看 PC 規格（VRAM + RAM）立刻知道能跑哪一級的模型、需不需要卸載。</li>
<li>理解為什麼 16GB VRAM + 64GB RAM 跑 30B MoE 比跑 14B Dense 全載 VRAM 划算。</li>
<li>判讀 KV cache 量化跟 context 長度的權衡。</li>
<li>判斷自己這台 PC 適不適合跑本地 LLM、瓶頸在 VRAM 還是 RAM。</li>
</ol>
<h2 id="pc-記憶體預算的基本算式">PC 記憶體預算的基本算式</h2>
<p>PC 跑本地 LLM 的預算拆成兩塊、各有自己的容量上限：</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 = 顯卡記憶體（GDDR6/7）= 高頻寬區
</span></span><span class="line"><span class="ln">2</span><span class="cl">  └── 通常需放：當前活躍模型層 + KV cache + 推論中間結果
</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">系統 RAM = 主機板上的 DDR4/5 = 高容量區
</span></span><span class="line"><span class="ln">5</span><span class="cl">  └── 可以放：MoE 不活躍專家層（透過 --n-cpu-moe）、暫存權重、context cache
</span></span><span class="line"><span class="ln">6</span><span class="cl">  └── 通常需保留：作業系統 + 應用程式 + GPU driver pinned memory
</span></span><span class="line"><span class="ln">7</span><span class="cl">
</span></span><span class="line"><span class="ln">8</span><span class="cl">PCIe = 兩塊預算之間的橋
</span></span><span class="line"><span class="ln">9</span><span class="cl">  └── 5.0 x16 廠商標稱單向約 64 GB/s、模型載入時較常成為瓶頸、推論時通常較少</span></span></code></pre></div><p>兩塊預算各自的估算原則（具體數值依硬體世代、廠商規格與驅動版本而變化、本章引用的數字以廠商規格表為主、實際吞吐受系統配置影響）：</p>
<ol>
<li><strong>VRAM 容量</strong>：決定能放多少模型層。Dense 模型若要生字快、所有層都該在 VRAM；MoE 模型可以只放「共用層 + 部分專家」、其餘走 RAM。</li>
<li><strong>VRAM 頻寬</strong>：影響生字速度上限。常見消費級 NVIDIA 卡的廠商標稱頻寬（向廠商規格表查驗）大致落在數百 GB/s 到約 1 TB/s 級的區間（如 RTX 5060 Ti 16GB 標稱約 448 GB/s、RTX 5070 Ti 約 896 GB/s）；生字 t/s 約等於「VRAM 頻寬 ÷ 模型每 token 讀取的 bytes」、但實際吞吐還受 CUDA backend、量化方式與 batch size 影響。</li>
<li><strong>系統 RAM 容量</strong>：影響 MoE 卸載與多模型併存的彈性。對 16GB VRAM 卡而言、64GB DDR5 通常足以支撐重度 MoE 卸載、128GB 對多模型併存或長 context cache 更從容、32GB 則會限縮可卸載的層數。</li>
<li><strong>系統 RAM 頻寬</strong>：影響卸載到 CPU 的層走多快。DDR5 6000 雙通道的標稱頻寬約 96 GB/s（依主機板、CMK 模組與時序變動）、相對 VRAM 慢約一個量級、所以卸載層數要跟可接受的生字速度損失一起調。</li>
<li><strong>PCIe 頻寬</strong>：模型載入時通常是瓶頸、單人推論時較少成為主要瓶頸（除非每 token 都需要把大量卸載權重拉回 VRAM）。</li>
</ol>
<h2 id="pc-配置與可運作模型對照">PC 配置與可運作模型對照</h2>
<p>下表整理 2026 年 5 月常見消費級 NVIDIA GPU 加上不同 RAM 容量、可運作模型的數量級對照。體感標籤是社群常見回報的相對描述、實際因 llama.cpp / Ollama 版本、CUDA backend、模型量化版本、<code>--n-cpu-moe</code> 設定與工作流類型而變動、需自行實測校準。</p>
<table>
  <thead>
      <tr>
          <th>GPU</th>
          <th>VRAM</th>
          <th>RAM 配置</th>
          <th>全載 VRAM 可跑 Dense</th>
          <th>配合 MoE 卸載可跑模型</th>
          <th>體感區段（社群回報）</th>
          <th>備註</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>RTX 4060 / 5060</td>
          <td>8GB</td>
          <td>16GB</td>
          <td>7B Q4</td>
          <td>14B MoE 卸載</td>
          <td>入門體驗</td>
          <td>對寫 code 的中大型任務通常仍須混用雲端</td>
      </tr>
      <tr>
          <td>RTX 4060 Ti / 5060 Ti</td>
          <td>16GB</td>
          <td>32GB</td>
          <td>14B Q4 / 20B Q3</td>
          <td>30B MoE 卸載部分專家層</td>
          <td>可日常使用</td>
          <td>MoE 卸載空間受 32GB RAM 限制</td>
      </tr>
      <tr>
          <td>RTX 4060 Ti / 5060 Ti</td>
          <td>16GB</td>
          <td>64GB</td>
          <td>14B Q4</td>
          <td>30B MoE Q4 + 重度卸載</td>
          <td>多數寫 code 任務流暢</td>
          <td>2026 年常被列為合理起點之一</td>
      </tr>
      <tr>
          <td>RTX 4070 Ti / 5070 Ti</td>
          <td>16GB</td>
          <td>64GB</td>
          <td>14B Q4</td>
          <td>30B MoE Q4 / 70B MoE Q3 卸載</td>
          <td>補完體感更接近即時</td>
          <td>VRAM 頻寬規格上接近 5060 Ti 兩倍</td>
      </tr>
      <tr>
          <td>RTX 4090</td>
          <td>24GB</td>
          <td>64GB</td>
          <td>32B Q4 / 70B Q3</td>
          <td>70B MoE Q4</td>
          <td>大型任務也流暢</td>
          <td>Dense 70B 可在 Q3 量化下全載</td>
      </tr>
      <tr>
          <td>RTX 5090</td>
          <td>32GB</td>
          <td>64GB ~ 128GB</td>
          <td>70B Q4</td>
          <td>100B+ MoE 卸載</td>
          <td>容量充裕</td>
          <td>適合 70B Dense 主力或多模型併存場景</td>
      </tr>
  </tbody>
</table>
<p>讀這張表要注意四件事：</p>
<ol>
<li><strong>「全載 VRAM」跟「卸載」是兩種選型</strong>。全載生字較快但模型較小、卸載生字較慢但能跑較大模型；MoE 結構讓兩者的速度差距小於 Dense 模型。</li>
<li><strong>量化等級可以調整</strong>。16GB VRAM 跑 30B MoE Q4 比跑 30B MoE Q5 留下更多 VRAM 餘量、給 KV cache 跟併發數使用。</li>
<li><strong>RAM 容量影響選型</strong>。32GB RAM 配 16GB VRAM 時、可卸載層數有限、能跑的最大 MoE 規模受限；64GB RAM 配 16GB VRAM 通常足以支撐 30B 級 MoE 的重度卸載。</li>
<li><strong>多卡升級建議在單卡跑穩後評估</strong>。雙 GPU 在 llama.cpp 上要設定 <a href="/blog/llm/knowledge-cards/llama-cpp-tensor-split/" data-link-title="llama.cpp Tensor Split" data-link-desc="llama.cpp 多 GPU 場景中把模型張量按比例切到多張卡上的權重分配機制">tensor split</a>、實際速度提升依模型與配置變化；消費級主機板的 PCIe lane 分配（常見一條 x16 + 一條 x4）也會影響多卡效益。建議先把單卡跑熟、再依瓶頸決定是否多卡。</li>
</ol>
<h2 id="為什麼-16gb-vram--64gb-ram-常被列為寫-code-場景的合理起點">為什麼 16GB VRAM + 64GB RAM 常被列為寫 code 場景的合理起點</h2>
<p>這個配置（RTX 5060 Ti 16GB / RTX 5070 Ti 16GB + 64GB DDR5）在 2026 年 5 月的 PC 本地 LLM 社群裡、常被作為「寫 code 用途」的價格效能比合理起點。對應的判讀軸有四條：</p>
<ol>
<li><strong>30B 級 MoE 模型在多數寫 code 任務已能勝任</strong>。Qwen3-30B-A3B 等 <a href="/blog/llm/knowledge-cards/moe/" data-link-title="Mixture of Experts (MoE)" data-link-desc="把 transformer 的 FFN 層拆成多個專家、每 token 只啟用少數、總參數大但每 token 計算量小的架構">MoE</a> 模型在公開 coding benchmark 上的回報（如 Qwen 官方技術報告、社群 SWE-bench 跑分）顯示表現接近大型 Dense 模型；具體分數依任務類型、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>。模型總參數與 <a href="/blog/llm/knowledge-cards/active-parameter/" data-link-title="Active Parameter" data-link-desc="MoE 模型每生成一個 token 實際參與計算的參數量、跟模型總參數量不同、影響推論速度上限">active parameter</a> 是兩個獨立軸、影響記憶體需求跟生字速度上限。</li>
<li><strong>MoE 卸載讓 16GB VRAM 能載入 30B 級模型</strong>。把約 30 層 MoE 專家權重留在 RAM、其餘放 VRAM、Qwen3-30B-A3B Q4 量化下整套模型總記憶體約落在 18 ~ 22GB 區間、其中常見約 12 ~ 14GB 在 VRAM（實際依模型結構與 <code>--n-cpu-moe</code> 設定變化）。</li>
<li><strong>KV cache 量化能在剩餘 VRAM 開大 context</strong>。模型權重放好後、剩餘 VRAM 配上 K=Q8 / V=Q4 的 KV cache 量化、社群常見回報能開到 128K ~ 256K 級 context（依模型 attention 配置變化）、寫 code 場景的長 prompt 較少需要截斷。</li>
<li><strong>零件可分次採購、後續可升級</strong>。相對 Apple Silicon 整機綁定配置、PC 零件（GPU、RAM、CPU、儲存）可分次採購與升級；具體零件價格依在地市場、世代與促銷波動、本文不引用具體幣值。</li>
</ol>
<p>下表是社群討論中常被提及的兩張同代 16GB 卡的相對對照、用意是「同樣 16GB VRAM 但頻寬不同對 throughput 的影響」、不是嚴格 benchmark：</p>
<table>
  <thead>
      <tr>
          <th>顯卡</th>
          <th>VRAM 頻寬（廠商標稱）</th>
          <th>Prefill 數量級</th>
          <th>生成數量級</th>
          <th>可開 context（量化 KV cache 下）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>RTX 5060 Ti 16GB</td>
          <td>約 448 GB/s</td>
          <td>數百 t/s</td>
          <td>數十 t/s（較 5070 Ti 低約一半）</td>
          <td>128K ~ 256K 級</td>
      </tr>
      <tr>
          <td>RTX 5070 Ti 16GB</td>
          <td>約 896 GB/s</td>
          <td>約為 5060 Ti 的 2 倍</td>
          <td>約為 5060 Ti 的 2 倍</td>
          <td>128K ~ 256K 級</td>
      </tr>
  </tbody>
</table>
<p>兩張卡的差異主要在 VRAM 頻寬（廠商標稱接近 2 倍）、不在 VRAM 容量。對「同樣的模型能否載入」沒影響、對「生字多快」影響較大。實際 throughput 因驅動版本、模型量化方式、<code>--n-cpu-moe</code> 設定與 prompt 長度而變動、需自行用 <code>llama-bench</code> 或實際工作流校準。</p>
<blockquote>
<p><strong>事實查核註</strong>：表中 prefill / 生成的具體數字是社群討論中常見回報的相對數量級、不是經本文系統實測的 benchmark。VRAM 頻寬以 NVIDIA 廠商規格表為主、實作上會被 GDDR 模組廠商、PCIe 版本、CUDA backend 版本影響。引用前請以最新官方規格表跟 <a href="https://github.com/ggml-org/llama.cpp/discussions">llama.cpp 官方 benchmark</a> 為準。</p></blockquote>
<p>社群常見回報的三個觀察點（同樣需以自身配置實測校準）：</p>
<ol>
<li><code>--n-cpu-moe</code> 數值往上加（如從 20 加到 30）、單張卡的 VRAM 佔用降低、可開的 context 上限拉大、但生成速度也會下降；具體下降幅度依模型 active parameter 比例變化。</li>
<li>KV cache 量化（K=Q8 / V=Q4）相對 fp16 KV cache 體積大幅壓縮、能換取更大 context 上限；寫 code 場景的補完品質影響社群多數回報為小幅或不明顯、但會視 prompt 長度與任務類型而異。</li>
<li>系統 RAM 從 32GB 升到 64GB 後、可卸載的 MoE 層數上限明顯提高、能跑的最大模型規模也跟著拉開；具體層數依模型結構而定。</li>
</ol>
<p>對應的 PC 配置面向（2026 年 5 月、不引用具體幣值）：</p>
<ul>
<li><strong>價格優先</strong>：RTX 5060 Ti 16GB + 64GB DDR5 + 中階 CPU（如 AMD 9900X / Intel 14700K）+ 1TB NVMe。</li>
<li><strong>生字速度優先</strong>：RTX 5070 Ti 16GB + 64GB DDR5 + 中階 CPU。VRAM 容量跟 5060 Ti 相同、頻寬規格接近兩倍。</li>
<li><strong>跑得了 70B 級</strong>：RTX 4090 24GB / RTX 5090 32GB + 64GB ~ 128GB DDR5。</li>
</ul>
<p>若你正準備組新機主要為了跑本地 LLM 寫 code、16GB VRAM + 64GB RAM 是社群常見的合理起點；具體選哪張卡、視預算上限與對生字速度的要求而定。</p>
<h2 id="moe-卸載-vs-全載-dense-的選型差異">MoE 卸載 vs 全載 Dense 的選型差異</h2>
<p>PC 場景有 Mac 沒有的選型變數：<strong>同樣 16GB VRAM、要跑「全載 14B Dense」還是「卸載 30B MoE」？</strong></p>
<p>兩條路線的差異：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>全載 14B Dense</th>
          <th>卸載 30B MoE</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>生字速度</td>
          <td>相對較快</td>
          <td>相對較慢、視卸載層數而定</td>
      </tr>
      <tr>
          <td>模型能力</td>
          <td>14B 級、跨檔案重構任務的成功率較 30B 低</td>
          <td>30B 級、跨檔案重構任務社群回報成功率相對較高</td>
      </tr>
      <tr>
          <td>對 RAM 容量需求</td>
          <td>較低（32GB 通常足夠）</td>
          <td>較高（64GB 常見起點、128GB 對重度使用者更從容）</td>
      </tr>
      <tr>
          <td>context 上限</td>
          <td>KV cache 競 VRAM、上限受限</td>
          <td>配合 KV cache 量化、社群回報可開 128K 級以上</td>
      </tr>
      <tr>
          <td>系統熱度與功耗</td>
          <td>GPU 為主負載</td>
          <td>GPU 跟 CPU 同時負擔</td>
      </tr>
  </tbody>
</table>
<p><strong>判讀原則</strong>：寫 code 場景下、模型能力對任務成敗的影響通常比生字速度更顯著；30B 模型能完成的跨檔案任務、生字較慢仍可能勝過 14B 較快但解不出來的情況。若工作流以高頻短補完為主、對生字即時體感要求高、14B Dense 全載仍是合理選擇。實際取捨建議用一週實測校準。</p>
<h2 id="kv-cache-量化與-context-的權衡">KV cache 量化與 context 的權衡</h2>
<p>VRAM 預算扣掉模型權重後、剩下的空間主要給 KV cache。KV cache 跟 context 長度大致成正比、長 context 場景的 VRAM 限制跟 Mac 統一記憶體場景類似、但 PC 多了「量化 KV cache」這個工程選項。</p>
<p>下表為 KV cache 體積的數量級估算（依模型 attention head 數、hidden size、量化策略變化、實際值需用工具測量、本表用於說明量化前後的比例變化）：</p>
<table>
  <thead>
      <tr>
          <th>Context 長度</th>
          <th>KV cache 不量化（數量級）</th>
          <th>KV cache K=Q8 / V=Q4（數量級）</th>
          <th>16GB VRAM 餘量觀察</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>8K tokens</td>
          <td>1 GB 級</td>
          <td>&lt; 0.5 GB</td>
          <td>餘量寬鬆</td>
      </tr>
      <tr>
          <td>32K tokens</td>
          <td>數 GB 級</td>
          <td>1 ~ 2 GB</td>
          <td>量化後仍寬鬆</td>
      </tr>
      <tr>
          <td>128K tokens</td>
          <td>10 GB 級以上</td>
          <td>數 GB 級</td>
          <td>不量化時 VRAM 不足</td>
      </tr>
      <tr>
          <td>256K tokens</td>
          <td>數十 GB 級</td>
          <td>10 GB 級</td>
          <td>量化後接近 VRAM 上限</td>
      </tr>
  </tbody>
</table>
<p>KV cache 量化在寫 code 場景的體感判讀有三條社群常見回報的原則（具體影響因模型、量化版本與工作流而變、需自行實測校準）：</p>
<ol>
<li><strong>K（key）對量化容忍度通常較高</strong>：key 用來計算 attention score、本質是相對量級的比較。社群多數回報指出 K=Q8 相對 fp16 在補完品質上差異不明顯、可作為較安全的起手量化等級。</li>
<li><strong>V（value）對量化敏感度集中在長 context 末尾</strong>：value 是被加權平均的內容、量化誤差會累積進輸出。短 prompt（&lt; 32K）下 V=Q4 跟 fp16 的差異多為小幅；長 prompt（128K+）的對話末尾、社群回報偶爾觀察到「對前文細節記憶較模糊」的情形、但對跨檔案 code 補完任務影響社群多數回報為小。</li>
<li><strong>品質影響在 coding 跟自由創作場景不同</strong>：寫 code 的輸出空間受語法 / 型別 / 編譯限制、KV cache 量化的小幅誤差較容易被約束過濾；自由創作（小說、詩、長對話）對 V 量化較敏感、社群回報品質差異較明顯。</li>
</ol>
<p>實務上、K=Q8 / V=Q4 是 PC 場景開大 context 的常見組合；若觀察到長 prompt 末尾的回答品質下降、可考慮把 V 升回 Q8 或 fp16（代價是 VRAM 佔用上升、context 上限會縮短）。</p>
<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>。</p>
<h2 id="系統-ram-容量在-pc-場景的角色">系統 RAM 容量在 PC 場景的角色</h2>
<p>Mac 統一記憶體只有一個容量數字、PC 多了「VRAM」跟「系統 RAM」兩個獨立數字。PC 場景的預算分配若全部投入 VRAM、可能忽略系統 RAM 對 MoE 卸載策略的支撐角色。</p>
<p>系統 RAM 在本地 LLM 場景的主要用途（具體佔用量依工作流變化）：</p>
<ol>
<li><strong>作業系統 + 開發工具</strong>：Windows / Linux + VS Code + 瀏覽器、常見佔用約 8 ~ 16GB。</li>
<li><strong>GPU driver pinned memory</strong>：NVIDIA driver 為了 PCIe DMA 會固定一塊系統 RAM、依驅動版本與配置常見約 1 ~ 2GB。</li>
<li><strong>MoE 卸載的專家權重</strong>：跑 30B MoE 卸載多數專家層、所需 RAM 落在 10 GB 級以上；跑 70B MoE 重度卸載通常需要數十 GB 級。具體數字依模型結構與 <code>--n-cpu-moe</code> 設定變化。</li>
<li><strong>多模型併存</strong>：同時跑 coding model + embedding model + 翻譯模型、每個各佔數 GB 級。</li>
<li><strong>page cache / 系統暫存</strong>：Linux 會把剩餘 RAM 用於 page cache、模型 reload 時可加速。</li>
</ol>
<p>對 16GB VRAM 配置而言、64GB RAM 通常足以支撐重度 MoE 卸載、是社群常見的起點容量。32GB RAM 配 16GB VRAM 在重度 MoE 卸載場景容易吃緊、可卸載層數會受限；視工作流類型、32GB 也可能足夠跑全載 Dense 模型。</p>
<h2 id="pcie-頻寬的角色">PCIe 頻寬的角色</h2>
<p>PCIe 在「載入模型」階段較常成為瓶頸、單人推論時通常不是、但 MoE 卸載會讓 PCIe 在推論時也參與資料流：</p>
<ol>
<li><strong>模型載入時</strong>：PCIe 5.0 x16 廠商標稱單向約 64 GB/s（PCIe 4.0 x16 約一半）、實際走完磁碟 → RAM → VRAM 整條路徑的吞吐通常較規格低、模型載入時間視 NVMe 讀取速度、檔案系統與量化格式變動。常見差異在啟動秒數、推論階段一般感受不到。</li>
<li><strong>MoE 卸載推論時</strong>：每 token 啟用的專家層權重需透過 PCIe 從 RAM 拉到 VRAM。以 Qwen3-30B-A3B 為例、每 token 啟用約 3B active parameter；若部分專家層在 RAM、每 token 需透過 PCIe 拉部分權重。單人推論場景下、相對 PCIe 5.0 x16 的可用頻寬佔比通常較小、社群多數回報不是主要瓶頸；併發數高或卸載比例極大時會逐漸顯現。</li>
<li><strong>多卡推論</strong>：多卡 tensor parallel 會密集走 PCIe / NVLink。消費級 GPU 普遍不支援 NVLink、訊息走 PCIe；多卡的吞吐縮放比社群回報相對單卡 + MoE 卸載的線性度差、需依工作流評估。</li>
</ol>
<p>實務上、單卡 + MoE 卸載場景下 PCIe 較少成為主要瓶頸；多卡或極端卸載比例下、PCIe lane 分配（如主機板的 x16 + x4 配置）會明顯影響可達吞吐。</p>
<h2 id="給讀者的決策表">給讀者的決策表</h2>
<p>看完上面的對照後、可以照下表做決策：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>建議</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>已有 8GB VRAM 卡、想試本地</td>
          <td>用 Qwen3 7B / Gemma 4 8B 試一週、評估是否值得升級、寫 code 主力可暫時保留雲端</td>
      </tr>
      <tr>
          <td>已有 12GB VRAM 卡（如 3060 / 4070）</td>
          <td>14B Dense Q4 全載 / 20B MoE Q4 卸載、依寫 code 場景速度需求選擇</td>
      </tr>
      <tr>
          <td>已有 16GB VRAM 卡、RAM 32GB</td>
          <td>先評估升級 RAM 到 64GB 再評估 MoE 卸載策略、32GB RAM 配 16GB VRAM 卸載空間有限</td>
      </tr>
      <tr>
          <td>已有 16GB VRAM 卡、RAM 64GB</td>
          <td>Qwen3-30B-A3B MoE Q4 + <code>--n-cpu-moe</code> 約 30 是社群常見起點配置</td>
      </tr>
      <tr>
          <td>已有 24GB VRAM 卡（如 4090）</td>
          <td>32B Dense Q4 全載 / 70B MoE Q4 卸載、依任務類型評估</td>
      </tr>
      <tr>
          <td>已有 32GB VRAM 卡（如 5090）</td>
          <td>70B Dense Q4 全載通常可行、依任務評估是否仍需 MoE 卸載</td>
      </tr>
      <tr>
          <td>正準備組新機、價格優先</td>
          <td>5060 Ti 16GB + 64GB DDR5 + 中階 CPU、整機可分次採購、具體預算依在地零件價格而定</td>
      </tr>
      <tr>
          <td>正準備組新機、追求生字速度</td>
          <td>5070 Ti 16GB + 64GB DDR5、VRAM 頻寬規格相對 5060 Ti 約 2 倍</td>
      </tr>
      <tr>
          <td>正準備組新機、要兼跑 70B</td>
          <td>4090 24GB / 5090 32GB + 64GB ~ 128GB DDR5</td>
      </tr>
  </tbody>
</table>
<h2 id="釐清需求類型個人使用-vs-服務多人">釐清需求類型：個人使用 vs 服務多人</h2>
<p>初次接觸本地 LLM 時、常見的疑問是「是不是要 H100 / H200 等資料中心級配置才能跑」。實際上資料中心級配置的設計目標是<strong>大規模並發推論服務</strong>（同時對許多 client 出 token）、跟單人寫 code 的需求側重不同。釐清需求類型後、硬體選擇會清楚很多。</p>
<p>三條判讀軸：</p>
<ol>
<li><strong>能載入的模型大小</strong>主要受 VRAM 容量影響、跟 GPU 算力等級沒有單一對應關係。16GB VRAM 配 MoE 卸載可載入 30B 級 MoE 模型；資料中心級 GPU 容量更大、能載入更大的 Dense 模型、但對個人寫 code 場景的能力提升不一定線性。</li>
<li><strong>生字速度上限</strong>主要由 VRAM 頻寬影響。消費級高階卡（如 RTX 5070 Ti、4090、5090）的頻寬已足以支撐單人寫 code 場景的補完即時體感、實際差異依模型量化、context 長度與 backend 變化。</li>
<li><strong>大量並發推論</strong>才需要資料中心級配置。單人開 VS Code 跟 LLM 對話、通常不會用到資料中心的並發優勢。</li>
</ol>
<p>對應的決策路徑：先確認需求是「個人寫 code」還是「服務多人」、再選 16GB VRAM + 64GB RAM 級的起點配置、實測一週觀察模型能力是否符合任務需求、再依痛點選擇升級方向（VRAM 容量、頻寬、或多卡）。</p>
<p>升級到能跑 70B 級之前、建議先確認痛點是「模型能力不夠」還是「生字速度不夠」。本地 30B MoE 在多數寫 code 任務上已能勝任、社群多數使用者回報不是每個工作流都需要 70B 級模型；具體判斷需用自己的任務實測。</p>
<h2 id="下一章">下一章</h2>
<p>下一章：<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>、深入 <code>--n-cpu-moe</code> 的判讀。</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>5.2 KV cache 量化策略</title><link>https://tarrragon.github.io/blog/llm/05-discrete-gpu/kv-cache-quantization-strategy/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/05-discrete-gpu/kv-cache-quantization-strategy/</guid><description>&lt;p>KV cache 量化是 PC 場景開大 context 或提高併發數的常用工程選項：把 &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> 從 fp16 壓到 Q8 或 Q4、體積大幅縮減、騰出的 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&lt;/a>、加併發、或載入更大模型。本章不重複&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">卡片定義&lt;/a>、改處理「實際要不要量化、量化到哪一級」的判讀。卡片視角的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a> 跟本章的 KV cache 量化是兩個方向：前者壓模型權重、後者壓推論時的 attention 暫存。&lt;/p>
&lt;p>讀完本章後、你應該能對自己的工作流回答：KV cache 量化的好處能換到什麼、品質代價落在什麼範圍、K 跟 V 為什麼建議不同等級、跟 context 長度跟併發數怎麼搭配。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;ol>
&lt;li>理解 KV cache 為什麼會隨 context 線性膨脹、為什麼 PC 場景常需要量化。&lt;/li>
&lt;li>區分 K 跟 V 在 attention 計算中的角色、解釋為何兩者對量化的容忍度不同。&lt;/li>
&lt;li>判讀「該不該量化 KV cache」的工作流類型。&lt;/li>
&lt;li>認識 llama.cpp 的 &lt;code>--cache-type-k&lt;/code> / &lt;code>--cache-type-v&lt;/code> 旗標與相關限制（如 flash attention 要求）。&lt;/li>
&lt;li>知道調參時的觀察訊號跟取捨方向。&lt;/li>
&lt;/ol>
&lt;h2 id="kv-cache-為什麼會膨脹">KV cache 為什麼會膨脹&lt;/h2>
&lt;p>LLM 推論時、每處理一個 token 都會把該 token 的 key 跟 value 向量算出來、暫存進 KV cache、供後續 token 的 attention 計算複用（不重算）。KV cache 的體積跟下面幾個變數線性相關：&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">KV cache 體積 ≈ 2 × n_layers × n_heads × head_dim × bytes_per_value × context_長度 × batch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>2：分別是 K cache 跟 V cache&lt;/li>
&lt;li>n_layers / n_heads / head_dim：模型結構參數&lt;/li>
&lt;li>bytes_per_value：fp16 是 2 bytes、Q8_0 約 1 byte、Q4_0 約 0.5 byte&lt;/li>
&lt;li>context_長度：context 開多大、KV cache 就放多大&lt;/li>
&lt;li>batch：併發處理多少 sequence&lt;/li>
&lt;/ul>
&lt;p>實際 KV cache 體積依模型 attention 變體（MHA / GQA / MLA）、head 數設計、量化方式而變。比起背公式、更實用的做法是看 llama.cpp 啟動時的 log、它會列出實際 KV cache 配置的記憶體：&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">llm_load_print_meta: n_layer = 48
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">llm_load_print_meta: n_head = 32
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">llama_kv_cache_init: KV self size = 2048.00 MiB, K (q8_0): 1024.00 MiB, V (q8_0): 1024.00 MiB&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：上面的 log 格式跟欄位名稱依 llama.cpp 版本變動、實際輸出以執行時為準。常見模型的 KV cache 估算工具可參考 &lt;a href="https://github.com/ggml-org/llama.cpp">llama.cpp 官方文件&lt;/a> 或社群維護的 calculator。&lt;/p></description><content:encoded><![CDATA[<p>KV cache 量化是 PC 場景開大 context 或提高併發數的常用工程選項：把 <a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a> 從 fp16 壓到 Q8 或 Q4、體積大幅縮減、騰出的 VRAM 拿去開長 <a href="/blog/llm/knowledge-cards/context-window/" data-link-title="Context Window" data-link-desc="模型一次能處理的最大 token 數量：prompt 加生成的總和上限">context</a>、加併發、或載入更大模型。本章不重複<a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">卡片定義</a>、改處理「實際要不要量化、量化到哪一級」的判讀。卡片視角的 <a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a> 跟本章的 KV cache 量化是兩個方向：前者壓模型權重、後者壓推論時的 attention 暫存。</p>
<p>讀完本章後、你應該能對自己的工作流回答：KV cache 量化的好處能換到什麼、品質代價落在什麼範圍、K 跟 V 為什麼建議不同等級、跟 context 長度跟併發數怎麼搭配。</p>
<h2 id="本章目標">本章目標</h2>
<ol>
<li>理解 KV cache 為什麼會隨 context 線性膨脹、為什麼 PC 場景常需要量化。</li>
<li>區分 K 跟 V 在 attention 計算中的角色、解釋為何兩者對量化的容忍度不同。</li>
<li>判讀「該不該量化 KV cache」的工作流類型。</li>
<li>認識 llama.cpp 的 <code>--cache-type-k</code> / <code>--cache-type-v</code> 旗標與相關限制（如 flash attention 要求）。</li>
<li>知道調參時的觀察訊號跟取捨方向。</li>
</ol>
<h2 id="kv-cache-為什麼會膨脹">KV cache 為什麼會膨脹</h2>
<p>LLM 推論時、每處理一個 token 都會把該 token 的 key 跟 value 向量算出來、暫存進 KV cache、供後續 token 的 attention 計算複用（不重算）。KV cache 的體積跟下面幾個變數線性相關：</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">KV cache 體積 ≈ 2 × n_layers × n_heads × head_dim × bytes_per_value × context_長度 × batch</span></span></code></pre></div><ul>
<li>2：分別是 K cache 跟 V cache</li>
<li>n_layers / n_heads / head_dim：模型結構參數</li>
<li>bytes_per_value：fp16 是 2 bytes、Q8_0 約 1 byte、Q4_0 約 0.5 byte</li>
<li>context_長度：context 開多大、KV cache 就放多大</li>
<li>batch：併發處理多少 sequence</li>
</ul>
<p>實際 KV cache 體積依模型 attention 變體（MHA / GQA / MLA）、head 數設計、量化方式而變。比起背公式、更實用的做法是看 llama.cpp 啟動時的 log、它會列出實際 KV cache 配置的記憶體：</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">llm_load_print_meta: n_layer    = 48
</span></span><span class="line"><span class="ln">2</span><span class="cl">llm_load_print_meta: n_head     = 32
</span></span><span class="line"><span class="ln">3</span><span class="cl">llama_kv_cache_init: KV self size = 2048.00 MiB, K (q8_0): 1024.00 MiB, V (q8_0): 1024.00 MiB</span></span></code></pre></div><blockquote>
<p><strong>事實查核註</strong>：上面的 log 格式跟欄位名稱依 llama.cpp 版本變動、實際輸出以執行時為準。常見模型的 KV cache 估算工具可參考 <a href="https://github.com/ggml-org/llama.cpp">llama.cpp 官方文件</a> 或社群維護的 calculator。</p></blockquote>
<h2 id="k-跟-v-為什麼適合用不同量化等級">K 跟 V 為什麼適合用不同量化等級</h2>
<p>K 跟 V 在 <a href="/blog/llm/knowledge-cards/attention/" data-link-title="Attention" data-link-desc="Transformer 內部讓每個 token 對其他 token 加權平均的核心機制、形成 KV cache 跟 context window 的計算基礎">attention</a> 計算中扮演不同角色、對量化的容忍度也不同。K 參與內積比較（量化容忍度通常較高）、V 是被加權平均的輸出內容（量化誤差會線性累積）、社群常見做法是 K 用較激進的量化、V 保留較高精度。</p>
<p>attention 的計算流程簡化為：</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">attention(Q, K, V) = softmax(Q · K^T / √d) · V</span></span></code></pre></div><p>K 跟 V 在這個流程中的角色差異：</p>
<ol>
<li><strong>K（key）</strong>：用來跟 Q 算內積、產生 attention score。內積本質是「相對量級的比較」、量化造成的微小誤差容易在 softmax 後被吸收。</li>
<li><strong>V（value）</strong>：是被 softmax 加權平均後直接輸出的內容、量化誤差會線性累積進輸出。</li>
</ol>
<p>社群多數回報指出：</p>
<ul>
<li><strong>K 用 Q8_0 或 Q4_0 對品質影響相對小</strong>：因為 softmax 對輸入量級的敏感度集中在最大值附近、其他位置的小幅誤差會被指數壓縮。</li>
<li><strong>V 用 Q4_0 在長 context 末尾較易出現品質下降</strong>：因為 V 是被加權平均的內容、累積誤差會在輸出中可見。</li>
</ul>
<blockquote>
<p><strong>事實查核註</strong>：K 跟 V 對量化敏感度不同的論述、來自社群常見回報跟若干針對 KV cache 量化的論文（如 KIVI、KVQuant 等）。具體影響因模型架構、量化方法（symmetric / asymmetric、per-head / per-channel scale 等）變化、不同模型的表現可能不一致；建議用自己工作流的任務跟自己選定的量化版本實測校準。</p></blockquote>
<h2 id="kv-cache-量化等級對照">KV cache 量化等級對照</h2>
<p>llama.cpp 支援的常見 KV cache 量化等級：</p>
<table>
  <thead>
      <tr>
          <th>量化等級</th>
          <th>bytes/value（約）</th>
          <th>相對 fp16 體積</th>
          <th>社群常見用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>fp16</code></td>
          <td>2</td>
          <td>100%</td>
          <td>預設、品質基準</td>
      </tr>
      <tr>
          <td><code>q8_0</code></td>
          <td>1</td>
          <td>50%</td>
          <td>K 的常見起點、品質衰減社群回報為小幅</td>
      </tr>
      <tr>
          <td><code>q5_1</code></td>
          <td>~0.7</td>
          <td>~35%</td>
          <td>中間選項</td>
      </tr>
      <tr>
          <td><code>q5_0</code></td>
          <td>~0.7</td>
          <td>~35%</td>
          <td>中間選項</td>
      </tr>
      <tr>
          <td><code>q4_1</code></td>
          <td>~0.5</td>
          <td>~25%</td>
          <td>V 的常見極限</td>
      </tr>
      <tr>
          <td><code>q4_0</code></td>
          <td>~0.5</td>
          <td>~25%</td>
          <td>V 的常見起點、品質衰減較 Q5 略大</td>
      </tr>
  </tbody>
</table>
<p>常見組合（社群回報、需自行校準）：</p>
<ul>
<li><strong>保守（品質優先）</strong>：K=fp16、V=fp16。完全不量化、VRAM 用量最大。</li>
<li><strong>平衡起點</strong>：K=Q8_0、V=Q8_0。體積約一半、品質衰減社群多數回報為小幅或不明顯。</li>
<li><strong>激進（context 優先）</strong>：K=Q8_0、V=Q4_0。體積約 fp16 的 35%、社群回報短 prompt 影響小、長 prompt 末尾可能出現品質下降。</li>
<li><strong>極限</strong>：K=Q4_0、V=Q4_0。體積約 fp16 的 25%、用於開超大 context 或極高併發、品質風險最高。</li>
</ul>
<h2 id="何時值得量化何時不該量化">何時值得量化、何時不該量化</h2>
<p>KV cache 量化的主要用途是「VRAM 不足以同時放下模型權重 + 目標 context 長度 + 目標併發數」的場景。當 VRAM 已有充裕餘量、量化省下的 VRAM 沒有對應的用途時、保留 fp16 通常較合適。下表整理常見的判讀情境：</p>
<table>
  <thead>
      <tr>
          <th>場景</th>
          <th>是否值得量化</th>
          <th>主要考量</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>寫 code、補完、跨檔案重構</td>
          <td>值得（K=Q8/V=Q4）</td>
          <td>程式碼合法性約束會過濾小幅誤差、社群回報品質影響小</td>
      </tr>
      <tr>
          <td>RAG（大型 codebase 索引、長文件摘要）</td>
          <td>值得</td>
          <td>context 通常很長、KV cache 是 VRAM 主要瓶頸</td>
      </tr>
      <tr>
          <td>自由創作（小說、長對話、詩）</td>
          <td>評估、可能不適合</td>
          <td>V 量化的累積誤差較易在創作品質上感知</td>
      </tr>
      <tr>
          <td>數學 / 邏輯推理（chain-of-thought）</td>
          <td>從保守起點</td>
          <td>推理鏈累積誤差較敏感、建議從 K=Q8 / V=Q8 起步、再依任務評估</td>
      </tr>
      <tr>
          <td>短 prompt 短回答（&lt; 4K context）</td>
          <td>不必要</td>
          <td>KV cache 體積本來就小、量化省下的 VRAM 不多</td>
      </tr>
      <tr>
          <td>對品質高度敏感的研究或產品任務</td>
          <td>從保守起點</td>
          <td>先用 fp16 建立品質基準、再依需求逐步量化、確認品質可接受</td>
      </tr>
  </tbody>
</table>
<p>判讀原則：<strong>先確認瓶頸是「VRAM 不夠」還是「品質不夠」</strong>。前者量化是解法、後者量化通常會惡化問題。</p>
<h2 id="跟-context-長度併發數的協調">跟 context 長度、併發數的協調</h2>
<p>KV cache 量化的好處要跟其他 VRAM 用量一起評估。常見的取捨方向：</p>
<ol>
<li><strong>量化 → 開更大 context</strong>：把省下的 VRAM 用在加大 <code>-c</code>、能開長 prompt（如 RAG、長對話、跨檔案分析）。</li>
<li><strong>量化 → 加併發</strong>：把省下的 VRAM 用在加 <code>--parallel</code>、能同時服務多個 client（如多個編輯器視窗、多 agent）。</li>
<li><strong>量化 → 載入更大模型</strong>：把省下的 VRAM 用在降 <code>--n-cpu-moe</code>、減少卸載、提升生字速度。</li>
</ol>
<p>三者通常不能同時極大化、需要依工作流挑主軸。</p>
<p>實務上的常見搭配（社群回報、需校準）：</p>
<table>
  <thead>
      <tr>
          <th>工作流</th>
          <th>建議搭配</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>單人寫 code、補完為主</td>
          <td>K=Q8 / V=Q4、context 32K ~ 128K、<code>--parallel 1 ~ 2</code></td>
      </tr>
      <tr>
          <td>RAG 大型 codebase</td>
          <td>K=Q8 / V=Q4、context 128K ~ 256K、<code>--parallel 1</code></td>
      </tr>
      <tr>
          <td>多 agent / 多視窗並用</td>
          <td>K=Q8 / V=Q4 或更激進、context 32K、<code>--parallel 4 ~ 8</code></td>
      </tr>
      <tr>
          <td>對話品質敏感、純創作</td>
          <td>K=Q8 / V=Q8 起步、context 適中、依品質確認再決定是否加量化</td>
      </tr>
  </tbody>
</table>
<h2 id="llamacpp-的相關旗標">llama.cpp 的相關旗標</h2>
<p>跑 KV cache 量化時、常用的旗標：</p>
<table>
  <thead>
      <tr>
          <th>旗標</th>
          <th>作用</th>
          <th>備註</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--cache-type-k &lt;type&gt;</code></td>
          <td>K cache 量化（如 <code>f16</code>、<code>q8_0</code>、<code>q4_0</code>）</td>
          <td>預設 f16</td>
      </tr>
      <tr>
          <td><code>--cache-type-v &lt;type&gt;</code></td>
          <td>V cache 量化</td>
          <td>預設 f16</td>
      </tr>
      <tr>
          <td><code>-fa</code> / <code>--flash-attn</code></td>
          <td>啟用 flash attention</td>
          <td>部分量化組合需要 flash attention 才能啟用、見下方說明</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>-ctk &lt;type&gt;</code> / <code>-ctv &lt;type&gt;</code></td>
          <td><code>--cache-type-k</code> / <code>--cache-type-v</code> 的短旗標</td>
          <td>同義、版本依 llama.cpp 變動</td>
      </tr>
  </tbody>
</table>
<h3 id="flash-attention-的關係">flash attention 的關係</h3>
<p>部分 KV cache 量化組合（特別是 V=Q4_0 / Q4_1）在 llama.cpp 上需要同時啟用 <a href="/blog/llm/knowledge-cards/flash-attention/" data-link-title="Flash Attention" data-link-desc="Attention 計算的記憶體友善實作、減少 GPU memory 讀寫、提升長 context 推論吞吐">flash attention</a>（<code>-fa</code>）才能正常運作；沒啟用時可能載入失敗或 fallback 到 fp16。具體要求依 llama.cpp 版本變化、以實際 <code>llama-server --help</code> 跟 <a href="https://github.com/ggml-org/llama.cpp/pulls?q=is%3Amerged&#43;kv&#43;cache&#43;quant">llama.cpp 官方 issue / PR</a> 為準。</p>
<blockquote>
<p><strong>事實查核註</strong>：flash attention 對 KV cache 量化組合的限制、是 llama.cpp 實作層面的演進議題、不是模型本身的限制。新版 llama.cpp 可能放寬或改變要求、引用前以最新版的 release notes 為準。</p></blockquote>
<h2 id="給讀者的調參步驟">給讀者的調參步驟</h2>
<p>實際設定 KV cache 量化時、可以照下面的步驟調：</p>
<ol>
<li><strong>先用 fp16 基準跑一次</strong>：用實際工作流的代表性任務、記錄補完品質、執行時間、VRAM 用量。這是後續比較的基準。</li>
<li><strong>切到 K=Q8 / V=Q8</strong>：跑同樣的任務、比較品質。社群多數回報差異不明顯、但需以自己工作流確認。</li>
<li><strong>進一步切到 V=Q4</strong>：再跑同樣任務、特別注意長 prompt 末尾、推理鏈、複雜邏輯任務的輸出品質。</li>
<li><strong>若品質可接受、評估省下的 VRAM 怎麼用</strong>：加大 <code>-c</code>、提高 <code>--parallel</code>、或減少 <code>--n-cpu-moe</code>。</li>
<li><strong>建立可重複的校準腳本</strong>：把代表性任務寫成 prompt 集、做為日後升級模型或調參時的回歸測試。</li>
</ol>
<h2 id="下一章">下一章</h2>
<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>、把本章跟 <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 卸載</a> 的旗標放進完整的 llama.cpp 調參工作流。</p>
]]></content:encoded></item><item><title>5.3 llama.cpp 在 PC 上</title><link>https://tarrragon.github.io/blog/llm/05-discrete-gpu/llama-cpp-on-pc/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/05-discrete-gpu/llama-cpp-on-pc/</guid><description>&lt;p>llama.cpp 是 PC 場景跑本地 LLM 的主流 &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>、也是 Ollama、LM Studio 的底層 backend。在 PC 上直接使用 llama.cpp 的場景跟 Mac 不同：PC 需要選對 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gpu-compute-backend/" data-link-title="GPU Compute Backend" data-link-desc="GPU 加速計算的底層 API 介面（CUDA / ROCm / Vulkan / Metal / SYCL）、決定推論軟體能否用 GPU 跑得快">GPU compute backend&lt;/a>（CUDA / ROCm / Vulkan）、處理 driver 版本對齊、調 &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 卸載&lt;/a> 與 KV cache 量化旗標、產出的是 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/openai-compatible-api/" data-link-title="OpenAI 相容 API" data-link-desc="本地推論伺服器跟雲端 OpenAI 共用的 API 形狀標準">OpenAI 相容 API&lt;/a>。本章把這些 PC 場景特有的設定串成一條完整的調參工作流。&lt;/p>
&lt;p>讀完本章後、你應該能在自己的 PC 上：選對 llama.cpp build、用 &lt;code>llama-server&lt;/code> 跑 OpenAI 相容 API、用 &lt;code>llama-bench&lt;/code> 校準 throughput、知道多卡跟非 NVIDIA GPU 的入門設定方向。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;ol>
&lt;li>知道怎麼取得對應自己 GPU 的 llama.cpp build（pre-built release vs 自編譯）。&lt;/li>
&lt;li>看懂 PC 場景常用旗標的分組與互相關係。&lt;/li>
&lt;li>用 &lt;code>llama-server&lt;/code> 啟動 OpenAI 相容 server、接到 VS Code Continue.dev。&lt;/li>
&lt;li>用 &lt;code>llama-bench&lt;/code> 校準 prefill 跟 generation throughput。&lt;/li>
&lt;li>認識多卡 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/llama-cpp-tensor-split/" data-link-title="llama.cpp Tensor Split" data-link-desc="llama.cpp 多 GPU 場景中把模型張量按比例切到多張卡上的權重分配機制">tensor split&lt;/a> 的入門設定。&lt;/li>
&lt;li>知道 ROCm（AMD）跟 Vulkan backend 的相對成熟度。&lt;/li>
&lt;/ol>
&lt;h2 id="取得-llamacpp-build">取得 llama.cpp build&lt;/h2>
&lt;p>llama.cpp 在 PC 上的取得方式有三條：&lt;/p>
&lt;h3 id="路徑一官方-pre-built-release社群常見起點">路徑一：官方 pre-built release（社群常見起點）&lt;/h3>
&lt;p>&lt;code>ggml-org/llama.cpp&lt;/code> 的 GitHub release 提供 Windows / Linux 的 pre-built binary、含 CUDA 12.x、ROCm、Vulkan、CPU-only 等多種 backend。下載對應自己 GPU + driver 版本的 build、解壓即用。模型權重檔通常為 &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;/p>
&lt;p>選 build 時的判讀：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>GPU 廠商&lt;/th>
 &lt;th>建議 backend&lt;/th>
 &lt;th>備註&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>NVIDIA（RTX 系列）&lt;/td>
 &lt;td>CUDA 12.x build&lt;/td>
 &lt;td>最成熟、社群回報最多、需對應 NVIDIA driver 版本&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>AMD（RX 系列、Radeon Pro）&lt;/td>
 &lt;td>ROCm build（Linux）/ Vulkan build（Windows）&lt;/td>
 &lt;td>ROCm Windows 支援仍在演進、Vulkan 跨平台但 throughput 通常較 CUDA 低&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Intel（ARC）&lt;/td>
 &lt;td>Vulkan build / SYCL build&lt;/td>
 &lt;td>工具鏈相對年輕、社群實測案例較少&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Apple Silicon&lt;/td>
 &lt;td>Metal build（屬模組一範圍）&lt;/td>
 &lt;td>見 &lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">1.2 Mac 版 llama.cpp&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：各 backend 的成熟度跟支援度依 llama.cpp 版本快速演進、上表為 2026 年 5 月常見回報的相對情況、建議引用時以 &lt;a href="https://github.com/ggml-org/llama.cpp/releases">llama.cpp release notes&lt;/a> 跟對應 backend 的官方文件為準。&lt;/p></description><content:encoded><![CDATA[<p>llama.cpp 是 PC 場景跑本地 LLM 的主流 <a href="/blog/llm/knowledge-cards/inference-server/" data-link-title="Inference Server" data-link-desc="載入模型權重、處理 prompt、產生 token 的常駐 process">推論伺服器</a>、也是 Ollama、LM Studio 的底層 backend。在 PC 上直接使用 llama.cpp 的場景跟 Mac 不同：PC 需要選對 <a href="/blog/llm/knowledge-cards/gpu-compute-backend/" data-link-title="GPU Compute Backend" data-link-desc="GPU 加速計算的底層 API 介面（CUDA / ROCm / Vulkan / Metal / SYCL）、決定推論軟體能否用 GPU 跑得快">GPU compute backend</a>（CUDA / ROCm / Vulkan）、處理 driver 版本對齊、調 <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 卸載</a> 與 KV cache 量化旗標、產出的是 <a href="/blog/llm/knowledge-cards/openai-compatible-api/" data-link-title="OpenAI 相容 API" data-link-desc="本地推論伺服器跟雲端 OpenAI 共用的 API 形狀標準">OpenAI 相容 API</a>。本章把這些 PC 場景特有的設定串成一條完整的調參工作流。</p>
<p>讀完本章後、你應該能在自己的 PC 上：選對 llama.cpp build、用 <code>llama-server</code> 跑 OpenAI 相容 API、用 <code>llama-bench</code> 校準 throughput、知道多卡跟非 NVIDIA GPU 的入門設定方向。</p>
<h2 id="本章目標">本章目標</h2>
<ol>
<li>知道怎麼取得對應自己 GPU 的 llama.cpp build（pre-built release vs 自編譯）。</li>
<li>看懂 PC 場景常用旗標的分組與互相關係。</li>
<li>用 <code>llama-server</code> 啟動 OpenAI 相容 server、接到 VS Code Continue.dev。</li>
<li>用 <code>llama-bench</code> 校準 prefill 跟 generation throughput。</li>
<li>認識多卡 <a href="/blog/llm/knowledge-cards/llama-cpp-tensor-split/" data-link-title="llama.cpp Tensor Split" data-link-desc="llama.cpp 多 GPU 場景中把模型張量按比例切到多張卡上的權重分配機制">tensor split</a> 的入門設定。</li>
<li>知道 ROCm（AMD）跟 Vulkan backend 的相對成熟度。</li>
</ol>
<h2 id="取得-llamacpp-build">取得 llama.cpp build</h2>
<p>llama.cpp 在 PC 上的取得方式有三條：</p>
<h3 id="路徑一官方-pre-built-release社群常見起點">路徑一：官方 pre-built release（社群常見起點）</h3>
<p><code>ggml-org/llama.cpp</code> 的 GitHub release 提供 Windows / Linux 的 pre-built binary、含 CUDA 12.x、ROCm、Vulkan、CPU-only 等多種 backend。下載對應自己 GPU + driver 版本的 build、解壓即用。模型權重檔通常為 <a href="/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF</a> 格式。</p>
<p>選 build 時的判讀：</p>
<table>
  <thead>
      <tr>
          <th>GPU 廠商</th>
          <th>建議 backend</th>
          <th>備註</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>NVIDIA（RTX 系列）</td>
          <td>CUDA 12.x build</td>
          <td>最成熟、社群回報最多、需對應 NVIDIA driver 版本</td>
      </tr>
      <tr>
          <td>AMD（RX 系列、Radeon Pro）</td>
          <td>ROCm build（Linux）/ Vulkan build（Windows）</td>
          <td>ROCm Windows 支援仍在演進、Vulkan 跨平台但 throughput 通常較 CUDA 低</td>
      </tr>
      <tr>
          <td>Intel（ARC）</td>
          <td>Vulkan build / SYCL build</td>
          <td>工具鏈相對年輕、社群實測案例較少</td>
      </tr>
      <tr>
          <td>Apple Silicon</td>
          <td>Metal build（屬模組一範圍）</td>
          <td>見 <a href="/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">1.2 Mac 版 llama.cpp</a></td>
      </tr>
  </tbody>
</table>
<blockquote>
<p><strong>事實查核註</strong>：各 backend 的成熟度跟支援度依 llama.cpp 版本快速演進、上表為 2026 年 5 月常見回報的相對情況、建議引用時以 <a href="https://github.com/ggml-org/llama.cpp/releases">llama.cpp release notes</a> 跟對應 backend 的官方文件為準。</p></blockquote>
<h3 id="路徑二自編譯需要特定功能或最新-commit">路徑二：自編譯（需要特定功能或最新 commit）</h3>
<p>從原始碼編譯適合下面情境：</p>
<ol>
<li>想用 release 還沒包進去的新功能（如剛 merge 的 PR）。</li>
<li>想針對特定 CUDA compute capability 編譯、減少 binary 大小或開特定優化。</li>
<li>自己 patch 過 llama.cpp。</li>
</ol>
<p>CUDA build 的常見編譯指令（以 Linux 為例、Windows 請參考官方文件）：</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">git clone https://github.com/ggml-org/llama.cpp.git
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">cd</span> llama.cpp
</span></span><span class="line"><span class="ln">3</span><span class="cl">cmake -B build -DGGML_CUDA<span class="o">=</span>ON
</span></span><span class="line"><span class="ln">4</span><span class="cl">cmake --build build --config Release -j</span></span></code></pre></div><p>編譯選項依版本變化、以 <code>CMakeLists.txt</code> 跟 <a href="https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md">build 文件</a> 為準。</p>
<h3 id="路徑三透過上層工具ollama--lm-studio">路徑三：透過上層工具（Ollama / LM Studio）</h3>
<p>如果你不需要直接面對 llama.cpp 旗標、用 Ollama 或 LM Studio 通常更省事。它們把 llama.cpp 包裝在背後、提供更高層的設定介面。Mac / Windows 都適用、見 <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 LM Studio 在 Windows</a>。</p>
<p>直接面對 llama.cpp 的價值：完整控制旗標、看 log 直接 debug、用 <code>llama-bench</code> 做精確校準。</p>
<h2 id="核心旗標地圖">核心旗標地圖</h2>
<p>PC 場景常用的旗標可以分成五組：</p>
<h3 id="1-gpu-層分配">1. GPU 層分配</h3>
<table>
  <thead>
      <tr>
          <th>旗標</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>-ngl &lt;N&gt;</code></td>
          <td>把 N 層 transformer block 放 GPU。常設 99 或 max 表示能放盡量放</td>
      </tr>
      <tr>
          <td><code>--n-cpu-moe &lt;N&gt;</code></td>
          <td>MoE 模型：把 N 層的專家權重保留 CPU 記憶體、見 <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>
      </tr>
      <tr>
          <td><code>--split-mode &lt;mode&gt;</code></td>
          <td>多卡模式（<code>none</code> / <code>layer</code> / <code>row</code>）</td>
      </tr>
      <tr>
          <td><code>-ts &lt;floats&gt;</code></td>
          <td>tensor split、多卡時各卡的權重比例</td>
      </tr>
      <tr>
          <td><code>-mg &lt;N&gt;</code></td>
          <td>主卡 index、特定計算（如 KV cache）放在主卡</td>
      </tr>
  </tbody>
</table>
<h3 id="2-kv-cache-與-context">2. KV cache 與 context</h3>
<table>
  <thead>
      <tr>
          <th>旗標</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>-c &lt;N&gt;</code></td>
          <td>context window 大小</td>
      </tr>
      <tr>
          <td><code>--cache-type-k &lt;type&gt;</code></td>
          <td>K cache 量化（f16 / q8_0 / q4_0 等）、見 <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>
      </tr>
      <tr>
          <td><code>--cache-type-v &lt;type&gt;</code></td>
          <td>V cache 量化</td>
      </tr>
      <tr>
          <td><code>-fa</code> / <code>--flash-attn</code></td>
          <td>啟用 flash attention、部分量化組合需要</td>
      </tr>
  </tbody>
</table>
<h3 id="3-平行與-batch">3. 平行與 batch</h3>
<table>
  <thead>
      <tr>
          <th>旗標</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--parallel &lt;N&gt;</code></td>
          <td>同時處理的 sequence 數、高併發場景使用</td>
      </tr>
      <tr>
          <td><code>-b &lt;N&gt;</code></td>
          <td>logical batch size</td>
      </tr>
      <tr>
          <td><code>-ub &lt;N&gt;</code></td>
          <td>micro-batch size、影響 prefill 速度</td>
      </tr>
      <tr>
          <td><code>-np &lt;N&gt;</code></td>
          <td>num parallel slots（部分版本旗標、依版本變動）</td>
      </tr>
  </tbody>
</table>
<h3 id="4-模型與量化">4. 模型與量化</h3>
<table>
  <thead>
      <tr>
          <th>旗標</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>-m &lt;path&gt;</code></td>
          <td>GGUF 模型路徑</td>
      </tr>
      <tr>
          <td><code>--alias &lt;name&gt;</code></td>
          <td>對外宣告的 model name（OpenAI 相容 API 用）</td>
      </tr>
      <tr>
          <td><code>--lora &lt;path&gt;</code></td>
          <td>LoRA adapter 路徑</td>
      </tr>
  </tbody>
</table>
<h3 id="5-server-設定">5. server 設定</h3>
<table>
  <thead>
      <tr>
          <th>旗標</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--host &lt;addr&gt;</code></td>
          <td>bind 位址、預設 127.0.0.1</td>
      </tr>
      <tr>
          <td><code>--port &lt;N&gt;</code></td>
          <td>port、預設 8080</td>
      </tr>
      <tr>
          <td><code>--api-key &lt;k&gt;</code></td>
          <td>API key 驗證</td>
      </tr>
      <tr>
          <td><code>-v</code></td>
          <td>verbose log</td>
      </tr>
  </tbody>
</table>
<p>完整旗標清單見 <code>llama-server --help</code> 跟 <a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md">tools/server/README.md</a>；版本更新後旗標可能新增、改名或棄用、以實際版本為準。</p>
<h2 id="完整啟動範例">完整啟動範例</h2>
<p>下面三個範例對應三種常見硬體配置、皆為起點配置、需依實測調整。</p>
<h3 id="範例一16gb-vram--64gb-ram跑-30b-moe-寫-code">範例一：16GB VRAM + 64GB RAM、跑 30B MoE 寫 code</h3>





<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 <span class="se">\
</span></span></span><span class="line"><span class="ln"> 2</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"> 3</span><span class="cl"><span class="se"></span>  --alias qwen3-30b-a3b <span class="se">\
</span></span></span><span class="line"><span class="ln"> 4</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"> 5</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"> 6</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"> 7</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"> 8</span><span class="cl"><span class="se"></span>  -fa <span class="se">\
</span></span></span><span class="line"><span class="ln"> 9</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">10</span><span class="cl"><span class="se"></span>  --parallel <span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="se"></span>  --host 127.0.0.1 <span class="se">\
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="se"></span>  --port <span class="m">8080</span></span></span></code></pre></div><p>對應的 Continue.dev 設定：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="nt">&#34;models&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Local llama.cpp&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;openai&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;qwen3-30b-a3b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:8080/v1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">      <span class="nt">&#34;apiKey&#34;</span><span class="p">:</span> <span class="s2">&#34;not-needed&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><h3 id="範例二24gb-vram--64gb-ram跑-32b-dense">範例二：24GB VRAM + 64GB RAM、跑 32B Dense</h3>





<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 <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -m ~/models/Qwen3-32B-Q4_K_M.gguf <span class="se">\
</span></span></span><span class="line"><span class="ln">3</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">4</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">5</span><span class="cl"><span class="se"></span>  --cache-type-v q8_0 <span class="se">\
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="se"></span>  -fa <span class="se">\
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="se"></span>  -c <span class="m">65536</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="se"></span>  --parallel <span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="se"></span>  --port <span class="m">8080</span></span></span></code></pre></div><p>Dense 32B Q4_K_M 體積落在 16 ~ 20 GB 級、24GB VRAM 可全載；KV cache 保留較保守的 Q8 / Q8、context 開到 64K。</p>
<h3 id="範例三8gb-vram--32gb-ram跑-7b-級-dense">範例三：8GB VRAM + 32GB RAM、跑 7B 級 Dense</h3>





<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 <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -m ~/models/Qwen3-7B-Q4_K_M.gguf <span class="se">\
</span></span></span><span class="line"><span class="ln">3</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">4</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">5</span><span class="cl"><span class="se"></span>  --cache-type-v q8_0 <span class="se">\
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="se"></span>  -fa <span class="se">\
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="se"></span>  -c <span class="m">16384</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="se"></span>  --port <span class="m">8080</span></span></span></code></pre></div><p>7B Q4_K_M 體積約 4 ~ 5 GB、8GB VRAM 可全載 + 適中 KV cache。</p>
<h2 id="用-llama-bench-校準">用 llama-bench 校準</h2>
<p><code>llama-bench</code> 是 llama.cpp 附帶的 benchmark 工具、用來測量特定模型 + 旗標組合的 prefill 跟 generation throughput。</p>
<p>基本用法：</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-bench <span class="se">\
</span></span></span><span class="line"><span class="ln">2</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">3</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">4</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">5</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">6</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">7</span><span class="cl"><span class="se"></span>  -p <span class="m">512</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="se"></span>  -n <span class="m">128</span></span></span></code></pre></div><p><code>-p</code>：prefill 測試的 prompt 長度；<code>-n</code>：generation 測試的 token 數。</p>
<p>輸出會列出 prefill t/s 跟 generation t/s。建議：</p>
<ol>
<li><strong>記錄基準</strong>：用「平衡起點」旗標跑一次、記下 prefill 跟 generation t/s。</li>
<li><strong>逐項調整</strong>：每次只動一個旗標（如 <code>--n-cpu-moe</code> 從 30 改 25、再改 35）、看 t/s 怎麼變。</li>
<li><strong>校準目標</strong>：找到「VRAM 用量、context 上限、t/s」三者組合符合工作流需求的設定。</li>
</ol>
<p>llama-bench 的結果是「fixed prompt / 固定生成長度」、跟「實際工作流的混合長度」有差距；建議再用實際工作流的代表性任務做最終驗證。</p>
<blockquote>
<p><strong>事實查核註</strong>：<code>llama-bench</code> 的輸出格式跟旗標名稱依 llama.cpp 版本變動、以實際 <code>llama-bench --help</code> 為準。</p></blockquote>
<h2 id="多卡-tensor-split-入門">多卡 tensor split 入門</h2>
<p>如果你有兩張或以上的 GPU、llama.cpp 支援把模型權重分散到多卡：</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 <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -m ~/models/Llama-4-Scout.gguf <span class="se">\
</span></span></span><span class="line"><span class="ln">3</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">4</span><span class="cl"><span class="se"></span>  --split-mode layer <span class="se">\
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="se"></span>  -ts 0.5,0.5 <span class="se">\
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="se"></span>  --port <span class="m">8080</span></span></span></code></pre></div><ul>
<li><code>--split-mode layer</code>：以層為單位切分、最常用</li>
<li><code>--split-mode row</code>：以張量的 row 切分、用於 tensor parallel</li>
<li><code>-ts 0.5,0.5</code>：兩張卡各分一半權重；若兩卡 VRAM 不同、可調比例（如 <code>-ts 0.4,0.6</code>）</li>
</ul>
<p>多卡的實際吞吐縮放比依下面因素變化：</p>
<ol>
<li><strong>主機板 PCIe lane 配置</strong>：消費級主機板常見「一條 x16 + 一條 x4」、第二張卡的 PCIe 頻寬可能受限。</li>
<li><strong>GPU 之間是否有 <a href="/blog/llm/knowledge-cards/nvlink/" data-link-title="NVLink" data-link-desc="NVIDIA 多 GPU 之間的高速互連介面、提供比 PCIe 更高的卡間頻寬、消費級 RTX 系列普遍不支援">NVLink</a></strong>：消費級 RTX 系列普遍不支援 NVLink、卡間通訊走 <a href="/blog/llm/knowledge-cards/pcie/" data-link-title="PCIe" data-link-desc="PC 上連接 GPU 跟主機板的高速序列匯流排、影響模型載入速度跟 MoE 卸載時的推論吞吐">PCIe</a>、相對資料中心級配置慢。</li>
<li><strong>split-mode 選擇</strong>：<code>row</code> 模式需要更高的卡間頻寬、<code>layer</code> 模式對 PCIe 頻寬要求較低。</li>
</ol>
<p>社群常見回報：多卡縮放比通常低於線性、<code>layer</code> 模式對長 prompt 的 prefill 提升較明顯、generation 提升相對小。具體效益依工作流跟卡間頻寬、需用 <code>llama-bench</code> 校準。</p>
<p>對單人寫 code 場景、多卡的邊際效益通常不如「先升級單卡」或「先優化單卡配置」。</p>
<h2 id="rocm-與-vulkan-backend-的相對成熟度">ROCm 與 Vulkan backend 的相對成熟度</h2>
<p>llama.cpp 對非 CUDA backend 的支援度依社群回報有以下相對位置：</p>
<table>
  <thead>
      <tr>
          <th>Backend</th>
          <th>平台支援</th>
          <th>社群成熟度</th>
          <th>常見適用情境</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>CUDA</td>
          <td>NVIDIA、Windows/Linux</td>
          <td>最成熟、PR 與文件最多</td>
          <td>預設選項</td>
      </tr>
      <tr>
          <td>ROCm</td>
          <td>AMD、Linux 為主</td>
          <td>演進中、Windows 支援較新</td>
          <td>AMD GPU on Linux</td>
      </tr>
      <tr>
          <td>Vulkan</td>
          <td>跨廠商</td>
          <td>通用但 throughput 通常較 CUDA / ROCm 低</td>
          <td>AMD on Windows、Intel ARC、跨平台 fallback</td>
      </tr>
      <tr>
          <td>SYCL</td>
          <td>Intel</td>
          <td>新興、社群實測案例較少</td>
          <td>Intel ARC</td>
      </tr>
      <tr>
          <td>Metal</td>
          <td>Apple Silicon</td>
          <td>成熟（屬模組一範圍）</td>
          <td>Mac、見 <a href="/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">1.2</a></td>
      </tr>
  </tbody>
</table>
<blockquote>
<p><strong>事實查核註</strong>：各 backend 的成熟度跟性能對比是社群常見回報、不是經本文系統實測。建議引用前查閱 <a href="https://github.com/ggml-org/llama.cpp/pulls">llama.cpp 的 PR 列表</a>、對應 backend 的官方文件、跟自己硬體的實際 benchmark。</p></blockquote>
<p>選 backend 的判讀：</p>
<ol>
<li><strong>NVIDIA GPU</strong>：用 CUDA build、不需考慮其他。</li>
<li><strong>AMD GPU on Linux</strong>：優先試 ROCm build；不穩或不支援的卡型則退回 Vulkan。</li>
<li><strong>AMD GPU on Windows</strong>：ROCm on Windows 在演進、Vulkan 通常較穩。具體選擇以 llama.cpp release notes 跟自己硬體實測為準。</li>
<li><strong>Intel ARC</strong>：Vulkan 或 SYCL backend；社群實測案例較少、預期需要較多自己摸索。</li>
</ol>
<h2 id="跟-ollama--lm-studio-並存">跟 Ollama / LM Studio 並存</h2>
<p>llama.cpp <code>server</code>、Ollama、LM Studio 可以同時跑、用不同 port：</p>
<table>
  <thead>
      <tr>
          <th>推論伺服器</th>
          <th>預設 port</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Ollama</td>
          <td>11434</td>
      </tr>
      <tr>
          <td>llama-server</td>
          <td>8080</td>
      </tr>
      <tr>
          <td>LM Studio</td>
          <td>1234</td>
      </tr>
  </tbody>
</table>
<p>Continue.dev 可以同時接：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="nt">&#34;models&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Ollama default&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;ollama&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;qwen3-30b-a3b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:11434&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;llama.cpp custom&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;openai&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;qwen3-30b-a3b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:8080/v1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">      <span class="nt">&#34;apiKey&#34;</span><span class="p">:</span> <span class="s2">&#34;not-needed&#34;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>實務上、多數情況只需要一個推論伺服器；同時跑多個的場景是「比較同一模型在不同 backend / 旗標下的差異」、屬於調參階段、不是常態。</p>
<h2 id="下一章">下一章</h2>
<p>下一章：<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 LM Studio 在 Windows</a>、給「不想直接面對 CLI」的讀者另一條路。</p>
]]></content:encoded></item><item><title>5.4 LM Studio 在 Windows</title><link>https://tarrragon.github.io/blog/llm/05-discrete-gpu/lm-studio-on-windows/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/05-discrete-gpu/lm-studio-on-windows/</guid><description>&lt;p>LM Studio 在 PC 場景的價值是「不打開終端機也能調 &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 卸載&lt;/a> 與 KV cache 量化」。本章不重複 &lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/lm-studio/" data-link-title="1.1 LM Studio：GUI 探索模型" data-link-desc="GUI 取向的本地推論伺服器：內建模型瀏覽器、speculative decoding 設定面板、適合探索新模型">Mac 版 LM Studio&lt;/a> 的基本定位、改聚焦 Windows + 獨立 GPU 場景的特有設定：CUDA / ROCm backend 選擇、GUI 內對應 &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 卸載&lt;/a> / &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 KV cache 量化&lt;/a> 旗標的位置。LM Studio 跟 Ollama、llama-server 一樣屬於 &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> 層、對外提供 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/openai-compatible-api/" data-link-title="OpenAI 相容 API" data-link-desc="本地推論伺服器跟雲端 OpenAI 共用的 API 形狀標準">OpenAI 相容 API&lt;/a>。&lt;/p>
&lt;p>讀完本章後、你應該能在 Windows 上：選對 LM Studio 的 GPU backend、在 GUI 內設定卸載層數與 KV cache 量化、啟動 OpenAI 相容 server、接到 VS Code Continue.dev。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;ol>
&lt;li>在 Windows 上安裝 LM Studio、選對 GPU backend。&lt;/li>
&lt;li>知道 GUI 設定面板的哪幾個欄位對應 llama.cpp 的核心旗標。&lt;/li>
&lt;li>啟動 LM Studio 的本地 server、提供 OpenAI 相容 API。&lt;/li>
&lt;li>判斷你的工作流適不適合用 LM Studio 當主力。&lt;/li>
&lt;li>處理常見的 Windows + GPU 整合議題（driver 版本、CUDA toolkit）。&lt;/li>
&lt;/ol>
&lt;h2 id="安裝">安裝&lt;/h2>
&lt;p>LM Studio 是 Electron 桌面 app、個人使用免費、Windows / Linux / macOS 三平台都支援。從 &lt;a href="https://lmstudio.ai">lmstudio.ai 官網&lt;/a> 下載對應系統的安裝檔即可。&lt;/p>
&lt;p>Windows 版的安裝步驟：&lt;/p>
&lt;ol>
&lt;li>下載 &lt;code>.exe&lt;/code> 安裝程式、執行安裝（不需 admin 權限的情況下會裝在使用者目錄）。&lt;/li>
&lt;li>首次啟動時、LM Studio 會偵測 GPU 並提示選擇 backend。&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：LM Studio 是商業軟體、UI 跟功能會隨版本變化。本章描述以 2026 年 5 月的穩定版為基準、實際 UI 元素位置以當前版本為準。&lt;/p>&lt;/blockquote>
&lt;h2 id="gpu-backend-選擇">GPU backend 選擇&lt;/h2>
&lt;p>LM Studio 在 Windows 上的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gpu-compute-backend/" data-link-title="GPU Compute Backend" data-link-desc="GPU 加速計算的底層 API 介面（CUDA / ROCm / Vulkan / Metal / SYCL）、決定推論軟體能否用 GPU 跑得快">GPU compute backend&lt;/a> 選項依 GPU 廠商不同：&lt;/p></description><content:encoded><![CDATA[<p>LM Studio 在 PC 場景的價值是「不打開終端機也能調 <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 卸載</a> 與 KV cache 量化」。本章不重複 <a href="/blog/llm/01-local-llm-services/lm-studio/" data-link-title="1.1 LM Studio：GUI 探索模型" data-link-desc="GUI 取向的本地推論伺服器：內建模型瀏覽器、speculative decoding 設定面板、適合探索新模型">Mac 版 LM Studio</a> 的基本定位、改聚焦 Windows + 獨立 GPU 場景的特有設定：CUDA / ROCm backend 選擇、GUI 內對應 <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 卸載</a> / <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> 旗標的位置。LM Studio 跟 Ollama、llama-server 一樣屬於 <a href="/blog/llm/knowledge-cards/inference-server/" data-link-title="Inference Server" data-link-desc="載入模型權重、處理 prompt、產生 token 的常駐 process">推論伺服器</a> 層、對外提供 <a href="/blog/llm/knowledge-cards/openai-compatible-api/" data-link-title="OpenAI 相容 API" data-link-desc="本地推論伺服器跟雲端 OpenAI 共用的 API 形狀標準">OpenAI 相容 API</a>。</p>
<p>讀完本章後、你應該能在 Windows 上：選對 LM Studio 的 GPU backend、在 GUI 內設定卸載層數與 KV cache 量化、啟動 OpenAI 相容 server、接到 VS Code Continue.dev。</p>
<h2 id="本章目標">本章目標</h2>
<ol>
<li>在 Windows 上安裝 LM Studio、選對 GPU backend。</li>
<li>知道 GUI 設定面板的哪幾個欄位對應 llama.cpp 的核心旗標。</li>
<li>啟動 LM Studio 的本地 server、提供 OpenAI 相容 API。</li>
<li>判斷你的工作流適不適合用 LM Studio 當主力。</li>
<li>處理常見的 Windows + GPU 整合議題（driver 版本、CUDA toolkit）。</li>
</ol>
<h2 id="安裝">安裝</h2>
<p>LM Studio 是 Electron 桌面 app、個人使用免費、Windows / Linux / macOS 三平台都支援。從 <a href="https://lmstudio.ai">lmstudio.ai 官網</a> 下載對應系統的安裝檔即可。</p>
<p>Windows 版的安裝步驟：</p>
<ol>
<li>下載 <code>.exe</code> 安裝程式、執行安裝（不需 admin 權限的情況下會裝在使用者目錄）。</li>
<li>首次啟動時、LM Studio 會偵測 GPU 並提示選擇 backend。</li>
</ol>
<blockquote>
<p><strong>事實查核註</strong>：LM Studio 是商業軟體、UI 跟功能會隨版本變化。本章描述以 2026 年 5 月的穩定版為基準、實際 UI 元素位置以當前版本為準。</p></blockquote>
<h2 id="gpu-backend-選擇">GPU backend 選擇</h2>
<p>LM Studio 在 Windows 上的 <a href="/blog/llm/knowledge-cards/gpu-compute-backend/" data-link-title="GPU Compute Backend" data-link-desc="GPU 加速計算的底層 API 介面（CUDA / ROCm / Vulkan / Metal / SYCL）、決定推論軟體能否用 GPU 跑得快">GPU compute backend</a> 選項依 GPU 廠商不同：</p>
<table>
  <thead>
      <tr>
          <th>GPU 廠商</th>
          <th>可選 backend</th>
          <th>建議起點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>NVIDIA RTX 系列</td>
          <td>CUDA、Vulkan</td>
          <td>CUDA（成熟度高、社群實測案例多）</td>
      </tr>
      <tr>
          <td>AMD Radeon 系列</td>
          <td>ROCm（部分卡型）、Vulkan、DirectML</td>
          <td>視 GPU 型號與 driver 版本、社群常見從 Vulkan 起步</td>
      </tr>
      <tr>
          <td>Intel ARC</td>
          <td>Vulkan、OpenVINO（部分版本）</td>
          <td>Vulkan 較通用</td>
      </tr>
      <tr>
          <td>整合顯卡 / CPU only</td>
          <td>CPU backend</td>
          <td>模型較小、適合試水溫</td>
      </tr>
  </tbody>
</table>
<p>backend 的切換位置：LM Studio 的設定面板（齒輪圖示）→ Hardware / Runtime 區段、會列出當前可用的 backend 與下載連結。部分 backend 在首次使用時需要下載對應的 runtime（如 CUDA runtime）。</p>
<p>選錯 backend 的常見徵兆：</p>
<ol>
<li><strong>模型載入時間異常長</strong>：可能 fallback 到 CPU、確認 GPU backend 是否正確啟用。</li>
<li><strong>生字速度遠低於同硬體的社群回報</strong>：backend 不對、或 driver 版本不對、或 VRAM 不足而啟用了 CPU offload。</li>
<li><strong>載入時錯誤訊息提到 CUDA 版本不符</strong>：driver 跟 LM Studio 內建的 CUDA runtime 不對齊、需更新 driver 或選擇對應的 LM Studio build。</li>
</ol>
<blockquote>
<p><strong>事實查核註</strong>：各 backend 的可用性跟下載方式依 LM Studio 版本變動、以當前版本的 Hardware / Runtime 設定面板顯示為準。</p></blockquote>
<h2 id="gui-設定對應到-llamacpp-旗標">GUI 設定對應到 llama.cpp 旗標</h2>
<p>LM Studio 在背後使用 llama.cpp、GUI 內的設定欄位通常對應到 llama.cpp 的某個旗標。對熟悉 <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> 旗標的讀者、這個對應表能加速 GUI 內的設定：</p>
<table>
  <thead>
      <tr>
          <th>LM Studio GUI 欄位（位置依版本變化）</th>
          <th>對應 llama.cpp 旗標</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GPU Offload / GPU Layers</td>
          <td><code>-ngl &lt;N&gt;</code></td>
          <td>把 N 層丟到 GPU</td>
      </tr>
      <tr>
          <td>CPU Threads</td>
          <td><code>-t &lt;N&gt;</code></td>
          <td>CPU thread 數</td>
      </tr>
      <tr>
          <td>Context Length</td>
          <td><code>-c &lt;N&gt;</code></td>
          <td>context window</td>
      </tr>
      <tr>
          <td>K Cache Quantization</td>
          <td><code>--cache-type-k &lt;type&gt;</code></td>
          <td>K cache 量化等級</td>
      </tr>
      <tr>
          <td>V Cache Quantization</td>
          <td><code>--cache-type-v &lt;type&gt;</code></td>
          <td>V cache 量化等級</td>
      </tr>
      <tr>
          <td>Flash Attention</td>
          <td><code>-fa</code> / <code>--flash-attn</code></td>
          <td>flash attention 開關</td>
      </tr>
      <tr>
          <td>MoE Expert Offload / CPU MoE Layers</td>
          <td><code>--n-cpu-moe &lt;N&gt;</code></td>
          <td>MoE 專家層卸載</td>
      </tr>
      <tr>
          <td>Batch Size</td>
          <td><code>-b &lt;N&gt;</code> / <code>-ub &lt;N&gt;</code></td>
          <td>batch / micro-batch</td>
      </tr>
      <tr>
          <td>Parallel Sequences</td>
          <td><code>--parallel &lt;N&gt;</code></td>
          <td>同時處理的 sequence 數</td>
      </tr>
  </tbody>
</table>
<p>具體欄位名稱跟位置依 LM Studio 版本變化、以實際 UI 為準。新加入 llama.cpp 的旗標通常會在後續 LM Studio 版本被加進 GUI。</p>
<h2 id="啟動-lm-studio-server">啟動 LM Studio Server</h2>
<p>LM Studio 內建 OpenAI 相容 server、預設 port 1234。啟用步驟：</p>
<ol>
<li>載入想用的模型（GUI 左側 Chat / Local Server 切換）。</li>
<li>切到「Local Server」分頁。</li>
<li>設定上面對應的旗標（GPU Offload、Context、KV Quant、MoE Offload 等）。</li>
<li>點「Start Server」、看 log 確認模型載入成功、port 顯示為 1234（或自訂）。</li>
</ol>
<p>啟動成功後、可以用任何 OpenAI 相容 client 連接：</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">curl http://localhost:1234/v1/chat/completions <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="s1">    &#34;model&#34;: &#34;loaded-model-name&#34;,
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="s1">    &#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;Hi&#34;}]
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="s1">  }&#39;</span></span></span></code></pre></div><p>接到 VS Code Continue.dev：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">  <span class="nt">&#34;models&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;LM Studio&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;openai&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;loaded-model-name&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:1234/v1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">      <span class="nt">&#34;apiKey&#34;</span><span class="p">:</span> <span class="s2">&#34;not-needed&#34;</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p><code>model</code> 欄位填 LM Studio 載入的模型名稱、要跟 GUI 顯示一致。</p>
<h2 id="模型瀏覽器與下載">模型瀏覽器與下載</h2>
<p>LM Studio 的內建模型瀏覽器直接連到 Hugging Face、可以搜尋 GGUF 格式的模型並一鍵下載。對「想試新模型但不想自己抓 GGUF」的使用者較友善。</p>
<p>下載時的選擇：</p>
<ol>
<li><strong>量化等級</strong>：LM Studio 會列出可用的量化版本（Q4_K_M、Q5_K_M、Q8_0 等）、可依 VRAM 預算選擇。</li>
<li><strong>模型大小估計</strong>：LM Studio 通常會顯示「在你當前硬體上能不能跑」的提示；提示為估計、實際載入仍以 llama.cpp 啟動結果為準。</li>
<li><strong>下載位置</strong>：LM Studio 預設下載到使用者目錄；可在設定面板改路徑（適合把模型放到大容量 SSD）。</li>
</ol>
<blockquote>
<p><strong>事實查核註</strong>：LM Studio 對「能否在當前硬體跑」的判讀是基於 VRAM + RAM 容量的估算、不考慮 MoE 卸載、KV cache 量化等進階設定；提示僅供參考、實際以實測為準。</p></blockquote>
<h2 id="跟-ollama--llamacpp-並存">跟 Ollama / llama.cpp 並存</h2>
<p>LM Studio、Ollama、llama-server 可以同時跑、用不同 port：</p>
<table>
  <thead>
      <tr>
          <th>推論伺服器</th>
          <th>預設 port</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Ollama</td>
          <td>11434</td>
      </tr>
      <tr>
          <td>llama-server</td>
          <td>8080</td>
      </tr>
      <tr>
          <td>LM Studio</td>
          <td>1234</td>
      </tr>
  </tbody>
</table>
<p>實務上同時跑多個的場景是調參階段比較不同 backend 或設定；常態使用通常一個就夠。</p>
<p>切換主力的判讀：</p>
<table>
  <thead>
      <tr>
          <th>工作流類型</th>
          <th>較適合的主力工具</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>多模型探索、Hugging Face 抓新模型試</td>
          <td>LM Studio（GUI 瀏覽器較順）</td>
      </tr>
      <tr>
          <td>穩定日常寫 code、模型不常換</td>
          <td>Ollama（命令列管理較簡潔）</td>
      </tr>
      <tr>
          <td>進階調參、<code>llama-bench</code> 校準</td>
          <td>直接 <code>llama-server</code>（旗標控制最完整）</td>
      </tr>
      <tr>
          <td>不想接觸 CLI、視覺化看參數</td>
          <td>LM Studio</td>
      </tr>
      <tr>
          <td>多 agent / 多 client 同時連</td>
          <td>任一、視併發設定</td>
      </tr>
  </tbody>
</table>
<h2 id="windows--gpu-整合常見議題">Windows + GPU 整合常見議題</h2>
<p>Windows 上跑本地 LLM 的常見議題：</p>
<ol>
<li><strong>NVIDIA driver 版本</strong>：driver 太舊可能不支援 LM Studio 內建的 CUDA runtime；過新 driver 偶爾出現相容性問題。建議用 NVIDIA Studio Driver（相對 Game Ready Driver 更穩）、或 NVIDIA 官方建議的當前長期支援版本。</li>
<li><strong>WSL2 vs 原生 Windows</strong>：LM Studio 在原生 Windows 跟 WSL2 都能跑；WSL2 可以更接近 Linux 環境（適合熟悉 Linux 工具的使用者）、但 GPU 透傳的配置略多。</li>
<li><strong>windows defender / 防毒軟體掃描</strong>：模型檔案常為 10+ GB、安全軟體的即時掃描可能拖慢載入速度；建議把模型目錄加入排除清單。</li>
<li><strong>電源計劃</strong>：Windows 的「省電」電源計劃可能讓 CPU 在閒置時降頻、影響 prefill 速度；建議使用「高效能」或自訂「卓越效能」計劃。</li>
<li><strong>VRAM 被其他應用佔用</strong>：Chrome、Discord、遊戲都可能佔用 VRAM；觀察「工作管理員 → 效能 → GPU」確認 VRAM 餘量。</li>
</ol>
<blockquote>
<p><strong>事實查核註</strong>：上面的議題以 Windows 10 / 11 為背景、具體現象跟解法依 Windows 版本、driver 版本變化。引用前以自己版本的官方文件為準。</p></blockquote>
<h2 id="給多數讀者的建議">給多數讀者的建議</h2>
<p>LM Studio 在 Windows + 獨立 GPU 場景的核心價值是「降低 MoE 卸載與 KV cache 量化的學習成本」。對下面類型的使用者特別合適：</p>
<ol>
<li>剛接觸本地 LLM、不熟悉 CLI 旗標。</li>
<li>主力工作是探索新模型、不是調穩定 production-like 設定。</li>
<li>想視覺化看「卸載層數 vs VRAM 用量」的關係、再決定要不要轉到 CLI。</li>
</ol>
<p>對下面類型的使用者、Ollama 或直接 <code>llama-server</code> 通常更適合：</p>
<ol>
<li>熟悉 CLI、想最完整地控制旗標。</li>
<li>主力是穩定日常寫 code、模型不常換。</li>
<li>想用 <code>llama-bench</code> 做精確校準。</li>
<li>部署到團隊或多人共用的 server 環境（GUI app 不適合 headless 部署）。</li>
</ol>
<h2 id="下一章">下一章</h2>
<p>下一章：<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>模組五：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><item><title>5.6 GPU 廠商差異</title><link>https://tarrragon.github.io/blog/llm/05-discrete-gpu/gpu-vendor-differences/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/05-discrete-gpu/gpu-vendor-differences/</guid><description>&lt;p>選 GPU 跑本地 LLM 不只看 &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> 容量與 &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>、工具鏈支援度同樣重要。NVIDIA / AMD / Intel 三家廠商在 llama.cpp 生態的位置不同、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gpu-compute-backend/" data-link-title="GPU Compute Backend" data-link-desc="GPU 加速計算的底層 API 介面（CUDA / ROCm / Vulkan / Metal / SYCL）、決定推論軟體能否用 GPU 跑得快">GPU compute backend&lt;/a> 中 CUDA 之外的選項仍在演進。本章整理三家在 2026 年 5 月的相對位置、跟選卡時值得考慮的判讀軸；多卡互連的議題見 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/nvlink/" data-link-title="NVLink" data-link-desc="NVIDIA 多 GPU 之間的高速互連介面、提供比 PCIe 更高的卡間頻寬、消費級 RTX 系列普遍不支援">NVLink&lt;/a> 跟 &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>。本章不重複 &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> 的 Mac 場景、改聚焦 PC 獨立 VRAM 的廠商工具鏈差異。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>事實查核註&lt;/strong>：GPU 工具鏈的支援度依 driver 版本、llama.cpp release 與廠商策略快速演進、本章描述為 2026 年 5 月的社群常見回報、建議引用前查閱對應 backend 的官方文件、&lt;a href="https://github.com/ggml-org/llama.cpp/releases">llama.cpp release notes&lt;/a> 跟自己硬體的實測。&lt;/p>&lt;/blockquote>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;ol>
&lt;li>知道 NVIDIA CUDA、AMD ROCm、Intel SYCL、跨平台 Vulkan 各自的成熟度。&lt;/li>
&lt;li>認識「工具鏈支援度」相對「硬體規格」對本地 LLM 體驗的重要性。&lt;/li>
&lt;li>在選卡時、能用「工具鏈 × 規格 × 預算」三軸做判讀。&lt;/li>
&lt;li>認識常見的混合場景（雲端 + 本地）。&lt;/li>
&lt;/ol>
&lt;h2 id="nvidia-cuda當前生態預設">NVIDIA CUDA：當前生態預設&lt;/h2>
&lt;p>NVIDIA GPU + CUDA backend 是 2026 年本地 LLM 社群的事實預設。原因不是「規格最好」、而是「工具鏈最成熟」：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>llama.cpp CUDA backend 開發最久、PR 跟 issue 數量最多&lt;/strong>：新功能（新量化、flash attention 改進、speculative decoding 等）通常先在 CUDA backend 落地。&lt;/li>
&lt;li>&lt;strong>driver 跟 CUDA toolkit 對齊明確&lt;/strong>：driver 版本對應 CUDA 版本的表清楚、出問題容易查。&lt;/li>
&lt;li>&lt;strong>社群實測案例多&lt;/strong>：Reddit、HuggingFace forum、GitHub issue 上、絕大多數 benchmark 跟調參討論基於 CUDA。&lt;/li>
&lt;li>&lt;strong>上層工具（Ollama、LM Studio）優先支援&lt;/strong>：新版本通常先 CUDA、再 Vulkan、再 ROCm。&lt;/li>
&lt;/ol>
&lt;p>社群常見回報的 NVIDIA 卡分級（依 VRAM 容量為主、寫 code 場景）：&lt;/p>
&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;/td>
 &lt;td>RTX 5060 8GB / RTX 4060 8GB&lt;/td>
 &lt;td>試水溫、跑 7B 級模型&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>主流（甜蜜點）&lt;/td>
 &lt;td>RTX 5060 Ti 16GB / RTX 5070 Ti 16GB&lt;/td>
 &lt;td>30B MoE 卸載、寫 code 場景社群常見起點&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>進階&lt;/td>
 &lt;td>RTX 4090 24GB / RTX 5080 16GB&lt;/td>
 &lt;td>32B Dense 全載 / 70B MoE 卸載&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>旗艦&lt;/td>
 &lt;td>RTX 5090 32GB&lt;/td>
 &lt;td>70B Dense Q4 全載、長 context、多模型併存&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>上一代二手&lt;/td>
 &lt;td>RTX 3090 24GB&lt;/td>
 &lt;td>二手市場價格可能更友善、CUDA 支援度仍佳&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>選卡時的常見軸&lt;/strong>：&lt;/p></description><content:encoded><![CDATA[<p>選 GPU 跑本地 LLM 不只看 <a href="/blog/llm/knowledge-cards/vram/" data-link-title="VRAM" data-link-desc="顯卡上的記憶體、跟系統 RAM 是兩塊獨立預算、決定能載入多大模型權重跟 KV cache">VRAM</a> 容量與 <a href="/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">memory bandwidth</a>、工具鏈支援度同樣重要。NVIDIA / AMD / Intel 三家廠商在 llama.cpp 生態的位置不同、<a href="/blog/llm/knowledge-cards/gpu-compute-backend/" data-link-title="GPU Compute Backend" data-link-desc="GPU 加速計算的底層 API 介面（CUDA / ROCm / Vulkan / Metal / SYCL）、決定推論軟體能否用 GPU 跑得快">GPU compute backend</a> 中 CUDA 之外的選項仍在演進。本章整理三家在 2026 年 5 月的相對位置、跟選卡時值得考慮的判讀軸；多卡互連的議題見 <a href="/blog/llm/knowledge-cards/nvlink/" data-link-title="NVLink" data-link-desc="NVIDIA 多 GPU 之間的高速互連介面、提供比 PCIe 更高的卡間頻寬、消費級 RTX 系列普遍不支援">NVLink</a> 跟 <a href="/blog/llm/knowledge-cards/pcie/" data-link-title="PCIe" data-link-desc="PC 上連接 GPU 跟主機板的高速序列匯流排、影響模型載入速度跟 MoE 卸載時的推論吞吐">PCIe</a>。本章不重複 <a href="/blog/llm/knowledge-cards/unified-memory/" data-link-title="Unified Memory Architecture" data-link-desc="Apple Silicon 讓 CPU / GPU / NE 共用同一塊記憶體：跑大模型的優勢來源">統一記憶體</a> 的 Mac 場景、改聚焦 PC 獨立 VRAM 的廠商工具鏈差異。</p>
<blockquote>
<p><strong>事實查核註</strong>：GPU 工具鏈的支援度依 driver 版本、llama.cpp release 與廠商策略快速演進、本章描述為 2026 年 5 月的社群常見回報、建議引用前查閱對應 backend 的官方文件、<a href="https://github.com/ggml-org/llama.cpp/releases">llama.cpp release notes</a> 跟自己硬體的實測。</p></blockquote>
<h2 id="本章目標">本章目標</h2>
<ol>
<li>知道 NVIDIA CUDA、AMD ROCm、Intel SYCL、跨平台 Vulkan 各自的成熟度。</li>
<li>認識「工具鏈支援度」相對「硬體規格」對本地 LLM 體驗的重要性。</li>
<li>在選卡時、能用「工具鏈 × 規格 × 預算」三軸做判讀。</li>
<li>認識常見的混合場景（雲端 + 本地）。</li>
</ol>
<h2 id="nvidia-cuda當前生態預設">NVIDIA CUDA：當前生態預設</h2>
<p>NVIDIA GPU + CUDA backend 是 2026 年本地 LLM 社群的事實預設。原因不是「規格最好」、而是「工具鏈最成熟」：</p>
<ol>
<li><strong>llama.cpp CUDA backend 開發最久、PR 跟 issue 數量最多</strong>：新功能（新量化、flash attention 改進、speculative decoding 等）通常先在 CUDA backend 落地。</li>
<li><strong>driver 跟 CUDA toolkit 對齊明確</strong>：driver 版本對應 CUDA 版本的表清楚、出問題容易查。</li>
<li><strong>社群實測案例多</strong>：Reddit、HuggingFace forum、GitHub issue 上、絕大多數 benchmark 跟調參討論基於 CUDA。</li>
<li><strong>上層工具（Ollama、LM Studio）優先支援</strong>：新版本通常先 CUDA、再 Vulkan、再 ROCm。</li>
</ol>
<p>社群常見回報的 NVIDIA 卡分級（依 VRAM 容量為主、寫 code 場景）：</p>
<table>
  <thead>
      <tr>
          <th>等級</th>
          <th>代表卡型</th>
          <th>適用情境</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>入門</td>
          <td>RTX 5060 8GB / RTX 4060 8GB</td>
          <td>試水溫、跑 7B 級模型</td>
      </tr>
      <tr>
          <td>主流（甜蜜點）</td>
          <td>RTX 5060 Ti 16GB / RTX 5070 Ti 16GB</td>
          <td>30B MoE 卸載、寫 code 場景社群常見起點</td>
      </tr>
      <tr>
          <td>進階</td>
          <td>RTX 4090 24GB / RTX 5080 16GB</td>
          <td>32B Dense 全載 / 70B MoE 卸載</td>
      </tr>
      <tr>
          <td>旗艦</td>
          <td>RTX 5090 32GB</td>
          <td>70B Dense Q4 全載、長 context、多模型併存</td>
      </tr>
      <tr>
          <td>上一代二手</td>
          <td>RTX 3090 24GB</td>
          <td>二手市場價格可能更友善、CUDA 支援度仍佳</td>
      </tr>
  </tbody>
</table>
<p><strong>選卡時的常見軸</strong>：</p>
<ol>
<li><strong>VRAM 容量決定模型上限</strong>：16GB 起步可跑 30B MoE 卸載、24GB 跑 32B Dense、32GB 跑 70B Dense。</li>
<li><strong>VRAM 頻寬決定生字速度上限</strong>：同 VRAM 容量下、頻寬接近兩倍的卡（如 5070 Ti 對 5060 Ti）生字速度通常顯著差。</li>
<li><strong>CUDA compute capability</strong>：影響某些優化能否啟用、新世代卡通常有額外指令支援。</li>
<li><strong>driver 長期支援</strong>：較新世代卡的 driver 支援週期通常較長、適合長時間用。</li>
</ol>
<h2 id="amd-rocm-與-radeon">AMD ROCm 與 Radeon</h2>
<p>AMD GPU 在 llama.cpp 生態的位置：ROCm backend 在演進、Vulkan backend 是跨平台 fallback。</p>
<h3 id="rocm-backend">ROCm backend</h3>
<p>ROCm（Radeon Open Compute）是 AMD 的 GPU 計算平台、定位類似 CUDA。社群常見回報的當前狀態：</p>
<ol>
<li><strong>Linux 支援度較 Windows 成熟</strong>：ROCm 在 Linux 上發展時間較長、Windows 版本相對年輕。</li>
<li><strong>支援 GPU 清單</strong>：ROCm 對「官方支援」的 GPU 清單有明確限制、清單外的卡也許能跑、但走 unsupported 路徑。</li>
<li><strong>llama.cpp ROCm build 跟 CUDA build 的功能差異</strong>：多數核心功能跨 backend 一致、新功能 cherry-pick 速度通常稍慢於 CUDA。</li>
<li><strong>效能對比</strong>：同價格段、AMD 卡的 VRAM 容量有時較大；但生字速度依模型跟設定變化、社群回報的 NVIDIA / AMD 對比結果不一致、需自己硬體實測。</li>
</ol>
<h3 id="vulkan-backend">Vulkan backend</h3>
<p>Vulkan 是跨平台 GPU API、llama.cpp 的 Vulkan backend 適合：</p>
<ol>
<li><strong>AMD GPU on Windows</strong>：ROCm Windows 不穩或不支援時的選項。</li>
<li><strong>Intel ARC</strong>：見下節。</li>
<li><strong>跨平台 fallback</strong>：希望同一份 binary 跑在多種 GPU 上。</li>
</ol>
<p>社群常見回報：Vulkan backend 的 throughput 通常較同硬體的 CUDA / ROCm backend 低、但通用性高。</p>
<h3 id="選-amd-卡的判讀">選 AMD 卡的判讀</h3>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>建議</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Linux 主力使用者、想避開 NVIDIA driver</td>
          <td>AMD + ROCm on Linux 是合理選擇、先確認卡型在 ROCm 支援清單</td>
      </tr>
      <tr>
          <td>Windows 主力使用者</td>
          <td>NVIDIA + CUDA 仍是社群預設較順的路徑</td>
      </tr>
      <tr>
          <td>同價格段、AMD VRAM 容量明顯較大</td>
          <td>評估「容量優勢 vs 工具鏈成本」、用自己工作流校準</td>
      </tr>
      <tr>
          <td>已有 AMD 卡、想試本地 LLM</td>
          <td>直接試 Vulkan / ROCm backend、看是否符合需求</td>
      </tr>
  </tbody>
</table>
<h2 id="intel-arc">Intel ARC</h2>
<p>Intel 的獨立 GPU 系列 ARC（A 系列、後續預期 B 系列）在 llama.cpp 生態仍處於相對年輕的階段：</p>
<ol>
<li><strong>可用 backend</strong>：Vulkan（通用）、SYCL / OpenVINO（Intel 特化）。</li>
<li><strong>VRAM 容量</strong>：ARC A770 16GB 的 VRAM 容量在價格段內競爭力較強。</li>
<li><strong>工具鏈成熟度</strong>：社群實測案例較 NVIDIA / AMD 少、預期需要較多自己摸索。</li>
<li><strong>driver 演進</strong>：Intel ARC driver 在 2026 年仍持續演進、不同版本的 throughput 可能差異較大。</li>
</ol>
<p>選 Intel ARC 的合理情境：</p>
<ol>
<li>想試「相對冷門但價格友善」的選項。</li>
<li>已有 Intel 平台、想保持廠商一致。</li>
<li>不介意花時間自己調工具鏈設定。</li>
</ol>
<p>對「想最快跑起來、最少調參」的使用者、ARC 不是最順的選擇。</p>
<h2 id="工具鏈--規格--預算的判讀框架">工具鏈 × 規格 × 預算的判讀框架</h2>
<p>選卡時的三軸框架：</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">工具鏈支援度（CUDA &gt; ROCm &gt; Vulkan &gt; SYCL）
</span></span><span class="line"><span class="ln">2</span><span class="cl">  ×
</span></span><span class="line"><span class="ln">3</span><span class="cl">硬體規格（VRAM 容量 + VRAM 頻寬 + CUDA core / CU 數量）
</span></span><span class="line"><span class="ln">4</span><span class="cl">  ×
</span></span><span class="line"><span class="ln">5</span><span class="cl">預算（含後續電費、機殼散熱、電源升級）</span></span></code></pre></div><p>判讀順序：</p>
<ol>
<li><strong>先確認工具鏈支援度符合自己的折騰意願</strong>：怕折騰選 NVIDIA、樂於折騰可考慮 AMD / Intel。</li>
<li><strong>再依預算選 VRAM 容量級別</strong>：16GB 起步、24GB 進階、32GB 旗艦。</li>
<li><strong>同容量下選頻寬較高的卡</strong>：對生字速度影響直接。</li>
<li><strong>預留升級空間</strong>：機殼散熱、電源、PCIe lane 配置會影響後續多卡或換卡的選擇。</li>
</ol>
<h2 id="雲端--本地的混合場景">雲端 + 本地的混合場景</h2>
<p>本地 LLM 不必獨自解決所有任務、雲端 + 本地的混合是社群多數使用者的實際做法：</p>
<table>
  <thead>
      <tr>
          <th>任務類型</th>
          <th>適合本地</th>
          <th>適合雲端</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>補完、行內編輯（高頻、短回答）</td>
          <td>本地反應快、不消耗 API quota</td>
          <td>雲端 latency 較高、成本累積</td>
      </tr>
      <tr>
          <td>跨檔案重構、設計討論</td>
          <td>視本地模型能力</td>
          <td>旗艦模型（Claude、GPT-5）能力較強</td>
      </tr>
      <tr>
          <td>隱私敏感內容、未公開 codebase</td>
          <td>本地 prompt 不離開機器</td>
          <td>視服務的資料政策</td>
      </tr>
      <tr>
          <td>試新 prompt、調 prompt 工程</td>
          <td>本地快速迭代、無 quota 壓力</td>
          <td>雲端做最終驗證</td>
      </tr>
      <tr>
          <td>一次性 / 偶爾的複雜任務</td>
          <td>投資本地硬體可能不划算</td>
          <td>雲端按使用量付費較划算</td>
      </tr>
  </tbody>
</table>
<p>社群常見的混合做法：本地跑 30B 級 MoE 處理日常補完、跨檔案重構或設計討論切到雲端旗艦。Continue.dev 等工具支援同時設定多個 model、可以快速切換、見 <a href="/blog/llm/01-local-llm-services/vscode-continue-integration/" data-link-title="1.3 VS Code &#43; Continue.dev 整合" data-link-desc="安裝 Continue 擴充套件、config.json 設定、Cmd&#43;L 對話 / Cmd&#43;I 行內編輯快捷鍵">1.3 VS Code + Continue.dev 整合</a>。</p>
<h2 id="給讀者的選卡判讀">給讀者的選卡判讀</h2>
<p>整合本章與 <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>
<ol>
<li><strong>NVIDIA 是當前社群預設</strong>：怕折騰、想最大化「跑得起來」概率、選 NVIDIA。</li>
<li><strong>VRAM 16GB 是常見起點</strong>：16GB VRAM + 64GB RAM 配 30B MoE 卸載、是 2026 年寫 code 場景的常見配置。</li>
<li><strong>頻寬比容量更影響日常體感</strong>：同容量下、頻寬接近兩倍的卡（如 5070 Ti 對 5060 Ti）日常生字速度差異明顯。</li>
<li><strong>二手卡也是選項</strong>：RTX 3090 24GB 二手市場價格依在地市場變化、CUDA 支援度仍佳、適合預算敏感但想要 24GB VRAM 的使用者。</li>
<li><strong>多卡不是優先升級方向</strong>：單人寫 code 場景下、單卡 + 良好設定通常勝過雙卡入門配置。</li>
</ol>
<h2 id="下一步">下一步</h2>
<p>本章是模組五的最後一章。下一步可以回到 <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 調參">模組五 _index</a> 看其他章節、或進入 <a href="/blog/llm/04-applications/" data-link-title="模組四：LLM 應用層原理" data-link-desc="Prompt 技術光譜、RAG、tool use、agent、應用層協議、人機協作、multi-agent、workflow 編排、eval 設計：跨工具不變的概念地圖">模組四 應用層原理</a> 看 LLM 作為系統元件的設計取捨。</p>
]]></content:encoded></item><item><title>LLM 寫 code 工程實務指南：從心智模型到應用架構</title><link>https://tarrragon.github.io/blog/llm/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/</guid><description>&lt;p>本指南的核心目標是把「LLM 在寫 code 工作流的完整工程地圖」拆成可決策、可實作、可期望管理的工程問題。範圍覆蓋四條讀者旅程：(1) 在自己機器跑本地 LLM 寫 code 的最短可行路徑（Mac 或 PC）、(2) 想懂 LLM 內部運作機制（數學 + 理論基礎）、(3) 想做 LLM 應用開發（RAG / agent / tool use / VLM / benchmarking / 靜態 deployment）、(4) 關心 LLM 工作流的安全議題（本地 dev 視角 + 靜態網站視角）。網路上的 LLM 文章常把推論框架、加速技巧、應用模式、安全議題混為一談；本指南先把這些名詞放回正確的層級、再回答各層的具體取捨。&lt;/p>
&lt;p>本指南預設讀者已經會用過雲端 LLM（ChatGPT、Claude）、熟悉終端機操作、想以工程視角理解 LLM。&lt;strong>寫 code 場景是主要使用例、但模組二 / 三 / 四 / 六多數章節跨場景通用&lt;/strong>：想懂 reasoning model / RAG / embedding model 內部、即使不裝本地 LLM 也能讀。硬體前提分兩條路線：Apple Silicon Mac（M1 ~ M4、統一記憶體）走模組一；Windows / Linux + 獨立 GPU（NVIDIA / AMD、獨立 VRAM + 系統 RAM）走模組五。文章不販賣 LLM 焦慮、也不誇大本地能取代雲端的程度；它的責任是給每條讀者旅程的最短可行路徑、並標出每個階段的取捨。&lt;/p>
&lt;p>模組零（心智模型）是所有讀者旅程的共同前置。模組一跟模組五是「裝本地 LLM」的兩條硬體路線、依平台選一條；想懂底層走模組二跟模組三（跟硬體無關、含 reasoning model / speculative decoding 等推論細節）；想看 LLM 作為系統元件走模組四（12 章涵蓋 RAG、tool use、agent、應用層協議、workflow、production resource、long context、embedding model、benchmarking、vision、靜態 deployment）；本地工作流跑穩想看安全議題走模組六（個人 dev 視角的供應鏈、伺服器綁定、tool use 權限、prompt injection、跨雲端邊界、production routing）。&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;/td>
 &lt;td>本地 vs 雲端的差異、為何 LLM 生字慢、三層架構（介面 / 伺服器 / 模型）、&lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/openai-compatible-api/" data-link-title="0.3 OpenAI 相容 API" data-link-desc="為什麼幾乎所有本地 LLM 工具不用改就能切到本地：背後是同一套 API 形狀">OpenAI 相容 API&lt;/a>&lt;/td>
 &lt;td>雲端 GPU 租用、AGI 預測&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>術語澄清&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">MLX&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">MTP&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">oMLX&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">speculative decoding&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a>、&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>、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/ttft/" data-link-title="TTFT" data-link-desc="Time To First Token：送出 prompt 到第一個 token 出現的等待時間">TTFT&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 跑得了更大模型">MoE CPU 卸載&lt;/a>&lt;/td>
 &lt;td>post-training fine-tuning 細節&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mac 硬體現實&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/hardware-memory-budget/" data-link-title="0.5 Apple Silicon 記憶體預算" data-link-desc="記憶體決定能跑什麼，Q4 量化下的可運作模型對照與系統保留">記憶體預算與模型大小&lt;/a>、量化選擇、首字延遲、風扇與功耗&lt;/td>
 &lt;td>雲端 GPU 租用、資料中心訓練&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PC 硬體現實&lt;/td>
 &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 把兩個世界連起來">VRAM + RAM 分層預算&lt;/a>、MoE 專家層 CPU 卸載、KV cache 量化、PCIe 頻寬限制&lt;/td>
 &lt;td>多卡 NVLink、資料中心級分散式推論&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>本地推論伺服器&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/ollama/" data-link-title="1.0 Ollama：主流推論伺服器" data-link-desc="一行 brew 裝完、ollama run 一鍵跑 Gemma 4 MTP、OpenAI 相容 API on localhost:11434">Ollama&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/lm-studio/" data-link-title="1.1 LM Studio：GUI 探索模型" data-link-desc="GUI 取向的本地推論伺服器：內建模型瀏覽器、speculative decoding 設定面板、適合探索新模型">LM Studio&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">llama.cpp&lt;/a>（Mac + PC 通用）&lt;/td>
 &lt;td>vLLM、TGI、Triton 等資料中心級 inference server&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>編輯器整合&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/vscode-continue-integration/" data-link-title="1.3 VS Code &amp;#43; Continue.dev 整合" data-link-desc="安裝 Continue 擴充套件、config.json 設定、Cmd&amp;#43;L 對話 / Cmd&amp;#43;I 行內編輯快捷鍵">Continue.dev + VS Code&lt;/a>、Cursor 對應關係&lt;/td>
 &lt;td>JetBrains 全套整合、Vim / Emacs 進階 plugin&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>模型挑選&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/model-selection-priority/" data-link-title="1.4 寫 code 場景的模型選型優先順序" data-link-desc="Gemma 4 31B MTP → Qwen3-Coder 30B → Qwen3 14B → gpt-oss 20B 的取捨與適用情境">coding 場景的模型優先順序&lt;/a>、量化等級對體感影響&lt;/td>
 &lt;td>benchmark 跑分方法論的完整推導&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>期望管理&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/expectation-management/" data-link-title="1.5 期望管理：本地 LLM 的擅長領域與分工" data-link-desc="本地 LLM 是免費的初階 pair programmer：辨識它的擅長領域、跟雲端旗艦做結構性分工">本地 LLM 的擅長領域與分工&lt;/a>、混用雲端的時機&lt;/td>
 &lt;td>LLM 通用能力評估、AGI 預測&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>數學基礎&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/02-math-foundations/linear-algebra-for-llm/" data-link-title="2.0 線性代數：向量、矩陣、空間" data-link-desc="LLM 內部運算的基底：向量、矩陣、向量空間、內積、norm、矩陣乘法的角色">線性代數&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/02-math-foundations/probability-and-information/" data-link-title="2.1 機率與資訊論" data-link-desc="LLM 輸出的本質是機率分佈：softmax、cross-entropy、KL divergence、perplexity 在訓練與推論中的角色">機率與資訊論&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/02-math-foundations/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">最佳化&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/02-math-foundations/numerical-precision/" data-link-title="2.3 數值精度與量化的數學依據" data-link-desc="fp32 / bf16 / fp16 / int8 / int4 的差別、量化能省哪些 bits、品質衰減從哪裡來">數值精度&lt;/a> 在 LLM 中的角色&lt;/td>
 &lt;td>完整數學證明、測度論等屬於數學系範圍的主題&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>理論基礎&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/neural-network-basics/" data-link-title="3.0 神經網路基礎" data-link-desc="從單一 neuron 到 multi-layer：weights、activation function、forward / backward pass 的角色">神經網路&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/embedding-spaces/" data-link-title="3.1 Embedding 空間" data-link-desc="token 怎麼變成向量、為什麼相似 token 在向量空間中靠近、embedding 是怎麼學出來的">embedding&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">attention&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/transformer-architecture/" data-link-title="3.3 Transformer 架構細節" data-link-desc="Decoder-only 結構、Transformer block、positional encoding、layer norm、residual stream">Transformer&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/training-pipeline/" data-link-title="3.4 訓練流程：pre-train → SFT → RLHF" data-link-desc="LLM 的三階段訓練：預訓練、指令微調、人類反饋強化學習；各階段目標與最新替代方案">訓練流程&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/sampling-and-decoding/" data-link-title="3.5 Sampling 與 Decoding 策略" data-link-desc="Greedy、beam search、top-k、top-p、temperature、min-p：模型輸出後怎麼挑下一個 token">sampling&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/tokenization-algorithms/" data-link-title="3.6 Tokenization：BPE、SentencePiece、Tiktoken" data-link-desc="把文字切成 token 的算法：為什麼不同模型切出不同 token 數、tokenizer 選擇對能力的影響">tokenization&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/cross-language-tokenization/" data-link-title="3.7 跨語言場景的 tokenizer 與訓練分佈原理" data-link-desc="為什麼模型對不同語言表現不一致：tokenizer &amp;#43; 訓練資料分佈雙因素、語言選擇取捨">跨語言原理&lt;/a>&lt;/td>
 &lt;td>多模態擴展、最新研究細節交給 Stanford CS25&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>應用層原理&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/rag-principles/" data-link-title="4.1 RAG 原理：retrieval &amp;#43; augmentation 模式" data-link-desc="為什麼模型需要外掛知識、語意相似 vs 字面相似、chunking 的本質取捨、retrieval 失敗的根本原因">RAG&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/tool-use-principles/" data-link-title="4.3 Tool use 原理：LLM 跟外部世界互動" data-link-desc="Structured output 是 LLM 跨入工程系統的橋、function calling 取捨、為什麼本地小模型 tool use 表現崩潰">Tool use&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/agent-architecture/" data-link-title="4.4 Agent 架構原理" data-link-desc="Agent loop 結構、失敗模式、什麼任務適合 vs 不適合、跟人類審查的協作模型">Agent 架構&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/application-protocols/" data-link-title="4.6 應用層協議：function calling / structured output / MCP" data-link-desc="三個常被混為一談的概念：模型能力、sampling 約束、server 協議，三者的層級差異與組合方式">應用層協議&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/workflow-patterns/" data-link-title="4.7 Workflow 編排模式" data-link-desc="Pipeline / router / parallel / reflection：多 LLM call 組合的四種基本模式與退化條件">Workflow 編排&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/production-resource-planning/" data-link-title="4.9 Production 部署的資源評估原理" data-link-desc="從本地單 user 到 production multi-tenant：concurrent users、cost model、observability、SLA、capacity planning 的設計取捨">Production resource&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/artifact-management/" data-link-title="4.10 衍生產物管理原理：什麼進 git、什麼不該" data-link-desc="LLM 應用的 source / derived / external 三類產物對應 git / build cache / registry、與 production 部署的 reproducibility / cost / share 取捨">Artifact 管理&lt;/a>&lt;/td>
 &lt;td>具體 framework 教學（LangChain / LlamaIndex）、prompt engineering&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>進階理論&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/reasoning-models/" data-link-title="3.8 Reasoning models：test-time compute paradigm" data-link-desc="Chain-of-thought 從 prompting 技巧演化成訓練 paradigm、reasoning model 的內部運作、本地可跑的選項與適用任務">Reasoning models&lt;/a>（o1 / R1 / QwQ 風格）、&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/speculative-decoding-internals/" data-link-title="3.9 Speculative decoding 內部：drafter / 驗證 / 加速上限" data-link-desc="speculative decoding 的演算法細節、drafter 跟 target 怎麼配對、acceptance rate 怎麼決定實際加速、MTP 跟 EAGLE 等變體">Speculative decoding 內部&lt;/a>（drafter / MTP / EAGLE）&lt;/td>
 &lt;td>完整 paper 推導、最新研究 frontier&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>進階應用&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/long-context-engineering/" data-link-title="4.11 Long context engineering" data-link-desc="128K / 1M context 模型怎麼用：claimed vs effective context、lost-in-the-middle、context 設計策略、Long context vs RAG 取捨">Long context engineering&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/embedding-model-internals/" data-link-title="4.12 Embedding model 內部：訓練、選型、in-domain fine-tune" data-link-desc="Embedding model 怎麼訓練（contrastive learning &amp;#43; hard negative mining）、怎麼挑（MTEB / 大小 / domain）、何時該自己 fine-tune">Embedding model 內部&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/benchmarking-and-evaluation/" data-link-title="4.14 Benchmarking 與評估方法論" data-link-desc="判讀 model card benchmark 數字、做自己工作流的 in-house benchmark、量測本地推論速度的完整方法論">Benchmarking&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/vision-in-coding-workflow/" data-link-title="4.15 Vision in coding workflow：本地 VLM 怎麼接寫 code" data-link-desc="VLM 在 coding 工作流的 use cases、本地 VLM 選型、跟雲端 VLM 的分工、Continue.dev / Ollama 整合現狀">Vision in coding&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/static-and-serverless-rag-deployment/" data-link-title="4.16 靜態 / serverless RAG deployment：架構選擇與資安取捨" data-link-desc="沒 backend 的場景怎麼做 RAG：四種 deployment 方案、API key 暴露問題、CORS / abuse / 第三方信任、跟模組六的 routing">靜態 / serverless RAG deployment&lt;/a>&lt;/td>
 &lt;td>完整 LangChain / LlamaIndex 教學&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Fine-tuning&lt;/td>
 &lt;td>原理（&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/qlora/" data-link-title="QLoRA" data-link-desc="把 base model 量化到 4-bit &amp;#43; LoRA fine-tune 的組合、消費級 GPU 也能 fine-tune 大模型">QLoRA&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/catastrophic-forgetting/" data-link-title="Catastrophic Forgetting" data-link-desc="Fine-tune 模型時、新訓練資料覆蓋掉原本學到的能力的現象、LoRA / 資料 mixing 是主要緩解">catastrophic forgetting&lt;/a>）+ &lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/hands-on/local-fine-tuning/" data-link-title="Hands-on：用 QLoRA 在本機 fine-tune coding 模型" data-link-desc="Apple Silicon Mac / PC 獨立 GPU 上跑 QLoRA fine-tune 的完整流程：環境、資料、訓練、evaluation、合併、部署到 Ollama">本機 hands-on&lt;/a>&lt;/td>
 &lt;td>完整資料工程、large-scale distributed fine-tune&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>隱私 / 安全&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/privacy-data-flow/" data-link-title="0.7 隱私 / 資安的資料流原理" data-link-desc="從「位置」到「資料流」的思考升級：信任邊界、合約模型、零信任原則套用到 LLM 工作流">隱私資料流&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/06-security/" data-link-title="模組六：本地 LLM 的安全與權限" data-link-desc="個人 dev 在自己機器上跑本地 LLM 的安全議題：模型供應鏈、推論伺服器綁定、tool use 副作用、prompt injection 在 IDE、跨雲端 / 本地資料邊界">本地 dev 安全模組&lt;/a>（供應鏈 / 伺服器綁定 / tool use / prompt injection / 跨雲端邊界 / production routing）、&lt;a href="https://tarrragon.github.io/blog/llm/04-applications/static-and-serverless-rag-deployment/" data-link-title="4.16 靜態 / serverless RAG deployment：架構選擇與資安取捨" data-link-desc="沒 backend 的場景怎麼做 RAG：四種 deployment 方案、API key 暴露問題、CORS / abuse / 第三方信任、跟模組六的 routing">靜態網站 RAG 資安&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/troubleshooting/" data-link-title="1.7 排錯方法論：用三層架構做故障定位" data-link-desc="故障定位的分層思考、症狀到層級的對應反射、log 在三層的角色差異、最小可重現的縮減策略">排錯方法論&lt;/a>&lt;/td>
 &lt;td>企業合規逐條檢核、SOC 2 / HIPAA 流程&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>進一步學習&lt;/td>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/llm/02-math-foundations/going-deeper-math/" data-link-title="2.4 想學更深：推薦公開課程" data-link-desc="MIT、Stanford、Harvard 等公開課程：數學基礎跟 LLM 預備知識的完整學習路線">數學公開課推薦&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/03-theoretical-foundations/going-deeper-theory/" data-link-title="3.11 想學更深：推薦公開課程" data-link-desc="Karpathy、Stanford CS224N / CS25 / CS336、DeepLearning.AI、Hugging Face：LLM 理論深入學習的完整路線">LLM 理論公開課推薦&lt;/a>&lt;/td>
 &lt;td>（交給推薦的課程跟書籍）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="學習路線">學習路線&lt;/h2>
&lt;p>本指南分成七個模組加一組前置卡片（111 張）。讀者依目的選讀、不需要從頭到尾全讀：&lt;/p></description><content:encoded><![CDATA[<p>本指南的核心目標是把「LLM 在寫 code 工作流的完整工程地圖」拆成可決策、可實作、可期望管理的工程問題。範圍覆蓋四條讀者旅程：(1) 在自己機器跑本地 LLM 寫 code 的最短可行路徑（Mac 或 PC）、(2) 想懂 LLM 內部運作機制（數學 + 理論基礎）、(3) 想做 LLM 應用開發（RAG / agent / tool use / VLM / benchmarking / 靜態 deployment）、(4) 關心 LLM 工作流的安全議題（本地 dev 視角 + 靜態網站視角）。網路上的 LLM 文章常把推論框架、加速技巧、應用模式、安全議題混為一談；本指南先把這些名詞放回正確的層級、再回答各層的具體取捨。</p>
<p>本指南預設讀者已經會用過雲端 LLM（ChatGPT、Claude）、熟悉終端機操作、想以工程視角理解 LLM。<strong>寫 code 場景是主要使用例、但模組二 / 三 / 四 / 六多數章節跨場景通用</strong>：想懂 reasoning model / RAG / embedding model 內部、即使不裝本地 LLM 也能讀。硬體前提分兩條路線：Apple Silicon Mac（M1 ~ M4、統一記憶體）走模組一；Windows / Linux + 獨立 GPU（NVIDIA / AMD、獨立 VRAM + 系統 RAM）走模組五。文章不販賣 LLM 焦慮、也不誇大本地能取代雲端的程度；它的責任是給每條讀者旅程的最短可行路徑、並標出每個階段的取捨。</p>
<p>模組零（心智模型）是所有讀者旅程的共同前置。模組一跟模組五是「裝本地 LLM」的兩條硬體路線、依平台選一條；想懂底層走模組二跟模組三（跟硬體無關、含 reasoning model / speculative decoding 等推論細節）；想看 LLM 作為系統元件走模組四（12 章涵蓋 RAG、tool use、agent、應用層協議、workflow、production resource、long context、embedding model、benchmarking、vision、靜態 deployment）；本地工作流跑穩想看安全議題走模組六（個人 dev 視角的供應鏈、伺服器綁定、tool use 權限、prompt injection、跨雲端邊界、production routing）。</p>
<h2 id="教材邊界">教材邊界</h2>
<table>
  <thead>
      <tr>
          <th>類型</th>
          <th>放在本指南</th>
          <th>不放在本指南</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>心智模型</td>
          <td>本地 vs 雲端的差異、為何 LLM 生字慢、三層架構（介面 / 伺服器 / 模型）、<a href="/blog/llm/00-foundations/openai-compatible-api/" data-link-title="0.3 OpenAI 相容 API" data-link-desc="為什麼幾乎所有本地 LLM 工具不用改就能切到本地：背後是同一套 API 形狀">OpenAI 相容 API</a></td>
          <td>雲端 GPU 租用、AGI 預測</td>
      </tr>
      <tr>
          <td>術語澄清</td>
          <td><a href="/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">MLX</a>、<a href="/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">MTP</a>、<a href="/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">oMLX</a>、<a href="/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">speculative decoding</a>、<a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a>、<a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a>、<a href="/blog/llm/knowledge-cards/ttft/" data-link-title="TTFT" data-link-desc="Time To First Token：送出 prompt 到第一個 token 出現的等待時間">TTFT</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 跑得了更大模型">MoE CPU 卸載</a></td>
          <td>post-training fine-tuning 細節</td>
      </tr>
      <tr>
          <td>Mac 硬體現實</td>
          <td><a href="/blog/llm/00-foundations/hardware-memory-budget/" data-link-title="0.5 Apple Silicon 記憶體預算" data-link-desc="記憶體決定能跑什麼，Q4 量化下的可運作模型對照與系統保留">記憶體預算與模型大小</a>、量化選擇、首字延遲、風扇與功耗</td>
          <td>雲端 GPU 租用、資料中心訓練</td>
      </tr>
      <tr>
          <td>PC 硬體現實</td>
          <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 把兩個世界連起來">VRAM + RAM 分層預算</a>、MoE 專家層 CPU 卸載、KV cache 量化、PCIe 頻寬限制</td>
          <td>多卡 NVLink、資料中心級分散式推論</td>
      </tr>
      <tr>
          <td>本地推論伺服器</td>
          <td><a href="/blog/llm/01-local-llm-services/ollama/" data-link-title="1.0 Ollama：主流推論伺服器" data-link-desc="一行 brew 裝完、ollama run 一鍵跑 Gemma 4 MTP、OpenAI 相容 API on localhost:11434">Ollama</a>、<a href="/blog/llm/01-local-llm-services/lm-studio/" data-link-title="1.1 LM Studio：GUI 探索模型" data-link-desc="GUI 取向的本地推論伺服器：內建模型瀏覽器、speculative decoding 設定面板、適合探索新模型">LM Studio</a>、<a href="/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">llama.cpp</a>（Mac + PC 通用）</td>
          <td>vLLM、TGI、Triton 等資料中心級 inference server</td>
      </tr>
      <tr>
          <td>編輯器整合</td>
          <td><a href="/blog/llm/01-local-llm-services/vscode-continue-integration/" data-link-title="1.3 VS Code &#43; Continue.dev 整合" data-link-desc="安裝 Continue 擴充套件、config.json 設定、Cmd&#43;L 對話 / Cmd&#43;I 行內編輯快捷鍵">Continue.dev + VS Code</a>、Cursor 對應關係</td>
          <td>JetBrains 全套整合、Vim / Emacs 進階 plugin</td>
      </tr>
      <tr>
          <td>模型挑選</td>
          <td><a href="/blog/llm/01-local-llm-services/model-selection-priority/" data-link-title="1.4 寫 code 場景的模型選型優先順序" data-link-desc="Gemma 4 31B MTP → Qwen3-Coder 30B → Qwen3 14B → gpt-oss 20B 的取捨與適用情境">coding 場景的模型優先順序</a>、量化等級對體感影響</td>
          <td>benchmark 跑分方法論的完整推導</td>
      </tr>
      <tr>
          <td>期望管理</td>
          <td><a href="/blog/llm/01-local-llm-services/expectation-management/" data-link-title="1.5 期望管理：本地 LLM 的擅長領域與分工" data-link-desc="本地 LLM 是免費的初階 pair programmer：辨識它的擅長領域、跟雲端旗艦做結構性分工">本地 LLM 的擅長領域與分工</a>、混用雲端的時機</td>
          <td>LLM 通用能力評估、AGI 預測</td>
      </tr>
      <tr>
          <td>數學基礎</td>
          <td><a href="/blog/llm/02-math-foundations/linear-algebra-for-llm/" data-link-title="2.0 線性代數：向量、矩陣、空間" data-link-desc="LLM 內部運算的基底：向量、矩陣、向量空間、內積、norm、矩陣乘法的角色">線性代數</a>、<a href="/blog/llm/02-math-foundations/probability-and-information/" data-link-title="2.1 機率與資訊論" data-link-desc="LLM 輸出的本質是機率分佈：softmax、cross-entropy、KL divergence、perplexity 在訓練與推論中的角色">機率與資訊論</a>、<a href="/blog/llm/02-math-foundations/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">最佳化</a>、<a href="/blog/llm/02-math-foundations/numerical-precision/" data-link-title="2.3 數值精度與量化的數學依據" data-link-desc="fp32 / bf16 / fp16 / int8 / int4 的差別、量化能省哪些 bits、品質衰減從哪裡來">數值精度</a> 在 LLM 中的角色</td>
          <td>完整數學證明、測度論等屬於數學系範圍的主題</td>
      </tr>
      <tr>
          <td>理論基礎</td>
          <td><a href="/blog/llm/03-theoretical-foundations/neural-network-basics/" data-link-title="3.0 神經網路基礎" data-link-desc="從單一 neuron 到 multi-layer：weights、activation function、forward / backward pass 的角色">神經網路</a>、<a href="/blog/llm/03-theoretical-foundations/embedding-spaces/" data-link-title="3.1 Embedding 空間" data-link-desc="token 怎麼變成向量、為什麼相似 token 在向量空間中靠近、embedding 是怎麼學出來的">embedding</a>、<a href="/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">attention</a>、<a href="/blog/llm/03-theoretical-foundations/transformer-architecture/" data-link-title="3.3 Transformer 架構細節" data-link-desc="Decoder-only 結構、Transformer block、positional encoding、layer norm、residual stream">Transformer</a>、<a href="/blog/llm/03-theoretical-foundations/training-pipeline/" data-link-title="3.4 訓練流程：pre-train → SFT → RLHF" data-link-desc="LLM 的三階段訓練：預訓練、指令微調、人類反饋強化學習；各階段目標與最新替代方案">訓練流程</a>、<a href="/blog/llm/03-theoretical-foundations/sampling-and-decoding/" data-link-title="3.5 Sampling 與 Decoding 策略" data-link-desc="Greedy、beam search、top-k、top-p、temperature、min-p：模型輸出後怎麼挑下一個 token">sampling</a>、<a href="/blog/llm/03-theoretical-foundations/tokenization-algorithms/" data-link-title="3.6 Tokenization：BPE、SentencePiece、Tiktoken" data-link-desc="把文字切成 token 的算法：為什麼不同模型切出不同 token 數、tokenizer 選擇對能力的影響">tokenization</a>、<a href="/blog/llm/03-theoretical-foundations/cross-language-tokenization/" data-link-title="3.7 跨語言場景的 tokenizer 與訓練分佈原理" data-link-desc="為什麼模型對不同語言表現不一致：tokenizer &#43; 訓練資料分佈雙因素、語言選擇取捨">跨語言原理</a></td>
          <td>多模態擴展、最新研究細節交給 Stanford CS25</td>
      </tr>
      <tr>
          <td>應用層原理</td>
          <td><a href="/blog/llm/04-applications/rag-principles/" data-link-title="4.1 RAG 原理：retrieval &#43; augmentation 模式" data-link-desc="為什麼模型需要外掛知識、語意相似 vs 字面相似、chunking 的本質取捨、retrieval 失敗的根本原因">RAG</a>、<a href="/blog/llm/04-applications/tool-use-principles/" data-link-title="4.3 Tool use 原理：LLM 跟外部世界互動" data-link-desc="Structured output 是 LLM 跨入工程系統的橋、function calling 取捨、為什麼本地小模型 tool use 表現崩潰">Tool use</a>、<a href="/blog/llm/04-applications/agent-architecture/" data-link-title="4.4 Agent 架構原理" data-link-desc="Agent loop 結構、失敗模式、什麼任務適合 vs 不適合、跟人類審查的協作模型">Agent 架構</a>、<a href="/blog/llm/04-applications/application-protocols/" data-link-title="4.6 應用層協議：function calling / structured output / MCP" data-link-desc="三個常被混為一談的概念：模型能力、sampling 約束、server 協議，三者的層級差異與組合方式">應用層協議</a>、<a href="/blog/llm/04-applications/workflow-patterns/" data-link-title="4.7 Workflow 編排模式" data-link-desc="Pipeline / router / parallel / reflection：多 LLM call 組合的四種基本模式與退化條件">Workflow 編排</a>、<a href="/blog/llm/04-applications/production-resource-planning/" data-link-title="4.9 Production 部署的資源評估原理" data-link-desc="從本地單 user 到 production multi-tenant：concurrent users、cost model、observability、SLA、capacity planning 的設計取捨">Production resource</a>、<a href="/blog/llm/04-applications/artifact-management/" data-link-title="4.10 衍生產物管理原理：什麼進 git、什麼不該" data-link-desc="LLM 應用的 source / derived / external 三類產物對應 git / build cache / registry、與 production 部署的 reproducibility / cost / share 取捨">Artifact 管理</a></td>
          <td>具體 framework 教學（LangChain / LlamaIndex）、prompt engineering</td>
      </tr>
      <tr>
          <td>進階理論</td>
          <td><a href="/blog/llm/03-theoretical-foundations/reasoning-models/" data-link-title="3.8 Reasoning models：test-time compute paradigm" data-link-desc="Chain-of-thought 從 prompting 技巧演化成訓練 paradigm、reasoning model 的內部運作、本地可跑的選項與適用任務">Reasoning models</a>（o1 / R1 / QwQ 風格）、<a href="/blog/llm/03-theoretical-foundations/speculative-decoding-internals/" data-link-title="3.9 Speculative decoding 內部：drafter / 驗證 / 加速上限" data-link-desc="speculative decoding 的演算法細節、drafter 跟 target 怎麼配對、acceptance rate 怎麼決定實際加速、MTP 跟 EAGLE 等變體">Speculative decoding 內部</a>（drafter / MTP / EAGLE）</td>
          <td>完整 paper 推導、最新研究 frontier</td>
      </tr>
      <tr>
          <td>進階應用</td>
          <td><a href="/blog/llm/04-applications/long-context-engineering/" data-link-title="4.11 Long context engineering" data-link-desc="128K / 1M context 模型怎麼用：claimed vs effective context、lost-in-the-middle、context 設計策略、Long context vs RAG 取捨">Long context engineering</a>、<a href="/blog/llm/04-applications/embedding-model-internals/" data-link-title="4.12 Embedding model 內部：訓練、選型、in-domain fine-tune" data-link-desc="Embedding model 怎麼訓練（contrastive learning &#43; hard negative mining）、怎麼挑（MTEB / 大小 / domain）、何時該自己 fine-tune">Embedding model 內部</a>、<a href="/blog/llm/04-applications/benchmarking-and-evaluation/" data-link-title="4.14 Benchmarking 與評估方法論" data-link-desc="判讀 model card benchmark 數字、做自己工作流的 in-house benchmark、量測本地推論速度的完整方法論">Benchmarking</a>、<a href="/blog/llm/04-applications/vision-in-coding-workflow/" data-link-title="4.15 Vision in coding workflow：本地 VLM 怎麼接寫 code" data-link-desc="VLM 在 coding 工作流的 use cases、本地 VLM 選型、跟雲端 VLM 的分工、Continue.dev / Ollama 整合現狀">Vision in coding</a>、<a href="/blog/llm/04-applications/static-and-serverless-rag-deployment/" data-link-title="4.16 靜態 / serverless RAG deployment：架構選擇與資安取捨" data-link-desc="沒 backend 的場景怎麼做 RAG：四種 deployment 方案、API key 暴露問題、CORS / abuse / 第三方信任、跟模組六的 routing">靜態 / serverless RAG deployment</a></td>
          <td>完整 LangChain / LlamaIndex 教學</td>
      </tr>
      <tr>
          <td>Fine-tuning</td>
          <td>原理（<a href="/blog/llm/knowledge-cards/lora/" data-link-title="LoRA" data-link-desc="Low-Rank Adaptation：凍住原模型權重、只訓兩個小矩陣的 parameter-efficient fine-tuning">LoRA</a> / <a href="/blog/llm/knowledge-cards/qlora/" data-link-title="QLoRA" data-link-desc="把 base model 量化到 4-bit &#43; LoRA fine-tune 的組合、消費級 GPU 也能 fine-tune 大模型">QLoRA</a> / <a href="/blog/llm/knowledge-cards/catastrophic-forgetting/" data-link-title="Catastrophic Forgetting" data-link-desc="Fine-tune 模型時、新訓練資料覆蓋掉原本學到的能力的現象、LoRA / 資料 mixing 是主要緩解">catastrophic forgetting</a>）+ <a href="/blog/llm/01-local-llm-services/hands-on/local-fine-tuning/" data-link-title="Hands-on：用 QLoRA 在本機 fine-tune coding 模型" data-link-desc="Apple Silicon Mac / PC 獨立 GPU 上跑 QLoRA fine-tune 的完整流程：環境、資料、訓練、evaluation、合併、部署到 Ollama">本機 hands-on</a></td>
          <td>完整資料工程、large-scale distributed fine-tune</td>
      </tr>
      <tr>
          <td>隱私 / 安全</td>
          <td><a href="/blog/llm/00-foundations/privacy-data-flow/" data-link-title="0.7 隱私 / 資安的資料流原理" data-link-desc="從「位置」到「資料流」的思考升級：信任邊界、合約模型、零信任原則套用到 LLM 工作流">隱私資料流</a>、<a href="/blog/llm/06-security/" data-link-title="模組六：本地 LLM 的安全與權限" data-link-desc="個人 dev 在自己機器上跑本地 LLM 的安全議題：模型供應鏈、推論伺服器綁定、tool use 副作用、prompt injection 在 IDE、跨雲端 / 本地資料邊界">本地 dev 安全模組</a>（供應鏈 / 伺服器綁定 / tool use / prompt injection / 跨雲端邊界 / production routing）、<a href="/blog/llm/04-applications/static-and-serverless-rag-deployment/" data-link-title="4.16 靜態 / serverless RAG deployment：架構選擇與資安取捨" data-link-desc="沒 backend 的場景怎麼做 RAG：四種 deployment 方案、API key 暴露問題、CORS / abuse / 第三方信任、跟模組六的 routing">靜態網站 RAG 資安</a>、<a href="/blog/llm/01-local-llm-services/troubleshooting/" data-link-title="1.7 排錯方法論：用三層架構做故障定位" data-link-desc="故障定位的分層思考、症狀到層級的對應反射、log 在三層的角色差異、最小可重現的縮減策略">排錯方法論</a></td>
          <td>企業合規逐條檢核、SOC 2 / HIPAA 流程</td>
      </tr>
      <tr>
          <td>進一步學習</td>
          <td><a href="/blog/llm/02-math-foundations/going-deeper-math/" data-link-title="2.4 想學更深：推薦公開課程" data-link-desc="MIT、Stanford、Harvard 等公開課程：數學基礎跟 LLM 預備知識的完整學習路線">數學公開課推薦</a>、<a href="/blog/llm/03-theoretical-foundations/going-deeper-theory/" data-link-title="3.11 想學更深：推薦公開課程" data-link-desc="Karpathy、Stanford CS224N / CS25 / CS336、DeepLearning.AI、Hugging Face：LLM 理論深入學習的完整路線">LLM 理論公開課推薦</a></td>
          <td>（交給推薦的課程跟書籍）</td>
      </tr>
  </tbody>
</table>
<h2 id="學習路線">學習路線</h2>
<p>本指南分成七個模組加一組前置卡片（111 張）。讀者依目的選讀、不需要從頭到尾全讀：</p>
<ul>
<li><strong>想用 Apple Silicon Mac 裝本地 LLM 寫 code</strong>：讀模組零 + 模組一（最短路徑）</li>
<li><strong>想用 Windows / Linux + 獨立 GPU 裝</strong>：讀模組零 + 模組五</li>
<li><strong>想懂 LLM 內部原理</strong>：模組二（數學） + 模組三（理論、含 reasoning models / speculative decoding）— 跟硬體無關</li>
<li><strong>想做 LLM 應用開發（含 RAG / agent / VLM / 靜態 deployment）</strong>：模組四（12 章、跨工具世代不變的原理）— 跟硬體無關</li>
<li><strong>想懂本地工作流的安全議題</strong>：模組一 / 五跑穩後接模組六（個人 dev 視角）</li>
<li><strong>想選 RAG 的 storage 方案（pickle / vector DB / hosted SaaS）</strong>：直接看 <a href="/blog/llm/04-applications/vector-storage-engineering/" data-link-title="4.22 RAG storage 工程：從 pickle 到 vector database 的選型判讀" data-link-desc="RAG storage backend 選型：規模到哪個階段該從 in-memory 升級到 vector DB、dependency chain 如何收窄選項">4.22 RAG storage 工程</a></li>
<li><strong>想在靜態網站加 RAG / 智能搜尋</strong>：直接看 <a href="/blog/llm/04-applications/static-and-serverless-rag-deployment/" data-link-title="4.16 靜態 / serverless RAG deployment：架構選擇與資安取捨" data-link-desc="沒 backend 的場景怎麼做 RAG：四種 deployment 方案、API key 暴露問題、CORS / abuse / 第三方信任、跟模組六的 routing">4.16 靜態 / serverless RAG deployment</a></li>
<li><strong>想在本機 fine-tune 模型</strong>：模組三 3.4 訓練流程原理 → <a href="/blog/llm/01-local-llm-services/hands-on/local-fine-tuning/" data-link-title="Hands-on：用 QLoRA 在本機 fine-tune coding 模型" data-link-desc="Apple Silicon Mac / PC 獨立 GPU 上跑 QLoRA fine-tune 的完整流程：環境、資料、訓練、evaluation、合併、部署到 Ollama">本機 QLoRA hands-on</a></li>
<li><strong>想跟最新進展接軌</strong>：讀完模組後進推薦的公開課程跟 paper（模組二 2.4 + 模組三 3.10）</li>
</ul>
<h3 id="前置知識卡片"><a href="/blog/llm/knowledge-cards/" data-link-title="Knowledge Cards" data-link-desc="用原子化卡片整理本地 LLM 寫 code 場景所需的概念詞彙">前置知識卡片</a></h3>
<p>用原子化卡片整理 <a href="/blog/llm/knowledge-cards/token/" data-link-title="Token" data-link-desc="LLM 處理文字時的最小單位：介於字元與單字之間">token</a>、<a href="/blog/llm/knowledge-cards/autoregressive/" data-link-title="Autoregressive" data-link-desc="LLM 一次生成一個 token、把已生成內容作為下一次輸入的架構">自回歸</a>、<a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a>、<a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a>、<a href="/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">speculative decoding</a>、<a href="/blog/llm/knowledge-cards/mtp/" data-link-title="Multi-Token Prediction (MTP)" data-link-desc="Google 為 Gemma 系列釋出的 speculative decoding 工程化實作">MTP</a>、<a href="/blog/llm/knowledge-cards/mlx/" data-link-title="MLX" data-link-desc="Apple 釋出的 Apple Silicon 數值運算 framework：類似 PyTorch / JAX 的 Mac 對應物">MLX</a>、<a href="/blog/llm/knowledge-cards/inference-server/" data-link-title="Inference Server" data-link-desc="載入模型權重、處理 prompt、產生 token 的常駐 process">推論伺服器</a>、<a href="/blog/llm/knowledge-cards/openai-compatible-api/" data-link-title="OpenAI 相容 API" data-link-desc="本地推論伺服器跟雲端 OpenAI 共用的 API 形狀標準">OpenAI 相容 API</a>、<a href="/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">memory bandwidth</a>、<a href="/blog/llm/knowledge-cards/unified-memory/" data-link-title="Unified Memory Architecture" data-link-desc="Apple Silicon 讓 CPU / GPU / NE 共用同一塊記憶體：跑大模型的優勢來源">統一記憶體</a>、<a href="/blog/llm/knowledge-cards/ttft/" data-link-title="TTFT" data-link-desc="Time To First Token：送出 prompt 到第一個 token 出現的等待時間">TTFT</a>、<a href="/blog/llm/knowledge-cards/prefill/" data-link-title="Prefill" data-link-desc="Prompt 首次處理時的計算階段：把整段輸入跑過模型、產生 KV cache">prefill</a>、<a href="/blog/llm/knowledge-cards/context-window/" data-link-title="Context Window" data-link-desc="模型一次能處理的最大 token 數量：prompt 加生成的總和上限">context window</a>、<a href="/blog/llm/knowledge-cards/transformer/" data-link-title="Transformer" data-link-desc="寫 code 用的 LLM 神經網路架構：基於 attention 機制、自回歸生成 token">Transformer</a>、<a href="/blog/llm/knowledge-cards/diffusion/" data-link-title="Diffusion" data-link-desc="產圖用的生成式 AI 架構：跟寫 code 用的 Transformer 是不同路線">Diffusion</a> 等核心概念。章節文章專注情境推導、術語背景交由卡片維持一致。</p>
<h3 id="模組零基礎知識與心智模型"><a href="/blog/llm/00-foundations/" data-link-title="模組零：基礎知識與心智模型" data-link-desc="建立本地 LLM 的心智模型、釐清 MLX / MTP / oMLX 等常被混淆的術語、Apple Silicon 記憶體現實">模組零：基礎知識與心智模型</a></h3>
<p>整理本地 vs 雲端 LLM 的差異、自回歸架構與記憶體頻寬瓶頸、介面 / 伺服器 / 模型三層心智模型、OpenAI 相容 API 為何重要、MLX / MTP / oMLX 三個容易搞混的術語、Apple Silicon Mac 記憶體與模型大小的對應關係、判讀本地 LLM 資訊的五個框架。</p>
<h3 id="模組一本地-llm-服務的安裝與應用"><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 整合、模型選型與期望管理">模組一：本地 LLM 服務的安裝與應用</a></h3>
<p>整理 Ollama、LM Studio、llama.cpp 三個主流推論伺服器的現況差異與安裝路徑、用 Continue.dev 把本地 LLM 接到 VS Code 的完整步驟、寫 code 場景下模型選型的優先順序、本地模型的期望管理、想進一步玩 coding agent、Web UI、產圖時的延伸方向。</p>
<h3 id="模組二llm-的數學基礎"><a href="/blog/llm/02-math-foundations/" data-link-title="模組二：LLM 的數學基礎" data-link-desc="整理 LLM 推論背後需要理解的線性代數、機率與資訊論、最佳化、數值精度等數學概念">模組二：LLM 的數學基礎</a></h3>
<p>整理 LLM 推論背後的數學工具：<a href="/blog/llm/02-math-foundations/linear-algebra-for-llm/" data-link-title="2.0 線性代數：向量、矩陣、空間" data-link-desc="LLM 內部運算的基底：向量、矩陣、向量空間、內積、norm、矩陣乘法的角色">線性代數</a>（向量、矩陣、空間）、<a href="/blog/llm/02-math-foundations/probability-and-information/" data-link-title="2.1 機率與資訊論" data-link-desc="LLM 輸出的本質是機率分佈：softmax、cross-entropy、KL divergence、perplexity 在訓練與推論中的角色">機率與資訊論</a>（softmax、cross-entropy、KL、perplexity）、<a href="/blog/llm/02-math-foundations/calculus-and-optimization/" data-link-title="2.2 微積分與最佳化" data-link-desc="從 gradient、chain rule 到 SGD / Adam：LLM 訓練如何更新數十億參數">微積分與最佳化</a>（gradient、SGD / Adam）、<a href="/blog/llm/02-math-foundations/numerical-precision/" data-link-title="2.3 數值精度與量化的數學依據" data-link-desc="fp32 / bf16 / fp16 / int8 / int4 的差別、量化能省哪些 bits、品質衰減從哪裡來">數值精度</a>（fp32 / bf16 / Q4 / Q8 的取捨）。每章末尾接到<a href="/blog/llm/02-math-foundations/going-deeper-math/" data-link-title="2.4 想學更深：推薦公開課程" data-link-desc="MIT、Stanford、Harvard 等公開課程：數學基礎跟 LLM 預備知識的完整學習路線">公開課推薦</a>。</p>
<h3 id="模組三llm-的理論基礎"><a href="/blog/llm/03-theoretical-foundations/" data-link-title="模組三：LLM 的理論基礎" data-link-desc="從神經網路、embedding、attention、Transformer 架構、訓練到 sampling：LLM 內部運作的完整理論圖像">模組三：LLM 的理論基礎</a></h3>
<p>整理 LLM 內部運作機制、共 11 章：<a href="/blog/llm/03-theoretical-foundations/neural-network-basics/" data-link-title="3.0 神經網路基礎" data-link-desc="從單一 neuron 到 multi-layer：weights、activation function、forward / backward pass 的角色">神經網路基礎</a>、<a href="/blog/llm/03-theoretical-foundations/embedding-spaces/" data-link-title="3.1 Embedding 空間" data-link-desc="token 怎麼變成向量、為什麼相似 token 在向量空間中靠近、embedding 是怎麼學出來的">embedding 空間</a>、<a href="/blog/llm/03-theoretical-foundations/attention-mechanism/" data-link-title="3.2 Attention 機制" data-link-desc="Query / Key / Value、scaled dot-product attention、multi-head attention：Transformer 的核心運算">attention 機制</a>、<a href="/blog/llm/03-theoretical-foundations/transformer-architecture/" data-link-title="3.3 Transformer 架構細節" data-link-desc="Decoder-only 結構、Transformer block、positional encoding、layer norm、residual stream">Transformer 架構</a>、<a href="/blog/llm/03-theoretical-foundations/training-pipeline/" data-link-title="3.4 訓練流程：pre-train → SFT → RLHF" data-link-desc="LLM 的三階段訓練：預訓練、指令微調、人類反饋強化學習；各階段目標與最新替代方案">訓練流程</a>（pre-train → SFT → RLHF / DPO）、<a href="/blog/llm/03-theoretical-foundations/sampling-and-decoding/" data-link-title="3.5 Sampling 與 Decoding 策略" data-link-desc="Greedy、beam search、top-k、top-p、temperature、min-p：模型輸出後怎麼挑下一個 token">sampling 策略</a>、<a href="/blog/llm/03-theoretical-foundations/tokenization-algorithms/" data-link-title="3.6 Tokenization：BPE、SentencePiece、Tiktoken" data-link-desc="把文字切成 token 的算法：為什麼不同模型切出不同 token 數、tokenizer 選擇對能力的影響">tokenization 算法</a>、<a href="/blog/llm/03-theoretical-foundations/cross-language-tokenization/" data-link-title="3.7 跨語言場景的 tokenizer 與訓練分佈原理" data-link-desc="為什麼模型對不同語言表現不一致：tokenizer &#43; 訓練資料分佈雙因素、語言選擇取捨">跨語言場景原理</a>、<a href="/blog/llm/03-theoretical-foundations/reasoning-models/" data-link-title="3.8 Reasoning models：test-time compute paradigm" data-link-desc="Chain-of-thought 從 prompting 技巧演化成訓練 paradigm、reasoning model 的內部運作、本地可跑的選項與適用任務">Reasoning models</a>（o1 / R1 / QwQ 等 test-time compute paradigm）、<a href="/blog/llm/03-theoretical-foundations/speculative-decoding-internals/" data-link-title="3.9 Speculative decoding 內部：drafter / 驗證 / 加速上限" data-link-desc="speculative decoding 的演算法細節、drafter 跟 target 怎麼配對、acceptance rate 怎麼決定實際加速、MTP 跟 EAGLE 等變體">Speculative decoding 內部</a>（drafter / MTP / EAGLE）。每章末尾接到<a href="/blog/llm/03-theoretical-foundations/going-deeper-theory/" data-link-title="3.11 想學更深：推薦公開課程" data-link-desc="Karpathy、Stanford CS224N / CS25 / CS336、DeepLearning.AI、Hugging Face：LLM 理論深入學習的完整路線">公開課推薦</a>（Karpathy、Stanford CS224N / CS25 / CS336、DeepLearning.AI）。</p>
<h3 id="模組四llm-應用層原理"><a href="/blog/llm/04-applications/" data-link-title="模組四：LLM 應用層原理" data-link-desc="Prompt 技術光譜、RAG、tool use、agent、應用層協議、人機協作、multi-agent、workflow 編排、eval 設計：跨工具不變的概念地圖">模組四：LLM 應用層原理</a></h3>
<p>整理 LLM 作為系統元件的設計原理、共 12 章：<a href="/blog/llm/04-applications/rag-principles/" data-link-title="4.1 RAG 原理：retrieval &#43; augmentation 模式" data-link-desc="為什麼模型需要外掛知識、語意相似 vs 字面相似、chunking 的本質取捨、retrieval 失敗的根本原因">RAG</a>、<a href="/blog/llm/04-applications/tool-use-principles/" data-link-title="4.3 Tool use 原理：LLM 跟外部世界互動" data-link-desc="Structured output 是 LLM 跨入工程系統的橋、function calling 取捨、為什麼本地小模型 tool use 表現崩潰">tool use</a>、<a href="/blog/llm/04-applications/agent-architecture/" data-link-title="4.4 Agent 架構原理" data-link-desc="Agent loop 結構、失敗模式、什麼任務適合 vs 不適合、跟人類審查的協作模型">agent 架構</a>、<a href="/blog/llm/04-applications/application-protocols/" data-link-title="4.6 應用層協議：function calling / structured output / MCP" data-link-desc="三個常被混為一談的概念：模型能力、sampling 約束、server 協議，三者的層級差異與組合方式">應用層協議</a>、<a href="/blog/llm/04-applications/workflow-patterns/" data-link-title="4.7 Workflow 編排模式" data-link-desc="Pipeline / router / parallel / reflection：多 LLM call 組合的四種基本模式與退化條件">workflow 編排模式</a>、<a href="/blog/llm/04-applications/production-resource-planning/" data-link-title="4.9 Production 部署的資源評估原理" data-link-desc="從本地單 user 到 production multi-tenant：concurrent users、cost model、observability、SLA、capacity planning 的設計取捨">Production resource planning</a>、<a href="/blog/llm/04-applications/artifact-management/" data-link-title="4.10 衍生產物管理原理：什麼進 git、什麼不該" data-link-desc="LLM 應用的 source / derived / external 三類產物對應 git / build cache / registry、與 production 部署的 reproducibility / cost / share 取捨">衍生產物管理</a>、<a href="/blog/llm/04-applications/long-context-engineering/" data-link-title="4.11 Long context engineering" data-link-desc="128K / 1M context 模型怎麼用：claimed vs effective context、lost-in-the-middle、context 設計策略、Long context vs RAG 取捨">Long context engineering</a>、<a href="/blog/llm/04-applications/embedding-model-internals/" data-link-title="4.12 Embedding model 內部：訓練、選型、in-domain fine-tune" data-link-desc="Embedding model 怎麼訓練（contrastive learning &#43; hard negative mining）、怎麼挑（MTEB / 大小 / domain）、何時該自己 fine-tune">Embedding model 內部</a>、<a href="/blog/llm/04-applications/benchmarking-and-evaluation/" data-link-title="4.14 Benchmarking 與評估方法論" data-link-desc="判讀 model card benchmark 數字、做自己工作流的 in-house benchmark、量測本地推論速度的完整方法論">Benchmarking 方法論</a>、<a href="/blog/llm/04-applications/vision-in-coding-workflow/" data-link-title="4.15 Vision in coding workflow：本地 VLM 怎麼接寫 code" data-link-desc="VLM 在 coding 工作流的 use cases、本地 VLM 選型、跟雲端 VLM 的分工、Continue.dev / Ollama 整合現狀">Vision in coding workflow</a>（本地 VLM 接 IDE）、<a href="/blog/llm/04-applications/static-and-serverless-rag-deployment/" data-link-title="4.16 靜態 / serverless RAG deployment：架構選擇與資安取捨" data-link-desc="沒 backend 的場景怎麼做 RAG：四種 deployment 方案、API key 暴露問題、CORS / abuse / 第三方信任、跟模組六的 routing">靜態 / serverless RAG deployment</a>（沒 backend 場景）。本模組刻意只寫跨工具世代不變的原理、避開 LangChain / LlamaIndex 等具體 framework 教學。</p>
<h3 id="模組五windows--linux--獨立-gpu"><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 調參">模組五：Windows / Linux + 獨立 GPU</a></h3>
<p>整理消費級 PC（Windows / Linux + NVIDIA / AMD 獨立 GPU）跑本地 LLM 的硬體判讀模型與工程選項：<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 把兩個世界連起來">VRAM + RAM 分層預算</a>、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>（<code>--n-cpu-moe</code>）、KV cache 量化（K=Q8 / V=Q4）跟 context 長度的權衡、llama.cpp 在 PC 上的調參空間。本模組跟模組一是平行的硬體路線、共用模組零的心智模型跟卡片。</p>
<h3 id="模組六本地-llm-的安全與權限"><a href="/blog/llm/06-security/" data-link-title="模組六：本地 LLM 的安全與權限" data-link-desc="個人 dev 在自己機器上跑本地 LLM 的安全議題：模型供應鏈、推論伺服器綁定、tool use 副作用、prompt injection 在 IDE、跨雲端 / 本地資料邊界">模組六：本地 LLM 的安全與權限</a></h3>
<p>整理個人 dev 在自己機器上跑本地 LLM 的安全議題：<a href="/blog/llm/06-security/model-supply-chain-trust/" data-link-title="6.0 模型供應鏈與信任邊界" data-link-desc="個人 dev 用本地 LLM 時的模型權重來源信任：GGUF 完整性、Hugging Face / Ollama registry 信任、量化版本污染、檔案完整性檢查">模型供應鏈與信任邊界</a>、<a href="/blog/llm/06-security/inference-server-binding/" data-link-title="6.1 推論伺服器的綁定與暴露範圍" data-link-desc="個人 dev 場景下 llama-server / Ollama / LM Studio 的 bind address 判讀：127.0.0.1 vs LAN vs 反代、預設安全、誤開放給內網的後果">推論伺服器的綁定與暴露範圍</a>、<a href="/blog/llm/06-security/tool-use-permission-model/" data-link-title="6.2 tool use 與 MCP server 的權限模型" data-link-desc="個人 dev 場景下 tool use / MCP server 的副作用權限：檔案系統 / shell / 網路存取邊界、第三方 MCP 信任、副作用的可逆性">tool use 與 MCP server 的權限模型</a>、<a href="/blog/llm/06-security/prompt-injection-in-ide/" data-link-title="6.3 IDE 場景的 prompt injection" data-link-desc="個人 dev 場景下 IDE 寫 code 工作流的 prompt injection：codebase 內容、外部文件、剪貼簿作為攻擊面、跟雲端 LLM 場景的差異">IDE 場景的 prompt injection</a>、<a href="/blog/llm/06-security/cross-cloud-local-data-boundary/" data-link-title="6.4 跨雲端 / 本地的資料邊界" data-link-desc="個人 dev 場景下混用雲端 LLM 跟本地 LLM 時的 prompt 洩漏點：Continue.dev 多 provider 設定、隱私資料流、按敏感度分流的判讀">跨雲端 / 本地的資料邊界</a>、<a href="/blog/llm/06-security/routing-to-production-security/" data-link-title="6.5 跨進 production 的 routing 中樞" data-link-desc="個人 dev → 團隊 → production LLM 服務的三層演化、跟 backend/07 對應卡片的 routing 清單">跨進 production 的 routing 中樞</a>。framing 是個人 dev 視角、不是 enterprise 資安管理；production / 多租戶 LLM 服務的特殊資安議題見 <a href="/blog/backend/07-security-data-protection/" data-link-title="模組七：資安與資料保護" data-link-desc="以問題驅動方式擴充資安知識網：先定義服務環節問題，再以案例作為觸發式參考">Backend 模組七 資安與資料保護</a> 的 LLM 相關章節。</p>
<h2 id="模組之間怎麼配合">模組之間怎麼配合</h2>
<table>
  <thead>
      <tr>
          <th>模組</th>
          <th>角度</th>
          <th>跟其他模組的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>模組零</td>
          <td>操作層心智模型</td>
          <td>是模組一跟模組五的共同前置</td>
      </tr>
      <tr>
          <td>模組一</td>
          <td>工具層、Mac 實際安裝</td>
          <td>用模組零的詞彙、跟模組三的理論互補</td>
      </tr>
      <tr>
          <td>模組二</td>
          <td>數學工具</td>
          <td>提供模組三需要的數學詞彙、跟硬體平台無關</td>
      </tr>
      <tr>
          <td>模組三</td>
          <td>理論機制</td>
          <td>用模組二的工具拼出完整 LLM、跟硬體平台無關</td>
      </tr>
      <tr>
          <td>模組四</td>
          <td>應用層原理</td>
          <td>用前面模組建的詞彙、看 LLM 作為系統元件</td>
      </tr>
      <tr>
          <td>模組五</td>
          <td>工具層、PC 獨立 GPU</td>
          <td>跟模組一平行、用模組零的詞彙、處理 VRAM 場景</td>
      </tr>
      <tr>
          <td>模組六</td>
          <td>安全層、個人 dev 視角</td>
          <td>在模組一 / 五的工作流上加安全判讀、cross-link backend/07 通用資安卡片</td>
      </tr>
  </tbody>
</table>
<p>模組二跟模組三可並讀。閱讀模組三遇到陌生數學詞時跳回模組二補完、再回模組三繼續。模組四在前面模組之上、但讀者熟悉 LLM 應用詞彙也可直接從這裡讀起。模組一跟模組五依硬體選一條主路線、共用模組零的心智模型與 <a href="/blog/llm/knowledge-cards/" data-link-title="Knowledge Cards" data-link-desc="用原子化卡片整理本地 LLM 寫 code 場景所需的概念詞彙">knowledge-cards</a>。模組六在模組一 / 五跑穩後接、處理「跑起來後該注意什麼」。</p>
<h2 id="適合的讀者">適合的讀者</h2>
<table>
  <thead>
      <tr>
          <th>背景</th>
          <th>適合程度</th>
          <th>建議起點</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>用過 ChatGPT / Claude、沒碰過本地模型</td>
          <td>直接適合</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>裝過 Ollama 但被網路上的術語混淆</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">MLX / MTP / oMLX 區分</a> + <a href="/blog/llm/00-foundations/info-judgment-frames/" data-link-title="0.6 判讀本地 LLM 資訊的五個框架" data-link-desc="本地 LLM 資訊更新快，學會用版本、層級、變數、能力、資料流五個框架評估文章與宣稱">判讀框架</a></td>
      </tr>
      <tr>
          <td>想知道 24GB / 32GB Mac 該選哪個模型</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/00-foundations/hardware-memory-budget/" data-link-title="0.5 Apple Silicon 記憶體預算" data-link-desc="記憶體決定能跑什麼，Q4 量化下的可運作模型對照與系統保留">硬體記憶體預算</a> + <a href="/blog/llm/01-local-llm-services/model-selection-priority/" data-link-title="1.4 寫 code 場景的模型選型優先順序" data-link-desc="Gemma 4 31B MTP → Qwen3-Coder 30B → Qwen3 14B → gpt-oss 20B 的取捨與適用情境">模型選型</a></td>
      </tr>
      <tr>
          <td>想用本地 LLM 完全取代 Claude / GPT-5</td>
          <td>部分適合</td>
          <td><a href="/blog/llm/01-local-llm-services/expectation-management/" data-link-title="1.5 期望管理：本地 LLM 的擅長領域與分工" data-link-desc="本地 LLM 是免費的初階 pair programmer：辨識它的擅長領域、跟雲端旗艦做結構性分工">期望管理</a> 先看完再決定</td>
      </tr>
      <tr>
          <td>想懂 LLM 內部運作機制</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/03-theoretical-foundations/" data-link-title="模組三：LLM 的理論基礎" data-link-desc="從神經網路、embedding、attention、Transformer 架構、訓練到 sampling：LLM 內部運作的完整理論圖像">模組三 理論基礎</a> 從頭讀（含 reasoning models / speculative decoding）</td>
      </tr>
      <tr>
          <td>想懂背後的數學</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/02-math-foundations/" data-link-title="模組二：LLM 的數學基礎" data-link-desc="整理 LLM 推論背後需要理解的線性代數、機率與資訊論、最佳化、數值精度等數學概念">模組二 數學基礎</a> 從頭讀</td>
      </tr>
      <tr>
          <td>想懂 o1 / DeepSeek-R1 等 reasoning model 怎麼運作</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/03-theoretical-foundations/reasoning-models/" data-link-title="3.8 Reasoning models：test-time compute paradigm" data-link-desc="Chain-of-thought 從 prompting 技巧演化成訓練 paradigm、reasoning model 的內部運作、本地可跑的選項與適用任務">3.8 Reasoning models</a> 從頭讀</td>
      </tr>
      <tr>
          <td>想做 LLM 應用開發（RAG / agent / tool use）</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/04-applications/" data-link-title="模組四：LLM 應用層原理" data-link-desc="Prompt 技術光譜、RAG、tool use、agent、應用層協議、人機協作、multi-agent、workflow 編排、eval 設計：跨工具不變的概念地圖">模組四</a> 從 4.0 RAG 依序讀</td>
      </tr>
      <tr>
          <td>想在自家 Hugo / Astro 等靜態網站加 RAG</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/04-applications/static-and-serverless-rag-deployment/" data-link-title="4.16 靜態 / serverless RAG deployment：架構選擇與資安取捨" data-link-desc="沒 backend 的場景怎麼做 RAG：四種 deployment 方案、API key 暴露問題、CORS / abuse / 第三方信任、跟模組六的 routing">4.16 靜態 / serverless RAG deployment</a>（含資安取捨）</td>
      </tr>
      <tr>
          <td>想用 VLM 看截圖 / 設計稿輔助寫 code</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/04-applications/vision-in-coding-workflow/" data-link-title="4.15 Vision in coding workflow：本地 VLM 怎麼接寫 code" data-link-desc="VLM 在 coding 工作流的 use cases、本地 VLM 選型、跟雲端 VLM 的分工、Continue.dev / Ollama 整合現狀">4.15 Vision in coding workflow</a></td>
      </tr>
      <tr>
          <td>想評估 LLM benchmark 數字、做 in-house eval</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/04-applications/benchmarking-and-evaluation/" data-link-title="4.14 Benchmarking 與評估方法論" data-link-desc="判讀 model card benchmark 數字、做自己工作流的 in-house benchmark、量測本地推論速度的完整方法論">4.14 Benchmarking 方法論</a></td>
      </tr>
      <tr>
          <td>想在本機 fine-tune 模型懂自家 codebase 慣例</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/03-theoretical-foundations/training-pipeline/" data-link-title="3.4 訓練流程：pre-train → SFT → RLHF" data-link-desc="LLM 的三階段訓練：預訓練、指令微調、人類反饋強化學習；各階段目標與最新替代方案">3.4 訓練流程</a> 原理 + <a href="/blog/llm/01-local-llm-services/hands-on/local-fine-tuning/" data-link-title="Hands-on：用 QLoRA 在本機 fine-tune coding 模型" data-link-desc="Apple Silicon Mac / PC 獨立 GPU 上跑 QLoRA fine-tune 的完整流程：環境、資料、訓練、evaluation、合併、部署到 Ollama">QLoRA hands-on</a></td>
      </tr>
      <tr>
          <td>想做 large-scale fine-tune / 從頭訓練</td>
          <td>部分適合</td>
          <td>讀完模組三後進入 <a href="/blog/llm/03-theoretical-foundations/going-deeper-theory/" data-link-title="3.11 想學更深：推薦公開課程" data-link-desc="Karpathy、Stanford CS224N / CS25 / CS336、DeepLearning.AI、Hugging Face：LLM 理論深入學習的完整路線">推薦的公開課程</a> 跟 Stanford CS336</td>
      </tr>
      <tr>
          <td>用 Windows / Linux + NVIDIA / AMD 獨立 GPU 跑本地 LLM</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/00-foundations/" data-link-title="模組零：基礎知識與心智模型" data-link-desc="建立本地 LLM 的心智模型、釐清 MLX / MTP / oMLX 等常被混淆的術語、Apple Silicon 記憶體現實">模組零</a> 建心智模型 + <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 調參">模組五</a> 處理 VRAM 預算、MoE 卸載、KV cache 量化</td>
      </tr>
      <tr>
          <td>想知道本地 LLM 跑起來後的安全議題</td>
          <td>直接適合</td>
          <td><a href="/blog/llm/06-security/" data-link-title="模組六：本地 LLM 的安全與權限" data-link-desc="個人 dev 在自己機器上跑本地 LLM 的安全議題：模型供應鏈、推論伺服器綁定、tool use 副作用、prompt injection 在 IDE、跨雲端 / 本地資料邊界">模組六</a> 個人 dev 視角的安全與權限</td>
      </tr>
      <tr>
          <td>想把 LLM 部署成 production 服務、處理服務化資安</td>
          <td>部分適合</td>
          <td>個人視角見 <a href="/blog/llm/06-security/" data-link-title="模組六：本地 LLM 的安全與權限" data-link-desc="個人 dev 在自己機器上跑本地 LLM 的安全議題：模型供應鏈、推論伺服器綁定、tool use 副作用、prompt injection 在 IDE、跨雲端 / 本地資料邊界">模組六</a>；production 場景見 <a href="/blog/backend/07-security-data-protection/" data-link-title="模組七：資安與資料保護" data-link-desc="以問題驅動方式擴充資安知識網：先定義服務環節問題，再以案例作為觸發式參考">Backend 模組七 資安</a> 的 LLM 相關章節</td>
      </tr>
      <tr>
          <td>想在資料中心級 GPU（H100 / H200 / B200）部署</td>
          <td>部分適合</td>
          <td>心智模型跟 <a href="/blog/llm/knowledge-cards/" data-link-title="Knowledge Cards" data-link-desc="用原子化卡片整理本地 LLM 寫 code 場景所需的概念詞彙">knowledge-cards</a> 通用；vLLM / TGI / Triton 等資料中心 inference server 另尋專門教材</td>
      </tr>
      <tr>
          <td>想跑 Stable Diffusion / Midjourney 等產圖</td>
          <td>跟主題不同</td>
          <td>產圖是 Diffusion 架構、見 <a href="/blog/llm/knowledge-cards/diffusion/" data-link-title="Diffusion" data-link-desc="產圖用的生成式 AI 架構：跟寫 code 用的 Transformer 是不同路線">Diffusion 卡片</a>、另尋 ComfyUI / Draw Things 教材</td>
      </tr>
  </tbody>
</table>
<h2 id="用語約定">用語約定</h2>
<p>本指南使用的關鍵術語在第一次出現時都附原文。為避免歧義，下列詞彙在本指南內固定指涉：</p>
<ol>
<li><strong>本地 LLM</strong>：跑在使用者自己機器（Mac 或 PC）上的大型語言模型推論、prompt 留在本機。</li>
<li><strong>推論伺服器</strong>（inference server）：負責載入模型權重、處理 prompt、產生 token 的常駐程式、例如 Ollama、LM Studio 內建 server、llama.cpp <code>server</code>。</li>
<li><strong>介面層</strong>：使用者實際打字互動的工具、例如 VS Code + Continue.dev、CLI、Web UI。介面層透過 API 跟推論伺服器溝通。</li>
<li><strong>模型</strong>（model）：權重檔本身、例如 <code>gemma4:31b</code>、<code>qwen3-coder:30b</code>。模型可以在不同推論伺服器之間共用、前提是格式相容。</li>
<li><strong>量化</strong>（quantization）：把模型權重從高精度（如 bf16）壓成低精度（如 Q4）以減少記憶體佔用、代價是少許品質下降。</li>
</ol>
<h2 id="不在本指南內的主題">不在本指南內的主題</h2>
<p>本指南不討論：</p>
<ul>
<li><strong>Speech / audio LLM</strong>：跟核心文字 LLM 是不同方向、本指南不涵蓋。Vision（VLM）原本不放、但因 coding 工作流的 vision use case 進入主流、補上 <a href="/blog/llm/04-applications/vision-in-coding-workflow/" data-link-title="4.15 Vision in coding workflow：本地 VLM 怎麼接寫 code" data-link-desc="VLM 在 coding 工作流的 use cases、本地 VLM 選型、跟雲端 VLM 的分工、Continue.dev / Ollama 整合現狀">4.15 Vision in coding workflow</a>；video LLM 仍不放。</li>
<li><strong>資料中心訓練的工程細節</strong>：data parallelism、ZeRO、tensor parallelism 等屬於專門課程的範圍。</li>
<li><strong>向量資料庫的 vendor 比較</strong>（Pinecone vs Weaviate vs Chroma 等）：vendor 格局半年一變、不適合寫入教材。RAG 的 storage 工程原理（升級判讀、index 生命週期、dependency 約束）見 <a href="/blog/llm/04-applications/vector-storage-engineering/" data-link-title="4.22 RAG storage 工程：從 pickle 到 vector database 的選型判讀" data-link-desc="RAG storage backend 選型：規模到哪個階段該從 in-memory 升級到 vector DB、dependency chain 如何收窄選項">4.22 RAG storage 工程</a>。</li>
<li><strong>Kubernetes / 資料中心級分散式推論</strong>：跟個人機器本地 LLM 方向不同、需另尋專門教材。</li>
<li><strong>多卡 NVLink、tensor parallelism</strong>：消費級 PC 場景通常單卡、本指南不涵蓋多卡分散式推論。</li>
</ul>
<p>若讀完本指南後想往這些方向走：</p>
<ol>
<li><strong>想做 <a href="/blog/llm/knowledge-cards/rag/" data-link-title="RAG" data-link-desc="Retrieval-Augmented Generation：動態外掛知識給 LLM、繞開模型參數記憶的靜態限制">RAG</a> 應用</strong>：先把 Ollama + Continue.dev 跑穩、再讀 <a href="/blog/llm/04-applications/rag-principles/" data-link-title="4.1 RAG 原理：retrieval &#43; augmentation 模式" data-link-desc="為什麼模型需要外掛知識、語意相似 vs 字面相似、chunking 的本質取捨、retrieval 失敗的根本原因">模組四 4.1 RAG 原理</a> 建立設計取捨判讀、或 <a href="/blog/llm/03-theoretical-foundations/going-deeper-theory/" data-link-title="3.11 想學更深：推薦公開課程" data-link-desc="Karpathy、Stanford CS224N / CS25 / CS336、DeepLearning.AI、Hugging Face：LLM 理論深入學習的完整路線">模組三 3.8 推薦</a> 的 DeepLearning.AI short courses。</li>
<li><strong>想跑 coding <a href="/blog/llm/knowledge-cards/agent/" data-link-title="LLM Agent" data-link-desc="把控制流交給 LLM 的應用模式：自主決策、跨多步呼叫工具、人類角色從主導變監督">agent</a></strong>：先讀 <a href="/blog/llm/04-applications/agent-architecture/" data-link-title="4.4 Agent 架構原理" data-link-desc="Agent loop 結構、失敗模式、什麼任務適合 vs 不適合、跟人類審查的協作模型">4.4 Agent 架構原理</a> 建立判讀、再看 <a href="/blog/llm/01-local-llm-services/extension-paths/" data-link-title="1.6 延伸方向：Web UI、coding agent、產圖" data-link-desc="日常路徑跑穩後可以玩的延伸：Open WebUI、aider、ComfyUI；先把基底跑穩再進階">1.6 延伸方向</a> 了解 aider、Cline 等工具的定位差異。</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 / Draw Things / Diffusers 教材。</li>
<li><strong>想自己訓練 / fine-tune</strong>：讀完模組三、進入 Karpathy zero-to-hero、Stanford CS336、Hugging Face NLP Course 等<a href="/blog/llm/03-theoretical-foundations/going-deeper-theory/" data-link-title="3.11 想學更深：推薦公開課程" data-link-desc="Karpathy、Stanford CS224N / CS25 / CS336、DeepLearning.AI、Hugging Face：LLM 理論深入學習的完整路線">推薦資源</a>。</li>
</ol>
<hr>
<p><em>文件版本：v0.7.0</em>
<em>最後更新：2026-05-12</em>
<em>系列狀態：七個模組 + 125 張知識卡片。模組零（9 章）/ 一（10 章 + hands-on、含 QLoRA + judge harness）/ 二（5 章）/ 三（12 章、含 reasoning / speculative / constrained decoding）/ 四（17 章、含 long context / embedding / benchmarking / VLM / 靜態 deployment / coding agent harness / prompt caching / agent memory / tracing / LLM-as-judge）/ 五（7 章）/ 六（7 章、含 OWASP 對照）。</em></p>
]]></content:encoded></item></channel></rss>