MiniCPM-V-4.7-35B-A3B — ROCmFP4 builds for AMD Strix Halo (gfx1151)
ROCmFP4 quantizations of openbmb/MiniCPM-V-4.7-35B-A3B, built with gufo-quant and measured on AMD Strix Halo (gfx1151). Pick MiniCPM-V-4.7-35B-A3B-ROCmFP4-LEAN-Q6K-trunk.gguf (build C) for quality — it is the only build whose perplexity ratio against stock sits wholly under the 1.02 bar — or MiniCPM-V-4.7-35B-A3B-ROCmFP4-LEAN.gguf (build A) for speed: on the public ROCmFPX fork A decodes as fast as the stock Q4_K_M from a 6 % smaller file. The DSpark drafter file runs on King's gufo engine only: the file carries 62 tensors and the public fork's draft-dflash loader builds only 58 of them (wrong number of tensors; expected 62, got 58); openbmb's own F16 drafter is refused the same way.
Files
| file | size | sha256 | description |
|---|---|---|---|
| MiniCPM-V-4.7-35B-A3B-ROCmFP4-LEAN-Q6K-trunk.gguf | 20.18 GB (20177346848 bytes) | 0d16398fdbab3110e3c9406406b17701ad3ad6dc83657aef58e5eb8f851a9364 | build C (SPEC2-C): LEAN + Q6_K on the trunk's attention and recurrent matrices |
| MiniCPM-V-4.7-35B-A3B-ROCmFP4-LEAN.gguf | 19.85 GB (19847536928 bytes) | 54b66ecdc90e3bca300e58b6fd777a20521a0d99758111a55c665e123d3388df | build A (v1-LEAN) |
| dspark-MiniCPM-V-4.7-35B-A3B-Q8_0.gguf | 0.57 GB (573173696 bytes) | 798a373958559014658935b14e49ce7ac6310639c3b31ec45afab334e827861f | the DSpark drafter, Q8_0 conversion of openbmb's F16 drafter |
Which file
Use C for quality: q 1.0130 [1.0091, 1.0169] passes the 1.02 bar whole-interval. Its cost is decode speed: on the public fork C's code mean is 50.7 tok/s against 55.4 for stock and 55.5 for A; on King's gufo engine it is 3.5–4.9 % slower than A (−4.9/−3.9/−3.9/−3.5 % at 1.6K/6.3K/13.4K/26.8K). Use A for speed: q 1.0317 [1.0274, 1.0360] misses the bar; on the public fork it matches stock (code mean 55.5 vs 55.4 tok/s, prefill and decode within 6 % above stock at every prompt length), and on King's gufo engine it decodes 1.15–1.20x stock (66.53/63.36/60.73/56.61 tok/s at 1.6K/6.3K/13.4K/26.8K).
Quality
Paired perplexity on the public ROCmFPX fork's llama-perplexity, corpus wiki.test.raw, n_ctx 512, the same 320 chunks for every file, q = exp(mean of the per-chunk NLL differences). Stock PPL 6.9139 (reference, q 1.0000), A 7.1329, C 7.0038. Quality q vs stock, 95% CI: C 1.0130 [1.0091, 1.0169] PASS — the whole interval sits under the 1.02 bar; A 1.0317 [1.0274, 1.0360] MISS.
Speed on the public ROCmFPX fork
Setup: public ROCmFPX fork at commit b41ce12, legs f-s (stock Q4_K_M), f-c (build C), f-a (build A), each UP in 8/4/4 s; speed256.py p1k/p4k/p8k plus code6.py (256 new tokens, cached=0 on every timed request).
| leg | prefill p1k / p4k / p8k (tok/s) | decode p1k / p4k / p8k (tok/s) | CODE mean (tok/s) |
|---|---|---|---|
| stock Q4_K_M | 1008.2 / 981.5 / 921.2 | 59.0 / 56.7 / 54.7 | 55.4 |
| C SPEC2-C | 1004.6 / 949.8 / 892.2 | 55.3 / 53.5 / 50.5 | 50.7 |
| A v1-LEAN | 1061.2 / 996.8 / 933.2 | 60.8 / 58.3 / 55.8 | 55.5 |
Code means are the mean of 6 runs: stock 55.4 (54.9, 55.3, 55.9, 55.6, 55.7, 55.1), C 50.7 (47.7, 51.1, 51.2, 51.6, 51.9, 50.9), A 55.5 (51.8, 56.4, 56.3, 56.0, 56.5, 55.9); accepted/drafted None/None on all 6 per leg. Speed detail: f-s ptok 1568/6335/13386, ctok 133/149/150; f-c ptok 1569/6333/13387, ctok 131/139/101; f-a ptok 1569/6332/13385, ctok 142/146/101; all cached=0.
Speed on King's gufo engine (not public)
Setup: halo, 2026-10-13, drafter OFF both engines; client tok/s, greedy, n=64, fresh nonce per prompt, every row cached=0, ntok 64/64; prompts p1k 1.6K / p4k 6.3K / p8k 13.4K / p16k 26.8K tokens; one bracket 03:51–03:57Z; stock = mean of its two fork legs in that bracket.
| build | engine | size | prefill 1.6K / 6.3K / 13.4K / 26.8K | decode 1.6K / 6.3K / 13.4K / 26.8K |
|---|---|---|---|---|
| stock Q4_K_M | fork | 21.17 GB | 894.2 / 956.9 / 918.8 / 815.0 | 55.46 / 54.39 / 52.27 / 49.36 |
| A v1-LEAN | gufo | 19.85 GB | 1432.4 / 1518.2 / 1505.2 / 1426.4 | 66.53 / 63.36 / 60.73 / 56.61 |
| C SPEC2-C | gufo | 20.18 GB | 1475.2 / 1549.0 / 1529.5 / 1450.4 | 63.25 / 60.88 / 58.39 / 54.63 |
| A vs stock | 1.60x / 1.59x / 1.64x / 1.75x | 1.20x / 1.17x / 1.16x / 1.15x | ||
| C vs stock | 1.65x / 1.62x / 1.67x / 1.78x | 1.14x / 1.12x / 1.12x / 1.11x | ||
| C vs A (the cost) | +3.0% / +2.0% / +1.6% / +1.7% | −4.9% / −3.9% / −3.9% / −3.5% |
Drafter setup: file C, gufo 2608f5c4, Q8_0 drafter, Jay's four coding prompts, 256 new tokens, cached=0; prose via speed.sh n=256 A/B/A off / k=8 / k=3 / off2, cached=0.
| config | p1 | p2 | p3 | p4 | mean | x off | accepted/drafted |
|---|---|---|---|---|---|---|---|
| off | 63.3 | 62.6 | 62.6 | 62.6 | 62.76 | 1.00 | — |
| k=3 Q8 | 86.4 | 67.0 | 70.3 | 93.5 | 79.30 | 1.263x | 179/211, 140/206, 152/218, 186/201 |
| k=8 Q8 | 83.5 | 73.5 | 73.3 | 88.3 | 79.64 | 1.269x | 197/277, 160/212, 173/257, 204/274 |
Prose decode vs off (p1k/p4k/p8k): k=3: 0.910/0.801/0.713x; k=8: 0.854/0.801/0.700x.
Quick start
Build ROCmFPX at b41ce12 (prerequisites: the project's build guide):
git clone https://github.com/charlie12345/ROCmFPX.git && cd ROCmFPX && git checkout b41ce12
HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -R)" \
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
-DGGML_HIP=ON -DGGML_VULKAN=ON -DGPU_TARGETS=gfx1151 \
-DGGML_HIP_GRAPHS=ON -DGGML_HIP_NO_VMM=ON -DLLAMA_CURL=OFF
cmake --build build --target llama-server -j
(-DGGML_VULKAN=ON matches the build these numbers were measured with; leave it out if you have no Vulkan SDK.)
Serve the C file (this fork command with the C file name, port 8080, no drafter flags):
env GGML_HIP_ENABLE_UNIFIED_MEMORY=1 LD_LIBRARY_PATH=$PWD/build/bin:/opt/rocm/lib \
build/bin/llama-server -m MiniCPM-V-4.7-35B-A3B-ROCmFP4-LEAN-Q6K-trunk.gguf \
-ngl 999 -fa on --no-mmap -fit off -c 32768 -ctk q8_0 -ctv q8_0 -np 1 -b 2048 -ub 1024 \
--jinja --reasoning off --alias m --host 127.0.0.1 --port 8080
How these were built
Tool gufo-quant 0.9.1 (build via gufo-quant 30962d8a in gpu-run pmc-build). Recipe LEAN, protect preset qwen35moe-v1 with --protect-allow-unmatched (the 10 exact blk.40 rules plus *nextn match 0 tensors — this model has no MTP block; applied: output/token_embd Q6_K, ssm_alpha/ssm_beta Q8_0 x30 each), no imatrix (Ornith's imatrix was not reused: 20 Ornith-only blk.40 tensors plus vocab 248320 vs 248144). C adds two families at Q6_K: B3 *attn_qkv/*attn_gate/*ssm_out FP4 → Q6_K (the recurrent block) and B4 *attn_q/*attn_k/*attn_v/*attn_output FP4 → Q6_K (the full-attention block). The drafter quantizes the DSpark F16 sidecar with recipe LEAN and catch-all =Q8_0 after keep-rules _norm.weight=F32, conf_proj.bias=F32, conf_proj.weight/markov_w1/markov_w2/fc/attn_k/attn_v=BF16 (62 tensors; wall 0.76 s). Census 733/733: A is Q4_0_ROCMFP4 370, Q8_0 60, Q6_K 2, F32 rest (wall 192 s); C is Q4_0_ROCMFP4 240, Q6_K 132, Q8_0 60, F32 301 (wall 189 s). Contract qf_contract.py on the built census: exit 0, 0 violations, for both builds. The build manifests are in recipe/.
Limits
The DSpark drafter runs on King's gufo engine only: the fork's draft-dflash loader refuses the Q8_0 sidecar and openbmb's own F16 drafter alike (each file carries 62 tensors; the loader builds 58 and stops with expected 62, got 58). Vision was not tested on these builds (text only). C costs 3.5–4.9% of decode against A. DSpark pays on code, not on long prose (50–62% of drafted slots accepted at p4k/p8k prose; prose decode 0.70–0.91x of drafter-off, k=3 keeps confidence floor 0.5).