Achilles1089's picture
docs: MTP block / llama.cpp version compatibility note (fixes confusion in discussion #1)
0b6ae9c verified
|
Raw
History Blame Contribute Delete
5.01 kB
---
license: apache-2.0
base_model: Achilles1089/fable-coder-35B-A3B
pipeline_tag: text-generation
tags:
- code
- agentic
- moe
- qwen3.6
- gguf
- dappit
language:
- en
---
# fable-coder-35B-A3B Β· GGUF
Quantized GGUFs of **[Achilles1089/fable-coder-35B-A3B](https://huggingface.co/Achilles1089/fable-coder-35B-A3B)** β€”
a sovereign, open-weights agentic coding model by **[Dappit Labs](https://dappit.io)**. 35B MoE (β‰ˆ3B active),
Claude Fable-5 / Opus-4.8 agentic distill on an abliterated, Opus-4.7-reasoning-distilled Qwen3.6-35B-A3B.
> Built by **[Dappit Labs](https://dappit.io)** ([@dappitdotio](https://x.com/dappitdotio)) Β· Trained on hardware from **[Manifest Network](https://manifest.network/)**.
See the [main model card](https://huggingface.co/Achilles1089/fable-coder-35B-A3B) for the full write-up,
training details, evaluation, license, and responsible-use notes.
## Quants
Each quant is a single self-contained file β€” download **only the one you need**.
| File | Quant | Size | Fits |
|---|---|---|---|
| [`fable-coder-35B-A3B-Q8_0.gguf`](https://huggingface.co/Achilles1089/fable-coder-35B-A3B-GGUF/blob/main/fable-coder-35B-A3B-Q8_0.gguf) | Q8_0 | ~38GB | 48GB+ GPU / 64GB Mac β€” near-lossless |
| [`fable-coder-35B-A3B-Q6_K.gguf`](https://huggingface.co/Achilles1089/fable-coder-35B-A3B-GGUF/blob/main/fable-coder-35B-A3B-Q6_K.gguf) | Q6_K | ~29GB | 32–48GB |
| [`fable-coder-35B-A3B-Q5_K_M.gguf`](https://huggingface.co/Achilles1089/fable-coder-35B-A3B-GGUF/blob/main/fable-coder-35B-A3B-Q5_K_M.gguf) | Q5_K_M | ~25GB | 32GB |
| [`fable-coder-35B-A3B-Q4_K_M.gguf`](https://huggingface.co/Achilles1089/fable-coder-35B-A3B-GGUF/blob/main/fable-coder-35B-A3B-Q4_K_M.gguf) | Q4_K_M | ~22GB | 24GB (3090/4090) |
## Download
**One quant via the HF CLI** (recommended β€” resumable, no full-repo clone):
```bash
pip install -U "huggingface_hub[cli]"
hf download Achilles1089/fable-coder-35B-A3B-GGUF \
fable-coder-35B-A3B-Q4_K_M.gguf --local-dir .
```
**LM Studio / Jan:** search `fable-coder-35B-A3B` and pick a quant from the list.
**Ollama:** ([ollama.com/achillessafehavencalls/fable-coder](https://ollama.com/achillessafehavencalls/fable-coder) β€” sane defaults + `max_tokens` cap baked in)
```bash
ollama run achillessafehavencalls/fable-coder # Q4_K_M (default)
ollama run achillessafehavencalls/fable-coder:q8_0 # near-lossless
```
**Web:** open the [Files tab](https://huggingface.co/Achilles1089/fable-coder-35B-A3B-GGUF/tree/main) and click any single file to download it.
## Run
```bash
# llama.cpp
llama-server -m fable-coder-35B-A3B-Q6_K.gguf -c 32768 -ngl 99
```
**Thinking is native** β€” the Qwen template opens `<think>` by default; the server returns reasoning in
`reasoning_content` and the answer in `content`. For agentic coding, drive it inside a harness with a
tool-use system prompt + tool registry (treat it like Claude Code).
Quantized from the bf16 master with llama.cpp `llama-quantize`.
## Compatibility β€” MTP block / `llama.cpp` version
These GGUFs keep the upstream **MTP (next-token-prediction) block** β€” `block_count = 41`,
`nextn_predict_layers = 1`, with `blk.40` being that block. This matches the stock
Qwen3.6-35B-A3B layout, and it needs a reasonably current `llama.cpp`.
**Older builds fail to load with:**
```
llama_model_load: error loading model: missing tensor 'blk.40.ssm_conv1d.weight'
```
That is a **loader-version issue, not a bad file**. `blk.40` is the MTP block and is
attention-style *by design* β€” the base Qwen3.6-35B-A3B has no `ssm_conv1d` there either (the
hybrid pattern puts full-attention layers at blocks 3, 7, 11 … 39, with 40 as MTP on top).
Older builds type block 40 as a regular hybrid layer and go looking for SSM tensors.
**Fix: update `llama.cpp`.** Verified loading and generating on build `9950 (961e4b26a)`;
reported failing on `b9075`.
If you are pinned to an older build β€” or on a runtime that cannot load the MTP block β€” you can
strip block 40 locally (`pip install gguf`). You lose only the speculative-decoding head;
normal generation quality is unchanged:
```python
# strip_mtp.py IN.gguf OUT.gguf
import sys
from gguf import GGUFReader, GGUFWriter, GGUFValueType
src, dst = sys.argv[1], sys.argv[2]
r = GGUFReader(src)
w = GGUFWriter(dst, r.fields['general.architecture'].contents())
OVERRIDE = {'qwen35moe.block_count': 40, 'qwen35moe.nextn_predict_layers': 0}
for key, field in r.fields.items():
if key == 'general.architecture' or key.startswith('GGUF.'):
continue
val, types = OVERRIDE.get(key, field.contents()), field.types
if types and types[0] == GGUFValueType.ARRAY:
w.add_key_value(key, val, GGUFValueType.ARRAY, sub_type=types[1])
else:
w.add_key_value(key, val, types[-1])
for t in r.tensors:
if not t.name.startswith('blk.40.'):
w.add_tensor(t.name, t.data, raw_dtype=t.tensor_type)
w.write_header_to_file(); w.write_kv_data_to_file(); w.write_tensors_to_file(); w.close()
```