<?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[实测63-79tok/s：RTX PRO 4500 32GB 部署 SGLang 0.5.19 + Qwen3.8-27B-NVFP4（DSPARK 投机）成功实践与踩坑指南]]></title><description><![CDATA[<h1>实测63-79tok/s：RTX PRO 4500 32GB 部署 SGLang 0.5.19 + Qwen3.8-27B-NVFP4（DSPARK 投机）成功实践与踩坑指南</h1>
<blockquote>
<p dir="auto">测试基准：本机 RTX PRO 4500 32GB，100K 上下文稳定档 / DSPARK 投机 / NVFP4 量化，agent 真实负载（开思考）稳态 decode 63-79 tok/s，no-spec 基线 49 tok/s。数据附实测方法，欢迎拉复验打脸。</p>
</blockquote>
<h2>目录</h2>
<ul>
<li><a href="#%E7%BB%93%E8%AE%BA%E9%80%9F%E6%9F%A5">结论速查</a></li>
<li><a href="#%E5%90%8D%E8%AF%8D%E7%99%BD%E8%AF%9D%E8%A7%A3%E9%87%8A">名词白话解释</a></li>
<li><a href="#%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83">运行环境</a></li>
<li><a href="#%E6%9C%80%E7%BB%88%E9%85%8D%E7%BD%AE">最终配置</a></li>
<li><a href="#-%E6%9C%80%E9%87%8D%E8%A6%81%E7%9A%84%E6%9C%BA%E5%88%B6"><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f534.png?v=301515bb865" class="not-responsive emoji emoji-android emoji--red_circle" style="height:23px;width:auto;vertical-align:middle" title="🔴" alt="🔴" /> 最重要的机制</a></li>
<li><a href="#%E5%AE%9E%E6%B5%8B%E6%95%B0%E6%8D%AE">实测数据</a></li>
<li><a href="#%E8%B8%A9%E8%BF%87%E7%9A%84n%E4%B8%AA%E5%9D%91">踩过的N个坑</a></li>
<li><a href="#%E4%B8%8D%E8%A6%81%E5%81%9A%E7%9A%84%E4%BA%8B">不要做的事</a></li>
<li><a href="#%E5%A4%8D%E7%8E%B0%E9%99%84%E5%BD%95">复现附录</a></li>
<li><a href="#%E6%9C%AA%E6%B5%8B%E8%AF%95%E9%A1%B9">未测试项</a></li>
</ul>
<hr />
<h2>结论速查</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>指标</th>
<th>数值</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>Decode 吞吐</td>
<td>63-79 tok/s</td>
<td>agent 负载（开思考），DSPARK 投机</td>
</tr>
<tr>
<td>no-spec 基线</td>
<td>~49 tok/s</td>
<td>关投机对照（DSPARK 提速 ~29%）</td>
</tr>
<tr>
<td>关思考纯生成</td>
<td>~47 tok/s</td>
<td>短输出直答模式</td>
</tr>
<tr>
<td>TTFT</td>
<td>0.12-0.17s</td>
<td>短上下文；session radix 命中 &lt;1s 免 prefill</td>
</tr>
<tr>
<td>上下文</td>
<td><strong>100000 (100K)</strong></td>
<td>稳定档；131072+DSPARK 在 32GB 上 6K 即 OOM（血案见坑1）</td>
</tr>
<tr>
<td>KV 池</td>
<td>107077 tokens</td>
<td>fp8_e4m3，每 token 仅 32KB（hybrid 架构红利）</td>
</tr>
<tr>
<td>可用显存</td>
<td>~1.57GB</td>
<td>余量（OOM 崩溃时仅 0.049GB，30 倍差距）</td>
</tr>
<tr>
<td>缓存命中上报</td>
<td><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=301515bb865" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 已开启</td>
<td><code>--enable-cache-report</code>；agent（dsh）可显示真实命中率（实测 97% 前缀命中上报）</td>
</tr>
<tr>
<td>真实 agent 会话</td>
<td>90 tok/s · 首 token 3.1s · 缓存命中 84%</td>
<td>dsh 5 轮 31 步真实会话（2026-09-09，UI 累计口径；口径辨析见「实测数据 &gt; 真实 agent 会话」节）</td>
</tr>
<tr>
<td>冷启（JIT 热后）</td>
<td>~45s</td>
<td>CUDA graph capture 完成</td>
</tr>
<tr>
<td>首请求</td>
<td>~90s 一次性</td>
<td>首次 lazy init</td>
</tr>
<tr>
<td>完整冷启（无 JIT 缓存）</td>
<td>16-18min</td>
<td>CUDA graph capture 阶段占大头，属正常非卡死</td>
</tr>
</tbody>
</table>
<hr />
<h2>名词白话解释</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>名词</th>
<th>白话</th>
</tr>
</thead>
<tbody>
<tr>
<td>NVFP4</td>
<td>NVIDIA 的 4-bit 浮点量化方案，Blackwell 原生支持，精度损失远小于整数量化</td>
</tr>
<tr>
<td>Qwen3.8-27B</td>
<td>dense 27.8B 混合架构：64 层 = 48 层 Gated DeltaNet（线性注意力）+ 16 层 full attention</td>
</tr>
<tr>
<td>Gated DeltaNet</td>
<td>线性注意力变体，无传统 KV cache——<strong>每 token KV 只占 32KB</strong>，长上下文显存成本骤降</td>
</tr>
<tr>
<td>SGLang</td>
<td>LLM 推理引擎，RadixAttention 自动共享请求间公共前缀</td>
</tr>
<tr>
<td>session radix cache</td>
<td>同一会话多轮共享前缀缓存，agent 连续对话免重复 prefill</td>
</tr>
<tr>
<td>DSPARK</td>
<td>投机解码新方案：独立小 draft 模型（1.4GB）并行预测，主模型验证；对 reasoning 思考链接受率高</td>
</tr>
<tr>
<td>modelopt_fp4</td>
<td>draft 模型量化格式（NVIDIA modelopt），DSPARK 必须配此格式</td>
</tr>
<tr>
<td>intermediate buffer</td>
<td>DSPARK 验证 linear-attention state 的必需中间显存（2.25GB），不可省</td>
</tr>
<tr>
<td>flashinfer_cutlass</td>
<td>SGLang 底层 kernel 后端；本机 dense 模型走 flashinfer 默认路径，JIT 编译是冷启大头</td>
</tr>
</tbody>
</table>
<hr />
<h2>运行环境</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>组件</th>
<th>版本</th>
</tr>
</thead>
<tbody>
<tr>
<td>GPU</td>
<td>RTX PRO 4500（sm_120，Blackwell 架构，<strong>12.0</strong>）32GB</td>
</tr>
<tr>
<td>CUDA</td>
<td>torch 2.13.0+cu130 wheel 自带（nvcc 13.4.46rc1 全家桶在 venv site-packages/nvidia/cu13）</td>
</tr>
<tr>
<td>SGLang</td>
<td>0.5.19（~/.sglang-venv，python3.11）</td>
</tr>
<tr>
<td>torch</td>
<td>2.13.0+cu130</td>
</tr>
<tr>
<td>flashinfer-python</td>
<td>0.6.18（随 sglang 自动装）</td>
</tr>
<tr>
<td>主模型权重</td>
<td>gittensor-model-hub/Qwen3.8-27B-NVFP4-RTX5090（17GB，NVFP4，<strong>无 MTP head、无 vision 加载</strong>）</td>
</tr>
<tr>
<td>draft 权重</td>
<td>gittensor-model-hub/Qwen3.8-27B-DSpark-NVFP4（1.4GB，DSPARK 专用）</td>
</tr>
</tbody>
</table>
<p dir="auto"><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="⚠" />️ 权重<strong>必须</strong> gittensor-model-hub 版（modelopt 格式，SGLang 兼容）；Unsloth NVFP4（compressed-tensors）SGLang 直接报不支持。</p>
<hr />
<h2>最终配置</h2>
<p dir="auto">systemd 服务路径：<code>~/.config/systemd/user/sglang-qwen27b.service</code>（全文如下，可直接复制）</p>
<pre><code class="language-ini">[Unit]
Description=SGLang Qwen3.8-27B-NVFP4 (100K/DSPARK/无视觉, 2026-09-08 定案)
After=network.target

[Service]
Type=simple
WorkingDirectory=%h
ExecStart=%h/.sglang-venv/bin/python -m sglang.launch_server --model-path %h/models/Qwen3.8-27B-NVFP4-RTX5090 --served-model-name qwen3.8-27B-NVFP4 --host 127.0.0.1 --port 8000 --context-length 100000 --mem-fraction-static 0.88 --max-running-requests 4 --mamba-ssm-dtype bfloat16 --kv-cache-dtype fp8_e4m3 --reasoning-parser qwen3 --tool-call-parser qwen3_coder --enable-session-radix-cache --enable-cache-report --speculative-algorithm DSPARK --speculative-draft-model-path %h/models/Qwen3.8-27B-DSpark-NVFP4 --speculative-dspark-block-size 7 --speculative-draft-model-quantization modelopt_fp4
# ⚠️ 环境三件套（缺一不可，见坑3）：PATH 前缀 cuda-cc（gcc-12 symlink）+ cu13 bin；CUDA_HOME=cu13；LD_LIBRARY_PATH=cu13/lib + cudnn/cusparselt/nccl/nvshmem
Environment=PATH=%h/.local/bin/cuda-cc:%h/.sglang-venv/lib/python3.11/site-packages/nvidia/cu13/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Environment=CUDA_HOME=%h/.sglang-venv/lib/python3.11/site-packages/nvidia/cu13
Environment=LD_LIBRARY_PATH=%h/.sglang-venv/lib/python3.11/site-packages/nvidia/cu13/lib:%h/.sglang-venv/lib/python3.11/site-packages/nvidia/cudnn/lib:%h/.sglang-venv/lib/python3.11/site-packages/nvidia/cusparselt/lib:%h/.sglang-venv/lib/python3.11/site-packages/nvidia/nccl/lib:%h/.sglang-venv/lib/python3.11/site-packages/nvidia/nvshmem/lib
Environment=CUDA_VISIBLE_DEVICES=0
Restart=on-failure
RestartSec=10

[Install]
WantedBy=default.target
</code></pre>
<p dir="auto"><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="⚠" />️ <strong>不要加</strong> <code>--mamba-radix-cache-strategy no_buffer</code>（与 overlap schedule 不兼容直接 crash loop，用默认 auto）；<strong>不要加</strong> <code>--max-mamba-cache-size 20</code>（intermediate 预占挤走 KV 池 ~2.8GB）。</p>
<p dir="auto">启动 &amp; 验证（长等待用 curl --retry，勿 shell 手写循环）：</p>
<pre><code class="language-bash">systemctl --user daemon-reload
systemctl --user start sglang-qwen27b.service
curl -s -m 3 --retry 90 --retry-delay 10 --retry-all-errors http://127.0.0.1:8000/v1/models | head -c 300
</code></pre>
<p dir="auto">llm-switch 集成：目标 1=sglang-qwen27b（<code>echo 1 | llm-switch</code>），与 sglang-a3b/ComfyUI 8000 端口互斥。</p>
<hr />
<h2><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/1f534.png?v=301515bb865" class="not-responsive emoji emoji-android emoji--red_circle" style="height:23px;width:auto;vertical-align:middle" title="🔴" alt="🔴" /> 最重要的机制</h2>
<h3>1. 为什么是 100K 而不是 131072（OOM 血案实证）</h3>
<p dir="auto">ctx 131072 + mem-fraction 0.90 + DSPARK 时，<strong>6K 前缀请求即 CUDA OOM</strong>（free 仅 49MB）→ scheduler SIGQUIT → 服务崩溃。显存账本：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>组件</th>
<th>大小</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>权重 NVFP4</td>
<td>~17GB</td>
<td>gittensor 版（含 vision tower 权重但 SGLang 不加载 vision）</td>
</tr>
<tr>
<td>DSPARK draft</td>
<td>1.4GB</td>
<td>独立小模型</td>
</tr>
<tr>
<td>Mamba intermediate</td>
<td>2.25GB</td>
<td>DSPARK 验证 state 必需（auto→extra_buffer）</td>
</tr>
<tr>
<td>ssm+conv state</td>
<td>~1.2GB</td>
<td>48 层线性注意力状态池</td>
</tr>
<tr>
<td>KV 池 fp8</td>
<td>~3.4GB</td>
<td>107077 tokens × 32KB/token</td>
</tr>
<tr>
<td>CUDA graph</td>
<td>~1.4GB</td>
<td>prefill + verify/decode</td>
</tr>
</tbody>
</table>
<p dir="auto">关键数字：<strong>每 token KV 仅 32KB</strong>（16/64 层 full-attn 才要传统 KV，48 层线性注意力走 state 池）——100K 满需求 ~3.2GB，131K 满需求 ~4.2GB，差距不大；<strong>真正的杀手是 DSPARK 的 draft 1.4GB + intermediate 2.25GB 预占</strong>。mem-fraction 0.90 时预分配过满，运行时 free≈0，任何请求峰值即爆。</p>
<p dir="auto"><strong>100K + mem-fraction 0.88 = 甜点区</strong>：KV 池 107077（≥100K + radix 余量）+ available 1.57GB（30 倍余量）。实测 30K 上下文稳定、NRestarts=0。</p>
<p dir="auto"><strong>若要回 131072</strong>：唯一路径是去掉 DSPARK（释放 draft+intermediate 共 ~3.65GB → 池 174681），但速度 63→49 tok/s，稳定性换速度，想清楚再动。</p>
<h3>2. DSPARK 投机为什么值得（对本模型）</h3>
<ul>
<li>draft 1.4GB 独立小模型，<strong>对 reasoning 思考链接受率高</strong>（agent 开思考负载 63-79 tok/s &gt; no-spec 49）</li>
<li>必须 <code>--speculative-draft-model-quantization modelopt_fp4</code>（README 裸格式在部分环境报不兼容）</li>
<li><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="⚠" />️ gittensor README 的 85.8/161.7 tok/s 是 <strong>RTX 5090（1792 GB/s 带宽）参考值，4500 带宽减半</strong>——本机实测约其一半（no-spec 49→DSpark 63），勿拿 README 数字当本机预期</li>
<li>MTP（模型内嵌 head 投机）此权重已移除（gittensor 优化版），不要加 MTP 参数</li>
</ul>
<h3>3. 无视觉是特性不是 bug</h3>
<p dir="auto">SGLang 默认不加载 vision encoder；<code>--language-model-only</code> 对本模型架构会 ValueError。视觉任务走云端多模态 API（mimo-v2.5 等），本地只管文本——显存省 ~2GB。</p>
<hr />
<h2>实测数据</h2>
<h3>稳态 decode（开思考 agent 负载）</h3>
<p dir="auto">方法：连续请求看 SGLang 日志 <code>gen throughput (token/s)</code>；短输出直答另测。</p>
<pre><code>实测区间：63-79 tok/s（DSPARK，思考链长短波动）
no-spec 对照：~49 tok/s
关思考纯生成：~47 tok/s
</code></pre>
<h3>真实 agent 会话（dsh UI 口径，2026-09-09）</h3>
<p dir="auto">本配置 2026-09-08 起作为 dsh agent 日常现役模型（<code>~/.dsh/settings.yaml</code> → <code>qwen3.8-27B-NVFP4</code>），持续稳定运行（NRestarts=0）。真实 5 轮 31 步会话（本会话累计快照，随会话增长数值小幅漂移）：</p>
<pre><code>LLM 合计 9分8秒 · 工具调用 30.7s
90 tok/s          UI 口径：Σ输出 tokens ÷ Σ纯 decode 时长（firstToken→completed，不含 prefill/排队/等待；4 轮快照 88，随会话增长小幅上浮）
首 token 平均 3.1s UI 口径：每请求 (firstTokenTime − stepStart) 全请求平均
缓存命中 84%      UI 口径：cacheReadTokens ÷ 输入 tokens（1.3M 输入中约 1.1M 免重复 prefill）
输入 1.3M tok · 输出 40.9K tok（5 轮累计；单请求上下文逐轮增长，末轮远超此前 30K 实测档）
</code></pre>
<p dir="auto"><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="⚠" />️ <strong>口径辨析（复验请以下列 SGLang 日志为准）</strong>：UI 的 90 tok/s ≠ SGLang 日志 <code>gen throughput</code> 63-79 tok/s。前者是客户端「纯 decode 窗口」（首 token 到完成，不含 prefill/排队/混合采样窗口），数值高于日志档属口径使然；后者是服务端采样窗口、复验基准。两口径不矛盾，勿互相打脸。首 token 平均 3.1s（4 轮快照 3.5s）被后轮长上下文 prefill 拉高（短上下文冷/热 0.107-0.17s 仍成立），属预期行为非劣化。</p>
<h3>TTFT / radix</h3>
<ul>
<li>短上下文 TTFT：0.12-0.17s</li>
<li>session radix 命中（同会话连续多轮）：&lt;1s 免 prefill</li>
<li><img src="https://lcz.me/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=301515bb865" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title="✅" alt="✅" /> 缓存命中上报已打通（2026-09-08 晚）：服务端加 <code>--enable-cache-report</code> 后，响应 <code>usage.prompt_tokens_details.cached_tokens</code> 真实回填，agent（dsh）可显示真实命中率（实测 987 token 前缀第 2 轮起 cached=960，97%）。<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="⚠" />️ 该参数<strong>默认 False</strong>——不加时 ptd 恒 null，agent 显示「缓存命中 0%」是读不到字段的盲区不是 radix 失效（旧版文档的坑8 即此，现已由参数解决）。DSPARK 投机不影响上报（字段来自 radix 前缀命中统计，与 decode 侧投机无关）。验证法仍可用：同前缀两连发对比 TTFT（实测 25K 前缀：冷 5.7s → 命中 0.107s）。</li>
<li>真实 5 轮会话首 token 平均 3.1s（UI 口径，4 轮快照 3.5s）：短上下文 0.107-0.17s 仍成立，后轮长上下文 prefill 拉高均值，预期非劣化（口径辨析见「真实 agent 会话」节）。</li>
</ul>
<h3>冷启耗时</h3>
<ul>
<li>JIT 缓存热后：~45s（含 CUDA graph capture）</li>
<li>首次请求：~90s 一次性 lazy init</li>
<li>完整冷启（清空 ~/.cache/sglang）：16-18min——进程 ALIVE + 显存稳定 + 日志停在 autotune/capture 无报错 = 在 capture 属正常，耐心等；进程退出 + traceback = 真失败</li>
</ul>
<h3>显存分布（稳态）</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>状态</th>
<th>占用</th>
</tr>
</thead>
<tbody>
<tr>
<td>启动后稳态</td>
<td>~30.4GB / 32GB</td>
</tr>
<tr>
<td>可用显存</td>
<td>~1.57GB</td>
</tr>
<tr>
<td>KV 池</td>
<td>107077 tokens（fp8_e4m3）</td>
</tr>
<tr>
<td>权重</td>
<td>~17GB（主）+ 1.4GB（draft）</td>
</tr>
</tbody>
</table>
<hr />
<h2>踩过的N个坑</h2>
<h3>坑1：ctx 131072 + DSPARK 直接 OOM 崩溃（最贵的坑）</h3>
<p dir="auto">6K 前缀请求即 <code>CUDA OOM</code>，scheduler SIGQUIT 服务崩。反复调参浪费数小时后定案：<strong>不是 ctx 大，是 mem-fraction 0.90 预分配过满 + DSPARK 三件套（draft 1.4GB + intermediate 2.25GB + graph 1.4GB）挤压</strong>。解法：100K + 0.88（见机制1）。教训：<strong>新参数先复刻历史验证基线跑通，再逐档上调</strong>，别一上来顶目标配置。</p>
<h3>坑2：SGLang 冷启 16-18 分钟以为是卡死</h3>
<p dir="auto">首次部署无 JIT 缓存时 CUDA graph capture 阶段日志静默、GPU util 低波动——差点被 kill。判定：进程 ALIVE + 显存 ~29.7GB + 无 traceback = 正常。就绪探测用 <code>curl --retry 90</code>（见上），不要用 shell 手写循环 + 短超时误判 DOWN。</p>
<h3>坑3：环境三件套缺失（JIT 编译全家桶）</h3>
<p dir="auto">SGLang JIT（flashinfer）依赖链全在 venv 的 <code>site-packages/nvidia/cu13</code>（nvcc 13.4.46rc1 全家桶），不是系统 CUDA：</p>
<ol>
<li><strong>gcc 版本</strong>：nvcc 不认 gcc 15 → <code>~/.local/bin/cuda-cc/</code> 放 gcc/g++ → gcc-12 symlink，PATH 前缀</li>
<li><strong>CUDA_HOME</strong>：必须指向 <code>site-packages/nvidia/cu13</code>（含 nvcc + 头 + lib）；指向系统 /usr/local/cuda（12.9）会编译出链接 libcublasLt.so.12 的产物 → sm_120 fp8 初始化失败 <code>bmm_fp8_internal_cublaslt failed</code></li>
<li><strong>LD_LIBRARY_PATH</strong>：cu13/lib + cudnn/cusparselt/nccl/nvshmem 五个目录全列（见 unit 全文）</li>
<li><strong>lib64 + 无版本 .so symlink</strong>：pip 布局是 <code>cu13/lib</code>（无 lib64、无 <code>libcublasLt.so</code> 无版本 symlink）→ JIT <code>找不到 -lcudart/-lcublasLt</code>，需 <code>ln -sfn lib lib64</code> + 补 5 个无版本 symlink；<strong>pip 重装 nvidia-cuda-* 后 symlink 会丢，需重补</strong></li>
</ol>
<h3>坑4：CCCL 版本撕裂与 13.0 缺陷</h3>
<ul>
<li><code>--prerelease=allow</code> 装 SGLang 可能拉 nvcc 13.4.46rc1 + 头 13.0 → <code>CUDA compiler and CUDA toolkit headers are incompatible</code>。解法：nvcc/crt/runtime <strong>全套统一 13.4.46rc1</strong></li>
<li>nvcc 13.0.88 有硬缺陷：对 compute_12x 生成 PTX 9.4 但自带 ptxas 只认 9.0 → <code>Unsupported .version 9.4</code>，13.0.x 全线不行，必须 13.4rc</li>
<li>glibc ≥2.42 兼容：13.4 头自带 noexcept(true) 检测，Ubuntu 26.04（glibc 2.43）无需手 patch rsqrt（13.0.x 头无此机制需 patch 2 行）</li>
</ul>
<h3>坑5：权重厂商选错直接起不来</h3>
<p dir="auto">Unsloth NVFP4（compressed-tensors 混合精度）SGLang 报 <code>No compressed-tensors compatible scheme was found</code>；<strong>必须 gittensor-model-hub 版</strong>（modelopt 格式，含 No-MTP/LMHead4 变体可选）。下载 <code>hf download</code> 勿 <code>| tail</code> 吞退出码（假成功空目录血案）。</p>
<h3>坑6：DSPARK 参数三件套缺一不可</h3>
<p dir="auto"><code>--speculative-algorithm DSPARK</code> + <code>--speculative-draft-model-path</code> + <code>--speculative-draft-model-quantization modelopt_fp4</code> + <code>--speculative-dspark-block-size 7</code>。少 quantization 或 block-size 不对 → draft 加载失败或验证路径报错。draft 用 gittensor-model-hub/Qwen3.8-27B-DSpark-NVFP4，<strong>不是</strong> MTP head 版。</p>
<h3>坑7：<code>--mamba-radix-cache-strategy</code> 与 <code>--max-mamba-cache-size</code> 是负优化开关</h3>
<ul>
<li><code>no_buffer</code>：与 overlap schedule 不兼容 → AssertionError crash loop（需 --disable-overlap-schedule 才能用，别碰）</li>
<li><code>--max-mamba-cache-size 20</code>：intermediate 预占从 KV 池挤走 ~2.8GB（池 174681→99102），KV 不足</li>
<li>两个都不加，用 auto 默认</li>
</ul>
<h3>坑8：agent 显示缓存命中 0% —— 服务端默认不上报（已解决）</h3>
<p dir="auto">dsh 等 agent harness 显示「缓存命中 0%」——根因是 SGLang 启动参数 <code>--enable-cache-report</code> <strong>默认 False</strong>：响应 <code>usage.prompt_tokens_details</code> 恒 null 不回填 cached_tokens，harness 读不到字段（pi-ai 解析链只认 ptd.cached_tokens / prompt_cache_hit_tokens / 顶层 cached_tokens）。<strong>不是 radix 失效</strong>，TTFT 验证法可确认缓存实际在工作。</p>
<p dir="auto">修复（2026-09-08 实测闭环）：unit ExecStart 加 <code>--enable-cache-report</code> → 重启 → 第二轮起同前缀请求返回 <code>cached_tokens: N</code>（987 token 前缀实测 cached=960，97%），dsh UI 命中率显示真实值。DSPARK 投机不影响该字段。排查链：curl 直连看响应 ptd 是否 null → null 即未开上报。</p>
<h3>坑9：dsh/agent 接入报 400 <code>Unexpected message role.</code>（developer role 坑）</h3>
<p dir="auto">dsh（DeepSeek 官方 harness）对配置了 reasoning 的模型把 system prompt 发成 <code>role:"developer"</code>（pi-ai 逻辑：<code>useDeveloperRole = model.reasoning &amp;&amp; compat.supportsDeveloperRole</code>，DeepSeek API 认 developer，本地 Qwen3.6 模板不认直接 400）。症状：dsh 所有请求失败报 <code>CONTEXT_WINDOW_EXCEEDED: 400 status code (no body)</code>，但 curl 直连 SGLang 完全正常——tcpdump 抓包见响应体 <code>Unexpected message role.</code>。</p>
<p dir="auto">修复：dsh <code>~/.dsh/settings.yaml</code> 的 local-qwen 每个模型条目 compat 块加 <code>supportsDeveloperRole: false</code>（role 回落 system），重启 dsh.service 即恢复：</p>
<pre><code class="language-yaml">compat:
  supportsDeveloperRole: false   # 本地 Qwen 模板不认 developer role
  thinkingFormat: chat-template
  chatTemplateKwargs:
    enable_thinking: {$var: thinking.enabled}
    reasoning_effort: {$var: thinking.effort, omitWhenOff: true}
    preserve_thinking: true
</code></pre>
<h3>坑10：reasoning_effort 别发 max</h3>
<p dir="auto">Qwen3.8 jinja 模板只认 xhigh/high/medium/low，<code>max</code> 直接 500。agent 配置 reasoning_effort 用 xhigh 封顶（本地 override 键大小写双套 low/medium 细调）。</p>
<hr />
<h2>不要做的事</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>操作</th>
<th>为什么</th>
</tr>
</thead>
<tbody>
<tr>
<td>ctx 直接顶 131072 + DSPARK</td>
<td>6K 即 OOM 崩溃（坑1）</td>
</tr>
<tr>
<td>mem-fraction 设 0.90+</td>
<td>预分配过满，运行时 free≈0，任何峰值即爆</td>
</tr>
<tr>
<td>加 <code>--max-mamba-cache-size</code></td>
<td>intermediate 预占挤走 KV 池（坑7）</td>
</tr>
<tr>
<td>用 <code>--mamba-radix-cache-strategy no_buffer</code></td>
<td>crash loop（坑7）</td>
</tr>
<tr>
<td>用 Unsloth NVFP4 权重</td>
<td>SGLang 不兼容（坑5）</td>
</tr>
<tr>
<td>拿 gittensor README 速度当本机预期</td>
<td>5090 带宽参考，4500 减半（机制2）</td>
</tr>
<tr>
<td>期待本地模型带视觉</td>
<td>无 vision encoder，视觉走云端 API（机制3）</td>
</tr>
<tr>
<td>手动 shell 循环判就绪</td>
<td>冷启 16-18min 会误判 DOWN；用 curl --retry</td>
</tr>
<tr>
<td><code>| tail</code> 吞 hf download 退出码</td>
<td>假成功空目录</td>
</tr>
<tr>
<td>给 agent 配 reasoning_effort=max</td>
<td>模板 500（坑10）</td>
</tr>
<tr>
<td>服务端不加 <code>--enable-cache-report</code></td>
<td>agent 侧缓存命中永远 0%（坑8）</td>
</tr>
</tbody>
</table>
<hr />
<h2>复现附录</h2>
<h3>完整从零到跑通</h3>
<pre><code class="language-bash"># 1. 创建虚拟环境（python3.11）
python3.11 -m venv ~/.sglang-venv

# 2. 安装 SGLang 0.5.19 + flashinfer（自动依赖 cu130 wheel）
~/.sglang-venv/bin/pip install sglang==0.5.19 --prerelease=allow
#   验证：nvcc 13.4.46rc1 全家桶在 site-packages/nvidia/cu13（坑4）

# 3. 补 JIT 编译环境
#    gcc-12 symlink（nvcc 不认 gcc 15）
mkdir -p ~/.local/bin/cuda-cc &amp;&amp; cd ~/.local/bin/cuda-cc
ln -sf "$(which gcc-12)" gcc &amp;&amp; ln -sf "$(which g++-12)" g++
#    cu13/lib64 + 无版本 .so symlink（pip 布局缺这两个）
cd ~/.sglang-venv/lib/python3.11/site-packages/nvidia/cu13
ln -sfn lib lib64
cd lib &amp;&amp; for f in libcudart.so.13 libcublas.so.13 libcublasLt.so.13 libnvrtc.so.13 libcuda.so; do
  ln -sfn "$f" "${f%.13}"; ln -sfn "$f" "${f%%.so*}.so" 2&gt;/dev/null
done; cd -

# 4. 下载权重（gittensor 官方，勿 | tail 吞退出码）
hf download gittensor-model-hub/Qwen3.8-27B-NVFP4-RTX5090 --local-dir ~/models/Qwen3.8-27B-NVFP4-RTX5090
hf download gittensor-model-hub/Qwen3.8-27B-DSpark-NVFP4 --local-dir ~/models/Qwen3.8-27B-DSpark-NVFP4

# 5. 写入 systemd 服务（最终配置节全文）到 ~/.config/systemd/user/sglang-qwen27b.service
#    ⚠️ 环境三件套 Environment 行是启动成败关键（坑3），逐字复制

# 6. 启动（冷启 16-18min 属正常，见坑2）
systemctl --user daemon-reload
systemctl --user start sglang-qwen27b.service
curl -s -m 3 --retry 90 --retry-delay 10 --retry-all-errors http://127.0.0.1:8000/v1/models | head -c 300

# 7. 验证
curl -s http://127.0.0.1:8000/v1/models | python3 -m json.tool   # id=qwen3.8-27B-NVFP4, max_model_len=100000

# 8. 压测（纯文本 max_tokens 给足 ≥512，思考模型占 token）
curl -s http://127.0.0.1:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"qwen3.8-27B-NVFP4","messages":[{"role":"user","content":"详细解释量子计算原理"}],"max_tokens":2048}' | python3 -m json.tool
</code></pre>
<h3>客户端三处同步（ctx 改后必做）</h3>
<ol>
<li>Hermes <code>~/.hermes/config.yaml</code>：providers.local-qwen.models[0].context_length = 100000</li>
<li>Hermes config.yaml.template 同步（缩进不同，行级替换）</li>
<li>dsh <code>~/.dsh/settings.yaml</code>：llm-pi-ai.providers.local-qwen 模型条目 contextWindow = 100000（A3B 条目保持 131072），且每个模型条目 compat 块必须含 <code>supportsDeveloperRole: false</code>（见坑9——dsh 对 reasoning 模型默认发 developer role，本地 Qwen 模板不认会 400）</li>
</ol>
<h3>llm-switch 集成</h3>
<pre><code class="language-bash"># llm-switch.sh TARGETS 表已含：1=sglang-qwen27b / 2=sglang-a3b / 3=comfyui / 4=stop
echo 1 | llm-switch        # 切到 27B
echo 4 | llm-switch        # 停止全部
</code></pre>
<hr />
<h2>未测试项</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>项目</th>
<th>原因</th>
</tr>
</thead>
<tbody>
<tr>
<td>4 路并发满载压力</td>
<td>现役单用户 agent 场景，max-running-requests 4 未同时打满</td>
</tr>
<tr>
<td>100K 满长度压测</td>
<td>实测 30K 稳定，未灌满 100K 连续长会话（2026-09-09 真实会话末轮单请求上下文按累计输入估算已达 40K+ 级且稳定，仍未灌满）</td>
</tr>
<tr>
<td>超 100K 上下文 + 去 DSPARK 方案</td>
<td>理论上池 174681 可行，用户拍板前不动</td>
</tr>
<tr>
<td>EAGLE/MTP 投机</td>
<td>gittensor 权重已移除 MTP head；EAGLE 需额外 draft 未测</td>
</tr>
<tr>
<td>multi-GPU/tensor parallel</td>
<td>单卡场景</td>
</tr>
<tr>
<td>stream vs non-stream 吞吐差异</td>
<td>未单独 benchmark</td>
</tr>
<tr>
<td>8 路并发</td>
<td>显存不足（draft+intermediate 挤压），未尝试</td>
</tr>
</tbody>
</table>
<hr />
<blockquote>
<p dir="auto">本文档写于 2026-09-08，基于本机 RTX PRO 4500 32GB 实测（llama.cpp/vLLM 引擎同日退役后的 SGLang 终局配置）。硬件不同数据会有差异，仅供参考。方法论框架见 Hermes llm-serving 技能（M1-M8 全流程），本配置为 2026-09-08 深夜 OOM 实证后定案的稳定档。</p>
<p dir="auto">2026-09-08 深夜更新：① ExecStart 加 <code>--enable-cache-report</code>（缓存命中真实上报打通，坑8 由"盲区无解"改"参数解决"）② 新增坑9（dsh developer role 400，settings.yaml compat 加 <code>supportsDeveloperRole: false</code>）③ 原坑9 顺延为坑10。</p>
<p dir="auto">2026-09-09 更新：本配置现为 dsh agent 日常现役模型（settings.yaml → qwen3.8-27B-NVFP4，NRestarts=0 稳定运行）。新增「真实 agent 会话（dsh UI 口径）」实测：5 轮 31 步，90 tok/s（UI 累计口径，4 轮快照 88）/ 首 token 平均 3.1s / 缓存命中 84%（输入 1.3M tok · 输出 40.9K tok）；90 与 63-79 的口径差异、首 token 解释见该节。核心配置与坑位全部不变。整体用下来，感觉驱动dsh是非常丝滑，不太适合驱动hermes（如果显存有至少48GB，应该没问题）。相比llama，我的感觉是更适合聊天，sglang才适合驱动agent，仅代表个人观点。</p>
</blockquote>
]]></description><link>https://lcz.me/topic/1570</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 22:54:34 GMT</lastBuildDate><atom:link href="https://lcz.me/topic/1570.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Sep 2026 16:29:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 实测63-79tok/s：RTX PRO 4500 32GB 部署 SGLang 0.5.19 + Qwen3.8-27B-NVFP4（DSPARK 投机）成功实践与踩坑指南 on Tue, 08 Sep 2026 16:31:05 GMT]]></title><description><![CDATA[<p dir="auto"><img src="https://upload.lcz.me/uploads/1be30574-c480-4a51-b935-3b93e29c08d1.png" alt="截图 2026-09-09 00-03-55.png" class=" img-fluid img-markdown" /></p>
]]></description><link>https://lcz.me/post/16759</link><guid isPermaLink="true">https://lcz.me/post/16759</guid><dc:creator><![CDATA[清风明月]]></dc:creator><pubDate>Tue, 08 Sep 2026 16:31:05 GMT</pubDate></item></channel></rss>