Verify
Checks amdgpu, KFD and render access, gfx1151 topology, build tools, and a complete ROCm SDK.
A reproducible Qwen3.8-27B stack for Strix Halo: calibrated IQ4_XS weights, an IQ4_XS DFlash2 drafter, the UMA scheduler ring, and retained-PM4 dispatch. Built from source, installed in your home directory.
One command
bash <(curl -fsSL https://raw.githubusercontent.com/pwilkin/strix-halo/main/install.sh)
Process substitution keeps stdin attached to your terminal, so the installer can ask where to store the models. Prefer to inspect scripts before executing them: open the installer source or download it first.
Checks amdgpu, KFD and render access, gfx1151 topology, build tools, and a complete ROCm SDK.
Compiles pinned ROCr, HIP, and llama.cpp revisions into isolated, user-owned prefixes.
Downloads the selected target, DFlash2 draft, and Bartowski BF16 projector through resumable Xet transfers.
Installs optimized and generic launchers in ~/.local/bin, then adds that directory to your PATH.
Before you begin
Ryzen AI Max / Max+ with Radeon 8050S or 8060S exposed through KFD as gfx1151.
The amdgpu kernel module, /dev/kfd, and a writable DRM render node must be available to your user.
HIP 6.1+, ROCm Clang, hipBLAS, rocBLAS, AMD COMGR, and rocprofiler-register. The installer builds the modified userspace runtimes, not the compiler stack.
Enough room for source, build artifacts, two model GGUFs, and the BF16 vision projector. A separate model disk is supported.
The controlled leaderboard
We reran the alternative stacks on this Radeon 8060S with the same 31,497-token source-file prompt, 256-token output, fixed-width DFlash2 policy, warmup, and palindrome ordering. In that reproduction, our custom ROCm stack is the fastest on both prefill and decode.
Matched long-prompt reproduction
| Rank | Reproduced stack | Prompt | Decode | Acceptance | Two-pass range | Our margin |
|---|---|---|---|---|---|---|
| 01 | Our stackSelected IQ4_XS + IQ4_XS DFlash2 custom ROCm · retained PM4 |
256.84 t/s | 26.256 t/s | 60.74% | 26.232–26.279 | Fastest |
| 02 | ReproducedROCmFP4 FAST + FP4 DFlash2 Nathan-derived Vulkan kernel stack |
215.64 t/s | 23.168 t/s | 57.50% | 23.143–23.193 | +13.33% |
| 03 | ReproducedSame selected IQ4_XS models Nathan-derived Vulkan kernel stack |
219.67 t/s | 20.942 t/s | 60.74% | 20.933–20.950 | +25.38% |
“Nathan-derived” means the measured Vulkan fork at 5e085d12, which ports and credits Nathanw1014’s Strix Halo Vulkan gates.
The ROCmFP4 arm changes target and draft together; the same-model Vulkan arm isolates the engine/backend. All six generations were coherent,
every arm reproduced within 0.25%, and temperatures remained 37–54 °C.
Broader context
| Stack | Backend | Target + speculation | Reported decode | Protocol / context | Evidence |
|---|---|---|---|---|---|
| Measured hereIQ4_XS + DFlash2, width 6 | Custom ROCm retained PM4 |
All-calibrated IQ4_XS/Q8 IQ4_XS DFlash2 |
25.67 prose 39.14 reasoning 58.53 JSON |
128 generated tokens; deterministic shallow prompts; two counterbalanced servers per cell | Model card |
| Measured hereIQ4_XS + DFlash2, width 3 | Custom ROCm retained PM4 |
All-calibrated IQ4_XS/Q8 IQ4_XS DFlash2 |
25.74 prose 32.48 reasoning 41.03 JSON |
Same 128-token palindrome bracket; lower draft width benefits low-acceptance prose | Model card |
| ExternalROCmFP4 FAST + adaptive DFlash2 | Custom ROCmFPX / HIP | ROCmFP4 FAST ROCmFP4 DFlash2 |
45.44 code 48.26 prose · 46.85 reasoning · 46.03 JSON |
Adaptive width 3–7; 0.95+ reported acceptance; different target, engine, and prompts | ROCmFP4 card |
| ExternalUD-Q5_K_XL + DFlash2 | Vulkan / RADV | Q5_K_XL Q4_K_M DFlash2, width 7 |
31.4 t/s @ 80 W 30.2 t/s @ 70 W |
Four-task 1K-token average; 55.9% acceptance; per-task range 21.1–39.8 t/s | LocalLLaMA report |
| ExternalROCmFP4 STRIX + MTP | ROCm 7.2.4 | ROCmFP4 STRIX Q4_0 MTP, width 4 |
30.30 t/s | 8K decode; 256 tokens; greedy; median of 3–5; 92.6% MTP acceptance | ROCmFP4 card |
| ExternalUD-Q4_K_XL + DFlash2 | Vulkan / RADV | Q4_K_XL Q4_K_M DFlash2, width 7 |
28.5 t/s @ 80 W 27.3 t/s @ 70 W |
Same four-task 1K-token suite as Q5 result; 44.9% acceptance | LocalLLaMA report |
| HistoricalEarlier DFlash2 Vulkan result | Vulkan / RADV | UD-Q4_K_XL DFlash2, width 4 |
26.39 t/s | Zero-context-depth historical result; superseded by newer Q5/Q4 four-task measurements | Nathan toolbox |
| ExternalPieBru evidence-tracked recipes | Vulkan / RADV | Q5 / Q6_K_XL / Q8 DFlash2 |
~23 Q5 ~17–21 Q6 · ~15–18 Q8 |
Sustained recipe bands; prompt and context dependent; approximately 330 t/s prefill | Evidence repository |
| ExternalOfficial Ollama route | Vulkan / RADV | Official qwen3.8:27b route | 20.42 t/s | Nine warm repeats on a 128 GB GTR9 Pro; 292.49 prompt t/s; different runtime/API | Route matrix |
| HistoricalEarly MTP write-up | Vulkan / RADV | Q6_K target MTP width 2 |
18 t/s 9.6 t/s baseline |
Early report; width 2 beat width 5 by 19%; older runtime generation | daily.dev summary |
| Measured hereSelected target, no speculation | Custom ROCm retained PM4 |
All-calibrated IQ4_XS/Q8 | 14.10 t/s | llama-bench tg128; retained PM4; zero-context synthetic decode |
Model card |
| ExternalROCmFP4 STRIX, no speculation | ROCm 7.2.4 | ROCmFP4 STRIX | 13.46 t/s @ 8K 12.58 t/s @ 32K |
Greedy 256-token decode; context-filled server measurement | ROCmFP4 card |
Our protocol
Three deterministic workloads, 128 output tokens, one discarded warmup per server, two independently loaded servers per configuration, and palindrome ordering to expose drift.
Correctness
Q8_0 and IQ4_XS DFlash2 produced identical target-output hashes for every workload. Acceptance changed slightly; final deterministic output did not.
Read the numbers
Our width-6 run ranges from 25.67 to 58.53 t/s solely because prompt-dependent draft acceptance ranges from 29.3% to 95.6%.
What changes
Keep the experiments moving
The models, patches, installer, and benchmark notes are public. Support helps pay for hardware, power, storage, and the occasional very long compile.