Qwen3.8-27B (Q4_K_M) for AMD Loom
A Loom package (.loom programs and a model.json card) for the unmodified GGUF checkpoint bartowski/Qwen3.8-27B-GGUF (Qwen3.8-27B-Q4_K_M.gguf), generated on an AMD Ryzen AI Max+ 395 "Strix Halo" with the loom-skills workflow.
Quick start
pip install "hrx-loom[hf]"
loom-fetch https://huggingface.co/loom-fun/bartowski-Qwen3.8-27B-loom/resolve/main/model.json --materialize=copy --output=qwen3.8-27b
loom-serve --model=qwen3.8-27b/model.json --device=amdgpu --memory_bytes=52000000000
The server listens on 127.0.0.1:8080 and answers OpenAI-style /v1/chat/completions requests.
Performance vs llama.cpp
| metric | llama.cpp | Loom | margin | roofline | Loom % of roofline | DevLab llama.cpp | DevLab Loom | DevLab llama.cpp Vulkan | local ÷ DevLab (llama.cpp, Loom) |
|---|---|---|---|---|---|---|---|---|---|
| decode tok/s, short prompt | 20.3 | 26.2 | +29 % | 32.3 | 81 % | 21.8 | 27.0 ¹ | 21.9 | 0.93, 0.97 |
| decode tok/s, 2k context | 19.3 | 24.4 | +26 % | 31.6 | 77 % | 19.3 | 24.7 ¹ | 21.0 | 1.00, 0.99 |
| decode tok/s, 32k context | 16.6 | 19.3 | +16 % | 28.3 | 68 % | 17.2 | 19.8 ¹ | 17.1 | 0.97, 0.97 |
| prefill tok/s, 1k document | 309.0 | 499.7 | +62 % | 1185.9 | 42 % | 321.1 | 459.9 ¹ | 283.5 | 0.96, 1.09 |
| prefill tok/s, 2k document | 313.1 | 502.9 | +61 % | 1181.2 | 43 % | 323.8 | 458.6 ¹ | 286.4 | 0.97, 1.10 |
| prefill tok/s, 8k document | 315.0 | 509.4 | +62 % | 1154.0 | 44 % | 280.4 | 452.7 ¹ | 284.0 | 1.12, 1.13 |
| prefill tok/s, 16k document | 288.9 | 484.9 | +68 % | 1119.5 | 43 % | 263.4 | 418.8 ¹ | 270.4 | 1.10, 1.16 |
| prefill tok/s, 32k document | 239.1 | 439.5 | +84 % | 1056.5 | 42 % | 246.9 | 370.6 ¹ | 245.4 | 0.97, 1.19 |
| 4 streams, aggregate decode tok/s | 49.0 | 61.9 | +26 % | 123.4 | 50 % | 51.7 | 62.7 ¹ | 38.9 | 0.95, 0.99 |
| speculative decoding, drafted tokens accepted | — | 76 % ² | — | n/a | n/a | n/a | n/a | n/a | n/a |
- llama.cpp: build
llamacpp-rocm/b1355, server arguments-ngl 99 -cram 0 --spec-type draft-dflash --spec-draft-model ~/.cache/huggingface/hub/models--z-lab--Qwen3.8-27B-DFlash2-GGUF/snapshots/2d9571f8ce46e151f61c6499c99dee6079e1d610/Qwen3.8-27B-DFlash2-Q4_K_M.gguf --spec-draft-n-max 3 -ngld 99 -c 65536 -kvu -np 4. - Loom: speculative decoding on (DFlash, depth 3).
- Same GGUF on both engines, tokens per second. Loom: client-side timing; llama.cpp: server-side timings. Runs per value: decode and prefill 2 (mean), 4 streams 3 (median).
- Measured 2026-11-06; device AMD RYZEN AI MAX+ 395 w/ Radeon 8060S, AMD Radeon 8060S Graphics, Ubuntu 26.04; hrx-loom
0.1.0(hrx-systemd01d1c1); source: local run. - ¹ Measured 2026-11-07; device not recorded; hrx-loom unknown; source: DevLab Dispatch run 42395970032.
- ² Measured 2026-11-07; device AMD RYZEN AI MAX+ 395 w/ Radeon 8060S, AMD Radeon 8060S Graphics, Ubuntu 24.04; hrx-loom
0.1.0(hrx-systemd01d1c1); source: DevLab Dispatch run 42342529061. - DevLab: the same measurement on an AMD DevLab Dispatch Strix Halo runner; local ÷ DevLab is the local value over the DevLab value of each engine, recorded for comparison, not a verdict.
- DevLab llama.cpp Vulkan: build not recorded, server arguments
-ngl 99 -cram 0 --spec-type draft-dflash --spec-draft-model card:parameter/Qwen3.8-27B-DFlash2-Q4_K_M.gguf --spec-draft-n-max 3 -ngld 99 -c 65536 -kvu -np 4; same GGUF, prompts and settings as llama.cpp; measured 2026-11-09 in its own DevLab job (a different runner than the other DevLab columns: compare the engines through ratios, not across jobs); source: DevLab Dispatch run 42580835796. Differs from llama.cpp: decode, decode_2k, decode_32k measured with unified KV, draft, 4 slots:-ngl 99 -cram 0 --spec-type draft-dflash --spec-draft-model card:parameter/Qwen3.8-27B-DFlash2-Q4_K_M.gguf --spec-draft-n-max 3 -ngld 99 -c 65536 -kvu -np 4(the original job, run 42569157613). Differs from llama.cpp: prefill_1k, prefill_2k, prefill_8k, prefill_16k, prefill_32k measured with 1 slot, no draft:-ngl 99 -cram 0 -c 36864 -np 1. Differs from llama.cpp: streams4 measured with 4 per-slot streams, no draft:-ngl 99 -cram 0 -c 147456 -np 4. Differs from llama.cpp: each metric is the highest of the Vulkan server configurations measured (b12211, separate DevLab jobs); the ROCm baseline's own configuration is the unified pool with drafting. b12211's Vulkan backend has no GPU kernel for the fused flash attention over K/V rows that a unified pool uses (the server logs the CPU fallback); configurations that did not win or did not run: 1 slot, draft. - Drafted tokens accepted: the share of the drafter's proposed tokens the model accepted during the
specgate's requests. - Roofline: the hardware ceiling for this GGUF on AMD Ryzen AI Max+ 395 "Strix Halo" (gfx1151) at 216 GB/s and 59 TFLOP/s, from loom-roofline
roofline.py(loom-skillsb086d86); decode and 4 streams with speculative decoding: verify passes × (1 + acceptance × depth 3) tokens per pass, the drafter's cost not counted; acceptance measured in the row's own session: decode 50 %, decode at 2k 49 %, decode at 32k 49 %, 4 streams 47 %. - — not measured; n/a not applicable.
Features
| feature | status | detail |
|---|---|---|
| API | ✅ | OpenAI-style /v1/chat/completions |
| tool calling | ✅ | OpenAI-style tools and tool_calls |
| reasoning / thinking | ✅ | on by default; chat_template_kwargs: {"enable_thinking": false} turns it off |
| reasoning effort | ✅ | reasoning_effort: low, medium, xhigh (default xhigh) |
| speculative decoding | ✅ | DFlash, depth 3, on by default; drafter z-lab/Qwen3.8-27B-DFlash2-GGUF |
| image input | ✅ | OpenAI-style image_url parts; projector mmproj-Qwen3.8-27B-f16.gguf |
| audio input / output | — | not applicable |
| sampling | ✅ | temperature, top_p, top_k, seed |
| context size | ✅ | 262,144 tokens per request |
| concurrency | ✅ | 4 concurrent requests |
| max output tokens | ✅ | 4,096 (preset max_tokens) |
Correctness
| gate | description | result |
|---|---|---|
kernel_tests |
Unit tests of the generated kernels against reference implementations | ✅ pass (66/66) ¹ |
golden |
llama.cpp reference recorded on the same GGUF: greedy tokens and top-5 log-probs, short prompts and 1k-32k documents | ✅ pass ² |
compare |
Greedy output vs the llama.cpp reference, token by token; every divergence is a near-tie | ✅ pass ² |
vision |
Image input vs llama.cpp with the same projector: identical prompt tokens, replies equal up to near-ties | ✅ pass ² |
consistency |
Concurrent requests give the same output as the same requests run alone | ✅ pass ² |
spec |
Speculative decoding on gives exactly the output of speculative decoding off | ✅ pass ² |
agent |
Multi-turn tool-calling loop: exact prompt rendering, history reuse, valid tool calls, output vs llama.cpp | ✅ pass ² |
agent_think_off |
The tool-calling loop with thinking off | ✅ pass ³ |
sampling |
temperature, top_k and seed behave as specified; first-token distribution matches llama.cpp | ✅ pass ² |
needle |
Needle-in-a-haystack prompt at up to half the context, compared with llama.cpp; over-capacity prompt refused | ✅ pass ³ |
needle_full |
Needle-in-a-haystack prompt at the full context is served | ✅ pass ² |
decision |
Decision answers (choice, score, noul probabilities) vs llama.cpp on the same prompts | — not applicable |
- ¹ local run, 2026-11-06; device AMD RYZEN AI MAX+ 395 w/ Radeon 8060S, AMD Radeon 8060S Graphics, Ubuntu 26.04; hrx-loom
0.1.0(hrx-systemd01d1c1, recovered). - ² DevLab Dispatch run 42315858300, LEVEL=full, 2026-11-07; device AMD RYZEN AI MAX+ 395 w/ Radeon 8060S, AMD Radeon 8060S Graphics, Ubuntu 24.04; hrx-loom
0.1.0(hrx-systemd01d1c1). - ³ DevLab Dispatch run 42342529061, LEVEL=quick, 2026-11-07; device AMD RYZEN AI MAX+ 395 w/ Radeon 8060S, AMD Radeon 8060S Graphics, Ubuntu 24.04; hrx-loom
0.1.0(hrx-systemd01d1c1). - Gates are the loom-benchmark correctness gates (
gates.sh); a gate without a recorded run shows no evidence.
Files
model.json/model.json.lock: the card and the pinned source files (sha256 checked byloom-fetch).program/*.loom,weights.loom: the generated Loom programs.tokenizer.json: the tokenizer.llm_config.json: the configuration the programs were generated from.info.json: the measurements, gate evidence and versions this card shows; everything else comes from the files above.REPORT.md: how the values above were measured: setup, commands and the value of every run.
Versions: card schema loom-card/2; loom-skills af9f2a0 (recovered); hrx-loom 0.1.0 (hrx-system d01d1c1, recovered); card generator 1ed9a3e.
Source files, fetched by loom-fetch from their own repositories:
- checkpoint: bartowski/Qwen3.8-27B-GGUF @
87410e7,Qwen3.8-27B-Q4_K_M.gguf - drafter: z-lab/Qwen3.8-27B-DFlash2-GGUF @
2d9571f,Qwen3.8-27B-DFlash2-Q4_K_M.gguf - projector: bartowski/Qwen3.8-27B-GGUF @
87410e7,mmproj-Qwen3.8-27B-f16.gguf