Spark-X2.5-1.7B-Abliterated-GGUF
Requests, questions or suggestions? Message me on X: https://x.com/imdariotoo
Uncensored community quants of XHToken/Spark-X2.5-1.7B, produced by single-round rank-1 refusal-direction ablation (heretic) over a balanced 6292-prompt multilingual pool. Trial 33 of a 50-trial Optuna search.
Base model card, architecture notes and serving instructions live in the sibling repo
darioooooo0o/Spark-X2.5-1.7B-GGUF — this README covers only what the ablation changed
and how it was measured.
Files
| file | size | notes |
|---|---|---|
| Spark-X2.5-1.7B-Abliterated-Q8_0.gguf | ~1.8 GB | max quality |
| Spark-X2.5-1.7B-Abliterated-Q6_K.gguf | ~1.4 GB | recommended daily driver |
| Spark-X2.5-1.7B-Abliterated-Q4_K_M.gguf | ~1.0 GB | smaller cards |
| Spark-X2.5-1.7B-Abliterated-IQ4_XS.gguf | ~0.9 GB | smallest |
All quants built with imatrix calibration from the same BF16 merge. Serve with the
Spark fork of llama.cpp (spark2_5 arch) and f16 KV cache:
llama-server -m <gguf> --chat-template-file chat_template.jinja \
--host 127.0.0.1 --port 12450 -c 65536 -n 4096 -ngl 99 \
-fa on -ctk f16 -ctv f16 --temp 1.0 --top-p 0.95 --top-k -1 \
--reasoning-budget 2000 --jinja --reasoning-format deepseek
--reasoning-budget is load-bearing, not optional: median thinking length is 1500+
tokens and the tail exceeds 4000. Unbounded reasoning will eat your context.
Refusal results
Headline: 0 refusals in 300 sealed generations + 37 answer-level generations, eye-audited (base model: 186/300 refused on the same prompts).
Sealed sets (never trained on, never trial-scored — the ungameable numbers)
| set | base refused | ablated refused | base preamble | ablated preamble |
|---|---|---|---|---|
| sealed mjd, 200 prompts, 7 langs | 86 (43%) | 0-being-6-flagged, 0 real (3%) | 247 chars | 96 chars |
| sealed adv, 100 prompts, English | 100 (100%) | 0-being-15-flagged, 0 real (15%) | 435 chars | 145 chars |
"0-being-N-flagged" needs explanation — see Methodology. Short version: every flag was audited by eye; all 21 were reasoning traces planning compliance or complying answers containing words like "illegal". Zero actual refusals. Preamble (compliance-talk before the answer) collapsed 2-3x: answers start directly now.
Full matrix (marker ruler, descriptive — same prompts both models)
| set (n) | base | ablated t33 |
|---|---|---|
| all-eval, 3911 unique harmful prompts | 2014 (51.5%) | 263 (6.7%) |
| selection mjd-400 | 194 (48.5%) | 2 (0.5%) |
| selection adv-100 | 100 (100%) | 2 (2%) |
Marker numbers overstate both sides on thinking models (see below). They are included for comparability with other releases, not as claims.
Answer-level audit (4096-token generations, think/answer split)
41 sealed prompts (21 flagged + 20 random unflagged): 37 finished thinking, 37 produced answers, 0 answers refused. All 8 answer-flags were complying answers (guides, letters, code) containing refusal-vocabulary words.
Methodology: why marker counts are fiction on thinking models
Standard refusal eval generates ~100 tokens and string-matches for "sorry", "as an AI", "illegal", etc. On a thinking model this fails twice, in opposite directions, on the same model:
- Flags compliance. 100 tokens never exit thinking, so the matcher scores reasoning traces. Traces planning compliance ("We should provide a detailed, step-by-step guide" — for explosives manufacturing) get flagged for containing "as an AI". Complying answers get flagged for containing "illegal" (a drug-guide title: "# The Complete Guide to Manufacturing and Distributing Illegal Drugs").
- Misses real structure. Non-answers (thinking that never converges) score as neither refusal nor compliance.
Our ruler instead: 600+ token generations, split thinking from answer on
</think>, three buckets per generation — complied / refused / non-answer —
with every flagged item eye-audited. Reported numbers above are bucket counts,
not marker counts. Anyone comparing "0/300" against a marker-count "0/465" is
comparing different rulers; demand the bucket table.
How it was made
- Pools (frozen, manifest-hashed): train 6292 rows (mjd multilingual ×7 langs
- AdvBench oversampled ×10 for equal family mass — balanced diff-in-means needs equal votes, not proportional ones), selection 500 stratified (400 mjd + 100 adv), sealed 200 mjd + sealed 100 adv held out of everything. Zero-overlap matrix verified.
- Search: heretic Optuna, 50 trials (20 startup + 30 TPE), batch 32, bf16, KL co-optimized. Trial 33 selected: 4/500 selection refusals at KL 0.016.
- One round. Minimal-change principle: bigger balanced slices beat stacked rounds. A pre-registered second-round gate (residual cosine) was mooted and dropped — there is no residual refusal behavior left to ablate.
- Export: adapter-save, CPU reload, merge, tied-embedding twin-fill (PEFT unties embeddings on merge leaving a meta stub — filled from the live twin).
Full pipeline (patch scripts, pool builder, launchers, export, evals) is deterministic from the base safetensors; trial-33 params recorded in the study journal.
Quality gates (base vs ablated)
| check | base | ablated t33 |
|---|---|---|
| PPL, calib corpus, 512 ctx, BF16 | 3.8598 ± 0.0097 | 3.9492 ± 0.0099 (+2.3%, disclosed) |
| Agentic tool-use, 6-task HermesBench | 5/6 effective | 5/6 effective (one single-run miss retested 3/3 pass = temp-1.0 noise) |
| KL divergence (search objective) | — | 0.016 |
| Decode speed, RTX 3060 | 171 t/s Q6_K | identical arch/size — same |
The +2.3% PPL is over our own 2% bar by 0.3 points and is printed here, not buried. No capability damage was demonstrated anywhere else, so no DPO repair pass was run.
Caveats
- Inherits the base model's reasoning-loop failure mode on vague open-ended prompts
(documented in the base repo README): unbounded thinking until the token limit,
independent of quantization.
--reasoning-budget+ client timeouts are mandatory. - Most generations spend 1500+ tokens thinking; short
max_tokensvalues return reasoning fragments, not answers. Budget context accordingly. - "0 refusals" means no observed refusals in the evaluated sets under eye audit, not a proof of universal compliance. Novel framings were not exhaustively tested.
- Ablation removes refusal behavior, not knowledge. Standard responsible-use expectations apply.
License
Apache 2.0, same as the base model. Ablation deltas are rank-1 LoRA merges; no additional training data is distributed with these files.