<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[以AI Max+ 395配置SGLang]]></title><description><![CDATA[<h2>早先有發了一個帖子是講<a href="https://lcz.me/topic/1576">ROCmFP4</a>的llama.cpp分支，有興趣的可以去參考<br />
但更早之前我有試著在這台迷你主機配置過SGLang，我都是用Opencode內建MuseSpark 1.3免費版去做配置，全程沒有任何蛋疼過程</h2>
<h1>SGLang on AMD Ryzen AI Max+ 395（Strix Halo）部署與效能實測全記錄</h1>
<blockquote>
<p dir="auto"><strong>實測平台</strong>：FEVM FAEX1（AMD Ryzen AI Max+ 395 / 64-128GB UMA / ROCm 7.2.4）<br />
<strong>目標模型</strong>：Qwen3.8-27B（GPTQ-Int4 + MTP Heads）<br />
<strong>架構定位</strong>：Linux 推論 Server（Fedora）提供 OpenAI 相容接口（<code>:8081/v1</code>），Windows 用戶端透過 OpenCode 遠端掛載。</p>
</blockquote>
<hr />
<h2>1. 軟硬體環境與關鍵認知</h2>
<h3>1.1 硬體規格配置</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>項目</th>
<th>規格參數</th>
<th>架構限制與關鍵說明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>APU</strong></td>
<td>AMD Ryzen AI Max+ 395</td>
<td><code>gfx1151</code>（Radeon 8060S，40 CU），ROCm 7.2.4</td>
</tr>
<tr>
<td><strong>VRAM</strong></td>
<td>68.7 GB（BIOS Carve 固定）</td>
<td><strong>開機即鎖死</strong>，進入 OS 無法動態重劃。</td>
</tr>
<tr>
<td><strong>Host RAM</strong></td>
<td>62 GiB 實體記憶體 + 76 GiB Swap</td>
<td>UMA 共用同一實體記憶體池，Host 與 GPU 存在資源爭搶風險。</td>
</tr>
<tr>
<td><strong>同機其他服務</strong></td>
<td><code>lemonade</code>（NPU 專屬）</td>
<td>監聽埠 <code>13305</code>，不佔用 GPU VRAM；<code>llama-router</code> 已停用。</td>
</tr>
</tbody>
</table>
<blockquote>
<p dir="auto"><strong><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/26a0.png?v=301515bb865" class="not-responsive emoji emoji-android emoji--warning" style="height:23px;width:auto;vertical-align:middle" title="⚠" alt="⚠" />️ 核心硬體認知（UMA 邊界限制）</strong>：<br />
UMA 架構<strong>不等於</strong>「VRAM 不足時能無痛借用 Host RAM」。BIOS Carve-out 大小一旦決定即為硬上限，PyTorch 的裝置記憶體配置器（Device Malloc）無法溢出至 GTT。<strong>68.7 GB 是絕對硬上限</strong>，所有權重載入、KV Cache 與運算圖配置均以此邊界為基準。</p>
</blockquote>
<h3>1.2 軟體環境建置</h3>
<ul>
<li><strong>SGLang 核心分支</strong>：專為 <code>gfx1151</code> 移植之社群 Fork（整合 gfx1151 架構補丁、C++20 編譯修正、MoE Kernel 修正，並順利通過 AOT <code>sgl_kernel</code> 編譯）。</li>
<li><strong>Python 虛擬環境</strong>：獨立 Python 3.12 虛擬環境（Torch 2.14+rocm7.2、Triton 3.8.0），SGLang 採 Editable 模式安裝。</li>
<li><strong>模型套件</strong>：Qwen3.8-27B GPTQ + MTP Heads（已修正 MTP Config，使 Draft Path 指向同層目錄）。</li>
</ul>
<hr />
<h2>2. 產線定案啟動配置</h2>
<h3>2.1 一鍵啟動指令</h3>
<pre><code class="language-bash">#!/usr/bin/env bash
python3 -m sglang.launch_server \
  --port 8081 \
  --served-model-name qwen3.8-27b \
  --tp-size 1 \
  --quantization gptq \
  --kv-cache-dtype fp8_e4m3 \
  --dtype bfloat16 \
  --attention-backend triton \
  --context-length 262144 \
  --mem-fraction-static 0.55 \
  --max-running-requests 4 \
  --speculative-algorithm EAGLE \
  --speculative-num-steps 5 \
  --speculative-eagle-topk 4 \
  --speculative-num-draft-tokens 8 \
  --default-chat-template-kwargs '{"enable_thinking": false}' \
  --tool-call-parser qwen3_coder \
  --sleep-on-idle

</code></pre>
<ul>
<li><strong>常駐機制</strong>：透過 <code>systemd</code> 服務常駐管理。</li>
<li><strong>記憶體配額</strong>：模型權重＋靜態 KV Cache 佔用約 <strong>51 GB</strong>，預留 <strong>17 GB</strong> 作為動態請求與系統緩衝。</li>
</ul>
<hr />
<h3>2.2 核心參數設計理由</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>參數設定</th>
<th>數值 / 選項</th>
<th>設定理由與技術依據</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>--context-length</code></td>
<td><code>262144</code> (262K)</td>
<td>為超長歷史對話與程式碼庫預留天花板；64K 內載入耗時可接受。</td>
</tr>
<tr>
<td><code>--mem-fraction-static</code></td>
<td><code>0.55</code></td>
<td><strong>安全防線</strong>。數值若再提高，權重＋動態 KV＋運算圖將直接擊穿 68 GB 邊界引發崩潰。</td>
</tr>
<tr>
<td><code>--kv-cache-dtype</code></td>
<td><code>fp8_e4m3</code></td>
<td>實測已驗證可用。KV 佔用空間直接減半，是 262K 極限上下文能夠落地的物理前提。</td>
</tr>
<tr>
<td><strong>MTP 組合參數</strong></td>
<td><code>5 / 4 / 8</code>&lt;br&gt;</td>
</tr>
</tbody>
<tbody>
<tr>
<td>&lt;br&gt;<em>(steps/topk/tokens)</em></td>
<td>針對 Code / JSON 場景最佳化，實測平均接受長度達 3.9～4.8 tokens，推測解碼增益顯著。</td>
</tr>
<tr>
<td><code>--default-chat-template-kwargs</code></td>
<td><code>{"enable_thinking": false}</code></td>
<td>Agent 與編程輔助場景不需要思考鏈，關閉可省去無效 Token 浪費並大幅降低延遲。</td>
</tr>
<tr>
<td><code>--tool-call-parser</code></td>
<td><code>qwen3_coder</code></td>
<td>若使用通用 <code>qwen</code> parser 會吞掉 Tool-call（經 <code>get_weather</code> 回歸測試驗證確定修復）。</td>
</tr>
<tr>
<td><code>--max-running-requests</code></td>
<td><code>4</code></td>
<td>實測 4 併發時 Decode 總吞吐達單路 2.2 倍，剛好壓榨滿 APU 頻寬；更大隻會增加排隊延遲。</td>
</tr>
</tbody>
</table>
<hr />
<h2>3. 地雷導航與避坑指南（重大踩坑複盤）</h2>
<h3><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f6a8.png?v=301515bb865" class="not-responsive emoji emoji-android emoji--rotating_light" style="height:23px;width:auto;vertical-align:middle" title="🚨" alt="🚨" /> 避坑 1：嚴禁啟用 HiCache（Host 記憶體自毀死循環）</h3>
<ul>
<li><strong>現象</strong>：設定 <code>--hicache-size 20</code> 鎖定 20 GB Host RAM，但在模型加載時 Host 端自身也需十數 GB 空間。</li>
<li><strong>後果</strong>：62 GB 系統實體記憶體瞬時見底，觸發 Linux OOM-Killer 強制中斷，<code>systemd</code> 隨後重啟服務，陷入全機死循環卡死。</li>
<li><strong>教訓</strong>：在 UMA 架構下，Host RAM 與 VRAM 實質為同一實體池，開啟 HiCache 等同於「左右手互搶記憶體」，嚴禁開啟。</li>
</ul>
<h3><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f6a8.png?v=301515bb865" class="not-responsive emoji emoji-android emoji--rotating_light" style="height:23px;width:auto;vertical-align:middle" title="🚨" alt="🚨" /> 避坑 2：Adaptive MTP 效益低且佔資源</h3>
<ul>
<li><strong>現象</strong>：使用 <code>--speculative-adaptive</code> 會被底層強制設定 <code>topk=1</code>（與靜態 <code>topk=4</code> 互斥）。</li>
<li><strong>A/B 實測對比</strong>：自適應模式為 <strong>20.9 tok/s</strong>，靜態配置則達到 <strong>21.4 tok/s</strong>。寬推測樹（Tree-based）的收益明確高於動態步數，且自適應模式冷啟動更慢、佔用更多 VRAM。</li>
</ul>
<h3><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f6a8.png?v=301515bb865" class="not-responsive emoji emoji-android emoji--rotating_light" style="height:23px;width:auto;vertical-align:middle" title="🚨" alt="🚨" /> 避坑 3：Quark AWQ MXFP4（safetensors）是硬體死路</h3>
<ul>
<li><strong>現象</strong>：缺少 <code>aiter</code> 時拋出 <code>NotImplementedError</code>；編譯安裝 <code>aiter</code> 後，源碼中 <code>is_fp4_avail()</code> 白名單明確僅支援 <code>gfx950</code> 與 <code>gfx1250</code>。</li>
<li><strong>本質</strong>：<code>gfx1151</code> 晶片層面<strong>缺乏硬體級 FP4 WMMA 張量指令</strong>，任何純軟體模擬方案皆無法繞過此物理限制。</li>
</ul>
<h3><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f6a8.png?v=301515bb865" class="not-responsive emoji emoji-android emoji--rotating_light" style="height:23px;width:auto;vertical-align:middle" title="🚨" alt="🚨" /> 避坑 4：連接埠與顯存互斥衝突</h3>
<ul>
<li><strong>規範</strong>：連接埠 <code>8080</code> 保留給 llama 生態，SGLang 獨佔 <code>8081</code>。</li>
<li><strong>維護原則</strong>：切換推論引擎前，必須先停止另一側服務，並透過 <code>rocm-smi</code> 確認 VRAM 佔用從 41GB～51GB 徹底回落至基準狀態（約 <strong>0.6 GB</strong>）。</li>
</ul>
<hr />
<h2>4. 效能實測數據（代碼／JSON 密集場景）</h2>
<blockquote>
<p dir="auto"><strong>測試基準</strong>：全部輸入與輸出均為 Code / JSON 格式，數據取自 API 返回之精確 <code>usage</code> 欄位。</p>
</blockquote>
<h3>4.1 Prefix Cache 命中效益（6K Prompt）</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>測試情境</th>
<th>首字延遲（TTFT）</th>
<th>效益解析</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>冷啟動預填充（Cold Prefill）</strong></td>
<td><strong>17 ～ 68 秒</strong></td>
<td>需完整計算 Attention 矩陣與權重解包</td>
</tr>
<tr>
<td><strong>完整重複 Prompt（Cache Hit）</strong></td>
<td><strong>~ 1 秒</strong></td>
<td>透過 Radix Tree 秒級載入，幾乎免去重複運算</td>
</tr>
</tbody>
</table>
<h3>4.2 MTP 推測解碼接受率（Server Log 統計）</h3>
<ul>
<li><strong>運作配置</strong>：靜態 <code>topk=4</code>（現行定案）</li>
<li><strong>平均接受長度（Accept Length）</strong>：<strong>3.9 ～ 4.8 tokens</strong></li>
<li><strong>整體接受率（Accept Rate）</strong>：<strong>0.41 ～ 0.55</strong></li>
</ul>
<hr />
<h3>4.3 單併發 Prefill 吞吐階梯（2K → 64K）</h3>
<pre><code>Prefill 速率變化 (tok/s)
  600 |
  500 |             [4K 峰值: 504.4]
  400 |     [2K: 369.7]     [8K: 390.1]
  300 |                             [16K: 266.2]
  200 |                                             [32K: 140.2]
  100 |                                                             [64K: 112.6]
    0 +-------------------------------------------------------------------------
      0      8K     16K     24K     32K     40K     48K     56K     64K

</code></pre>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>上下文長度</th>
<th>SGLang 預填充速率</th>
<th>實測 Wall 耗時</th>
<th>運算狀態與架構特性分析</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>2,000</strong> (~2K)</td>
<td>369.7 tok/s</td>
<td>6 秒</td>
<td>初始階段，計算核心利用率逐步爬升</td>
</tr>
<tr>
<td><strong>4,000</strong> (~4K)</td>
<td><strong>504.4 tok/s</strong></td>
<td>8 秒</td>
<td><strong>效能甜蜜點</strong>，GEMM 矩陣計算達到完全飽和</td>
</tr>
<tr>
<td><strong>8,000</strong> (~8K)</td>
<td>390.1 tok/s</td>
<td>22 秒</td>
<td>開始受限於注意力機制運算負擔</td>
</tr>
<tr>
<td><strong>16,000</strong> (~16K)</td>
<td>266.2 tok/s</td>
<td>61 秒</td>
<td>序列拉長，記憶體搬運開銷逐步主導</td>
</tr>
<tr>
<td><strong>32,000</strong> (~32K)</td>
<td>140.2 tok/s</td>
<td>233 秒</td>
<td>Attention $O(N^2)$ 計算特性導致速率明顯下滑</td>
</tr>
<tr>
<td><strong>64,000</strong> (~64K)</td>
<td>112.6 tok/s</td>
<td>580 秒</td>
<td>載入需近 10 分鐘，長文本必須依賴 Prefix Cache 攤平開銷</td>
</tr>
</tbody>
</table>
<hr />
<h3>4.4 生成吞吐（Decode）與高併發壓力測試</h3>
<h4>單併發解碼（256 Tokens 生成，代碼情境）</h4>
<ul>
<li><strong>SGLang 單路輸出</strong>：<strong>28.9 tok/s</strong><br />
<em>(備註：常規散文寫作約 ~21 tok/s；程式碼的高結構性與重複語法使 MTP 享受到顯著的猜測紅利)</em></li>
</ul>
<h4>高併發擴展（Concurrency = 4）</h4>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>測試指標</th>
<th>實測總吞吐</th>
<th>併發擴展效益分析</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Prefill 4 路總量</strong>（10.5K × 4）</td>
<td><strong>307.2 tok/s</strong></td>
<td>高於單路長文本速率，Chunked Prefill 機制排程發揮成效</td>
</tr>
<tr>
<td><strong>Decode 4 路總量</strong>（256 × 4）</td>
<td><strong>63.3 tok/s</strong></td>
<td>達到單路吞吐的 <strong>2.2 倍</strong>，APU 記憶體頻寬在此完全飽和</td>
</tr>
</tbody>
</table>
<hr />
<h2>5. 推論引擎對決：SGLang (GPTQ) vs. ROCmFP4 (llama.cpp Fork)</h2>
<blockquote>
<p dir="auto"><strong>對照組環境</strong>：<br />
<code>ROCmFPX</code> Fork（自訂 GGML Type 100–106，Strix 專用解量化路徑）＋ Qwen3.8-27B <code>Q4_0_ROCMFP4</code>（13.7 GB）＋ MTP Draft，Context 131072。</p>
</blockquote>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>評測維度</th>
<th>SGLang (GPTQ + FP8 KV + MTP)</th>
<th>ROCmFP4 (llama.cpp Fork + MTP)</th>
<th>核心差異與架構優劣總結</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Prefill 峰值</strong></td>
<td><strong>504.4 tok/s</strong>（4K 達成）</td>
<td>437.7 tok/s（16K 達成）</td>
<td>SGLang 在中短 Prompt 依賴 Triton Kernel 算力飽和度更高。</td>
</tr>
<tr>
<td><strong>Prefill 64K 長文</strong></td>
<td>112.6 tok/s（580 秒）</td>
<td><strong>240.2 tok/s（272 秒）</strong></td>
<td><strong>ROCmFP4 快 2.1 倍</strong>；llama.cpp 的 C++ 原生分塊對超長文本搬運耗損更低。</td>
</tr>
<tr>
<td><strong>Prefill 4 路併發</strong></td>
<td><strong>307.2 tok/s（併發不崩）</strong></td>
<td>259.3 tok/s（低於單路）</td>
<td>SGLang 的 Chunked Prefill 排程極佳；llama.cpp 會出現排隊阻滯。</td>
</tr>
<tr>
<td><strong>單路 Decode</strong></td>
<td>28.9 tok/s</td>
<td><strong>29.0 ～ 44.0 tok/s</strong></td>
<td><strong>ROCmFP4 領先約 50%</strong>；純 C++ 與專屬對稱微區塊使逐字搬運延遲更低。</td>
</tr>
<tr>
<td><strong>4 路 Decode 總量</strong></td>
<td><strong>63.3 tok/s</strong></td>
<td>62.0 tok/s</td>
<td><strong>兩者打平</strong>；均撞上 APU 實體 256-bit 記憶體頻寬物理天花板。</td>
</tr>
<tr>
<td><strong>磁碟與顯存模型體積</strong></td>
<td>~19 GB</td>
<td><strong>~14 GB</strong></td>
<td>ROCmFP4 具備更極致的減重優勢，可省下約 5 GB 實體空間。</td>
</tr>
</tbody>
</table>
<hr />
<h2>6. 一句話決策總結</h2>
<ul>
<li><strong>選用 SGLang (GPTQ + MTP)</strong>：適合 <strong>高併發多人調用、多輪 Agent 密集對話</strong>，依賴其強大的 <strong>Radix Prefix Cache</strong>、Chunked Prefill 與成熟的 OpenAI API 生態。</li>
<li><strong>選用 ROCmFP4 (llama.cpp Fork)</strong>：適合 <strong>單人極限吞吐、超長文一次性分析（&gt;32K）</strong>，可享有快 2.1 倍的長文本預填充與高達 40+ tok/s 的單路打字機極速。</li>
</ul>
<p dir="auto">SGLang最大的好處無非就是Radix Tree<br />
相比llama.cpp的slot cache，Radix tree的token級快取還是比較細膩，多對話還可以更節省KV Cache<br />
但SGLang缺點也是很明顯....就是肥，要不是我有這大VRAM玩具，不然本地部屬單人使用還是llama.cpp為主就夠了<br />
以這主機來說，算力、帶寬、生態等瓶頸就擺在那，真的要強求高併發並不是它設計的場景，<br />
如果有想要以AMD平台設置推論引擎應該還是預先裝llama.cpp能玩廣大的通用gguf再說，各位參考</p>
]]></description><link>https://lcz.me/topic/1578</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 22:54:47 GMT</lastBuildDate><atom:link href="https://lcz.me/topic/1578.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Sep 2026 07:18:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 以AI Max+ 395配置SGLang on Wed, 09 Sep 2026 12:10:57 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/%E5%BC%A0%E5%85%89%E7%92%9E" aria-label="Profile: 张光璞">@<bdi>张光璞</bdi></a> 其實還好耶，這台很好玩呀，可以當服務器，zen5 16核32線超強，x86的docker生態又好，然後裝個steam搞個3A玩4K特效開中也跑得不錯，各種Comfy UI節點都可以搞來慢慢折騰，其實買這圖的就是可玩性不是生產力</p>
<p dir="auto">一般要AI裝個MOE模型可以噴到80~90 Tokens，平常做通用agent服務、調度檔案、文件、上網爬文都可以過得去<br />
是硬要跑27B dense模型才會變這樣，連雲端Flash服務器也知道要MOE+MTP，是Qwen3.8死不出一個35B A3B</p>
]]></description><link>https://lcz.me/post/16889</link><guid isPermaLink="true">https://lcz.me/post/16889</guid><dc:creator><![CDATA[dardeaw feng]]></dc:creator><pubDate>Wed, 09 Sep 2026 12:10:57 GMT</pubDate></item><item><title><![CDATA[Reply to 以AI Max+ 395配置SGLang on Wed, 09 Sep 2026 10:26:58 GMT]]></title><description><![CDATA[<p dir="auto">小主机的算力还是太弱了</p>
]]></description><link>https://lcz.me/post/16871</link><guid isPermaLink="true">https://lcz.me/post/16871</guid><dc:creator><![CDATA[张光璞]]></dc:creator><pubDate>Wed, 09 Sep 2026 10:26:58 GMT</pubDate></item><item><title><![CDATA[Reply to 以AI Max+ 395配置SGLang on Wed, 09 Sep 2026 07:22:55 GMT]]></title><description><![CDATA[<p dir="auto">非常好的帖子，AMD小主机的春天。</p>
]]></description><link>https://lcz.me/post/16854</link><guid isPermaLink="true">https://lcz.me/post/16854</guid><dc:creator><![CDATA[terry]]></dc:creator><pubDate>Wed, 09 Sep 2026 07:22:55 GMT</pubDate></item></channel></rss>