pearsonkyle commited on
Commit
e570976
·
0 Parent(s):

Squash history: keep current quants (IQ2_XS/IQ2_M/IQ3_M/IQ4_XS) + calibration data

Browse files
.gitattributes ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ Qwopus3.6-27B-Coder-Q2_K-plain-mtp.gguf filter=lfs diff=lfs merge=lfs -text
37
+ Qwopus3.6-27B-Coder-IQ2_XS-imatrix-mtp.gguf filter=lfs diff=lfs merge=lfs -text
38
+ Qwopus3.6-27B-Coder-IQ2_M-imatrix-mtp.gguf filter=lfs diff=lfs merge=lfs -text
39
+ Qwopus3.6-27B-Coder-Q2_K_S-imatrix-mtp.gguf filter=lfs diff=lfs merge=lfs -text
40
+ Qwopus3.6-27B-Coder-IQ2_M.gguf filter=lfs diff=lfs merge=lfs -text
41
+ Qwopus3.6-27B-Coder-IQ2_XS.gguf filter=lfs diff=lfs merge=lfs -text
42
+ Qwopus3.6-27B-Coder-Q2_K_S.gguf filter=lfs diff=lfs merge=lfs -text
43
+ Qwopus3.6-27B-Coder-Q2_K.gguf filter=lfs diff=lfs merge=lfs -text
44
+ Qwopus3.6-27B-Coder-IQ3_M.gguf filter=lfs diff=lfs merge=lfs -text
45
+ Qwopus3.6-27B-Coder-IQ4_XS.gguf filter=lfs diff=lfs merge=lfs -text
MTP/README.md ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # MTP (Multi-Token Prediction) — bundled, not separate
2
+
3
+ Unlike some MTP releases that ship a standalone draft GGUF, **Qwopus3.6 (Qwen3.6
4
+ architecture) bundles its MTP head directly into each trunk GGUF.** There are no
5
+ separate files in this folder by design — the draft head is already inside every
6
+ quant in the parent directory.
7
+
8
+ ## What's inside the GGUFs
9
+
10
+ Each quant carries the model's trained nextn/MTP layer (`blk.64`: a full
11
+ attention + MLP block plus `nextn.eh_proj` and its norms). The trunk (blk.0–63)
12
+ is quantized (2-bit through 4-bit, depending on the variant), but **the entire MTP layer is kept at Q8_0** — near-lossless,
13
+ so the draft head actually drafts well. The MTP layer adds ~0.4 GiB.
14
+
15
+ ## How to use it
16
+
17
+ ```bash
18
+ ./llama-server \
19
+ --model ../Qwopus3.6-27B-Coder-IQ2_M-imatrix-mtp.gguf \
20
+ --spec-type draft-mtp \
21
+ --spec-draft-n-max 1 \
22
+ --n-gpu-layers 999 --ctx-size 16384
23
+ ```
24
+
25
+ - **`--spec-draft-n-max 1`** is optimal: Qwen3.6 exposes exactly one nextn layer
26
+ (`qwen35.nextn_predict_layers = 1`), so higher values give no benefit.
27
+ - **`-np > 1`** (parallel slots) and `--mmproj` are not yet compatible with MTP.
28
+ - MTP uses a little extra memory (~the Q8 draft layer + its KV).
29
+ - Requires a llama.cpp built after the 2026-06 `--spec-type draft-mtp` merge.
30
+
31
+ ## Measured performance
32
+
33
+ On Apple Metal, IQ2_M trunk, n-max=1, holdout-session prompts:
34
+
35
+ | Config | Decode tok/s | Draft acceptance |
36
+ |---|---:|---:|
37
+ | MTP on | 22.9 ± 0.7 | **79.9%** |
38
+ | baseline (off) | 18.1 ± 1.7 | — |
39
+ | **speedup** | **1.26×** | |
40
+
41
+ Speedup is GPU-bandwidth dependent — the upstream Qwen3.6 figure is ~1.66× on an
42
+ RTX 5090. Acceptance was measured on IQ2_M; the Q8 draft head is identical across
43
+ all quants, so acceptance is similar (it verifies against each trunk, so a weaker
44
+ trunk shifts it slightly).
Qwopus3.6-27B-Coder-IQ2_M.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3243c28a4f564e20d31bdbabfd5e990348771274ec8561f41947f209f229eb14
3
+ size 10455912992
Qwopus3.6-27B-Coder-IQ2_XS.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c7118a07a6e30a463b8ac1ba69db4246b8bc449313c3960b80c8375479db8ed1
3
+ size 9541911072
Qwopus3.6-27B-Coder-IQ3_M.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1ee891a72ea1d9745b4ee89f0aeecb9f439dccb22d8a05e7024a0f07845a8859
3
+ size 13032191264
Qwopus3.6-27B-Coder-IQ4_XS.gguf ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e56602fe93b338a072bcc22d778adcda4988d09532f21e092c16260d9e00059a
3
+ size 15533823264
README.md ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ library_name: gguf
3
+ base_model:
4
+ - Jackrong/Qwopus3.6-27B-Coder
5
+ tags:
6
+ - gguf
7
+ - llama.cpp
8
+ - text-generation
9
+ - text-generation-inference
10
+ - transformers
11
+ - quantization
12
+ - quantized
13
+ - imatrix
14
+ - importance-matrix
15
+ - mtp
16
+ - multi-token-prediction
17
+ - speculative-decoding
18
+ - low-bit
19
+ - 2-bit
20
+ - 3-bit
21
+ - 4-bit
22
+ - iq2_xs
23
+ - iq2_m
24
+ - q2_k_s
25
+ - iq3_m
26
+ - iq4_xs
27
+ - qwopus
28
+ - qwen3
29
+ - 27b
30
+ - coder
31
+ - tool-use
32
+ - function-calling
33
+ - long-context
34
+ license: apache-2.0
35
+ language:
36
+ - en
37
+ pipeline_tag: text-generation
38
+ ---
39
+
40
+ <div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; border: 1px solid #99f6e4; border-radius: 16px; box-shadow: 0 10px 15px -3px rgba(0,0,0,0.05), 0 4px 6px -2px rgba(0,0,0,0.05); overflow: hidden; background: #ffffff; margin-bottom: 30px;">
41
+ <div style="background: linear-gradient(135deg, #0d9488 0%, #134e4a 100%); padding: 24px; color: white;">
42
+ <div style="display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px;">
43
+ <h1 style="margin: 0; font-size: 26px; font-weight: 800; display: flex; align-items: center; gap: 12px; color: white; border: none;">🧊 Jackrong/Qwopus3.6-27B-Coder</h1>
44
+ <span style="background: #f59e0b; color: #1c1917; font-size: 11px; font-weight: 700; padding: 4px 10px; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.5px;">imatrix + MTP</span>
45
+ </div>
46
+ </div>
47
+ <div style="display: flex; gap: 8px; flex-wrap: wrap; padding: 12px 24px; background: #f8fafc; border-bottom: 1px solid #e2e8f0;">
48
+ <span style="background: #dbeafe; color: #1e40af; font-size: 11px; font-weight: 700; padding: 4px 10px; border-radius: 20px; border: 1px solid #bfdbfe;">📦 4 quants · 8.9 – 14.5 GiB</span>
49
+ <span style="background: #d1fae5; color: #065f46; font-size: 11px; font-weight: 700; padding: 4px 10px; border-radius: 20px; border: 1px solid #a7f3d0;"> IQ2_XS · IQ2_M · IQ3_M · IQ4_XS</span>
50
+ <span style="background: #ede9fe; color: #5b21b6; font-size: 11px; font-weight: 700; padding: 4px 10px; border-radius: 20px; border: 1px solid #ddd6fe;">⚡ MTP bundled (Q8) · 1.26× · 79.9% accept · @n=1</span>
51
+ <span style="background: #fce7f3; color: #9d174d; font-size: 11px; font-weight: 700; padding: 4px 10px; border-radius: 20px; border: 1px solid #fbcfe8;">🏗️ llama.cpp 32782998 / f3e1828</span>
52
+ <span style="background: #fef3c7; color: #92400e; font-size: 11px; font-weight: 700; padding: 4px 10px; border-radius: 20px; border: 1px solid #fde68a;">🏅 IQ4_XS: KLD 0.004 · top_p 94%</span>
53
+ </div>
54
+ <div style="padding: 24px; display: flex; flex-direction: column; gap: 20px;">
55
+ <div style="background: #f0fdfa; border-left: 5px solid #0d9488; padding: 16px; border-radius: 0 8px 8px 0;">
56
+ <h3 style="margin: 0 0 8px 0; font-size: 15px; color: #115e59; font-weight: 700; display: flex; align-items: center; gap: 6px;"><span>🧊</span> What this is</h3>
57
+ <p style="margin: 0; font-size: 13px; color: #334155; line-height: 1.7;">imatrix calibrated quantizations of <b>Jackrong/Qwopus3.6-27B-Coder</b> spanning <b>2.8 – 4.5 bits per weight</b> — from aggressive 2-bit (IQ2_XS/IQ2_M/Q2_K_S) up to near-lossless <b>IQ4_XS</b> (KLD 0.004, top_p 94%) — each calibrated from real usage logs + wiki text, and each shipping the model's own <b>Multi-Token-Prediction (MTP) draft head bundled in at Q8_0</b> for built-in speculative decoding. The MTP head — kept near-lossless at Q8 while the trunk is quantized — drafts the next token for a <b>~1.26× decode speedup</b> at <b>79.9% acceptance</b>, no separate draft model required. Plain GGUF, no custom runtime.</p>
58
+ </div>
59
+ <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-top: 10px;">
60
+ <div style="border: 1px solid #e2e8f0; padding: 14px; border-radius: 8px; background: #fafafa; box-shadow: inset 0 2px 4px rgba(0,0,0,0.02);"><span style="font-weight: 700; color: #115e59; font-size: 12px; display: block; margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.5px;">📉 3.5–5.7× smaller on disk</span><span style="font-size: 13px; color: #4b5563; line-height: 1.5;">8.9–14.5 GiB on disk (incl. the bundled MTP head) vs 50.9 GiB for FP16. Tuned for English + Python agentic-coding workloads (see calibration scope below).</span></div>
61
+ <div style="border: 1px solid #e2e8f0; padding: 14px; border-radius: 8px; background: #fafafa; box-shadow: inset 0 2px 4px rgba(0,0,0,0.02);"><span style="font-weight: 700; color: #115e59; font-size: 12px; display: block; margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.5px;">⚡ 1.26× faster decode</span><span style="font-size: 13px; color: #4b5563; line-height: 1.5;">Built-in MTP speculative decoding: 22.9 vs 18.1 tok/s on Metal (IQ2_M, n-max=1), 79.9% draft acceptance.</span></div>
62
+ </div>
63
+ </div>
64
+ </div>
65
+
66
+ ## 🧰 1. Files & comparison
67
+
68
+ Calibrated imatrix-quants, each with the MTP head bundled at Q8_0. Plain Q2_K (no imatrix) is the no-calibration anchor. FP16 reference: 50.90 GiB (not included; fetch from [`Jackrong/Qwopus3.6-27B-Coder`](https://huggingface.co/Jackrong/Qwopus3.6-27B-Coder)).
69
+
70
+ | | FP16 (reference) | Q2_K (plain) | IQ2_XS (hybrid) | IQ2_M (hybrid) | Q2_K_S (hybrid) | IQ3_M (hybrid) | IQ4_XS (hybrid) |
71
+ |---|---|---|---|---|---|---|---|
72
+ | **File** | n/a | [Q2_K.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-Q2_K.gguf) | [IQ2_XS.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-IQ2_XS.gguf) | [IQ2_M.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-IQ2_M.gguf) | [Q2_K_S.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-Q2_K_S.gguf) | [IQ3_M.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-IQ3_M.gguf) | [IQ4_XS.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-IQ4_XS.gguf) |
73
+ | **Quant** | FP16 | Q2_K | IQ2_XS | **IQ2_M** | Q2_K_S | IQ3_M | **IQ4_XS** |
74
+ | **Agent Quality** | | ❌ | ❌ | ⭐ | ❌ | ⭐⭐ | ⭐⭐⭐ |
75
+ | **Technique** | none (reference) | plain (no imatrix) | hybrid imatrix | **hybrid imatrix** | hybrid imatrix | hybrid imatrix | **hybrid imatrix** |
76
+ | **Size (GiB)** | 50.90 | 10.40 | 8.89 | **9.74** | 9.96 | 12.14 | **14.47** |
77
+ | **BPW** | 16.000 | 3.269 | 2.794 | **3.062** | 3.133 | 3.816 | **4.549** |
78
+ | | | | | | | | |
79
+ | **PPL (general)** | 6.4826 | 5.5835 | 9.8866 | **8.5961** | 8.0091 | 8.3112 | **6.5729** |
80
+ | **KLD med (general)** | 0.00000 | 0.1154 | 0.0950 | **0.0535** | 0.0566 | 0.0191 | **0.0041** |
81
+ | **top_p (general)** | 100.00% | 79.29% | 78.87% | **83.23%** | 83.32% | 87.95% | **94.04%** |
82
+
83
+
84
+
85
+ <div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; border: 1px solid #fde68a; border-radius: 12px; background: #fffbeb; padding: 16px; margin: 16px 0; color: #92400e; font-size: 13px; line-height: 1.7;">
86
+ <b>⚠️ Caveat.</b> Low-bit (2.8–4.5 bpw) quants of a 27B model. The 2-bit rows are strong for their size but trade real fidelity; <b>IQ4_XS</b> is near-lossless (KLD 0.004) and the closest substitute for FP16 / Q4_K_M when you can spare ~14.5 GiB. Reach for the smaller rows when memory is the binding constraint.
87
+ </div>
88
+
89
+ <div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; border: 1px solid #bfdbfe; border-radius: 12px; background: #eff6ff; padding: 16px; margin: 16px 0; color: #1e3a8a; font-size: 13px; line-height: 1.7;">
90
+ <b>📋 Calibration scope — English &amp; Python, agentic coding.</b> The importance matrix (and the windowed packing that shaped it) was calibrated on <b>real agentic-coding sessions that are overwhelmingly English-language and Python-centric</b>, captured from <b>Claude Code, opencode, and qwen code</b>. At low bit-widths the codebook's precision is spent where those logs put it: English prompts and Python-flavored tool use (read / edit / bash / grep / write, etc.). Expect <b>weaker fidelity on other natural languages, non-Python ecosystems, and non-coding / general-chat workloads</b>.
91
+ </div>
92
+
93
+
94
+ ### SWE-rebench Results
95
+
96
+ The agentic coding capabilities of each quant were evaluated on 10 real-world coding issues from the [nebius/SWE-rebench](https://huggingface.co/datasets/nebius/SWE-rebench) using the [OpenAI Agents SDK](https://github.com/openai/openai-agents-python) pointed at a local [llama-server](https://github.com/ggml-org/llama.cpp). For each nebius/SWE-rebench issue, the agent gets the problem statement and a live bash tool that shells into a dedicated Docker container with the repo pre-checked out at the failing commit. It iterates by reading files, running tests, editing code until it produces a git diff or hits the step limit. The patch is then graded by actually running the repo's FAIL\_TO\_PASS test suite inside the container, so pass/fail is real execution, not fuzzy matching. We tried using [mini SWE-Agent](https://github.com/SWE-agent/mini-swe-agent) but it wasn't adequately resolving issues despite have a similar patch rate.
97
+
98
+ |Metric|Q2\_K|IQ2\_XS|**IQ2\_M**|Q2\_K\_S|Q5\_K\_M|
99
+ |:-|:-|:-|:-|:-|:-|
100
+ |File|[Q2\_K.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-Q2_K.gguf)|[IQ2\_XS.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-IQ2_XS.gguf)|**[IQ2\_M.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-IQ2_M.gguf)**|[Q2\_K\_S.gguf](https://huggingface.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF/resolve/main/Qwopus3.6-27B-Coder-Q2_K_S.gguf)|[Q5\_K\_M.gguf](https://huggingface.co/Jackrong/Qwopus3.6-27B-Coder-GGUF/resolve/main/Qwopus3.6-27B-Coder-Q5_K_M.gguf)|
101
+ |Technique|none|imatrix|**imatrix**|imatrix|none|
102
+ |Size (GiB)|10.40|8.89|**9.74**|9.96|19.50|
103
+ |Repetitions|3|3|**3**|3|3|
104
+ |Issues|10|10|**10**|10|10|
105
+ |Patch Rate|88±12%|70±10%|**100%**|93±6%|100%|
106
+ |Pass Rate|30±10%|27±6%|**63±6%**|57±6%|57±6%|
107
+ |Max Turns|27±15%|57±25%|**13±15%**|10±17%|0%|
108
+ |Mean Steps|58.5±7.6|73.1±15.1|**51.6±8.3**|46.7±8.1|38.6±1.3|
109
+ |Mean Tokens|1,335K±253K|1,779K±137K|**784K±260K**|922K±195K|588K±57K|
110
+ |Tool Error Rate|14.6±6.4%|9.5±3.6%|**12.6±1.8%**|8.9±1.5%|12.1±0.2%|
111
+ |Mean Wall|415±98s|558±182s|**381±66s**|425±259s|307±34s|
112
+
113
+ >Sampling Parameters: `temperature=0.25, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=0.0, repetition_penalty=1.0, max_tokens=32768, ctx=131072, thinking=true, mtp=true, mtp_draft_n_max=2`. Tested on 4060Ti (16Gb)
114
+
115
+ Definitions:
116
+
117
+ * `patched` \- how many of the 10 issues did the agent produce a patch for (even if it didn't resolve)?
118
+ * `resolved` \- how many of the 10 issues had patches that passed all FAIL\_TO\_PASS tests?
119
+ * `max_turns` \- how many of the 10 issues hit the 100-step cap without resolving?
120
+ * `mean_steps` \- average number of agentic steps taken (shelling into Docker, reading files,editing code counts as steps)
121
+ * `mean_tokens` \- average number of tokens generated across the entire agentic episode
122
+ * `tool_err_rate` \- how often the agent produced an invalid shell command that couldn't be executed (syntax errors, wrong file paths, etc.)
123
+ * `mean_wall` \- average wall-clock time per episode (capped at 2 hours for those that hit the step limit)
124
+
125
+ Overall, the `IQ2_M` quant achieves a strong 63% pass rate on this agentic coding benchmark, which is impressive for a 2-bit model. The high patch rate across all quants suggests that even the weaker ones can still generate plausible patches, but the lower pass rates and higher max turn rates indicate that many of those patches aren't actually resolving the issues. The `IQ2_M` quant behaves as good as the `Q5_K_M` albiet with \~20% more steps and tokens, however those additional steps and iterations look to be effective ones that are helping it self-correct and resolve more issues, rather than just looping. When the quant has a high number of mean tokens in combination with a high max turn rate that usually indicates the agent is stuck in a loop. It's worth pointing out that Q5KM never hits its max turn (100) when solving these issues. **We recommend running these quants with a repetition penalty of >1 to break it out of loops.** Given the variation induced from sampling, we run a few repetitions of each quant and report the mean ± standard deviation across those runs.
126
+
127
+ ---
128
+
129
+ ## 🔬 2. How they were made
130
+
131
+ <div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; display: flex; flex-direction: column; gap: 16px; margin-bottom: 24px;">
132
+ <div style="border: 1px solid #99f6e4; border-radius: 12px; overflow: hidden; background: #ffffff;">
133
+ <div style="background: linear-gradient(135deg, #0d9488 0%, #115e59 100%); padding: 12px 16px; color: white; font-weight: 700; font-size: 14px;">🧮 2.1 Hybrid importance matrix</div>
134
+ <div style="padding: 16px; font-size: 13px; color: #334155; line-height: 1.7;">
135
+ <p style="margin: 0 0 10px 0;">At low bit-widths the quantizer must decide <i>where</i> to spend its limited precision. An <b>importance matrix</b> measures, per input channel, how much that channel drives each layer's output on a calibration corpus, and tells <code>llama-quantize</code> to preserve the high-impact channels. This release uses a <b>hybrid</b> imatrix blending activation energy <code>E[a²]</code> with weight-column energy <code>‖W[:, c]‖² · E[a²]</code>, collected at ctx=4096. Linear-attention / SSM tensors (this is a Qwen3.6 hybrid architecture) pass through with raw <code>E[a²]</code>. The output is a standard GGUF with no runtime overhead.</p>
136
+ </div>
137
+ </div>
138
+ <div style="border: 1px solid #ddd6fe; border-radius: 12px; overflow: hidden; background: #ffffff;">
139
+ <div style="background: linear-gradient(135deg, #7c3aed 0%, #5b21b6 100%); padding: 12px 16px; color: white; font-weight: 700; font-size: 14px;">⚡ 2.2 Bundled MTP (multi-token prediction)</div>
140
+ <div style="padding: 16px; font-size: 13px; color: #334155; line-height: 1.7;">
141
+ <p style="margin: 0 0 10px 0;">Qwopus3.6 ships a trained <b>MTP draft head</b> (one nextn layer, <code>blk.64</code>) that predicts the next token from the trunk's hidden state. llama.cpp runs it as built-in speculative decoding (<code>--spec-type draft-mtp</code>): the head drafts, the trunk verifies in parallel, and accepted drafts skip a full decode step.</p>
142
+ <p style="margin: 0 0 10px 0;">We <b>keep the MTP head near-lossless at Q8_0</b> while the trunk is quantized — the head is tiny relative to the model, and a low-bit draft head would draft poorly. The same Q8 head ships in all six quants. Measured on Metal (IQ2_M, n-max=1, holdout prompts):</p>
143
+ <table style="width:100%; border-collapse:collapse; font-size:12px; margin:0;">
144
+ <thead><tr style="background:#f5f3ff;"><th style="padding:8px 10px; border:1px solid #ddd6fe; text-align:left; color:#5b21b6;">Config</th><th style="padding:8px 10px; border:1px solid #ddd6fe; text-align:left; color:#5b21b6;">Decode tok/s</th><th style="padding:8px 10px; border:1px solid #ddd6fe; text-align:left; color:#5b21b6;">Draft acceptance</th></tr></thead>
145
+ <tbody>
146
+ <tr><td style="padding:8px 10px; border:1px solid #ddd6fe;"><b>MTP on</b> (n-max=1)</td><td style="padding:8px 10px; border:1px solid #ddd6fe;"><b>22.9 ± 0.7</b></td><td style="padding:8px 10px; border:1px solid #ddd6fe;"><b>79.9%</b></td></tr>
147
+ <tr><td style="padding:8px 10px; border:1px solid #ddd6fe;">baseline (off)</td><td style="padding:8px 10px; border:1px solid #ddd6fe;">18.1 ± 1.7</td><td style="padding:8px 10px; border:1px solid #ddd6fe;">—</td></tr>
148
+ </tbody>
149
+ </table>
150
+ <p style="margin: 10px 0 0 0;"><b>→ 1.26× speedup</b> on Metal. Qwen3.6 exposes <b>one</b> nextn layer, so <code>--spec-draft-n-max 1</code> is optimal (higher values don't help). GPU bandwidth matters — the upstream Qwen3.6 figure is ~1.66× on an RTX 5090. See <a href="./MTP/README.md"><code>MTP/README.md</code></a> for details.</p>
151
+ </div>
152
+ </div>
153
+ <div style="border: 1px solid #bfdbfe; border-radius: 12px; overflow: hidden; background: #ffffff;">
154
+ <div style="background: linear-gradient(135deg, #2563eb 0%, #1e3a8a 100%); padding: 12px 16px; color: white; font-weight: 700; font-size: 14px;">📚 2.3 Calibration & evaluation data</div>
155
+ <div style="padding: 16px; font-size: 13px; color: #334155; line-height: 1.7;">
156
+ <p style="margin: 0 0 10px 0;">Calibration and every eval corpus are disjoint by construction — the tool-call eval is the held-out 10% of sessions, windowed exactly like calibration but never seen by it — so §1 measures generalization, not fit. All shipped under <code>calibration_data/</code>.</p>
157
+ <table style="width:100%; border-collapse:collapse; font-size:12px; margin:0;">
158
+ <thead><tr style="background:#eff6ff;"><th style="padding:8px 10px; border:1px solid #bfdbfe; text-align:left; color:#1e3a8a;">Corpus</th><th style="padding:8px 10px; border:1px solid #bfdbfe; text-align:left; color:#1e3a8a;">Source</th><th style="padding:8px 10px; border:1px solid #bfdbfe; text-align:left; color:#1e3a8a;">Used for</th></tr></thead>
159
+ <tbody>
160
+ <tr><td style="padding:8px 10px; border:1px solid #bfdbfe;"><b>Calibration</b></td><td style="padding:8px 10px; border:1px solid #bfdbfe;">~500k tokens of usage-log text (windowed) + all of <code>wiki.test.raw</code></td><td style="padding:8px 10px; border:1px solid #bfdbfe;">hybrid imatrix collection</td></tr>
161
+ <tr><td style="padding:8px 10px; border:1px solid #bfdbfe;"><b>Eval — tools</b> (in-distribution)</td><td style="padding:8px 10px; border:1px solid #bfdbfe;">held-out logtrain session slice (10%), windowed like calibration but disjoint from it</td><td style="padding:8px 10px; border:1px solid #bfdbfe;"><b>§1 <i>tools</i> columns (PPL · KLD · top_p)</b></td></tr>
162
+ <tr><td style="padding:8px 10px; border:1px solid #bfdbfe;"><b>Eval — general</b></td><td style="padding:8px 10px; border:1px solid #bfdbfe;"><code>combined_en_tiny</code> (broad English) from the same eaddario dataset</td><td style="padding:8px 10px; border:1px solid #bfdbfe;"><b>§1 <i>gen</i> columns (PPL · KLD · top_p)</b></td></tr>
163
+ </tbody>
164
+ </table>
165
+ </div>
166
+ </div>
167
+ </div>
168
+
169
+ ---
170
+ ## 🚀 3. Usage
171
+
172
+ ### Quick start with Ollama
173
+
174
+ Each quant is exposed as a tag (the filename's quant suffix):
175
+
176
+ ```bash
177
+ ollama run hf.co/pearsonkyle/Qwopus3.6-27B-Coder-2bit-MTP-GGUF:IQ2_M
178
+ # also: :IQ4_XS · :IQ3_M · :Q2_K_S · :IQ2_XS · :Q2_K
179
+ ```
180
+
181
+ ### Building llama.cpp from source (GPU)
182
+
183
+ ```bash
184
+ apt-get update && apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
185
+ git clone https://github.com/ggml-org/llama.cpp
186
+ cmake llama.cpp -B llama.cpp/build -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON # -DGGML_CUDA=OFF for CPU/Metal
187
+ cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-server
188
+ cp llama.cpp/build/bin/llama-* llama.cpp/
189
+ ```
190
+
191
+ > **MTP needs a recent llama.cpp** — `--spec-type draft-mtp` support was merged in 2026-06. Build from current `master`.
192
+
193
+ ### Running the server with MTP speculative decoding
194
+
195
+ ```bash
196
+ ./llama-server \
197
+ --model Qwopus3.6-27B-Coder-IQ2_M.gguf \
198
+ --ctx-size 16384 \
199
+ --n-gpu-layers 999 \
200
+ --spec-type draft-mtp \
201
+ --spec-draft-n-max 1 \
202
+ --flash-attn on \
203
+ --cache-type-k q8_0 --cache-type-v q8_0 \
204
+ --host 0.0.0.0 --port 1234
205
+ ```
206
+
207
+ Drop `--spec-type draft-mtp --spec-draft-n-max 1` to run without MTP.
208
+
209
+ ### Querying via the OpenAI-compatible API
210
+
211
+ ```python
212
+ import json, urllib.request
213
+
214
+ def ask(content, max_tokens=256):
215
+ body = {
216
+ "messages": [{"role": "user", "content": content}],
217
+ "max_tokens": max_tokens,
218
+ # Coder variant emits <think> reasoning. Set enable_thinking False
219
+ # (or raise max_tokens) so the answer lands in "content".
220
+ "chat_template_kwargs": {"enable_thinking": False},
221
+ }
222
+ req = urllib.request.Request("http://127.0.0.1:1234/v1/chat/completions",
223
+ json.dumps(body).encode(),
224
+ {"Content-Type": "application/json"})
225
+ return json.loads(urllib.request.urlopen(req).read())["choices"][0]["message"]["content"]
226
+
227
+ print(ask("Write a Python function that reverses a linked list."))
228
+ ```
229
+
230
+ ---
231
+
232
+ ## 🪪 4. License & attribution
233
+
234
+ * Inherits its license from the base model [`Jackrong/Qwopus3.6-27B-Coder`](https://huggingface.co/Jackrong/Qwopus3.6-27B-Coder). **Confirm the exact terms and update the frontmatter `license:` before publishing.**
235
+ * Base weights: [`Jackrong/Qwopus3.6-27B-Coder`](https://huggingface.co/Jackrong/Qwopus3.6-27B-Coder) (full finetune of Qwen3.6-27B, ships its own MTP head).
236
+ * Calibration + quantization performed locally with [**Quant-Tuner**](https://github.com/pearsonkyle/Quant-Tuner); vendored llama.cpp at commit `32782998` (2-bit rows: Q2_K, IQ2_XS, IQ2_M, Q2_K_S) and `f3e1828` (IQ3_M, IQ4_XS). All six share the same hybrid imatrix + calibration corpora.
237
+ * Calibration data (usage logs) scraped using [**LogMiner**](https://github.com/pearsonkyle/LogMiner).
calibration_data/README.md ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Calibration data
2
+
3
+ Produced by `scripts/build_corpora.py` + `scripts/exp041_quants_qwopus36.py` under
4
+ `out/exp-041/corpora/`, reproduced here for transparency. The usage-log text is packed
5
+ with a **stub + multi-window** scheme (system-prompt prose trimmed to a stub, each
6
+ session sliced into windows of real tool-call turns) so the imatrix sees the agentic
7
+ decision channels rather than boilerplate.
8
+
9
+ | File | Role | Source |
10
+ |---|---|---|
11
+ | `corpus.cal.txt` | hybrid imatrix collection | all of `wiki.test.raw` + ~500k tokens from the logtrain **train** slice (windowed) |
12
+ | `corpus.eval.tools.txt` | **§1 tools columns** (PPL · KLD · top_p, in-distribution) | logtrain **holdout** slice (10%), windowed like calibration but disjoint from it |
13
+ | `corpus.eval.general.txt` | **§1 gen columns** (PPL · KLD · top_p, free-text check) | `combined_en_tiny` (broad English) from `eaddario/imatrix-calibration` |
14
+
15
+ The folder also ships `corpus.eval.txt` (external code+math+tools from the same eaddario
16
+ dataset), retained for reference but no longer used in §1.
17
+
18
+ `corpora_audit.json` records token/session counts and per-source breakdown, and asserts
19
+ the logtrain train/test/holdout fingerprints are disjoint.
20
+
21
+ Every eval corpus is disjoint from calibration — the tool-call eval is the held-out
22
+ session slice that the calibration `train` slice never touches — so §1 measures
23
+ generalization, not fit. Note `corpus.eval.tools.txt` is chat-templated and
24
+ `llama-perplexity` lacks `--parse-special`, so its KLD is for **quant-vs-quant**
25
+ comparison (all rows vs FP16 on the identical file), not absolute cross-corpus PPL.
calibration_data/corpora_audit.json ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "seed": 42,
3
+ "logtrain_splits": {
4
+ "train": 200,
5
+ "test": 25,
6
+ "holdout": 25
7
+ },
8
+ "wiki_bytes": 1287656,
9
+ "supplement": null,
10
+ "external_eval_repo": "eaddario/imatrix-calibration",
11
+ "external_eval_domains": [
12
+ "code_small",
13
+ "math_small",
14
+ "tools_small"
15
+ ],
16
+ "calibration": {
17
+ "path": "out/exp-041/corpora/corpus.cal.txt",
18
+ "target_logtrain_tokens": 500000,
19
+ "actual_logtrain_tokens": 500063,
20
+ "n_logtrain_sessions": 182,
21
+ "pack_audit": {
22
+ "total_tokens": 500063,
23
+ "chunk_count": 182,
24
+ "session_count": 36,
25
+ "truncated_sessions": 0,
26
+ "per_session_cap": 3500,
27
+ "tokens_per_source": {
28
+ "claude": 210796,
29
+ "opencode": 56651,
30
+ "qwen": 232616
31
+ },
32
+ "tokens_per_length_bucket": {
33
+ "long": 255958,
34
+ "medium": 164677,
35
+ "short": 79428
36
+ },
37
+ "tokens_per_stratum": {
38
+ "claude/long": 106091,
39
+ "claude/medium": 67490,
40
+ "claude/short": 37215,
41
+ "opencode/long": 44289,
42
+ "opencode/medium": 12362,
43
+ "qwen/long": 105578,
44
+ "qwen/medium": 84825,
45
+ "qwen/short": 42213
46
+ },
47
+ "sessions_available_per_stratum": {
48
+ "qwen/short": 12,
49
+ "qwen/medium": 53,
50
+ "qwen/long": 70,
51
+ "claude/short": 10,
52
+ "claude/long": 15,
53
+ "claude/medium": 36,
54
+ "opencode/medium": 1,
55
+ "opencode/long": 3
56
+ },
57
+ "sessions_consumed_per_stratum": {
58
+ "claude/long": 6,
59
+ "claude/medium": 6,
60
+ "claude/short": 6,
61
+ "opencode/long": 3,
62
+ "opencode/medium": 1,
63
+ "qwen/long": 6,
64
+ "qwen/medium": 5,
65
+ "qwen/short": 5
66
+ },
67
+ "windowing": {
68
+ "system_prose_budget": 256,
69
+ "full_prose_quota": 1,
70
+ "max_windows_per_session": 8,
71
+ "windows_emitted": 182,
72
+ "sessions_kept": 36,
73
+ "avg_windows_per_session": 5.06,
74
+ "unique_system_prompts": 3,
75
+ "full_prose_sessions": 3,
76
+ "stub_sessions": 33,
77
+ "oversize_windows": 19,
78
+ "system_prose_tokens": 55417,
79
+ "body_tokens": 444646,
80
+ "tool_turn_token_share": 0.8892
81
+ }
82
+ }
83
+ },
84
+ "validation": {
85
+ "path": "out/exp-041/corpora/corpus.val.txt",
86
+ "target_logtrain_tokens": 10000,
87
+ "actual_logtrain_tokens": 9531,
88
+ "n_logtrain_sessions": 8,
89
+ "pack_audit": {
90
+ "total_tokens": 9531,
91
+ "chunk_count": 8,
92
+ "session_count": 3,
93
+ "truncated_sessions": 0,
94
+ "per_session_cap": 3500,
95
+ "tokens_per_source": {
96
+ "claude": 8621,
97
+ "qwen": 910
98
+ },
99
+ "tokens_per_length_bucket": {
100
+ "long": 3460,
101
+ "medium": 6071
102
+ },
103
+ "tokens_per_stratum": {
104
+ "claude/long": 3460,
105
+ "claude/medium": 5161,
106
+ "qwen/medium": 910
107
+ },
108
+ "sessions_available_per_stratum": {
109
+ "qwen/long": 9,
110
+ "claude/medium": 7,
111
+ "qwen/medium": 6,
112
+ "claude/long": 2,
113
+ "qwen/short": 1
114
+ },
115
+ "sessions_consumed_per_stratum": {
116
+ "claude/long": 2,
117
+ "claude/medium": 7,
118
+ "qwen/long": 9,
119
+ "qwen/medium": 6,
120
+ "qwen/short": 1
121
+ },
122
+ "windowing": {
123
+ "system_prose_budget": 256,
124
+ "full_prose_quota": 1,
125
+ "max_windows_per_session": 8,
126
+ "windows_emitted": 8,
127
+ "sessions_kept": 3,
128
+ "avg_windows_per_session": 2.67,
129
+ "unique_system_prompts": 2,
130
+ "full_prose_sessions": 1,
131
+ "stub_sessions": 2,
132
+ "oversize_windows": 0,
133
+ "system_prose_tokens": 4343,
134
+ "body_tokens": 5188,
135
+ "tool_turn_token_share": 0.5443
136
+ }
137
+ },
138
+ "supplement_source": null
139
+ },
140
+ "eval": {
141
+ "path": "out/exp-041/corpora/corpus.eval.txt",
142
+ "target_tokens_per_domain": 30000,
143
+ "domains": {
144
+ "code_small": {
145
+ "path": "out/exp-041/corpora/corpus.eval.code_small.txt",
146
+ "target_tokens": 30000,
147
+ "actual_tokens": 30000,
148
+ "n_rows": 1,
149
+ "source_parquet": "out/external/imatrix-calibration/code_small.parquet"
150
+ },
151
+ "math_small": {
152
+ "path": "out/exp-041/corpora/corpus.eval.math_small.txt",
153
+ "target_tokens": 30000,
154
+ "actual_tokens": 30000,
155
+ "n_rows": 1,
156
+ "source_parquet": "out/external/imatrix-calibration/math_small.parquet"
157
+ },
158
+ "tools_small": {
159
+ "path": "out/exp-041/corpora/corpus.eval.tools_small.txt",
160
+ "target_tokens": 30000,
161
+ "actual_tokens": 30000,
162
+ "n_rows": 1,
163
+ "source_parquet": "out/external/imatrix-calibration/tools_small.parquet"
164
+ }
165
+ }
166
+ },
167
+ "eval_general": {
168
+ "path": "out/exp-041/corpora/corpus.eval.general.txt",
169
+ "domain": "combined_en_tiny",
170
+ "target_tokens": 30000,
171
+ "actual_tokens": 30000,
172
+ "n_rows": 1,
173
+ "source_parquet": "out/external/imatrix-calibration/combined_en_tiny.parquet"
174
+ },
175
+ "eval_tools": {
176
+ "path": "out/exp-041/corpora/corpus.eval.tools.txt",
177
+ "source_slice": "logtrain.holdout",
178
+ "target_tokens": 30000,
179
+ "actual_tokens": 30542,
180
+ "n_logtrain_sessions": 11,
181
+ "pack_audit": {
182
+ "total_tokens": 30542,
183
+ "chunk_count": 11,
184
+ "session_count": 4,
185
+ "truncated_sessions": 0,
186
+ "per_session_cap": 3500,
187
+ "tokens_per_source": {
188
+ "claude": 24425,
189
+ "qwen": 6117
190
+ },
191
+ "tokens_per_length_bucket": {
192
+ "long": 9481,
193
+ "medium": 16751,
194
+ "short": 4310
195
+ },
196
+ "tokens_per_stratum": {
197
+ "claude/long": 3364,
198
+ "claude/medium": 16751,
199
+ "claude/short": 4310,
200
+ "qwen/long": 6117
201
+ },
202
+ "sessions_available_per_stratum": {
203
+ "qwen/medium": 8,
204
+ "claude/long": 3,
205
+ "claude/medium": 3,
206
+ "qwen/long": 10,
207
+ "claude/short": 1
208
+ },
209
+ "sessions_consumed_per_stratum": {
210
+ "claude/long": 1,
211
+ "claude/medium": 1,
212
+ "claude/short": 1,
213
+ "qwen/long": 1,
214
+ "qwen/medium": 0
215
+ },
216
+ "windowing": {
217
+ "system_prose_budget": 256,
218
+ "full_prose_quota": 1,
219
+ "max_windows_per_session": 8,
220
+ "windows_emitted": 11,
221
+ "sessions_kept": 4,
222
+ "avg_windows_per_session": 2.75,
223
+ "unique_system_prompts": 2,
224
+ "full_prose_sessions": 2,
225
+ "stub_sessions": 2,
226
+ "oversize_windows": 1,
227
+ "system_prose_tokens": 10017,
228
+ "body_tokens": 20525,
229
+ "tool_turn_token_share": 0.672
230
+ }
231
+ },
232
+ "parse_special_caveat": "quant-vs-quant only (no --parse-special)"
233
+ }
234
+ }
calibration_data/corpus.cal.txt ADDED
The diff for this file is too large to render. See raw diff
 
calibration_data/corpus.eval.general.txt ADDED
The diff for this file is too large to render. See raw diff
 
calibration_data/corpus.eval.tools.txt ADDED
The diff for this file is too large to render. See raw diff
 
calibration_data/corpus.eval.txt ADDED
The diff for this file is too large to render. See raw diff