kingjones777/Granite-4.2-3B-ROCmFP4-STRIX_LEAN-GGUF
Granite 4.2-3B (STRIX_LEAN) — ROCmFP4 for AMD Strix Halo (gfx1151)
I built this STRIX_LEAN quantization of ibm-granite/granite-4.2-3b on my Strix Halo box for the ROCmFPX runtime. This is the 4th tier of my Granite 4.2 set — the lean 4-bit one people normally want.
The file
Type histogram, read from the finished file:
Q4_0_ROCMFP4_FAST x200, F32 x81, Q4_0_ROCMFP4 x80, Q6_K x1, Q5_K x1What STRIX_LEAN is — and what it protects
STRIXLEAN is my lean 4-bit tier. The body is ROCmFP4 with the Strix Halo attention K/V quality recipe (that is what the STRIX part buys you), and the token embedding table is trimmed to **Q5K** — that is the LEAN part, the size saving versus my COHERENT tier, which keeps the embeddings at Q6_K.
What never gets trimmed is the head. Every STRIXLEAN I publish carries the protected Q6K LM head. This model has tie_word_embeddings: false, so output.weight is a real standalone tensor, and a 4-bit head would degrade the logits of every single token. I quantized with --output-tensor-type q6_K and confirmed the head landed at Q6_K by exact-name read-back on the finished file (output.weight — exact match, not substring).
How I built it
- Manifest gate: pulled
ibm-granite/granite-4.2-3bfile list from the HF API with?blobs=trueand recorded the real shard bytes (2 safetensors shards, 7,319,517,120 bytes total — never the indextotal_size). - Downloaded and byte-verified all 15 files against that manifest (sizes + LFS sha256).
- Converted with
convert_hf_to_gguf.pyfrom myrocmfpx-dspark-halotree (4eca07e),--outtype bf16→ 363 tensors, 7,323,461,696 bytes. - Quantized with the same tree's
llama-quantizeat 16 threads with--output-tensor-type q6_K. Dry-run estimate 1,967.08 MiB (4.51 bpw); the real file landed within ~3.5 MiB of it.
Measured on my box — full GPU offload
amd-halo: AMD Ryzen AI Max+ 395 (Strix Halo, gfx1151), ROCm 7.13.0, 128 GiB unified memory. Functional check at full offload — server flags -dev ROCm0 -fa on -ngl 999 --no-mmap -fit off -np 1 -b 2048 -c 8192 -t 16 --jinja, port 8497, greedy. 8 other llama-server seats were live on this machine while I tested (MemAvailable 16.3 GiB before load → 13.2 GiB after), so this is a functional check, not an idle-box benchmark.
Sample output (greedy, prompt "Explain in one clear sentence what granite rock is primarily made of."):
Answer: Granite rock is primarily made of quartz. … (continued in the model's native self-check scaffold — real, structured generation)
⚠️ Stock llama.cpp will not load this file
Q4_0_ROCMFP4_STRIX_LEAN is a custom tensor format that exists only in the ROCmFPX fork of llama.cpp.
llama-server -m granite-4.2-3b-Q4_0_ROCMFP4_STRIX_LEAN.gguf -dev ROCm0 -fa on -ngl 999 -c 8192Not measured
No benchmark sweeps, no context sweeps, no perplexity — one full-offload functional check, per my build discipline.
Provenance & license
Converted and quantized from ibm-granite/granite-4.2-3b (Apache 2.0). This quantized build is released under the same Apache 2.0 license. The ROCmFPX runtime is a third-party fork; its own terms apply to the runtime, not to these weights.
<!-- VARIANTS:START -->
All my quants of Granite-4.2-3B
All measured by me on a Ryzen AI MAX+ 395 (Strix Halo, gfx1151, ROCm 7.2.4) with the whole model on GPU (-ngl 999), 128-token greedy generation. A dash means I haven't measured that one yet — I won't put a number in a card I didn't measure.
Base model: ibm-granite/granite-4.2-3b <!-- VARIANTS:END -->
