最近在折腾本地大模型,发现一个核心问题:Ollama 和 LM Studio 能让模型跑起来,但参数全靠猜——上下文长度、KV cache 类型、MoE expert 放哪、ubatch 多大……用默认参数基本是在浪费显卡。
于是做了个工具自动找最优配置,过程中踩了不少坑,记录一下。
Qwen3-30B-A3B 是 MoE 架构,在 8GB 显卡上:
快了 7 倍,显存反而省了 65%。关键是 llama.cpp 支持这个,但你得自己识别哪些 tensor 是 MoE expert (.ffn_.*_exps. 这类命名),然后手动配。
同一张 8GB 显卡跑 Llama 3.1 8B ,不同 KV cache 配置速度差异:
| 配置 | ctx | 速度 |
|---|---|---|
| iso3+iso3 ,4 slot | 8K | 19.4 tok/s |
| q8_0+q4_0 ,1 slot | 8K | 38.2 tok/s |
| f16+f16 ,1 slot | 8K | 51.7 tok/s |
| f16+f16 ,1 slot (自动) | 64K | 26.2 tok/s |
f16 比 iso3 快将近 3 倍。但 f16 显存占用更大,所以正确策略是:先算 f16 KV cache 占多少显存,装得下就用 f16 ,装不下再降级。
公式:KV_MB = 2 × layers × kv_heads × head_dim × ctx × bytes / 1024²
社区里流传的 oobabooga 显存估算公式,原本用来预测装载模型后剩余显存能支持多大 ctx 。但这个公式是基于 q8_0/f16 拟合的,用 iso3 的时候会严重高估显存需求,导致 ctx 只算出 4K 。
最后放弃公式预测,改成二分探测:从 min(nativeCtx, 65536) 开始,OOM 就减半,最多探 5 次,让 llama-server 自己告诉我能跑多少。Llama 3.1 8B 的 ctx 从 4K 直接到 64K 。
llama.cpp 默认开 4 个并行 slot (为了多用户并发),但单用户场景下这会把 VRAM 分成 4 份。
关掉多余 slot (--parallel 1)之后:18.5 → 38.2 tok/s ,直接翻倍。
ubatch 128 vs 512 的性能差异跟模型和显卡都有关系,没有通用最优值。实测结论:
直接 benchmark 两个值取快的,比查文档猜靠谱。
最初方案是上下文满了之后调本地模型生成摘要——结果单 slot 阻塞,直接超时。
改成纯算法提取:保留头部( system prompt + 首轮对话)和尾部(最近 8K tokens ),中间部分提取代码路径、函数名、文件名、TODO 等关键信息。压缩率 73%,耗时 <1ms 。
直接调用 llama.cpp 的 llama-server ,所有参数( ctx 、KV cache 类型、线程数、ubatch 、mlock 、tensor split )都通过启动参数注入。Kaiwu 本质上是一个参数决策层,不改推理引擎本身。
集成了 johndpope 的 turboquant fork (feature/planarquant-kv-cache),支持 -ctk iso3 -ctv iso3 参数。iso3 的压缩系数实测 0.73 ,理论值 0.75 ,在 VRAM 紧张的设备( 8GB )上可以把 KV cache 占用压缩到 q8_0 的一半。但有约 600MB 固定解码 buffer 开销,VRAM 充裕时反而比 f16 慢 8%,所以策略是 VRAM > 16GB 才默认开 iso3 。
社区流传的公式用来预测剩余显存能支持多大 ctx ,基于 q8_0/f16 拟合。iso3 场景下高估显存需求,导致 ctx 只算出 4K 。最终改成二分探测代替公式,让 llama-server 自己决定能跑多少。
Qwen3 等新模型用 GQA ( Grouped Query Attention ),kv_heads 远小于 attention_heads 。KV cache 大小公式里用的是 kv_heads 而不是 heads ,不识别这一点会高估 3-4 倍。通过读 GGUF metadata 拿到准确的 kv_heads 值再做计算。
读取模型的 tensor 名称列表,匹配 .ffn_.*_exps. 模式识别出 MoE expert 层,自动决定把这部分路由到 CPU 。不需要用户手动指定,也不需要提前知道模型架构。
上下文到 75% 时触发,纯算法提取:保留 system prompt 、首轮对话、最近 8K tokens ,中间部分按关键词权重保留(代码路径、函数名、文件名、TODO 、命令行等)。不调用任何模型,压缩耗时 <1ms ,73% 压缩率。最初试过调本地模型生成摘要,单 slot 阻塞直接超时,这条路走不通。
turboquant fork 需要自己编译带 iso3 支持的 llama-server 。用 GitHub Actions 同时编译 Windows ( MSVC )和 Linux ( GCC )版本,CUDA 12.4 ,覆盖 sm_75/80/86/89 架构,RTX 50 系列通过 PTX JIT 运行时支持。踩了三个 MSVC 编译坑( extern "C" 声明改定义、M_PI 未定义、全局符号缺失),记录在 PROGRESS.md 里。
把上面这些逻辑都自动化了,叫开物( Kaiwu )。一行命令启动,参数全部自动找,结果缓存起来,第二次 2 秒启动。
GitHub: https://github.com/val1813/kaiwu
OpenAI 兼容 API ,Continue / Cursor / Claude Code 直接接。
有遇到类似问题的欢迎交流,尤其是 MoE offload 和 KV cache 这块踩坑挺深的。
2
zrlhk 3 小时 34 分钟前
看起来显卡还是不够...:
本地大模型部署器 vv0.1.1 · llama.cpp b8864 by llmbbs.ai · 本地 AI 技术社区 [1/6] Probing hardware... GPU: NVIDIA GeForce RTX 3080 (SM86, 10240 MB VRAM, 760 GB/s) RAM: 47 GB UNKNOWN OS: windows amd64 [2/6] Selecting configuration... Model: Gemma 4 26B A4B It (moe, 19B total / 1B active) Quant: Q3_K_S (11.4 GB) Mode: moe_offload (experts on CPU) Accel: Flash Attention [3/6] Checking files... Using bundled iso3 binary: llama-server-cuda.exe Binary: llama-server-cuda.exe [cached] Model: gemma-4-26B-A4B-it.Q3_K_S.gguf [cached] [4/6] Preflight check... ✓ VRAM sufficient [5/6] Warmup benchmark... Probe 1: ctx=256K ... OOM Probe 2: ctx=128K ... OOM Probe 3: ctx=64K ... OOM Probe 4: ctx=32K ... OOM Probe 5: ctx=16K ... OOM Probe 6: ctx=8K ... OOM ⚠️ Warmup failed: all ctx probes failed (tried down to 4K) Using default parameters [6/6] Starting server... llama-server 不支持 iso3 ,回退到 q8_0/q4_0 Waiting for llama-server to be ready (port 11434)... ⚠️ 显存不足,降低上下文至 4K 重试... Waiting for llama-server to be ready (port 11434)... Error: failed to start llama-server: 连续 2 次启动失败,即使最小上下文(4K)也无法运行 建议:选择更小的量化或使用 MoE offload 模型 Usage: kaiwu run <model> [flags] Flags: --bench Run benchmark after starting --ctx-size int 手动指定上下文大小( 0=自动) --fast Skip warmup, use cached profile -h, --help help for run --reset 清除缓存,重新 warmup 探测最优参数 |
3
KaiWuBOSS OP 哥 您多大显存?
|
4
tangping 3 小时 16 分钟前
试试去了 🙌
|
5
KaiWuBOSS OP 我马上优化一版 空了再试试 gemma4 支持 ios3 的呀 判定有问题
|
7
damontian 3 小时 4 分钟前 via Android
大佬,16g 显存,64g 内存,跑哪个模型最合适?
|
8
KaiWuBOSS OP @zrlhk 我正在对你这个进行修复 1 你是正常 0.1.1 吗 我看代码 怎么显示你没编译涡轮量化 2 我回退策略太大了 我调整一版 我无论如何让你跑起来 顺畅跑起来
|
12
ntdll 2 小时 49 分钟前
看起来是 nVidia only
如果有用 AMD + Windows 的组合,可以尝试把 llama.cpp 的后端改成 vulkan ,会比 ROCm 的推理速度快上一档。在 Linux 上,我试下来是 ROCm 更快,但 Windows 相反。 |
14
sentinelK 2 小时 40 分钟前
这个机制和 llama.cpp 的 -- fit on 区别是?
|
15
KaiWuBOSS OP |
16
KaiWuBOSS OP @sentinelK 我也参考了他的 fiton 但他没有涡轮量化 另外我还做了上下文优化 相比而言 我这个不用调参 而且是硬件最大上下文 最优显存
-fit on 是随机削层,Kaiwu 是精准分层。 --fit on:显存不够就把后面几层丢给 CPU , 不管是什么层,速度损失大。 Kaiwu:专门识别 MoE 的专家层, 只把专家层放 CPU ,注意力层全在 GPU , 速度损失极小——这就是为什么 同样 8GB 显存,Kaiwu 能跑出 21 tok/s , LM Studio 只有 3 tok/s 。 |
17
KaiWuBOSS OP 0.1.1 版 ios3 脚本没上传上 正在编译 0.1.2 估计三个小时后发布
|
18
KaiWuBOSS OP 第一次发仓库项目 没经验 😰
|
19
hongdengdao 1 小时 34 分钟前
4060ti+5060ti 双卡没有识别出来,只出来了 4060ti
|
20
KaiWuBOSS OP @hongdengdao 奇怪 我特意在我双 4090 电脑测试能识别的 我去看看代码
|
21
KaiWuBOSS OP @hongdengdao 哥 跑一下 nvidia-smi 看输出是一个显卡还是 2 个 我这个读驱动的有代码支持的
|
22
hongdengdao 37 分钟前
0.1.1 我的是你的这个版本, nvidia-smi
Fri Apr 24 22:37:21 2026 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 591.86 Driver Version: 591.86 CUDA Version: 13.1 | +-----------------------------------------+------------------------+----------------------+ | GPU Name Driver-Model | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce RTX 4060 Ti WDDM | 00000000:01:00.0 Off | N/A | | 0% 33C P8 3W / 199W | 8MiB / 16380MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ | 1 NVIDIA GeForce RTX 5060 Ti WDDM | 00000000:0D:00.0 On | N/A | | 0% 38C P5 12W / 180W | 3831MiB / 16311MiB | 4% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ |
23
hongdengdao 34 分钟前
.\kaiwu.exe run Qwen3.6-27B-Q4_K_M.gguf
██╗ ██╗ █████╗ ██╗██╗ ██╗██╗ ██╗ ██║ ██╔╝██╔══██╗██║██║ ██║██║ ██║ █████╔╝ ███████║██║██║ █╗ ██║██║ ██║ ██╔═██╗ ██╔══██║██║██║███╗██║██║ ██║ ██║ ██╗██║ ██║██║╚███╔███╔╝╚██████╔╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚══╝╚══╝ ╚═════╝ 本地大模型部署器 vv0.1.1 · llama.cpp b8864 by llmbbs.ai · 本地 AI 技术社区 [1/6] Probing hardware... GPU: NVIDIA GeForce RTX 4060 Ti (SM89, 16380 MB VRAM, 0 GB/s) RAM: 61 GB DDR5 OS: windows amd64 [2/6] Selecting configuration... Model: Qwen3.6-27B (dense, 28B) Quant: Q4_K_M (15.7 GB) Mode: full_gpu Accel: Flash Attention [3/6] Checking files... Using bundled iso3 binary: llama-server-cuda.exe Binary: llama-server-cuda.exe [cached] Model: Qwen3.6-27B-Q4_K_M.gguf [cached] [4/6] Preflight check... ✓ VRAM sufficient [5/6] Warmup benchmark... Probe 1: ctx=8K ... OOM Probe 2: ctx=4K ... OOM ⚠️ Warmup failed: all ctx probes failed (tried down to 4K) Using default parameters [6/6] Starting server... llama-server 不支持 iso3 ,回退到 q8_0/q4_0 Waiting for llama-server to be ready (port 11434)... ⚠️ 显存不足,降低上下文至 4K 重试... Waiting for llama-server to be ready (port 11434)... Error: failed to start llama-server: 连续 2 次启动失败,即使最小上下文(4K)也无法运行 建议:选择更小的量化或使用 MoE offload 模型 Usage: kaiwu run <model> [flags] |
24
pengzhizhuo 27 分钟前
这个咋样?
(base) PS E:\kaiwu-windows-amd64> .\kaiwu.exe run Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf ██╗ ██╗ █████╗ ██╗██╗ ██╗██╗ ██╗ ██║ ██╔╝██╔══██╗██║██║ ██║██║ ██║ █████╔╝ ███████║██║██║ █╗ ██║██║ ██║ ██╔═██╗ ██╔══██║██║██║███╗██║██║ ██║ ██║ ██╗██║ ██║██║╚███╔███╔╝╚██████╔╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚══╝╚══╝ ╚═════╝ 本地大模型部署器 vv0.1.1 · llama.cpp b8864 by llmbbs.ai · 本地 AI 技术社区 [1/6] Probing hardware... GPU: NVIDIA GeForce RTX 4060 Laptop GPU (SM89, 8188 MB VRAM, 0 GB/s) RAM: 63 GB DDR5 OS: windows amd64 [2/6] Selecting configuration... Model: Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive (moe, 36B total / 1B active) Quant: Q4_K_M (19.7 GB) Mode: moe_offload (experts on CPU) Accel: Flash Attention [3/6] Checking files... Using bundled iso3 binary: llama-server-cuda.exe Binary: llama-server-cuda.exe [cached] Model: Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf [cached] [4/6] Preflight check... ✓ VRAM sufficient [5/6] Warmup benchmark... Probe 1: ctx=256K ... 22.1 tok/s Tune ubatch: ub=128 → 22.3 tok/s; ub=512 → 20.7 tok/s; ✓ 22.3 tok/s @ 256K ctx Saved profile: C:\Users\pzz\.kaiwu\profiles\qwen3.6-35b-a3b-uncensored-hauhaucs-aggressive-q4_k_m_sm89_8188mb_ddr5.json ✓ 22.3 tok/s [6/6] Starting server... Waiting for llama-server to be ready (port 11434)... llama-server started (PID 49380, port 11434) Kaiwu proxy started (port 11435) 2026/04/24 22:03:23 Kaiwu proxy listening on :11435 → llama-server :11434 ┌─────────────────────────────────────────────────┐ │ Ready — Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive @ 22.3 tok/s │ │ API: http://127.0.0.1:11435/v1/chat/completions │ │ 模型文件夹: E:\model │ └─────────────────────────────────────────────────┘ 运行 kaiwu inject 接入 IDE · Ctrl+C 停止 ─ 实时监控 · 空载 ─────────────────── 每 2s 刷新 ─ reuse:1024 · KV:q8_0 · 256K ctx · ub128 · mlock 速度 显存 内存 GPU 温度 — tok/s 5.5/8 GB 47.0/64 GB 2% 58°CC [..........] [======....] [=======...] [..........] [=====.....] ───────────────────────────────────────────────────────── 上下文 [....................] 0.0K / 256K 余 256.0K 正在停止服务... ✓ llama-server 已停止 ✓ Kaiwu proxy 已停止 |
25
KaiWuBOSS OP @hongdengdao 不好意思 我对双显卡判定之前太简单现在优化了 已经发布 0.1.2 了 你看看还有没有问题 下载后先 kaiwu run xx.gguf --reset 然后再跑 应该没问题了
|
26
KaiWuBOSS OP 产品最大担忧 我让 tok/s 最优值设定在 20 左右 就是让 kaiwu 在这个速度下 寻找上下文和显存最优解 如果用户显存有效 又期盼高速度 这个就不合适了 。之所以 20 是因为网上说 20 就是甜区了,但我觉得有点慢了。
|
27
mingtdlb 15 分钟前
看抖音说,同样的配置,llama.cpp 跑比 ollama 跑 吞吐更高?
|
28
osilinka 12 分钟前
现在不是有 turboquant 版本?
这个会不会效果更好 |