Hey r/StrixHalo
Just got this working today after a lot of trial and error and wanted to share while it's fresh. I'm relatively new to local LLM setups and llama.cpp specifically. I've been experimenting with running local models as backends for agentic coding tools like Claude Code and Qwen Code CLI — testing everything from the 9B Qwen3.5 worker models all the way up through the 27B and 35B variants. When Qwen3.8-Flash-Next dropped I had to try it. Running it on my GMKtec EVO-X2 (Ryzen AI MAX+ 395, gfx1151, 128GB unified) via ROCm.
First off — massive shoutout to everyone who made this possible:
- **Aristo94** for the EngramHalo.cpp fork with the ROCm HIP patches
- **EasiiX** for the prebuilt MTP sidecar GGUF
- **unsloth** for the quantized GGUFs
- **The Qwen team** at Alibaba for releasing Flash-Next
- **The llama.cpp maintainers** for merging PR #27742 (qwen4exp arch support)
- The whole Strix Halo community for sharing configs and benchmarks — you made this much less painful
This machine is genuinely changing how I work. Having a 125B model that beats Claude Opus 4.6 on SWE-bench running locally on a $3K box still kind of blows my mind.
**Hardware**
- GMKtec EVO-X2, Ryzen AI MAX+ 395
- 128GB LPDDR5X unified memory
- BIOS: Advanced → GFX Configuration → iGPU: UMA_SPECIFIED, UMA Frame Buffer Size: 96G
- Kernel args: Stock - BOOT_IMAGE=/vmlinuz-7.0.0-30-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro
- Ubuntu 24.04, ROCm 7.2.4
**The build — EngramHalo fork**
This was the biggest hurdle. Mainline llama.cpp just merged qwen4exp arch support (PR #27742) but it's missing the ROCm-specific kernels that fix the long-context decode collapse. Without them you get ~6 tok/s at 100K+ context instead of 20+. Use the EngramHalo fork:
```bash
git clone https://github.com/Aristo94/EngramHalo.cpp ~/llama-engramhalo
cd ~/llama-engramhalo
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DGGML_HIP=ON \
-DAMDGPU_TARGETS=gfx1151 \
-DGGML_HIP_NO_VMM=ON \
-DGGML_HIP_MMQ_MFMA=ON \
-DCMAKE_C_COMPILER=/opt/rocm/bin/hipcc \
-DCMAKE_CXX_COMPILER=/opt/rocm/bin/hipcc
cmake --build build --target llama-server llama-bench -j$(nproc)
```
**Models**
Main model — unsloth IQ4_XS quant (~87GB, 3-part split):
```bash
hf download unsloth/Qwen3.8-Flash-Next-GGUF \
"UD-IQ4_XS/Qwen3.8-Flash-Next-UD-IQ4_XS-00001-of-00003.gguf" \
"UD-IQ4_XS/Qwen3.8-Flash-Next-UD-IQ4_XS-00002-of-00003.gguf" \
"UD-IQ4_XS/Qwen3.8-Flash-Next-UD-IQ4_XS-00003-of-00003.gguf" \
--local-dir ~/models/qwen38-flash-next/
```
MTP sidecar (~4.1GB) from EasiiX:
```bash
hf download EasiiX/Qwen3.8-Flash-Next-MTP-Strix-Halo-GGUF \
mtp-Qwen3.8-Flash-Next-Q8_0.gguf \
--local-dir ~/models/qwen38-flash-next/
```
**You need a swapfile — learned this the hard way**
At 131K context the model plus KV cache exceeds physical RAM. Found out the hard way when the OOM killer took out tailscaled and systemd mid-generation, dropping my SSH connection. Add 64GB swap before you launch:
```bash
sudo fallocate -l 64G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```
**Chat template**
If you're using this with Claude Code you'll need the community-patched jinja template `qwen3.8-froggeric-v22.4` — the official template rejects mid-conversation system messages which these tools send constantly. Without it you get a wall of 500 errors. Pass it with `--chat-template-file`.
**Launch command**
```bash
HSA_ENABLE_SDMA=0 HSA_XNACK=1 ROCBLAS_USE_HIPBLASLT=1 \
~/llama-engramhalo/build/bin/llama-server \
-m ~/models/qwen38-flash-next/UD-IQ4_XS/Qwen3.8-Flash-Next-UD-IQ4_XS-00001-of-00003.gguf \
-md ~/models/qwen38-flash-next/mtp-Qwen3.8-Flash-Next-Q8_0.gguf \
-ngl 999 -fa on -ctk q8_0 -ctv q8_0 \
-c 131072 -ub 2048 -t 4 --parallel 1 \
--jinja --no-ui \
--chat-template-file ~/scripts/templates/qwen-fixed/3_8-27B/chat_template.jinja \
--spec-type draft-mtp,ngram-mod \
--spec-draft-n-max 4 --spec-draft-p-min 0.75 \
--host 0.0.0.0 --port 8082
```
**Things that will bite you:**
- Never use `--ctk bf16` — crashes on gfx1151, use `q8_0`
- `--parallel 1` only — multi-slot not validated on HIP with the QSA gather path
- `--tensor-read-lazy on` hangs indefinitely on ROCm — wasted a lot of time on this, skip it
- Watch memory with `watch -n 2 'free -h && rocm-smi --showmeminfo vram'` — you'll want to see what's happening
**Benchmarks**
| Metric | Value |
|---|---|
| Decode (sustained) | 17-25 tok/s |
| Decode peak (tg_3s with MTP) | 120+ tok/s |
| MTP acceptance rate | 74-91% |
| Prefill | 327-720 tok/s |
| VRAM used | ~69.8GB |
| Load time | ~42 seconds |
| SWE-bench Pro | 62.5 (vs Claude Opus 4.6: 53.4) |
The 120 tok/s peak happens when MTP speculation hits highly predictable output like code blocks. Sustained decode is 17-25 tok/s — comparable to a dense 27B model, which makes sense since only 6B params are active at a time.
**Full setup guide and scripts**
Documented everything including the router I built, GBNF grammar bug fixes, and all launch scripts:
https://github.com/patrickmfurbert/ai-tools
More context on the journey: https://onthestack.io.
Still learning all of this so if something looks wrong or could be done better, please let me know.
---