--- language: - en - zh - multilingual license: apache-2.0 library_name: llama.cpp tags: - gguf - qwen3.6 - qwen3_5 - conversational - vision - multimodal - speculative-decoding - mtp base_model: - Qwen/Qwen3.6-27B pipeline_tag: image-text-to-text quantization: - F16 - Q8_0 - Q6_K - Q5_K_M - Q4_K_M - IQ4_XS - IQ3_M - IQ2_M ---
# Qwen3.6-27B with MTP # **2.5x faster with MTP · 262K context on 48 GB · Fixed chat template**
Dense 27B model with vision, thinking, and tool use — self-speculative decoding, \ configurable KV cache (f16 for quality, q8_0/q4_0 for longer context), fixed Jinja template (tool calls and thinking actually work in C++ runtimes), \ and a server with both OpenAI and Anthropic APIs.
One command. Both APIs. No cloud.
--- > **Warning:** Vision (image input) crashes llama.cpp when used with MTP speculative decoding (all platforms). Text-only MTP works at 2.5x speed. For vision, start the server without `--spec-type draft-mtp` — see the [Vision](#vision) section. --- ## Start the server You need **llama.cpp b9180 or newer** (released 2026-05-16, includes MTP support). Install via Homebrew: ```bash brew install llama.cpp ``` ```bash llama-server -m Qwen3.6-27B-Q5_K_M-mtp.gguf \ --spec-type draft-mtp --spec-draft-n-max 3 \ --cache-type-k q8_0 --cache-type-v q8_0 \ -np 1 -c 262144 --temp 0.7 --top-k 20 -ngl 99 --port 8081 ``` That's it. Three optimizations in one command: | Flag | What it does | Impact | |---|---|---| | `--spec-type draft-mtp --spec-draft-n-max 3` | Multi-Token Prediction (built into the model) | **2.5x faster** generation | | `--cache-type-k q8_0 --cache-type-v q8_0` | 8-bit KV cache (instead of 16-bit) | **Half the KV memory**, negligible quality loss | | `-c 262144` | 262K context window | Full native context on **48 GB Mac** with q8_0 KV | > **Tip for Apple Silicon users at long context (>64K):** If you experience slow prefill or timeouts, try disabling Flash Attention with `-fa off`. On hybrid attention+SSM models like Qwen3.6, this can improve prefill speed 37-53% and unlock longer contexts that would otherwise time out. Adjust `-m`, `-c`, and `--cache-type-k/v` for your hardware — see the [Which quant should I download?](#which-quant-should-i-download) table below. --- ## Which quant should I download? Find your hardware below — each row gives the best quant, KV cache type, and max context that fits. ### Apple Silicon Qwen3.6-27B is a hybrid model — only **16 of 65 layers** use KV cache (verified). The other 48 are linear attention (fixed 898 MiB recurrent state). KV memory is **~4× less** than a standard dense model. Runtimes that don't handle this (e.g. vllm) allocate KV for all 65 layers and show much higher memory usage. Numbers below are total memory used (model + KV cache + 0.9 GB recurrent state). Must leave **≥ 8 GB for macOS** (16 GB Macs excepted). | RAM | Quant | KV cache | Max context | Total used | Vision | |---|---|---|---|---:|---| | 16 GB | **`IQ2_M`** | `q8_0` | **42K** | **12.0 GB** | ✗ | | 24 GB | **`IQ3_M`** | | **46K** | **16.0 GB** | ✗ | | 24 GB | `IQ3_M` | `q8_0` | 91K | 16.0 GB | ✗ | | 32 GB | **`Q5_K_M`** | | **74K** | **24.0 GB** | ✗ | | 32 GB | `Q5_K_M` | `q8_0` | 147K | 24.0 GB | ✗ | | 32 GB | `Q4_K_M` | | 99K | 24.0 GB | ✓ | | 48 GB | **`Q6_K`** | | **262K** | **39.7 GB** | ✓ | | 48 GB | `Q8_0` | | 173K | 40.0 GB | ✓ | | 48 GB | `Q8_0` | `q8_0` | 262K | 37.3 GB | ✓ | | 64 GB | **`Q8_0`** | | **262K** | **45.8 GB** | ✓ | | 96 GB | **`Q8_0`** | | **262K** | **45.8 GB** | ✓ | ### NVIDIA GPU Same model memory as Apple Silicon, plus ~1 GB CUDA overhead. | VRAM | Quant | KV cache | Max context | Total VRAM used | Vision | |---|---|---|---|---:|---| | 12 GB | **`IQ2_M`** | `q8_0` | **11K** | **12.0 GB** | ✗ | | 16 GB | **`IQ3_M`** | | **30K** | **16.0 GB** | ✗ | | 16 GB | `IQ3_M` | `q8_0` | 60K | 16.0 GB | ✗ | | 24 GB | **`Q4_K_M`** | | **83K** | **24.0 GB** | ✓ | | 24 GB | `Q4_K_M` | `q8_0` | 167K | 24.0 GB | ✓ | | 24 GB | `Q5_K_M` | | 58K | 24.0 GB | ✗ | | 48 GB | **`Q6_K`** | | **262K** | **40.7 GB** | ✓ | | 48 GB | `Q8_0` | | 262K | 46.8 GB | ✓ | | 80 GB | **`Q8_0`** | | **262K** | **46.8 GB** | ✓ | > **16 GB Mac:** `IQ2_M`/q8_0 — 42K text-only. No vision. > > **24 GB Mac:** `IQ3_M` — 46K (f16 KV) or 91K (q8_0). Vision at 32–65K. > > **32 GB Mac:** `Q5_K_M` — 74K text-only (f16 KV), 147K (q8_0). `Q4_K_M` for vision at 99K. > > **48 GB Mac:** `Q6_K`/f16 KV — 262K with vision. `Q8_0`/q8_0 KV for 262K at higher model quality. > > **64 GB+ Mac:** `Q8_0`/f16 KV — 262K with vision. Maximum quality at practical speed. > > **12 GB GPU:** `IQ2_M`/q8_0 — 11K. Very limited, no vision. > > **16 GB GPU:** `IQ3_M` — 30K (f16 KV) or 60K (q8_0). No vision. > > **24 GB GPU:** `Q4_K_M` — 83K with vision (f16 KV). `Q5_K_M` — 58K text-only (f16 KV), 116K (q8_0). > > **48 GB+ GPU:** `Q6_K`/f16 KV — 262K with vision. `Q8_0` for max quality. Leave KV cache at f16 (blank column) for best quality. Use `q8_0` KV only when f16 doesn't give enough context. `q4_0` KV should not exceed 64K context. Vision adds ~0.9 GB for mmproj. macOS needs **≥ 8 GB** for itself (16 GB Macs excepted — use ~4 GB). You can increase available memory by raising the wired memory limit, e.g. for a 96 GB Mac: `sudo sysctl iogpu.wired_limit_mb=90112` (88 GB). NVIDIA reserves ~1 GB for CUDA. --- ## API usage ### OpenAI-compatible (`/v1/chat/completions`) ```bash curl http://localhost:8081/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{"model":"qwen","messages":[{"role":"user","content":"Hello"}]}' ``` Works with any OpenAI client — just point it at `http://localhost:8081/v1`. ### Anthropic-compatible (`/v1/messages`) ```bash curl http://localhost:8081/v1/messages \ -H "Content-Type: application/json" \ -d '{"model":"qwen","max_tokens":1024,"messages":[{"role":"user","content":"Hello"}]}' ``` Works with any Anthropic client — the server natively speaks the Messages API with streaming, tool use, and vision. ### Claude Code ```bash ANTHROPIC_BASE_URL=http://127.0.0.1:8081 claude ``` Claude Code uses the Anthropic Messages API. With this one env var, it talks to your local Qwen3.6-27B instead of the cloud. ### Tool use (both APIs) ```bash curl http://localhost:8081/v1/messages \ -H "Content-Type: application/json" \ -d '{ "model": "qwen", "max_tokens": 1024, "tools": [{ "name": "get_weather", "description": "Get current weather for a location", "input_schema": { "type": "object", "properties": {"location": {"type": "string"}}, "required": ["location"] } }], "messages": [{"role": "user", "content": "What is the weather in Paris?"}] }' ``` ### Vision > **MTP + vision crashes** (all platforms, confirmed bug). For image inputs, start the server **without** `--spec-type draft-mtp`: > > ```bash > llama-server -m Qwen3.6-27B-Q5_K_M-mtp.gguf \ > --mmproj mmproj-Qwen3.6-27B-f16.gguf \ > --cache-type-k q8_0 --cache-type-v q8_0 \ > -c 262144 --temp 0.7 --top-k 20 -ngl 99 --port 8081 > ``` ```bash curl http://localhost:8081/v1/messages \ -H "Content-Type: application/json" \ -d '{ "model": "qwen", "max_tokens": 1024, "messages": [{"role": "user", "content": [ {"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": "'$(base64 < photo.jpg)'"}}, {"type": "text", "text": "Describe this image"} ]}] }' ``` --- ## Direct CLI usage ```bash # Text generation llama-cli -m Qwen3.6-27B-Q5_K_M-mtp.gguf \ --spec-type draft-mtp --spec-draft-n-max 3 \ --cache-type-k q8_0 --cache-type-v q8_0 \ -np 1 -c 4096 -n 2048 --temp 0.7 -ngl 99 \ -p "Your prompt here" # Vision (MTP does not work with images — omit --spec-type draft-mtp) llama-cli -m Qwen3.6-27B-Q5_K_M-mtp.gguf \ --mmproj mmproj-Qwen3.6-27B-f16.gguf \ --cache-type-k q8_0 --cache-type-v q8_0 \ -c 4096 -n 2048 --temp 0.7 -ngl 99 \ --image photo.jpg \ -p "Describe this image" ``` --- ## KV cache options The `--cache-type-k` and `--cache-type-v` flags control KV cache precision. Lower precision = less memory = longer context on the same hardware. | Type | Bits/val | KV size (80K ctx) | Quality | Speed | When to use | |---|---|---|---|---|---| | `f16` | 16 | 5.3 GB | Full | Baseline | **Best quality** — use when RAM allows | | **`q8_0`** | **8** | **2.8 GB** | **Negligible loss** | **Faster than f16** | **When f16 KV doesn't give enough context** | | `q4_0` | 4 | 1.5 GB | Minor loss | Slightly slower | Max context on limited RAM (≤64K only) | **Recommendation:** Leave KV at f16 for best quality. Use `q8_0` when f16 doesn't give enough context. Reserve `q4_0` for tight RAM — and only up to 64K context. Effect on hardware requirements (Q5_K_M, 80K context): | KV type | Model + recurrent + KV | Hardware | |---|---|---| | f16 | 24 GB | 48 GB Mac | | **q8_0** | **22 GB** | **32 GB Mac** | --- ## Speculative decoding modes ### MTP (recommended — 2.5x faster) The model predicts 5 extra tokens per step using its own MTP heads, then verifies them in one pass. No extra model needed. ```bash --spec-type draft-mtp --spec-draft-n-max 3 -np 1 ``` MTP currently requires `-np 1` (single-sequence mode). Tune `--spec-draft-n-max`: **3** is optimal for general use (83% acceptance rate). Values of 1–2 are more conservative; 4–5 waste compute on rejected tokens. ### Draft model (~2.3x faster) Pair with a smaller Qwen 3.5/3.6 model that shares the same tokenizer. ```bash llama-cli -m Qwen3.6-27B-Q5_K_M-mtp.gguf \ -md Qwen3.5-0.8B-Q8_0.gguf \ --spec-draft-n-max 10 -ngl 99 -ngld 99 \ -c 4096 -n 2048 --temp 0.7 \ -p "Your prompt" ``` ### ngram-mod (no extra model, benefits repeat prompts) Uses cached n-grams from previous prompts. ```bash --spec-type ngram-mod \ --spec-ngram-mod-n-match 24 \ --spec-ngram-mod-n-min 48 \ --spec-ngram-mod-n-max 64 \ --repeat-penalty 1.0 ``` --- ## Downloads | File | Size | Min. (4K ctx) | Recommended (80K ctx) | Max (262K ctx) | |---|---:|---|---|---| | `Qwen3.6-27B-F16-mtp.gguf` | 51 GB | 64 GB Mac · 80 GB GPU | 64 GB Mac · 80 GB GPU | 96 GB Mac · 80 GB GPU | | `Qwen3.6-27B-Q8_0-mtp.gguf` | 27 GB | 48 GB Mac · 48 GB GPU | 48 GB Mac · 48 GB GPU | 48 GB Mac · 48 GB GPU | | `Qwen3.6-27B-Q6_K-mtp.gguf` | 21 GB | 32 GB Mac · 24 GB GPU | 48 GB Mac · 48 GB GPU | 48 GB Mac · 48 GB GPU | | **`Qwen3.6-27B-Q5_K_M-mtp.gguf`** | **18 GB** | **32 GB Mac · 24 GB GPU** | **32 GB Mac · 24 GB GPU** | **48 GB Mac · 48 GB GPU** | | `Qwen3.6-27B-Q4_K_M-mtp.gguf` | 16 GB | 32 GB Mac · 24 GB GPU | 32 GB Mac · 24 GB GPU | 48 GB Mac · 48 GB GPU | | `Qwen3.6-27B-IQ4_XS-mtp.gguf` | 14 GB | 24 GB Mac · 24 GB GPU | 32 GB Mac · 24 GB GPU | 32 GB Mac · 48 GB GPU | | `Qwen3.6-27B-IQ3_M-mtp.gguf` | 12 GB | 24 GB Mac · 16 GB GPU | 24 GB Mac · 24 GB GPU | 32 GB Mac · 24 GB GPU | | `Qwen3.6-27B-IQ2_M-mtp.gguf` | 9.5 GB | 16 GB Mac · 16 GB GPU | 24 GB Mac · 16 GB GPU | 32 GB Mac · 24 GB GPU | | `mmproj-Qwen3.6-27B-f16.gguf` | 885 MB | Vision encoder (optional, any tier) | — | — | All tiers include MTP heads and were quantized directly from the F16 conversion for maximum precision. I-quant tiers (IQ4_XS, IQ3_M, IQ2_M) use unsloth's importance matrix. **Q5_K_M** is the sweet spot — use Q4_K_M if you're tight on RAM, Q8_0 for high quality, or **F16 for long agentic coding sessions** where quantization artifacts compound noticeably. GPU means NVIDIA (RTX 3060 = 12 GB, RTX 3090/4090 = 24 GB, A6000 = 48 GB, A100 = 80 GB). Hardware numbers assume f16 KV for "Min." (4K) and q8_0 KV for "Recommended" (80K) and "Max" (262K). Add `--cache-type-k q8_0 --cache-type-v q8_0` to reach the recommended or max context on smaller hardware. --- ## Memory requirements Approximate VRAM on Apple Silicon (unified memory), using Q5_K_M as reference. Includes 0.9 GB recurrent state (constant, does not scale with context). Only 16 of 65 layers use KV cache — the other 48 use linear attention. | Context | Model | KV (f16) | KV (q8_0) | Total (f16) | Total (q8_0) | Min. Mac | |---|---|---|---|---|---|---| | 4K | 18 GB | 0.3 GB | 0.1 GB | 19 GB | 19 GB | 32 GB | | 8K | 18 GB | 0.5 GB | 0.3 GB | 19 GB | 19 GB | 32 GB | | 32K | 18 GB | 2.1 GB | 1.0 GB | 20 GB | 20 GB | 32 GB | | 64K | 18 GB | 4.1 GB | 2.1 GB | 21 GB | 21 GB | 32 GB | | **80K (recommended)** | **18 GB** | **5.2 GB** | **2.6 GB** | **22 GB** | **22 GB** | **32 GB** | | 128K | 18 GB | 8.3 GB | 4.1 GB | 25 GB | 23 GB | 32 GB | | 262K (max native) | 18 GB | 17.0 GB | 8.5 GB | 34 GB | 27 GB | 48 GB | "Total" = model + recurrent state + KV cache. macOS needs ≥ 8 GB (16 GB Macs excepted). With vision: add 0.9 GB for the mmproj.
Memory for all quant tiers (4K context, q8_0 KV) | Quant | Model | KV + recurrent | Total | Min. Mac | |---|---|---|---|---| | Q8_0 | 27 GB | 1.0 GB | 28 GB | 48 GB | | Q6_K | 21 GB | 1.0 GB | 22 GB | 32 GB | | Q5_K_M | 18 GB | 1.0 GB | 19 GB | 32 GB | | Q4_K_M | 16 GB | 1.0 GB | 17 GB | 32 GB | | IQ4_XS | 14 GB | 1.0 GB | 15 GB | 24 GB | | IQ3_M | 12 GB | 1.0 GB | 13 GB | 24 GB | | IQ2_M | 9.5 GB | 1.0 GB | 11 GB | 16 GB |
--- ## System prompt The first line **must** be: ``` You are Qwen, created by Alibaba Cloud. You are a helpful assistant. ``` The model underperforms without it. Append anything after that line. --- ## Thinking toggle Drop `<|think_on|>` or `<|think_off|>` in any message to toggle thinking. The template strips the tag so the model never sees it. ``` System: You are a coding assistant. <|think_off|> User: What's 2+2? ``` Fast answer, no internal reasoning. ``` System: You are a coding assistant. <|think_on|> User: Implement a red-black tree in Rust. ``` The model thinks step by step, then answers. --- ## Sampling From the official Qwen authors. Reserve 128K+ context for thinking mode. | Mode | temp | top_p | top_k | repeat_penalty | |---|---|---|---|---| | **Thinking (coding)** | 0.6 | 0.95 | 20 | 1.0 | | Thinking (general) | 1.0 | 0.95 | 20 | 1.0 | | Non-thinking (general) | 0.7 | 0.8 | 20 | 1.0 | --- ## Compatibility | Runtime | Status | Why | |---|---|---| | **llama.cpp (b9180+ / Homebrew)** | Works fully | MTP support merged in b9180 (2026-05-16). `brew install llama.cpp` | | llama.cpp (pre-b9180) | Does not load | `missing tensor` — MTP heads not recognized | | LM Studio | Does not load | Bundled llama.cpp may not yet include b9180+ | | Ollama | Does not load | [No speculative decoding support yet](https://github.com/ollama/ollama/issues/5800) | | koboldcpp | Unknown | Depends on bundled llama.cpp version | **LM Studio users:** use the [MLX 8-bit](https://huggingface.co/froggeric/Qwen3.6-27B-MLX-8bit) or [MLX 4-bit](https://huggingface.co/froggeric/Qwen3.6-27B-MLX-4bit) instead — full vision + tools + thinking, no MTP. --- ## Chat template fixes The bundled Jinja template fixes several bugs in the official Qwen 3.6 template: - **Tool calls crash on C++ engines.** The official template uses Python's `|items` filter and `|safe`, which don't exist in C++ Jinja runtimes (llama.cpp, LM Studio). This template uses direct dictionary key lookups. - **The `developer` role crashes.** Modern APIs send `message.role == "developer"`. The official template throws an exception. This template maps it to `system`. - **Empty `preserve_thinking` spam.** The official template wraps every past turn in empty `` blocks, wasting context tokens. This template only emits thinking blocks with actual content. - **`` hallucination handling.** The model sometimes generates `` instead of the expected closing tag. Both are handled gracefully. See [Qwen-Fixed-Chat-Templates](https://huggingface.co/froggeric/Qwen-Fixed-Chat-Templates) for the standalone template repo. > **Note:** The fixed template works in llama.cpp but may cause errors in some frameworks (oh-my-pi, Codex, etc.) — typically `Jinja Exception: System message must be at the beginning.` If you hit this, use the default (unfixed) template instead. The fixes for tool calls and the `developer` role are only needed in llama.cpp's C++ Jinja runtime; other frameworks may already handle them natively or reject the modified template. ---
Architecture details | Spec | Value | |---|---| | Total params | 27.8B (dense, all active) | | Layers | 65 (3x linear attention + 1x full attention, 16 repetitions) + 1 MTP layer | | Attention | 24 Q heads, 4 KV heads (GQA), head_dim 256 | | Linear attention | 16 QK heads, 48 V heads, head_dim 128 | | FFN | intermediate_size 17408 | | Context | 262K native, 1M+ with YaRN | | RoPE | theta 10M, partial_rotary_factor 0.25, mrope_interleaved | | Vocab | 248K tokens | | Multi-token prediction | 1 MTP draft layer (15 tensors) | | model_type | `qwen3_5` |
Conversion details Converted from official Qwen3.6-27B safetensors using mainline `convert_hf_to_gguf.py` from [llama.cpp](https://github.com/ggml-org/llama.cpp) (b9180+, Homebrew v9240). MTP tensors are included by default — no custom build needed. The fixed chat template (v19) from [Qwen-Fixed-Chat-Templates](https://huggingface.co/froggeric/Qwen-Fixed-Chat-Templates) was embedded in `tokenizer_config.json` before conversion. **Quantization source:** F16 (not Q8_0) — all tiers are quantized directly from the F16 conversion for maximum precision, avoiding double-quantization artifacts. Standard K-quant tiers (Q8_0, Q6_K, Q5_K_M, Q4_K_M) use no importance matrix. I-quant tiers (IQ4_XS, IQ3_M, IQ2_M) use unsloth's importance matrix (calibrated with chat template at 6K–12K context, 76 chunks, 496 entries). IQ2_M keeps MTP tensors at Q4_K since the importance matrix doesn't cover MTP layer tensors.
--- ## Links - [Original model](https://huggingface.co/Qwen/Qwen3.6-27B) - [MLX 8-bit](https://huggingface.co/froggeric/Qwen3.6-27B-MLX-8bit) (LM Studio, Apple Silicon native, no MTP) - [MLX 4-bit](https://huggingface.co/froggeric/Qwen3.6-27B-MLX-4bit) - [Fixed chat templates](https://huggingface.co/froggeric/Qwen-Fixed-Chat-Templates) - [Qwen3.6 blog post](https://qwen.ai/blog?id=qwen3.6-27b) --- ## Authorship | Role | Author | |---|---| | Original model | Alibaba Cloud (Qwen team) | | GGUF conversion + MTP + vision + fixed chat template + quantization | [froggeric](https://huggingface.co/froggeric) | | Importance matrix | [unsloth](https://huggingface.co/unsloth) | ## License Apache-2.0, inherited from Qwen3.6.