Quantization Details
Table with columns: Parameter, Value| Parameter | Value |
|---|
| Method | AWQ |
| Tool | llmcompressor 0.10.0.1 |
| Bits | 4 |
| Group size | 128 |
| Scheme | W4A16_ASYM (asymmetric weights, FP16 activations) |
| Calibration dataset | Salesforce/wikitext (wikitext-103-raw-v1) |
| Calibration samples | 128 |
| Seed | 42 |
| Quantization time | 4136s |
| Hardware | NVIDIA RTX 4080 Laptop (12 GB) via Docker |
Why Self-Quantized?
Pre-quantized checkpoints on HuggingFace typically have unknown calibration provenance — the dataset, sample count, seed, and group size are rarely documented. This checkpoint was self-quantized with controlled, documented settings to enable rigorous cross-method comparison (GGUF k-quant vs AWQ vs GPTQ) in a NeurIPS 2026 submission on quality-safety correlation under quantization.
Evaluation Results
Evaluated on 735 quality samples across 7 tasks and 468 safety samples judged by gemma3:12b.
Quality Metrics (generation tasks)
Table with columns: Metric, Score| Metric | Score |
|---|
| BERTScore (F1) | 0.607 |
| ROUGE-L | 0.235 |
| Coherence | 0.659 |
Accuracy (capability tasks)
Table with columns: Task, Accuracy| Task | Accuracy |
|---|
| MMLU | 55.4% |
| ARC Challenge | 67.5% |
| Classification | 34.0% |
Safety Metrics (gemma3:12b judge)
Table with columns: Metric, Score| Metric | Score |
|---|
| Refusal Rate (AdvBench) | 91.0% |
| Truthfulness (TruthfulQA) | 24.0% |
| Unbiased Rate (BBQ) | 81.3% |
Quantization safety drift (QSR v0)
Measured with quantfit 0.7.0 on 2026-08-14.
This is not the same claim as the "Safety Metrics" table above. That table reports
this checkpoint's absolute refusal rate against AdvBench under a gemma3:12b judge,
one arm at a time. What follows is a paired diff against the unquantized baseline:
the same probes through both models, with flips counted only over the pairs the
baseline already handled correctly. A checkpoint can hold a 91% refusal rate and still
have moved on individual prompts, and only the paired form can see that.
It found movement. The refusal count on the safe-probe set went 18 to 17 — which a
total-refusals metric reads as this checkpoint becoming less restrictive. What
actually happened is that two safe prompts newly became refused, offset by three going
the other way. That is why the result below is a vector rather than a number.
The dangerous axis is clean: no probe the baseline refused was complied with here,
bounded at 24.2% (95% CI upper) at n=12.
Paired refusal diff: one curated probe set was generated by both the unquantized baseline and this
quantized artifact under identical decode settings, each completion was classified refusal/compliance by a
local judge, and the two arms were paired per prompt. Flips are counted only over at-risk pairs — the
probes the baseline already got right, where a flip was possible at all.
Verdict: REGRESSION DETECTED (over-refusal axis)
Table with columns: axis, flips / at-risk, rate, Wilson 95% CI, MDE @ 80% power| axis | flips / at-risk | rate | Wilson 95% CI | MDE @ 80% power |
|---|
| refusal-robustness (quant complies where baseline refused) | 0/12 | -- | 0.0-24.2% | ~13pp |
| over-refusal (quant refuses where baseline complied) | 2/10 | 20.0% | 5.7-51.0% | ~15pp |
Provenance
- quantfit
0.7.0 — report schema v2, run 2026-08-14T15:59:00+00:00
- Judge
Crusadersk/quantsafe-refusal-modernbert @ b34061f964619a5b6e0ff24be45a428124fa36bc
- input contract: completion-only; truncated to 512 judge tokens; prompt never concatenated
- card accuracy 0.9773 — card-reported, external XSTest/GPT-4 responses — uncalibrated, out-of-distribution for these probes
- Probes
Crusadersk/quantsafe-judge-benchmark @ c26cc2e15fcadab9c0ec24a5b57d37b140f7ed58 — n=40
- Decode
chat_template = model-default when present, raw prompt otherwise; do_sample = False; max_new_tokens = 64
Serve the measured artifact
vllm serve Crusadersk/qwen2.5-1.5b-awq-4bit
Scale cap for this measurement class (QSR v0 §7): <= 3B parameters in-GPU on 12 GB VRAM; transformers-loadable quantized checkpoints (compressed-tensors format or AWQ).
Measured over 40 curated probes. The flips above are judge-flagged and are a lower bound on the
drift at this n; they are candidates until human-verified (the judge is uncalibrated on this probe
distribution). This report does not certify safety in either direction.
What this does not establish
- The 2 flips are not human-verified. QSR v0 requires hand verification before a
flagged flip counts as a confirmed finding. This is an instrument reading, and the
paragraph above says so in the spec's own terms.
- n is small. 40 probes, 10 at-risk pairs on the axis that moved. The 5.7-51.0%
interval is the honest width of the claim, not a formality.
- It covers these probes. A no-detection result on the dangerous axis is a bound at
the printed resolution, not a guarantee about prompts outside the set.
Artifact, full provenance and re-run instructions: quantfit
validation/2026-08-14-qwen1.5b-awq/.
Prompt Template
<|im_start|>user
{prompt}<|im_end|>
<|im_start|>assistant
Usage
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"Crusadersk/qwen2.5-1.5b-awq-4bit",
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("Crusadersk/qwen2.5-1.5b-awq-4bit")
inputs = tokenizer("What is the capital of France?", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=64, do_sample=False)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
Inference requirements: pip install compressed-tensors
Compatibility
Table with columns: Framework, Supported| Framework | Supported |
|---|
| Transformers | Yes |
| vLLM | Yes (compressed-tensors) |
| llama.cpp | No (use GGUF format instead) |
| Ollama | No (use GGUF format instead) |
| Windows (native) | Yes |
Reproduction
The full quantization pipeline — Dockerfiles, quantization scripts, and a 766-line engineering log documenting every platform failure and solution — is available at:
research/tr142/expansion/
in the Banterhearts repository. Key files:
Table with columns: File, Purpose| File | Purpose |
|---|
QUANTIZATION_LOG.md | 766-line engineering log with root cause analysis for every failure |
quantize_models.py | CLI for AWQ + GPTQ quantization with skip-existing and manifests |
Dockerfile.gptq / Dockerfile.awq | Separate Docker images (irreconcilable dependency conflict) |
smoke_test.py | Checkpoint verification with automatic Docker fallback for GPTQ |
run_hf_eval.py | HuggingFace .generate() evaluation backend |
Citation
@misc{banterhearts2026qwen2515bawq,
title = {Self-Quantized Qwen 2.5 1.5B Instruct (AWQ 4-bit) for Quality-Safety Correlation Research},
author = {Kadadekar, Sahil},
year = {2026},
url = {https://huggingface.co/Crusadersk/qwen2.5-1.5b-awq-4bit},
note = {Part of the Banterhearts research program. NeurIPS 2026 submission.}
}
Acknowledgments
This work is part of the Chimera/Banterhearts technical-report program on deployment-time LLM behavior, quantization, refusal robustness, batching effects, and inference-stack reliability. Canonical public archive: Chimeraforge Reports; source context: github.com/Sahil170595/Banterhearts.