singulared's picture
Model card: ROCmFP4 builds + MTP drafter ladder with acceptance data
0a95e53 verified
|
Raw
History Blame Contribute Delete
5.08 kB
---
license: apache-2.0
base_model:
- Qwen/Qwen3.8-27B
- ggml-org/Qwen3.8-27B-GGUF
base_model_relation: quantized
library_name: llama.cpp
pipeline_tag: text-generation
tags:
- gguf
- rocm
- rocmfpx
- rocmfp4
- amd
- strix-halo
- gfx1151
- mtp
- speculative-decoding
- qwen3.5
---
# Qwen3.8-27B β€” ROCmFP4 + MTP drafter ladder (Strix Halo)
ROCmFP4 builds of [Qwen3.8-27B](https://huggingface.co/Qwen/Qwen3.8-27B), quantised from
`ggml-org/Qwen3.8-27B-GGUF`'s BF16 (sha256 `5a3eedc837bcbd13…`, verified), **plus an MTP drafter
at five precisions** so the speculative-decoding numbers below can be reproduced rather than
taken on trust.
Other ROCmFP4 builds of this model already exist. What is here and (at publication) not
elsewhere: **draft-acceptance rates**, a **per-backend `n-max` sweep**, a **`-ub` sweep**, and a
**ROCm 7.2 vs 10.1 comparison** that reverses the preset ranking.
> ⚠ **Read this before choosing FP4.** On the same machine, **mainline llama.cpp on Vulkan with a
> plain `Q4_K_M` and the official MTP drafter is faster** β€” 330 vs 227 prefill (+43%), decode tied.
> These FP4 files are worth it for the **1.7 GiB smaller footprint** (15.6 vs 17.3 GiB resident),
> which matters when co-residing two models. They are not the throughput winner.
## Files
| file | preset | size |
| --- | --- | ---: |
| `Qwen3.8-27B-ROCMFP4-STRIX.gguf` | `Q4_0_ROCMFP4_STRIX` | 13.75 GiB |
| `Qwen3.8-27B-ROCMFP4-COHERENT.gguf` | `Q4_0_ROCMFP4_COHERENT` | 14.41 GiB |
| `mtp-Qwen3.8-27B-ROCMFP4-STRIX.gguf` | FP4 drafter | 1.85 GiB |
| `mtp-Qwen3.8-27B-ROCMFP3.gguf` | FP3 drafter | 1.55 GiB |
| `mtp-Qwen3.8-27B-ROCMFP6.gguf` | FP6 drafter | 2.27 GiB |
| `mtp-Qwen3.8-27B-ROCMFP8.gguf` | FP8 drafter | 2.86 GiB |
| `mtp-Qwen3.8-27B-ROCMFP2.gguf` | FP2 drafter β€” **broken, see below** | 1.48 GiB |
Requires a [ROCmFPX](https://github.com/charlie12345/ROCmFPX) build; mainline llama.cpp does not
know the `Q4_0_ROCMFP4_*` tensor types.
## Hardware / method
AMD Ryzen AI MAX+ 395, Radeon 8060S (`gfx1151`, RDNA 3.5), 124 GiB GTT, Debian sid, kernel 7.2.
Server-measured (`llama-server` + probe), ~8K-token prompt, temperature 0, one job at a time.
ROCm nightly pinned to `therock-dist-linux-gfx1151-10.1.0a20260815`.
## 1. Draft depth (`--spec-draft-n-max`) is per-backend
| n-max | Vulkan Q4_K_M decode | acc | FP4 decode | acc |
| ---: | ---: | ---: | ---: | ---: |
| 3 | β€” | β€” | 33.42 | 100.0% |
| 4 | 35.80 | 88.1% | 35.16 | 98.7% |
| **5** | **38.94** | 91.6% | 38.67 | 98.1% |
| 6 | 38.47 | 86.5% | 38.04 | 97.5% |
| 7 | 37.84 | 82.0% | **39.26** | 94.7% |
| 8 | 28.56 | 78.1% | 32.36 | 95.2% |
| 10 | 25.47 | 59.4% | β€” | β€” |
Acceptance decays monotonically with depth; the knee is where verifying rejected drafts costs
more than the accepted ones save. FP4 holds higher acceptance, so its knee sits deeper and
flatter. **This is not DeepSeek-V4's n=2** β€” draft depth does not transfer between models.
## 2. Drafter precision is a bandwidth lever, not a quality one
Target fixed, drafter varied, Vulkan, n=5:
| drafter | size | decode | acceptance |
| --- | ---: | ---: | ---: |
| **Q4_K_M** | 1.89 GiB | **39.16** | 91.6% |
| Q6_K | 2.28 GiB | 38.28 | 92.1% |
| Q5_K_M | 2.08 GiB | 36.93 | 89.0% |
| Q8_0 | 2.95 GiB | 34.74 | 89.0% |
**Acceptance is flat (89–92%) while decode spans 13%** β€” so shrinking the drafter buys bandwidth
and costs nothing in draft quality. Advice to keep drafters at β‰₯Q8 does not hold here.
## 3. FP2 destroys a drafter
FPX ladder, STRIX target, ROCm 10.1, n=5:
| drafter | decode | acceptance |
| --- | ---: | ---: |
| FP4-STRIX | **37.03** | 97.4% |
| FP3 | 36.07 | **98.1%** |
| FP6 | 30.92 | 96.6% |
| FP8 | 29.76 | 96.6% |
| **FP2** | 22.07 | **64.0%** |
FP2's codebook has no exact zero. This drafter is BF16-sourced β€” the case usually assumed safe β€”
and acceptance still collapses. **Do not use FP2 for a draft model.**
## 4. The preset ranking flips with the ROCm version
`llama-bench`, pp2048:
| preset | ROCm 7.2.4 | ROCm 10.1 nightly |
| --- | ---: | ---: |
| COHERENT | **205.7** | 208.6 (+1%) |
| STRIX | 151.8 | **272.0 (+79%)** |
COHERENT wins on 7.2; STRIX wins on 10.1. Any "preset X is best" claim β€” including ones in other
repos β€” is conditional on a ROCm version that usually goes unstated.
## 5. `-ub 256`, not the default
| `-ub` | Vulkan pp2048 | FP4 pp2048 (10.1) |
| ---: | ---: | ---: |
| **256** | **370.6** | **300.3** |
| 512 | 360.9 | 267.3 |
| 1024 | 343.7 | 236.5 |
| 2048 | 332.0 | 235.8 |
Both backends prefer a small micro-batch; `-ub 2048` costs FP4 **27%** of its prefill. Batch size
(`-b` 512β†’4096) changes nothing.
## Usage
```bash
llama-server \
-m Qwen3.8-27B-ROCMFP4-STRIX.gguf \
-md mtp-Qwen3.8-27B-ROCMFP4-STRIX.gguf \
--spec-type draft-mtp --spec-draft-n-max 5 \
-ngl 99 -ngld 99 -fa on -ub 256
```
## Provenance
Every file derives from `ggml-org/Qwen3.8-27B-GGUF`, sha256-verified before quantisation:
`Qwen3.8-27B-BF16.gguf` = `5a3eedc837bcbd13…`, `mtp-Qwen3.8-27B-BF16.gguf` = `5723e551c4ee2b8c…`.