Harsha001's picture
Squash history
aaf7ddf
|
Raw History Blame Contribute Delete
7.6 kB
---
license: apache-2.0
base_model: jialinyyzz/humanizer
base_model_relation: quantized
pipeline_tag: text-generation
library_name: gguf
language: [en, zh]
tags: [gguf, rocmfpx, rocmfp4, amd, rocm, strix-halo, quantized, humanizer, text-rewriting, gemma4]
---
# humanizer 12B — ROCmFPX GGUF
[jialinyyzz/humanizer](https://huggingface.co/jialinyyzz/humanizer) (v2) rewrites AI-written drafts in English and
Chinese so they read like a person wrote them, and keeps every number, date, name and quote. It is a fine-tune of
Gemma 4 12B. This repo has it in the [ROCmFPX](https://github.com/charlie12345/ROCmFPX) formats, a llama.cpp fork
with low-bit weight types for AMD GPUs (Vulkan and HIP/ROCm).
**Start with `humanizer-12b-Q8_0_ROCMFPX.gguf`** if it fits in your GPU memory: it is almost identical to the full
model. Take the 6-bit file next, and a 4-bit file when memory is tight.
> These files need [HarshaVardhan3002/ROCmFPX](https://github.com/HarshaVardhan3002/ROCmFPX), built from
> 23 October 2026 or later (they carry per-tensor scales, see below). Stock llama.cpp, LM Studio, Ollama and other
> ROCmFPX builds may not load them. **These files have not been tested on AMD hardware yet.**
>
> Not an official release of humanizer. All credit for the model goes to its authors. Their own files in stock
> llama.cpp formats, including quantization-aware trained 2-, 3- and 4-bit files, are at
> [jialinyyzz/humanizer-GGUF](https://huggingface.co/jialinyyzz/humanizer-GGUF).
## Files
| File | Size | KL to BF16 | Same top token | |
|---|---:|---:|---:|---|
| `humanizer-12b-Q8_0_ROCMFPX.gguf` | 12.3 GB | 0.00024 | 99.3% | 8-bit, closest to the full model |
| `humanizer-12b-Q6_K_ROCMFPX.gguf` | 9.8 GB | 0.0023 | 97.8% | 6-bit (ROCmFPX `Q6_0_ROCMFPX` weights, see below) |
| `humanizer-12b-Q4_0_ROCMFP4_STRIX.gguf` | 6.7 GB | 0.040 | 91.9% | recommended 4-bit (Strix Halo recipe) |
| `humanizer-12b-Q4_0_ROCMFP4_FAST.gguf` | 6.3 GB | 0.047 | 90.8% | smallest, speed-first 4-bit |
Stock llama.cpp builds of this model, measured the same way:
| Stock file | Size | KL to BF16 | Same top token |
|---|---:|---:|---:|
| Q8_0 | 12.7 GB | 0.00064 | 98.8% |
| Q6_K | 10.0 GB | 0.0026 | 97.8% |
| Q4_K_M | 7.4 GB | 0.0186 | 94.1% |
The 8-bit file here is closer to BF16 than a stock Q8_0, and the 6-bit file matches a stock Q6_K; both are a
little smaller. At 4-bit, a stock Q4_K_M (or the authors' quantization-aware Q4_K_M) stays closer to the full model than the ROCmFP4
files here. The ROCmFP4 files are smaller and are meant for speed on AMD GPUs.
**How this was measured:** llama.cpp `llama-perplexity --kl-divergence` against the authors' BF16 file, 40 chunks of
512 tokens of English Wikipedia text (wikitext-2), run on a GPU after expanding each file to F16 (the expansion is
exact). KL is how far the file's next-token probabilities drift from BF16, averaged over every token; lower is better.
"Same top token" is how often the file's most likely next token is the same as BF16's. This is general text, not
rewriting text; the authors measured their files on held-out rewriting data, and their stock Q4_K_M (KL 0.021) is
close to what this test gives (0.0186).
Every file also passed a rewrite check: a test draft with five facts (a date, a count, a name, a year and an amount),
greedy decoding on the CPU. All five facts came through in every file.
The 6-bit file is named `humanizer-12b-Q6_K_ROCMFPX.gguf` so that Hugging Face lists it as a 6-bit quant. Its weights
are the ROCmFPX `Q6_0_ROCMFPX` type, not a stock llama.cpp `Q6_K`, and it needs the same fork as the other files.
## Why these files carry tensor scales
ROCmFPX stores one scale for each block of weights as an 8-bit float (UE4M3) whose smallest step is 2^-10. This
model's weights are small (the largest value in a typical block of 32 is about 0.02 to 0.04), so an 8-bit ROCmFPX
file cannot pick small enough scales: almost every block gets stuck at the smallest scale, and the file is about as
precise as a 6-bit one. These files multiply each weight matrix by a power of two (2^7 to 2^10) before quantizing and store
the inverse as `<name>.scale`, which the fork multiplies back after the matrix product. The shared embedding and
output matrix cannot take such a scale, so it uses a stock llama.cpp type: Q8_0 in the 8-bit file, Q6_K in the 6-bit
and STRIX files (the FAST file keeps it in ROCmFP4 for speed).
| KL to BF16 | Plain ROCmFPX | With tensor scales |
|---|---:|---:|
| 8-bit | 0.0112 | 0.00024 |
| 6-bit | 0.0080 | 0.0023 |
| 4-bit STRIX | 0.053 | 0.040 |
| 4-bit FAST | 0.064 | 0.047 |
## How these were made
1. Source: the authors' BF16 GGUF (`humanizer-12b-bf16.gguf` from
[jialinyyzz/humanizer-GGUF](https://huggingface.co/jialinyyzz/humanizer-GGUF)), sha256 checked against their card.
2. Importance matrix from the BF16 file over a general calibration text (`calibration_datav3`), 512-token chunks.
The authors used their own rewriting data for theirs.
3. `llama-quantize --imatrix` from the BF16 file with `LLAMA_ROCMFPX_TENSOR_SCALE=1`, one run per type, from
[HarshaVardhan3002/ROCmFPX](https://github.com/HarshaVardhan3002/ROCmFPX); `--token-embedding-type q8_0` for the
8-bit file and `q6_K` for the 6-bit file.
The only change from the original is the weight quantization. The tokenizer, the chat template and the stored sampling
defaults come unchanged from the authors' GGUF.
## Run
```bash
git clone https://github.com/HarshaVardhan3002/ROCmFPX && cd ROCmFPX
cmake -B build -DGGML_VULKAN=ON # or -DGGML_HIP=ON -DAMDGPU_TARGETS=gfx1151 (gfx1100 for RX 7900)
cmake --build build --target llama-server -j
build/bin/llama-server -m humanizer-12b-Q8_0_ROCMFPX.gguf -ngl 999 -c 8192 -np 1 --jinja
```
The model does text completion, not chat. The prompt is the instruction from `prompt_format.json`, a blank line, your
draft, then `\n\n### Rewritten:\n\n`. Sample with temperature 1.0, top-p 0.95, top-k 0, min-p 0 and repeat penalty 1.0,
and stop at the end-of-sequence token only.
```python
import json, urllib.request
pf = json.load(open("prompt_format.json", encoding="utf-8"))
def humanize(draft, url="http://127.0.0.1:8080"):
body = {"prompt": pf["instr"] + "\n\n" + draft.strip() + pf["sep"],
"temperature": 1.0, "top_p": 0.95, "top_k": 0, "min_p": 0,
"repeat_penalty": 1.0, "n_predict": 2048}
req = urllib.request.Request(url + "/completion", json.dumps(body).encode("utf-8"),
{"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=900) as r:
return json.load(r)["content"].strip()
print(humanize(open("draft.txt", encoding="utf-8").read()))
```
The chat template in each file builds the same prompt from the last user message, so `/v1/chat/completions` with one
draft per message also works. Keep instruction, draft and rewrite within 8,192 tokens and split long documents at
paragraph breaks. The authors note that a short, informal English draft occasionally comes back in Chinese; sample
again when that happens. Their [usage guide](https://github.com/sgaofen/humanizer-local-model/blob/main/docs/USAGE.md)
has more. Their desktop app runs stock llama.cpp with their own files, not these.
## License
Apache-2.0, same as the original (see `LICENSE`). The authors' `NOTICE` file is included and must stay with any copy.
humanizer is fine-tuned from [google/gemma-4-12B](https://huggingface.co/google/gemma-4-12B), which Google releases
under Apache 2.0. This repo is not affiliated with or endorsed by Google or the humanizer authors.