<?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[Windows 原生部署 NInfer：RTX 3080 Ti 20G 跑 Qwen3.8-27B + MTP + Vision 全流程 + gguf-to-ninfer 单流100k/s 双流150k/s]]></title><description><![CDATA[<p dir="auto">我和网页版的chatgpt聊天，本地编译，部署，测试后。chatgpt总结的内容如下（可以照抄作业，最终210k上下文显存占用17.7g，另有kvmem-v0.18.0-ninfer-windows-rtx30-sm86项目，显存可压倒15g不到，没在这篇）：</p>
<h1>Windows 原生部署 NInfer：RTX 3080 Ti 跑 Qwen3.8-27B + MTP + Vision 全流程</h1>
<p dir="auto">这篇记录一下我在 Windows 下原生编译部署 <code>iamwavecut/ninfer-all</code> 的完整过程。</p>
<p dir="auto">最终目标是：</p>
<ul>
<li>Windows 原生运行，不走 WSL</li>
<li>RTX 3080 Ti 20GB</li>
<li>CUDA SM86</li>
<li>Qwen3.8-27B</li>
<li>GSQ-RCO IQ3_S</li>
<li>MTP speculative decoding</li>
<li>Vision</li>
<li>长上下文</li>
<li>GGUF 自己转换成 <code>.ninfer</code></li>
</ul>
<p dir="auto">最终已经成功跑通。</p>
<hr />
<h2>一、环境</h2>
<p dir="auto">我的环境：</p>
<pre><code class="language-text">GPU：RTX 3080 Ti 20GB
架构：Ampere / SM86
系统：Windows
CUDA：13.0
NInfer：iamwavecut/ninfer-all
Commit：5ed86df
构建系统：CMake + Ninja
Visual Studio：Visual Studio 18 Insiders
MSVC Toolset：v143 / 14.44
</code></pre>
<p dir="auto">NInfer 源码：</p>
<pre><code class="language-text">D:\AI\NInfer\ninfer-all
</code></pre>
<p dir="auto">vcpkg：</p>
<pre><code class="language-text">D:\AI\NInfer\vcpkg
</code></pre>
<p dir="auto">CUDA：</p>
<pre><code class="language-text">C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.0
</code></pre>
<hr />
<h1>二、为什么要强制使用 MSVC 14.44</h1>
<p dir="auto">这里是第一个坑。</p>
<p dir="auto">Visual Studio Insiders 自带的新 MSVC 版本和 CUDA 13 的 host compiler 检查存在兼容问题。</p>
<p dir="auto">最后使用的是：</p>
<pre><code class="language-text">MSVC 19.44.35229
Toolset 14.44
</code></pre>
<p dir="auto">先打开 CMD，然后执行：</p>
<pre><code class="language-bat">call "C:\Program Files\Microsoft Visual Studio\18\Insiders\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=14.44
</code></pre>
<p dir="auto">确认：</p>
<pre><code class="language-bat">where cl
cl
</code></pre>
<p dir="auto">应该优先看到类似：</p>
<pre><code class="language-text">...\VC\Tools\MSVC\14.44.35207\bin\HostX64\x64\cl.exe
</code></pre>
<p dir="auto">而不是 VS Insiders 最新的 19.5x 编译器。</p>
<hr />
<h1>三、准备 vcpkg 自定义 triplet</h1>
<p dir="auto">创建：</p>
<pre><code class="language-text">D:\AI\NInfer\vcpkg\triplets\x64-windows-v143.cmake
</code></pre>
<p dir="auto">内容：</p>
<pre><code class="language-cmake">set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)

set(
    VCPKG_VISUAL_STUDIO_PATH
    "C:\\Program Files\\Microsoft Visual Studio\\18\\Insiders"
)

set(VCPKG_PLATFORM_TOOLSET v143)
set(VCPKG_PLATFORM_TOOLSET_VERSION 14.44)
</code></pre>
<p dir="auto">这个步骤很重要，否则 vcpkg 里面的依赖可能又偷偷用回最新 Toolset。</p>
<hr />
<h1>四、配置 NInfer</h1>
<p dir="auto">进入：</p>
<pre><code class="language-bat">cd /d D:\AI\NInfer\ninfer-all
</code></pre>
<p dir="auto">配置：</p>
<pre><code class="language-bat">cmake -S . -B build-sm86 -G Ninja ^
  -DCMAKE_BUILD_TYPE=Release ^
  -DCMAKE_CUDA_ARCHITECTURES=86 ^
  -DCMAKE_TOOLCHAIN_FILE="D:/AI/NInfer/vcpkg/scripts/buildsystems/vcpkg.cmake" ^
  -DVCPKG_TARGET_TRIPLET=x64-windows-v143 ^
  -DVCPKG_MANIFEST_MODE=ON
</code></pre>
<p dir="auto">成功时应该看到：</p>
<pre><code class="language-text">C compiler：MSVC 19.44
CXX compiler：MSVC 19.44
CUDA compiler：NVIDIA 13.0
CUDA architecture：86
</code></pre>
<hr />
<h1>五、编译 ninfer-serve</h1>
<p dir="auto">执行：</p>
<pre><code class="language-bat">cmake --build build-sm86 --target ninfer-serve -j 1
</code></pre>
<p dir="auto">我一开始使用旧 commit 时，在：</p>
<pre><code class="language-text">small_t_i8_launch.cuh
</code></pre>
<p dir="auto">附近遇到 MSVC lambda capture / dynamic shared memory 相关编译问题。</p>
<p dir="auto">后来把仓库更新到：</p>
<pre><code class="language-text">5ed86df
</code></pre>
<p dir="auto">之后上游已经修复。</p>
<p dir="auto">建议直接更新：</p>
<pre><code class="language-bat">git fetch
git checkout master
git pull --ff-only
</code></pre>
<p dir="auto">查看：</p>
<pre><code class="language-bat">git log -1 --oneline
</code></pre>
<p dir="auto">我最后使用的是：</p>
<pre><code class="language-text">5ed86df Merge pull request #106 ...
</code></pre>
<p dir="auto">之后：</p>
<pre><code class="language-bat">cmake --build build-sm86 --target ninfer-serve -j 1
</code></pre>
<p dir="auto">成功。</p>
<p dir="auto">生成：</p>
<pre><code class="language-text">D:\AI\NInfer\ninfer-all\build-sm86\apps\ninfer-serve.exe
</code></pre>
<hr />
<h1>六、编译并运行硬件校准</h1>
<p dir="auto">NInfer 有一个很重要的设备校准机制。</p>
<p dir="auto">先编译：</p>
<pre><code class="language-bat">cmake --build build-sm86 --target ninfer-calibrate -j 1
</code></pre>
<p dir="auto">然后执行校准。</p>
<p dir="auto">校准完成后我的结果大概是：</p>
<pre><code class="language-text">89 keys measured
59 routed off compiled route
hardware class：SM86
SM 数量：82
</code></pre>
<p dir="auto">默认 profile 会写到：</p>
<pre><code class="language-text">C:\Users\&lt;用户名&gt;\AppData\Local\ninfer\device-profiles.json
</code></pre>
<p dir="auto">我后来直接复制到：</p>
<pre><code class="language-text">D:\AI\NInfer\ninfer-all\build-sm86\apps\device-profiles.json
</code></pre>
<p dir="auto">启动服务器时显式指定：</p>
<pre><code class="language-bat">--device-profile-path "D:\AI\NInfer\ninfer-all\build-sm86\apps\device-profiles.json"
</code></pre>
<p dir="auto">正常启动会看到：</p>
<pre><code class="language-text">device profile nvidia-graphics-device-sm86:
89 routed keys
</code></pre>
<p dir="auto">说明校准配置生效。</p>
<hr />
<h1>七、Qwen3.8-27B 推荐启动配置</h1>
<p dir="auto">我主要用途是：</p>
<ul>
<li>Coding</li>
<li>Agent</li>
<li>长上下文</li>
<li>Vision</li>
<li>偶尔同时开第二个请求</li>
</ul>
<p dir="auto">最终我比较倾向：</p>
<pre><code class="language-text">KV dtype：rk8v4
KV capacity：约 210K
MTP：2 draft tokens
Vision：overlay
Host KV：关闭
</code></pre>
<p dir="auto">一个可直接使用的 BAT：</p>
<pre><code class="language-bat">@echo off
setlocal
chcp 65001 &gt;nul

set "SERVER=D:\AI\NInfer\ninfer-all\build-sm86\apps\ninfer-serve.exe"
set "PROFILE=D:\AI\NInfer\ninfer-all\build-sm86\apps\device-profiles.json"

set "MODEL=D:\AI\NInfer\models\Qwen3.8-27B-GSQ-RCO-IQ3_S-ninfer-v3.ninfer"

"%SERVER%" "%MODEL%" ^
  --model-id qwen3.8-27b ^
  --device-profile-path "%PROFILE%" ^
  --host 127.0.0.1 ^
  --port 18201 ^
  --max-concurrency 2 ^
  --max-context 210000 ^
  --kv-capacity 210000 ^
  --kv-dtype rk8v4 ^
  --gdn-state-fp16 ^
  --spec mtp ^
  --draft-tokens 2 ^
  --vision ^
  --vision-residency overlay ^
  --vision-max-merged 12288 ^
  --host-kv-mib 0

pause
</code></pre>
<hr />
<h1>八、为什么最后选择 210K rk8v4</h1>
<p dir="auto">我实际测试过几个配置。</p>
<h2>rk8v4 230K</h2>
<p dir="auto">服务器最终分配：</p>
<pre><code class="language-text">KV 230,016 tokens
runtime 7.07 GiB
free 452 MiB
</code></pre>
<p dir="auto">能跑，但是只剩：</p>
<pre><code class="language-text">452 MiB
</code></pre>
<p dir="auto">Vision 或两个请求一起上时风险比较大。</p>
<hr />
<h2>rk8v4 210K</h2>
<p dir="auto">缩到大约：</p>
<pre><code class="language-text">KV 210,048 tokens
runtime 6.56 GiB
free 980 MiB
</code></pre>
<p dir="auto">这个明显舒服很多。</p>
<p dir="auto">对于 20GB 卡，我觉得：</p>
<pre><code class="language-text">rk8v4 + 210K
</code></pre>
<p dir="auto">是长上下文、精度和显存之间比较好的平衡。</p>
<hr />
<h1>九、rk4v4 和 rk8v4</h1>
<p dir="auto">如果更追求：</p>
<pre><code class="language-text">速度
更大上下文
更低显存
</code></pre>
<p dir="auto">可以用：</p>
<pre><code class="language-bat">--kv-dtype rk4v4
</code></pre>
<p dir="auto">我测试时速度很好。</p>
<p dir="auto">但我主要跑 Coding Agent，而且经常会堆很长上下文，所以最后偏向：</p>
<pre><code class="language-text">rk8v4
</code></pre>
<p dir="auto">因为 K 保留 8bit，在超长上下文 Key 匹配上理论上更保守。</p>
<p dir="auto">如果主要是普通聊天或者追求容量：</p>
<pre><code class="language-text">rk4v4
</code></pre>
<p dir="auto">也完全可以。</p>
<hr />
<h1>十、MTP2 / MTP3</h1>
<p dir="auto">我自己的测试里，中短上下文：</p>
<pre><code class="language-text">MTP2
</code></pre>
<p dir="auto">表现很好。</p>
<p dir="auto">例如：</p>
<pre><code class="language-bat">--spec mtp
--draft-tokens 2
</code></pre>
<p dir="auto">单请求实际 decode 可以到大约：</p>
<pre><code class="language-text">110～115 tok/s
</code></pre>
<p dir="auto">部分滚动窗口会更高。</p>
<p dir="auto">我也测试了：</p>
<pre><code class="language-text">MTP3
</code></pre>
<p dir="auto">但在当前这些测试里并没有明显赢 MTP2。</p>
<p dir="auto">所以目前直接使用：</p>
<pre><code class="language-text">MTP2
</code></pre>
<hr />
<h1>十一、两个并发请求</h1>
<p dir="auto">我试过：</p>
<pre><code class="language-bat">--max-concurrency 2
</code></pre>
<p dir="auto">两个请求同时 decode。</p>
<p dir="auto">单请求速度大约：</p>
<pre><code class="language-text">74 tok/s
77 tok/s
</code></pre>
<p dir="auto">合计：</p>
<pre><code class="language-text">约 150 tok/s
</code></pre>
<p dir="auto">需要注意：</p>
<pre><code class="language-text">--kv-capacity
</code></pre>
<p dir="auto">是整个服务共享的 KV pool。</p>
<p dir="auto">例如：</p>
<pre><code class="language-text">kv-capacity = 210K
max-concurrency = 2
</code></pre>
<p dir="auto">并不代表：</p>
<pre><code class="language-text">2 × 210K
</code></pre>
<p dir="auto">而是两个请求共享这 210K。</p>
<hr />
<h1>十二、Host KV</h1>
<p dir="auto">默认情况下 NInfer 可能会分配较大的 Host KV。</p>
<p dir="auto">我最开始看到类似：</p>
<pre><code class="language-text">host KV pinned：8 GiB
</code></pre>
<p dir="auto">如果不需要 CPU KV spill，可以：</p>
<pre><code class="language-bat">--host-kv-mib 0
</code></pre>
<p dir="auto">这样能明显减少主机 pinned memory。</p>
<p dir="auto">不过 Windows 任务管理器仍然可能看到一点 Shared GPU Memory。</p>
<p dir="auto">这是正常的。</p>
<p dir="auto">即使：</p>
<pre><code class="language-text">host-kv-mib = 0
</code></pre>
<p dir="auto">仍然可能有：</p>
<ul>
<li>host state</li>
<li>Vision/media buffer</li>
<li>CUDA pinned/mapped memory</li>
<li>WDDM driver mapping</li>
</ul>
<p dir="auto">不代表 KV 正在偷偷 spill 到系统内存。</p>
<hr />
<h1>十三、Vision</h1>
<p dir="auto">启用：</p>
<pre><code class="language-bat">--vision ^
--vision-residency overlay ^
--vision-max-merged 12288 ^
</code></pre>
<p dir="auto">我选择：</p>
<pre><code class="language-text">overlay
</code></pre>
<p dir="auto">主要目的是减少 Vision 和 speculative 组件同时常驻 GPU 的显存压力。</p>
<p dir="auto">但是 Vision 真正进行 image encode 时还是会产生额外临时显存。</p>
<p dir="auto">所以：</p>
<pre><code class="language-text">230K rk8v4 + 452 MiB free
</code></pre>
<p dir="auto">我认为过于激进。</p>
<p dir="auto">而：</p>
<pre><code class="language-text">210K rk8v4 + 约 980 MiB free
</code></pre>
<p dir="auto">安全很多。</p>
<hr />
<h1>十四、把 GGUF 转成 NInfer</h1>
<p dir="auto">后面我又测试了自己转换一个 Huihui 的 Qwen3.8 模型：</p>
<pre><code class="language-text">Huihui-Qwen3.8-27B-abliterated-GSQ-RCO-IQ3_S-mtp.gguf
</code></pre>
<p dir="auto">目录：</p>
<pre><code class="language-text">D:\AI\llama\models\huihui-ai
</code></pre>
<p dir="auto">Vision：</p>
<pre><code class="language-text">D:\AI\llama\models\RCO\mmproj-Qwen3.8-27B-BF16.gguf
</code></pre>
<hr />
<h1>十五、创建独立 Python 转换环境</h1>
<p dir="auto">不要污染其他 Python 环境。</p>
<p dir="auto">进入：</p>
<pre><code class="language-bat">cd /d D:\AI\NInfer\ninfer-all
</code></pre>
<p dir="auto">创建：</p>
<pre><code class="language-bat">py -3.11 -m venv .venv-convert
</code></pre>
<p dir="auto">CMD 激活：</p>
<pre><code class="language-bat">call .\.venv-convert\Scripts\activate.bat
</code></pre>
<p dir="auto">注意：</p>
<p dir="auto">PowerShell 才是：</p>
<pre><code class="language-powershell">.\.venv-convert\Scripts\Activate.ps1
</code></pre>
<p dir="auto">如果在 CMD 里执行 <code>Activate.ps1</code> 是不会正常激活的。</p>
<p dir="auto">确认：</p>
<pre><code class="language-bat">where python
</code></pre>
<p dir="auto">应该指向：</p>
<pre><code class="language-text">D:\AI\NInfer\ninfer-all\.venv-convert\Scripts\python.exe
</code></pre>
<hr />
<h1>十六、安装转换依赖</h1>
<p dir="auto">我使用 CPU Torch：</p>
<pre><code class="language-bat">python -m pip install torch --index-url https://download.pytorch.org/whl/cpu
</code></pre>
<p dir="auto">确认：</p>
<pre><code class="language-bat">python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
</code></pre>
<p dir="auto">我的结果：</p>
<pre><code class="language-text">2.14.1+cpu
False
</code></pre>
<p dir="auto">这是正常的。</p>
<p dir="auto">转换模型并不需要 CUDA Torch。</p>
<p dir="auto">然后：</p>
<pre><code class="language-bat">python -m pip install gguf numpy safetensors transformers huggingface_hub
</code></pre>
<p dir="auto">其中：</p>
<pre><code class="language-text">gguf
</code></pre>
<p dir="auto">是必须的。</p>
<p dir="auto">不装会报：</p>
<pre><code class="language-text">ImportError:
reading a .gguf source requires the 'gguf' package
</code></pre>
<hr />
<h1>十七、准备 Qwen3.8 metadata</h1>
<p dir="auto">建立：</p>
<pre><code class="language-text">D:\AI\llama\models\huihui-ai\metadata
</code></pre>
<p dir="auto">从官方：</p>
<pre><code class="language-text">Qwen/Qwen3.8-27B
</code></pre>
<p dir="auto">下载这些文件：</p>
<pre><code class="language-text">config.json
generation_config.json
tokenizer.json
tokenizer_config.json
preprocessor_config.json
video_preprocessor_config.json
</code></pre>
<p dir="auto">最终目录：</p>
<pre><code class="language-text">metadata\
    config.json
    generation_config.json
    tokenizer.json
    tokenizer_config.json
    preprocessor_config.json
    video_preprocessor_config.json
</code></pre>
<p dir="auto">这里我一开始漏了：</p>
<pre><code class="language-text">generation_config.json
</code></pre>
<p dir="auto">于是转换器报：</p>
<pre><code class="language-text">FileNotFoundError:
metadata\generation_config.json
</code></pre>
<p dir="auto">补上之后即可。</p>
<hr />
<h1>十八、一个重要发现：MTP 可以直接从同一个 GGUF 里拿</h1>
<p dir="auto">一开始我以为要单独下载：</p>
<pre><code class="language-text">Q6_K MTP GGUF
</code></pre>
<p dir="auto">后来发现这个 Huihui 文件：</p>
<pre><code class="language-text">Huihui-Qwen3.8-27B-abliterated-GSQ-RCO-IQ3_S-mtp.gguf
</code></pre>
<p dir="auto">本身已经内嵌 MTP。</p>
<p dir="auto">只是 NInfer converter 要求：</p>
<pre><code class="language-text">gguf
</code></pre>
<p dir="auto">和：</p>
<pre><code class="language-text">mtp
</code></pre>
<p dir="auto">是两个逻辑 source。</p>
<p dir="auto">所以可以把同一个物理文件同时传两次：</p>
<pre><code class="language-bat">--source "gguf=xxx.gguf" ^
--source "mtp=xxx.gguf" ^
</code></pre>
<p dir="auto">这招成功了。</p>
<p dir="auto">转换日志明确识别出：</p>
<pre><code class="language-text">mtp/layers/0/attention/query: gguf_q6_k
mtp/layers/0/mlp/gate: gguf_q6_k
mtp/input_projection: gguf_q6_k
mtp/layers/0/attention/output: gguf_q6_k
mtp/layers/0/mlp/down: gguf_q6_k
</code></pre>
<p dir="auto">也就是说：</p>
<pre><code class="language-text">这个 GGUF 的 MTP 本身就是 Q6_K
</code></pre>
<p dir="auto">不需要另外下载 MTP。</p>
<hr />
<h1>十九、最终成功的 GGUF → NInfer 命令</h1>
<p dir="auto">进入：</p>
<pre><code class="language-bat">cd /d D:\AI\NInfer\ninfer-all
</code></pre>
<p dir="auto">然后：</p>
<pre><code class="language-bat">python -u -m tools.convert ^
  --model "D:\AI\llama\models\huihui-ai\metadata" ^
  --recipe qwen3_8_27b_gguf ^
  --source "gguf=D:\AI\llama\models\huihui-ai\Huihui-Qwen3.8-27B-abliterated-GSQ-RCO-IQ3_S-mtp.gguf" ^
  --source "mtp=D:\AI\llama\models\huihui-ai\Huihui-Qwen3.8-27B-abliterated-GSQ-RCO-IQ3_S-mtp.gguf" ^
  --source "vision=D:\AI\llama\models\RCO\mmproj-Qwen3.8-27B-BF16.gguf" ^
  --components text,vision,mtp ^
  --resource "chat_template.jinja=tools/chat_templates/qwen3_8.jinja" ^
  --device cpu ^
  --rows-per-chunk 512 ^
  --name "huihui-qwen3.8-27b-abliterated-gsq-rco-iq3-s" ^
  --out "D:\AI\NInfer\models\Huihui-Qwen3.8-27B-abliterated-GSQ-RCO-IQ3_S-MTP-Vision-ninfer-v3.ninfer"
</code></pre>
<p dir="auto">最后成功：</p>
<pre><code class="language-text">1174/1174
</code></pre>
<p dir="auto">然后：</p>
<pre><code class="language-text">wrote
D:\AI\NInfer\models\
Huihui-Qwen3.8-27B-abliterated-GSQ-RCO-IQ3_S-MTP-Vision-ninfer-v3.ninfer

1181 objects
1 files
34.0s
</code></pre>
<hr />
<h1>二十、为什么第一次生成的模型不能开 MTP</h1>
<p dir="auto">第一次转换时我用了：</p>
<pre><code class="language-bat">--components text,vision
</code></pre>
<p dir="auto">虽然源 GGUF 文件名带：</p>
<pre><code class="language-text">-mtp.gguf
</code></pre>
<p dir="auto">但输出 <code>.ninfer</code> 里并不会自动包含 MTP component。</p>
<p dir="auto">所以启动：</p>
<pre><code class="language-bat">--spec mtp
</code></pre>
<p dir="auto">会报：</p>
<pre><code class="language-text">Qwen3.5 config: missing component mtp
</code></pre>
<p dir="auto">正确方式必须是：</p>
<pre><code class="language-bat">--components text,vision,mtp
</code></pre>
<p dir="auto">并且：</p>
<pre><code class="language-bat">--source "mtp=..."
</code></pre>
<p dir="auto">也要显式提供。</p>
<p dir="auto">即使 <code>mtp=</code> 和 <code>gguf=</code> 指向的是同一个文件，也必须写。</p>
<hr />
<h1>二十一、以后转换模型可以直接用模板 BAT</h1>
<p dir="auto">核心变量只需要改：</p>
<pre><code class="language-bat">set "META=..."
set "GGUF=..."
set "MTP=..."
set "VISION=..."

set "OUTNAME=..."
set "MODEL_NAME=..."
</code></pre>
<p dir="auto">如果 MTP 就在主 GGUF 里面：</p>
<pre><code class="language-bat">set "GGUF=D:\models\xxx-mtp.gguf"
set "MTP=D:\models\xxx-mtp.gguf"
</code></pre>
<p dir="auto">即可。</p>
<p dir="auto">组件：</p>
<pre><code class="language-bat">set "COMPONENTS=text,vision,mtp"
</code></pre>
<p dir="auto">如果没有 Vision：</p>
<pre><code class="language-bat">set "COMPONENTS=text,mtp"
</code></pre>
<p dir="auto">如果没有 MTP：</p>
<pre><code class="language-bat">set "COMPONENTS=text"
</code></pre>
<hr />
<h1>二十二、最终效果</h1>
<p dir="auto">在 RTX 3080 Ti 20GB 上，当前这套 Windows 原生 NInfer 的体验比我之前使用的打包 runtime 明显好。</p>
<p dir="auto">大致测试：</p>
<pre><code class="language-text">Qwen3.8-27B
GSQ-RCO IQ3_S
MTP2
</code></pre>
<p dir="auto">单流 decode 大约：</p>
<pre><code class="language-text">100～115 tok/s
</code></pre>
<p dir="auto">部分 rolling window 可以更高。</p>
<p dir="auto">双请求时总吞吐可以到：</p>
<pre><code class="language-text">约 150 tok/s
</code></pre>
<p dir="auto">而长上下文配置：</p>
<pre><code class="language-text">rk8v4
约 210K KV
Vision
MTP2
</code></pre>
<p dir="auto">在 20GB 显存上也可以正常使用。</p>
<p dir="auto">目前我个人最终配置是：</p>
<pre><code class="language-text">RTX 3080 Ti 20GB

KV：
rk8v4

Context：
约 210K

Speculative：
MTP2

Vision：
开启
overlay

Host KV：
0

Concurrency：
2
</code></pre>
<p dir="auto">如果纯粹追求速度和最大上下文，可以换成：</p>
<pre><code class="language-text">rk4v4
</code></pre>
<p dir="auto">如果更重视长上下文 Coding / Agent，我目前更倾向：</p>
<pre><code class="language-text">rk8v4
</code></pre>
<hr />
<h2>总结</h2>
<p dir="auto">Windows 原生部署 NInfer 真正比较容易踩坑的主要是这几个地方：</p>
<ol>
<li>CUDA 13 和 VS 最新 MSVC 的兼容问题，要强制使用 MSVC 14.44。</li>
<li>vcpkg 也要指定 v143 / 14.44，不能只改当前 shell。</li>
<li>NInfer 更新到较新的 commit，旧版本 SM86 编译可能有问题。</li>
<li>一定运行 <code>ninfer-calibrate</code>。</li>
<li>20GB 卡不要把 rk8v4 KV 塞得太满，210K 比 230K 安全很多。</li>
<li>GGUF 转换必须安装 Python <code>gguf</code> 包。</li>
<li>metadata 不要漏 <code>generation_config.json</code>。</li>
<li>Vision 需要 <code>preprocessor_config.json</code> 和 <code>video_preprocessor_config.json</code>。</li>
<li>MTP 即使和主模型在同一个 GGUF 里，也要显式写 <code>--source mtp=同一个文件</code>。</li>
<li><code>--components text,vision</code> 不会自动生成 MTP；需要明确使用 <code>text,vision,mtp</code>。</li>
</ol>
<p dir="auto">到这里 Windows + RTX 30 系 + Qwen3.8-27B + MTP + Vision + 长上下文这条链路就完整跑通了。</p>
]]></description><link>https://lcz.me/topic/2433</link><generator>RSS for Node</generator><lastBuildDate>Sun, 25 Oct 2026 05:51:01 GMT</lastBuildDate><atom:link href="https://lcz.me/topic/2433.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Oct 2026 15:03:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Windows 原生部署 NInfer：RTX 3080 Ti 20G 跑 Qwen3.8-27B + MTP + Vision 全流程 + gguf-to-ninfer 单流100k/s 双流150k/s on Mon, 19 Oct 2026 15:07:02 GMT]]></title><description><![CDATA[<p dir="auto">这个速度相当满意：<br />
2026-10-19 23:03:43.715  INFO  req#39 started | openai-chat stream | 2 messages | max output 13,107 | thinking medium<br />
2026-10-19 23:03:45.487  INFO  throughput | 5.0s | prefill 960.3 tok/s (4,808 tok) | running 1 (prefill 1) | host 46.0% (2.3s)<br />
2026-10-19 23:03:50.482  INFO  throughput | 5.0s | prefill 1.54k tok/s (7,680 tok) | running 1 (prefill 1) | host 42.2% (2.1s)<br />
2026-10-19 23:03:55.475  INFO  throughput | 5.0s | prefill 1.22k tok/s (6,082 tok) | running 1 (prefill 1) | host 35.4% (1.8s)<br />
2026-10-19 23:04:00.487  INFO  throughput | 5.0s | prefill 1.53k tok/s (7,680 tok) | running 1 (prefill 1) | host 45.3% (2.3s)<br />
2026-10-19 23:04:05.483  INFO  throughput | 5.0s | prefill 617.3 tok/s (3,084 tok) | decode 57.0 tok/s (285 tok) | running 1 (decode-ready 1) | batch 1.00 | host 21.1% (1.1s)<br />
2026-10-19 23:04:10.489  INFO  throughput | 5.0s | decode 94.9 tok/s (475 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.2% (58.9 ms)<br />
2026-10-19 23:04:15.484  INFO  throughput | 5.0s | decode 227.6 tok/s (1,137 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.0% (51.0 ms)<br />
2026-10-19 23:04:20.474  INFO  throughput | 5.0s | decode 180.4 tok/s (900 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.1% (53.6 ms)<br />
2026-10-19 23:04:25.489  INFO  throughput | 5.0s | decode 258.2 tok/s (1,295 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.0% (50.2 ms)<br />
2026-10-19 23:04:30.480  INFO  throughput | 5.0s | decode 111.6 tok/s (557 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.1% (54.3 ms)<br />
2026-10-19 23:04:35.486  INFO  throughput | 5.0s | decode 115.5 tok/s (578 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.1% (57.2 ms)<br />
2026-10-19 23:04:40.485  INFO  throughput | 5.0s | decode 136.8 tok/s (684 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.1% (57.4 ms)<br />
2026-10-19 23:04:45.484  INFO  throughput | 5.0s | decode 153.8 tok/s (769 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.1% (54.3 ms)<br />
2026-10-19 23:04:50.482  INFO  throughput | 5.0s | decode 121.9 tok/s (609 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.1% (55.9 ms)<br />
2026-10-19 23:04:55.480  INFO  throughput | 5.0s | decode 119.7 tok/s (598 tok) | running 1 (decode-ready 1) | batch 1.00 | host 1.1% (55.6 ms)</p>
]]></description><link>https://lcz.me/post/26012</link><guid isPermaLink="true">https://lcz.me/post/26012</guid><dc:creator><![CDATA[to vi]]></dc:creator><pubDate>Mon, 19 Oct 2026 15:07:02 GMT</pubDate></item></channel></rss>