在24GB显存环境中运行Qwen 3.6 27B的配置:后端对比、量化选择与设置(llama.cpp, ik_llama.cpp, BeeLlama, vllm)
摘要
本文对比了在RTX 3090 24GB上运行Qwen 3.6 27B使用的llama.cpp后端,发现搭配IQ4_KS量化的ik_llama.cpp性能最佳(预填充1261 tok/s,解码72.9 tok/s)。
## TL;DR - 我在RTX 3090 24 GB上测试的最佳配置:`ik_llama.cpp` + `Qwen3.6-27B-MTP-IQ4_KS.gguf` - `156k` 上下文,`q8_0/q8_0` KV,MTP,视觉在CPU上 - 在 `~5.9k` 提示 + `1k` 输出上的基准测试结果:预填充约 `1261 tok/s`,解码 `72.9 tok/s` - `llama.cpp` 是一个不错的起点,BeeLlama值得测试,但 `ik_llama.cpp` 表现最好
## 测试内容
- 上游 `llama.cpp`:简单的基线,不错的起点
- `beellama.cpp`:理论上很有前景,但在我的环境下无法重现预期速度
- `ik_llama.cpp`:最佳解码/预填充,最佳显存适配
我还花时间测试了 `vLLM` / `club-3090`,但在此轮测试中未完成对等的干净对比,因此未将其列入表格。我们观察到响应速度约 `78 tok/s`,但高上下文显存不足(OOM)的断崖过于不稳定,所以暂时放弃,待该问题修复。近期未重新测试,但该仓库仍将单卡长上下文问题标记为未解决。
## 基准测试
单次聊天补全任务:
- 提示长度:约 `5.9k` 令牌
- 输出长度:`1024` 令牌
- 任务类型:对本地配置文件的代码审查/迁移笔记
因此主要测试:
- 中等大小真实提示的预填充速度
- 持续 `1k` 令牌生成的解码速度
这并非最佳情况下的tok/s,但更接近实际使用。
## 我所保留的配置
这是作为默认配置保留的方案:
- 后端:[`ikawrakow/ik_llama.cpp`](https://github.com/ikawrakow/ik_llama.cpp)
- 当前测试构建:`4507 (c35189d8)`
- 模型:[`ubergarm/Qwen3.6-27B-GGUF`](https://huggingface.co/ubergarm/Qwen3.6-27B-GGUF)
- 直接模型文件:[`Qwen3.6-27B-MTP-IQ4_KS.gguf`](https://huggingface.co/ubergarm/Qwen3.6-27B-GGUF/blob/main/Qwen3.6-27B-MTP-IQ4_KS.gguf)
高层启动参数:
- `--ctx-size 156000`
- `--cache-type-k q8_0`
- `--cache-type-v q8_0`
- `--flash-attn on`
- `--multi-token-prediction`
- `--draft-max 4`
- `--draft-p-min 0.0`
- `--merge-qkv`
- `--merge-up-gate-experts`
- `--cache-ram 32768`
- `--ctx-checkpoints 32`
- `--reasoning on`
- `--reasoning-format deepseek`
- `--chat-template-kwargs '{"preserve_thinking":true}'`
- `--no-mmproj-offload`
备注:
- `ik_llama.cpp` 内置的 MTP 比其他推测性路径效果更好
- `q8_0` KV 质量不错;可以选择 `q4`,但使用 `IQ4_KS` 时有充足的显存余量
## 为什么选择 `IQ4_KS`
- 比 Unsloth 的 `UD-Q4_K_XL` 小得多
- 质量足够高,我没有感觉到明显的损失
- 在 `24 GB` 显卡上,一旦你开始扩展上下文和合理的 u-batch 大小,节省的 GiB 就很重要
- 公平地说,可能还有更高量化的空间,比如 `q5`;我尚未测试
- [`Qwen-3.6 量化讨论 #1663`](https://github.com/ikawrakow/ik_llama.cpp/discussions/1663)
TLDR:
- `Qwen 3.6` 在 `IQ4_KS` 下量化效果很好
- `ikawrakow` 测得 `IQ4_KS` 非常接近甚至优于 `UD_Q4_XL`
- Unsloth 的 `UD-Q4_K_XL` 需要额外约 `2.8 GiB` 才能达到相近表现
如果你想了解量化系列本身的背景:
- [`新量化类型 IQ2_K, IQ3_K, IQ4_K, IQ5_K 讨论 #8`](https://github.com/ikawrakow/ik_llama.cpp/discussions/8)
## 视觉
- 默认将投射器放在CPU上:`--mmproj ...` + `--no-mmproj-offload`
- 如果想加快图像处理,可以将其移到GPU,但会多占用约 `1.5 GiB` 显存
- 如果显存不足,请降低上下文或切换到 `q4` KV
## GPU 相关
这是在Linux上运行,桌面使用核显,RTX 3090仅用于LLM。
- 功耗限制:`330 W`
- 显存超频:`+600`
- 降压:稳定在约 `1875 MHz @ 868 mV`(`LACT` 现在有曲线编辑器)
## 一些未能使默认配置更好的实验
- `ik_llama.cpp` 上的 `--spec-autotune`:在此工作负载上没有明显的提升
- `--mtp-requantize-output-tensor q6_K`:有时更快,但不稳定,且额外消耗约 `1 GiB` 显存,所以没有保留
- BeeLlama DFlash 精度快速入门:加载正常,但比我预期的慢得多
- 上游 `llama.cpp` MTP 路径:基线不错,但在我的测试中比 `ik_llama.cpp` 慢
BeeLlama 和 `vLLM` 仍然值得探索。我只是没有找到一个能在我工作负载上击败 `ik_llama.cpp` 配置的方案。
## 结果
以下是来自同一真实提示 / `1024` 令牌输出基准测试的有用对比点。
| 后端 | 模型/量化 | 推测路径 | 上下文 | KV缓存 | 预填充 tok/s | 解码 tok/s | 耗时 | 备注 |
| --- | --- | --- | ---: | --- | ---: | ---: | ---: | --- |
| `ik_llama.cpp` | `Qwen3.6-27B-MTP-IQ4_KS` | 内置 MTP | `156k` | `q8_0/q8_0` | `1260.95` | `72.93` | `18.79s` | 最好的全局默认配置 |
| `llama.cpp` 上游 | `Qwen3.6-27B-UD-Q4_K_XL` | `draft-mtp` | `32k` | `q4_0/q4_0` | `1247.65` | `51.20` | `24.80s` | 最简单的起点 |
| `llama.cpp` 上游调优 | `Qwen3.6-27B-UD-Q4_K_XL` | `draft-mtp` | `32k` | `q8_0/q8_0` | `1242.81` | `56.66` | `22.88s` | 旧版标志有帮助,但仍较慢 |
| `beellama.cpp` | `Q5_K_S` + DFlash `Q4_K_M` | DFlash | `122.8k` | `turbo4/turbo3_tcq` | `1117.66` | `36.32` | `33.55s` | 纯文本快速入门风格运行 |
测试过的标志:
- `--spec-autotune` 在此工作负载上未产生更好的结果
- `--mtp-requantize-output-tensor q6_K` 偶尔有提升,最佳运行中解码约 `+5 tok/s`,但不够稳定,不值得额外占用 `~1 GiB` 显存
## 标志对比
以下是影响最大的高层配置差异。
| 后端 | 量化方案 | 草稿/推测模式 | 关键草稿参数 | KV缓存 | 其他重要标志 |
| --- | --- | --- | --- | --- | --- |
| `ik_llama.cpp` | 目标 `IQ4_KS` MTP | 内置 `--multi-token-prediction` | `--draft-max 4`, `--draft-p-min 0.0` | `q8_0/q8_0` | `--merge-qkv`, `--merge-up-gate-experts`, `--ctx-checkpoints 32`, CPU `mmproj` |
| `llama.cpp` 上游 | 目标 `UD-Q4_K_XL` | `draft-mtp` | `--spec-draft-n-max 6`, `--spec-draft-p-min 0.75` | `q4_0/q4_0` 默认,`q8_0/q8_0` 调优 | `--flash-attn on`, `--jinja` |
| `beellama.cpp` | 目标 `Q5_K_S`, 草稿 `Q4_K_M` | `dflash` | `--spec-dflash-cross-ctx 1024` | `turbo4/turbo3_tcq` | `--kv-unified`, `-b 2048`, `-ub 256`, 我的运行中仅文本 |
## 链接
- `ik_llama.cpp`: https://github.com/ikawrakow/ik_llama.cpp
- `ExLlamaV3`: https://github.com/turboderp-org/exllamav3
- BeeLlama: https://github.com/Anbeeld/beellama.cpp
- BeeLlama Qwen 3.6 快速入门: https://github.com/Anbeeld/beellama.cpp/blob/main/docs/quickstart-qwen36-dflash.md
- `club-3090`: https://github.com/noonghunna/club-3090
- `IQ4_KS` with MTP: https://huggingface.co/ubergarm/Qwen3.6-27B-GGUF/blob/main/Qwen3.6-27B-MTP-IQ4_KS.gguf
- `Qwen-3.6 quants` 讨论: https://github.com/ikawrakow/ik_llama.cpp/discussions/1663
- `IQ4_KS` 量化系列讨论: https://github.com/ikawrakow/ik_llama.cpp/discussions/8
*** 这是我目前找到的最佳 `24 GB` 配置,但发展很快,我认为这还不是最终定论。本帖的目的是对比单 3090 / `24 GB` 的实际结果:后端选择、量化、标志,以及哪些在实际使用中保持稳定。我希望这能成为 `24 GB` 显卡的有用参考帖:什么是有效的,什么是崩溃的,以及什么真正值得日常运行。我尚未测试 `ExLlamaV3`,可能还有其他更好的配置。另外,感谢所有构建这些工具的人:后端作者、量化制作者、模板调优者,以及那些做枯燥的调试工作、使本地LLM可用的朋友。
相似文章
在 8GB 显存和 32GB 内存上运行 Qwen3.6 35b a3b,~190k 上下文
作者分享了一种高性能的本地推理配置,使用支持 TurboQuant 的修改版 llama.cpp,在硬件受限(8GB 显存、32GB 内存)的情况下运行 Qwen3.6 35B A3B,实现了 ~37-51 tok/sec 的生成速度,并支持 ~190k 上下文。
BeeLlama.cpp:支持推理和视觉的先进 DFlash 与 TurboQuant。在 RTX 3090 上以 200k 上下文运行 Qwen 3.6 27B Q5,速度比基线快 2-3 倍(峰值 135 tps!)
BeeLlama.cpp 是一个专注于性能的 llama.cpp 分支,引入了 DFlash 投机解码和 TurboQuant KV 缓存压缩技术,使得在消费级硬件上也能高速本地运行像 Qwen 3.6 27B 这样的大型模型。
QWEN3.6 + ik_llama 快得离谱
用户报告成功部署 Qwen 3.6 与 ik_llama 量化,在消费级硬件(16GB VRAM、32GB RAM)上实现 200k 上下文窗口下 50+ token/秒。
Qwen3.6 27B 在 vLLM 中的表现比在 llama.cpp 中更差
一名用户报告称,Qwen3.6-27B 模型在使用 llama.cpp 时比使用 vLLM 表现更好且更可靠,并指出尽管进行了大量配置,vLLM 仍出现工具调用错误和“被切除脑叶”的行为。
48GB VRAM + Qwen 3.6 27B 的最佳设置
一位用户分享了在双GPU配置(RTX 4090 + RTX 3090)上使用llama.cpp运行Qwen3.6 27B (Q8_0)的优化设置,在250k上下文下实现了75-100 t/s和1500 pp。