Introduction
Work in progress: This wiki is being actively expanded from Discord research and fork release notes. Many tuning recipes and throughput numbers are community-reported and have not been independently reproduced here. See Verification status for what is solid vs what still needs checking on your hardware.
Welcome to the GFX1030 Wiki — a focused, hands-on knowledge base for running LLM inference on AMD gfx1030 (RDNA2 / Navi 21) GPUs, with a strong bias toward the Radeon PRO V620 and the purpose-built tooling collected here.
gfx1030 is the LLVM/ROCm target for the Navi 21 “Sienna Cichlid” die. It powers the consumer
Radeon RX 6800 / 6800 XT / 6900 XT / 6950 XT and the workstation/data-center PRO W6800 and
PRO V620. These cards are officially supported by ROCm on Linux, which makes them a cost-effective
platform for modern LLMs — but getting the most out of them (power tuning, multi-GPU P2P, and RDNA-tuned
kernels) takes a bit of extra work. That’s what this wiki documents.
Read it in this order
- Getting started — hardware check, ROCm, optional V620 tuning, first container.
- llama.cpp or vLLM — which stack matches the model and card count.
- The matching section: vLLM onboard (V620) / vLLM overview, or llama.cpp.
- Troubleshooting when a command fails. Verification status says which numbers are solid.
Host firmware (the machine never POSTs) and Flash-Next serve lines are specialist pages. Skip them until you need them.
What this wiki focuses on
- Tuning — the
v620_toolboxrecipes: lowering the V620’s VBIOS-locked 250 W floor to 120 W, enabling GPU↔GPU PCIe Peer-to-Peer between multiple V620s (Fedora + AMD hosts; power tuning also on Ubuntu 26.04; Intel Ice Lake often sees no P2P win — A/B it), and optionally disabling Pro-card ECC for ~2 GB extra VRAM. - llama.cpp — stock builds plus the RDNA2 fork (tensor parallel, MTP / DFlash). Usually the easiest first stack on V620.
- vLLM on RDNA — ready-to-run Docker images;
recipes for Hub vs recipe container, and a separate
Flash-Next page
(
blivioniag/vllm-rdnaon ablivioniag/rocm-rdnaPyTorch base), how they are built withopengfx1030/vllm-rdna-docker, and the official vLLM extras forkopengfx1030/vllm-rdna(rdna_extras, now including Flash-Next cherry-picks). Hubv0.31.0-extrastracks the 11 Oct 2026 bake pin; commits after that pin still want a host venv clone.
New here? Start with Getting Started. Card identity is on Supported Hardware.
Community Discord
Much of this wiki is distilled from the gfx1030 club Discord — live tuning tips, fork releases, and multi-GPU benches land there first.
- Server: gfx1030 club
- Join: https://discord.gg/mESex2aBp
- Useful channels:
#vllm-rdna,#llamacpp,#general,#benchmarks,#harnesses,#lmcache,#motherboard
When turning Discord threads into docs, follow the privacy rules in Contributing.
Disclaimer: This is a community wiki, not affiliated with or endorsed by AMD. Kernel patches and power-cap changes are done at your own risk. Always cross-check against the official ROCm documentation. Contributions welcome — see Contributing.
llama.cpp or vLLM
Pick a stack before you follow a recipe. Both run on gfx1030; they are good at different jobs. Numbers below are community snapshots — see Verification status.
Which stack
| Workload | Prefer |
|---|---|
| Getting ROCm + multi-GPU working; GGUF; single-stream / low concurrency | llama.cpp (RDNA2 fork) — more battle-tested on V620 |
| Multi-stream / agentic loads with prefix caching | vLLM -extras — caching + concurrency usually win |
| Qwen3.8 Flash-Next on 4× V620 (weights in VRAM) | vLLM Flash-Next / rdna_extras — see Flash-Next. llama.cpp on the same job is typically much slower |
| Flash-Next on 2× V620, or any host that must RAM/CPU-offload | llama.cpp (--n-cpu-moe, -ot …=CPU) is the non-HEAD path — community 2-card IQ4_XS ~25 t/s / 150–200 PP. HEAD vLLM after #146 (28 Oct) has serve_offload.sh — 2× offload. Needs verify on a second host. |
| MoE / lighter agentic (Qwen3.6 35B-A3B, Ornith-class) | Either — the sweet spot on these cards |
| Curious about Strata (HIP, not llama.cpp) | Experimental. #general Oct 7–8: 2× V620 prompt jumped after gfx103x PRs #835 / #849 + STRATA_HIP_PROMPT_F16=1; 3-card hosts still could not match vLLM prefill and decode sagged under concurrency. #strata (25 Oct): Strata 0.1.49.2 signed DeepSeek engine feed has no gfx1030 HIP package (HIP build lists gfx1200/gfx1201). #vllm-rdna (28 Oct): easier onboarding / dashboard than vLLM; more interesting on fewer than 4 cards or when experts must spill. Not a wiki default — resources |
New to the cards? Start with RDNA2 serving, then vLLM onboard when you need concurrency. Multi-GPU tensor parallel benefits from PCIe P2P.
What fits well on V620
#general (Sep 2026) consensus — RDNA2 has no matrix / tensor cores, so prefill on dense
models is the weak spot (agentic “read a pile of files” workloads frustrate people even when decode
looks fine):
| Workload | Community take |
|---|---|
| MoE (e.g. Qwen3.6 35B-A3B, Ornith-class) | Sweet spot on 1–4× V620 |
| Dense 27B | Usable; expect mediocre PP vs newer silicon |
| Flash-Next | Promising on 4× V620 via vLLM Flash-Next; not a 1-card path |
| GLM-5.3-Flash / DeepSeek-class large MoE | Not 1–2 cards. Public zai-org/GLM-5.3-Flash is 320B / 18B active. #general (25 Oct): 1× V620 + host-RAM offload is a poor fit (community Maya snapshot ~200 PP / ~13 TG — Needs verify). Community vLLM path is 8× — recipes. |
| Dense agentic on 1–2 cards | Often disappointing TTFT / PP — prefer MoE or more cards |
| ComfyUI image / video | Poor fit — many workflows default to bf16 (emulated on V620). See hardware |
Next
- Getting started
- vLLM recipes — Hub
-extrasvs recipe container - llama.cpp overview
Getting Started
This page gets you from a bare Linux install to a working ROCm + PyTorch stack on a gfx1030 card, and explains how to preview this wiki locally.
1. Confirm your hardware
Make sure your card is a Navi 21 gfx1030 (or a related RDNA2 card):
lspci | grep -i vga
# After ROCm is installed:
rocminfo | grep -m1 -o 'gfx[0-9]*'
See Supported Hardware for the full card list. If the box never POSTs with several V620s (especially behind a PLX switch), read Host firmware before chasing ROCm.
2. Install ROCm
Follow Installing ROCm. At a high level:
# Add the amdgpu repo, then:
sudo apt install rocm
sudo usermod -aG render,video "$LOGNAME"
# Reboot, then verify:
rocminfo
clinfo | grep -i 'gfx\|Board'
3. (Optional) Tune the card
If you run one or more Radeon PRO V620 (or PRO W6800) cards, these tweaks are worth doing before you load models (Fedora or Ubuntu 26.04 for power cap; P2P is Fedora + AMD-validated — A/B on Intel, see When P2P helps):
- Power Tuning — drop the VBIOS-locked 250 W floor to 120 W and boot-cap at 180 W.
Passthrough VM and need OD clocks instead? See
Soft unlock
(
amd-v620-soft-unlock). - Disabling ECC — Pro cards hide ~2 GB behind ECC; optional extra VRAM.
- Multi-GPU PCIe P2P — enable GPU↔GPU peer-to-peer for multi-card setups.
Baremetal power floor + P2P come from the v620_toolbox
repo.
4. Run an inference stack (Docker)
The fastest path is the prebuilt images — no local ROCm/PyTorch/vLLM build required:
- Onboard vLLM on V620 — short happy path for Hub
v0.31.0-extrasor the fork launcher (serve_rdna.sh). - Running vLLM (Docker) —
blivioniag/vllm-rdnaon ablivioniag/rocm-rdnaPyTorch base. - vLLM recipes — Hub
-extrasvs recipe container vs Flash-Next by card count.
Prefer GGUF and building from source? See Building & Running llama.cpp (ROCm or Vulkan).
Want to build the images yourself, or use the RDNA-tuned kernels? See Building the Images and The rdna_extras fork.
Need the same stack in a host uv venv instead of Docker? See
Host venv (ROCm 7.2.0 index wheels, or 7.14.0 multi-arch wheels).
5. Smoke test
# Inside a rocm-rdna / vllm-rdna container, or a local ROCm PyTorch env:
python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
You should see True and your Radeon card’s name. If not, see Troubleshooting.
6. Join the community Discord
Questions, live benches, and fork updates land first on gfx1030 club:
https://discord.gg/mESex2aBp (#vllm-rdna, #llamacpp, #general,
#benchmarks). See Useful resources.
Editors: local preview and page conventions are in Contributing.
Supported Hardware
gfx1030 is the LLVM target name for AMD’s Navi 21 GPU (RDNA2 generation, codename
Sienna Cichlid). Several retail and workstation cards use this die and therefore report themselves
as gfx1030.
Cards that natively report as gfx1030
| Card | Architecture | VRAM | Compute Units | Notes |
|---|---|---|---|---|
| Radeon RX 6950 XT | RDNA2 / Navi 21 | 16 GB GDDR6 | 80 | No ECC |
| Radeon RX 6900 XT | RDNA2 / Navi 21 | 16 GB GDDR6 | 80 | No ECC |
| Radeon RX 6800 XT | RDNA2 / Navi 21 | 16 GB GDDR6 | 72 | Same CU count as V620; 16 GB, no ECC |
| Radeon RX 6800 | RDNA2 / Navi 21 | 16 GB GDDR6 | 60 | No ECC |
| Radeon PRO W6800 | RDNA2 / Navi 21 | 32 GB GDDR6 | 60 | ECC on by default (~30 GB visible) |
| Radeon PRO V620 | RDNA2 / Navi 21 | 32 GB GDDR6 | 72 | Data-center; ECC on by default (~30 GB visible) |
Pro cards hide ~2 GB behind ECC. See Disabling ECC if you want the full 32 GB.
#general (Sep 15 2026): versus a 32 GB MI50 (gfx906), community first-pass on V620 was more
prefill, less decode — PP “almost 2×”, TG behind but not far. That is a community A/B, not
a wiki bench. Sibling notes: wiki-gfx906.
#general (Sep 17 2026): do not tensor-parallel a V620 with an NVIDIA card (community example:
RTX 5090 + V620). Opposite strengths (RDNA2 has no matrix cores; the NVIDIA card has little VRAM
per dollar) — mixed decode gains were small and prefill collapsed. Prefer a homogeneous V620
(or W6800) box, or run the NVIDIA card standalone.
Do not flash W6800 VBIOS onto a V620.
#general(Sep 2026): pre-modded eBay cards and DIY flashes that load a W6800 BIOS on a V620 drop active CUs from 72 → 54 (W6800’s different CU layout). That is a large compute hit — stay on stock V620 BIOS. Cooling shroud mods are fine; BIOS swaps are not a free “Pro unlock.”Need OverDrive / unlocked clocks in a passthrough VM without flashing? Prefer the reversible 4-byte PowerPlay soft unlock (
Tamalero/amd-v620-soft-unlock) over a W6800 flash — see Power tuning → Soft unlock.
All of these are on the officially supported list for recent ROCm releases on Linux.
AMD BC-250 (gfx1013)
Headless mining APU board (Cyan Skillfish). RDNA2, reports as gfx1013 — not Navi 21 / gfx1030.
Community ROCm and Vulkan work exists; most of this wiki still targets Navi 21.
| Card | Architecture | VRAM | Compute Units | Notes |
|---|---|---|---|---|
| AMD BC-250 | RDNA2 / Cyan Skillfish | 16 GB GDDR6 UMA | 24 (40 unlocked) |
Community references: AMD BC-250 docs, akandr/bc250-rocm.
RDNA2 relatives that can run gfx1030 code
The rest of the RDNA2 line uses a different LLVM target but shares the same ISA family. They are not
on the official support matrix, but in practice they run gfx1030 kernels once you set
HSA_OVERRIDE_GFX_VERSION=10.3.0 (see HSA_OVERRIDE for RDNA2 Cousins).
| Card | LLVM target | Die |
|---|---|---|
| RX 6750 XT / 6700 XT / 6700 | gfx1031 | Navi 22 |
| RX 6650 XT / 6600 XT / 6600 | gfx1032 | Navi 23 |
| RX 6500 XT / 6400 | gfx1034 | Navi 24 |
| Ryzen 6000/7000 iGPU (RDNA2) | gfx1035 / gfx1036 | Rembrandt / Phoenix |
Architecture highlights (Navi 21)
- RDNA2 compute units with a native wavefront size of 32 (wave32), unlike GCN’s wave64.
- Infinity Cache (128 MB on Navi 21) that dramatically raises effective memory bandwidth.
- No dedicated matrix/tensor cores — RDNA2 predates the WMMA/matrix instructions added in RDNA3
(
gfx11xx). Matrix math runs on the regular vector ALUs, so expect lower peak throughput than RDNA3 or CDNA cards, but very good price/performance for inference. - FP16 is well supported; BF16 has limited/emulated support and is best avoided for hot paths
(prefer
float16).#general(Sep 28 2026): ComfyUI / image-video workflows often default to bf16. On V620 that path is HIP-emulated, so those pipelines are a poor fit — pick fp16 / int8 workflows, or use a card with native bf16. Community also called video generation a CUDA-world problem, not a V620 win.#general(30 Oct): training on V620 is the same constraint — prefer FP32 (or a native-bf16 card); community bf16-emulation tests had drawbacks.
How to check your GPU target
rocminfo | grep -i 'gfx\|Name'
# or, more directly:
rocminfo | grep -m1 -o 'gfx[0-9]*'
If the output shows gfx1030, everything in this wiki applies directly. If it shows gfx1031,
gfx1032, etc., head to HSA_OVERRIDE for RDNA2 Cousins first.
Host firmware (large BAR / no POST)
4× V620 behind a PLX switch can fail to POST on older workstation BIOS (community: Dell Precision T5820 / T7820 / T7920) even when the same kit boots on a modern desktop board. That is firmware MMIO High / SR-IOV work — see Host firmware — not a ROCm bug.
Installing ROCm
gfx1030 (Navi 21) is on AMD’s officially supported list for recent ROCm releases on Linux, so in
most cases a stock install “just works” — no override hacks required.
Always follow the official ROCm install guide for your exact distro and ROCm version. The commands below are a convenience summary and may drift over time.
Supported operating systems
ROCm’s RDNA2 support targets specific LTS releases. As of recent ROCm versions that typically means:
- Ubuntu 22.04 / 24.04 LTS
- RHEL / Rocky 9.x
- Debian 12 (community, less tested)
- Fedora 43 (wiki-validated for power / P2P); Fedora Server 44 + kernel 6.19 reported working for the V620 powerfix (community)
Check the system requirements page for the version you plan to install.
Ubuntu quick install (amdgpu-install)
# 1. Add the amdgpu package repository (replace VERSION with the ROCm release you want, e.g. 6.4.60400-1)
sudo apt update
wget https://repo.radeon.com/amdgpu-install/latest/ubuntu/jammy/amdgpu-install_VERSION_all.deb
sudo apt install ./amdgpu-install_VERSION_all.deb
sudo apt update
# 2. Install ROCm (compute use case)
sudo amdgpu-install --usecase=rocm
# 3. Add yourself to the render/video groups so you can access the GPU without root
sudo usermod -aG render,video "$LOGNAME"
# 4. Reboot
sudo reboot
Verify the install
rocminfo # should list your Navi 21 card and "Name: gfx1030"
clinfo | grep -i 'Board\|gfx' # OpenCL view
rocm-smi # live clocks, temps, VRAM, power
If rocminfo shows Name: gfx1030, you’re done. If it shows gfx1031/gfx1032/etc., your card is a
smaller RDNA2 die — continue to HSA_OVERRIDE for RDNA2 Cousins.
Multi-GPU: pin ROCm 7.2.0 or 7.14.0
For more than one card, stay on ROCm 7.2.0 (not 7.2.1+) or jump to 7.14.0.
#vllm-rdna / #llamacpp report an RCCL bug from 7.2.1 upward (including mid-line builds such as
7.2.4) that shows up as soon as you leave a single GPU — tensor-parallel hangs, comm failures,
AllReduce init failed, or cards dropping offline. The published
vllm-rdna images already sit on those two bases for that reason.
Do not “upgrade within 7.2.x” on a multi-GPU box. If you are already on a broken 7.2.1–7.13
userspace, rebuild or pull a 7.2.0 or 7.14.0 image rather than debugging RCCL on the
in-between releases. Ubuntu 26.04 can ship ROCm/HIP 7.1 (#llamacpp Sep 17) — treat that as
an A/B, not the multi-GPU pin. ROCm 10 / TheRock packaging is interesting for newer cards;
community llama.cpp benches on Ice Lake have run ROCm 10.0 with numbers close to 7.1 on that
host. #vllm-rdna (29 Oct): a fresh Ubuntu 26.04 install can land /opt/rocm/core-10
(and core-10.1) with no core-7.14 folder — do not copy a 7.14 ROCM_HOME from
host venv onto that tree. Same thread: ROCm 10 serves on at
least one host; the Triton wheel for that userspace is unconfirmed. #vllm-rdna
(30 Oct): maintainer called ROCm 10 and 7.14 the same for day-to-day serving;
another host is already serving on 10 with no issues so far. That is not a
reason to wipe a working 7.14 box. One 10.1 host-venv attempt failed before a
clean 7.14 retry — Needs verify, not a 10.1 ban. Day-to-day gfx1030 multi-GPU
advice is still: prefer 7.14.0 (or 7.2.0) unless you are deliberately
lab-testing 10.x.
Notes & gotchas
- Kernel driver: ROCm relies on the
amdgpukernel module. Very new kernels sometimes ship a driver newer than your ROCm userspace expects; theamdgpu-dkmspackage from the amdgpu repo keeps them in sync. - Secure Boot: if Secure Boot is enabled, the DKMS module must be signed or it will fail to load. The easiest path for a dev box is to disable Secure Boot.
- Multiple GPUs / iGPU present: if your CPU also has an RDNA2 iGPU, ROCm may enumerate it. Pin the
discrete card with
HIP_VISIBLE_DEVICES(see Reference). - hipBLASLt: some libraries assume hipBLASLt, which historically had gaps on Navi 21. If a workload
complains, try
TORCH_BLAS_PREFER_HIPBLASLT=0(PyTorch) or the workload’s equivalent flag.
HSA_OVERRIDE for RDNA2 Cousins
Only Navi 21 cards report as gfx1030. The smaller RDNA2 dies use different LLVM targets:
| Card family | LLVM target | Die |
|---|---|---|
| RX 6700 XT / 6750 XT / 6700 | gfx1031 | Navi 22 |
| RX 6600 / 6600 XT / 6650 XT | gfx1032 | Navi 23 |
| RX 6500 XT / 6400 | gfx1034 | Navi 24 |
| RDNA2 iGPUs (Ryzen 6000/7000) | gfx1035 / gfx1036 | Rembrandt / Phoenix |
Many ROCm libraries only ship precompiled kernels for a subset of targets. Because every RDNA2 card shares the same instruction set family, you can tell ROCm to treat your card as gfx1030 and reuse the gfx1030 kernels.
The override
export HSA_OVERRIDE_GFX_VERSION=10.3.0
10.3.0 maps to gfx1030. Set it in the shell (or systemd unit / container env) before launching
any HIP/ROCm program:
HSA_OVERRIDE_GFX_VERSION=10.3.0 python my_inference_script.py
To make it permanent for your user:
echo 'export HSA_OVERRIDE_GFX_VERSION=10.3.0' >> ~/.bashrc
Why this works (and its limits)
- RDNA2 GPUs (gfx1030–gfx1036) are binary-compatible enough that gfx1030 kernels execute correctly on the smaller dies for the vast majority of ML ops.
- It is still a workaround. AMD does not officially validate it, and you may hit edge cases — particularly in hand-tuned assembly kernels or libraries that query the exact arch at runtime.
- Performance-tuned kernels (e.g. in rocBLAS/Tensile) were tuned for Navi 21’s CU count and cache; on a smaller die they run correctly but may be sub-optimal.
Building instead of overriding
If you compile a library yourself, prefer building for your real target so you get correctly-tuned kernels, e.g.:
# Build for multiple RDNA2 targets at once
export PYTORCH_ROCM_ARCH="gfx1030;gfx1031;gfx1032"
# or for a single card
export AMDGPU_TARGETS=gfx1032
For llama.cpp:
cmake -B build -DGGML_HIP=ON -DAMDGPU_TARGETS=gfx1030 -DCMAKE_BUILD_TYPE=Release
Verifying it took effect
HSA_OVERRIDE_GFX_VERSION=10.3.0 python -c \
"import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
If PyTorch previously errored with "no kernel image is available for execution on the device" and now
prints True, the override is working.
Host firmware (MMIO High / large BAR / SR-IOV)
WIP / community: Workstation BIOS work for 4× V620 + PLX. Reports are from
#motherboardand#general(Sep 2026). Treat every offset as your dump, not a copy-paste from a PDF. See Verification status.
Large-BAR cards (V620 is 32 GB GDDR6, plus a huge prefetchable MMIO window) can fail to POST on older workstation firmware even when the same cards boot on a modern desktop board. This page is about getting the host to enumerate the GPUs — not about PCIe P2P after Linux is up.
When this applies
Community symptoms:
- Host POSTs fine with no GPUs (or one GPU) and hangs with 4× V620 behind a PLX / switch
- bifurcation card.
- The same 4× V620 + PLX kit works on a recent consumer board (community: Z690-class) but not on a Dell Precision tower you want for more RAM / more slots.
lspcinever appears because firmware never hands off.
If Linux already sees all cards, skip this page and go to P2P / Getting started.
Dell Precision T5820 / T7820 / T7920 (community)
#motherboard + #general (Sep 12–14 2026): these Xeon-W / dual-socket Precision towers often need
a hidden MMIO High / large-BAR change. A circulating public write-up is the
Precision 7920 MMIO GPU Unlock Guide
(GitHub attachment). Community: T7820 behaves like T5820 for this class of tweak.
Operational rules (do these)
- Dump your own UEFI variables. Do not copy a hex blob from the PDF or from someone else’s BIOS version. Community first-fail: writing another host’s dump back.
- Confirm the MMIO change without the PLX (cards in CPU slots, or fewer cards). Then add the switch.
- Prefer EFI
.nshscripts over typing hex by hand. Community usedsetup_var.efiand UEFITool against the matching BIOS update package (example: T7820 2.52.1) to find hidden variables. - Community variable name (T5820):
SocketCommonRcConfig, sub-fieldmmiohsizeset to0x03or0x04. Write base + size together; keep the existing base. Both sizes have been reported as “the one that worked” — A/B on your dump. - Do not factory-reset, clear CMOS, or pull the CMOS battery after a successful write — that
clears the change.
#general(Sep 23): a host that lost BIOS settings (flat CMOS battery suspected) came back with SR-IOV re-enabled and ReBAR off, then saw MMIO not allocated / fewer GPUs than before. Re-apply the known-good firmware settings before chasing ROCm. - After Linux boots, continue with P2P readiness.
Aperture size (community)
V620 VT-d / IOMMU windows reserve a very large prefetchable range per card (community order of magnitude: hundreds of GB of address space per GPU, not “just 32 GB VRAM”). A 64 GB MMIO High window can be too small for 4× V620. Community: there is often no 128 GB option; jump to 256 GB if the menu / variable allows it. Mixed large-BAR cards (e.g. adding 32 GB MI50s next to V620s) made a too-small window worse until 256 GB was set.
Dual-socket towers
T7820-class boards can route some slots to CPU2 or the chipset. Label the slots and keep all inference GPUs on one CPU’s root ports when you can. See Host topology.
What actually unblocked 4× V620 + PLX (one host)
Community (#motherboard, Sep 14 2026): Dell Precision T7820, 4× V620, LSI PEX880xx-class
switch on a bifurcation card, guest Proxmox.
- MMIO High /
mmiohsizework was necessary but not sufficient — POST still failed with the PLX populated. - The change that then posted and booted was disabling SR-IOV via hidden UEFI variables located with UEFITool on that BIOS package.
- That SR-IOV fix is board-specific. Do not treat it as a recipe for ASUS / HP / consumer boards.
Other platforms (short)
| Platform | Community note |
|---|---|
| Supermicro H12D | #general (Oct 6 2026): one H12D + V620 host looped POST codes 95, DE, AD, DF, 36, 05, 37 (reporter thought the card was dead). The combo that then POSTed: SR-IOV off, Above 4G decode on, CSM off, ReBAR on. Same thread: SR-IOV off was also needed for 4 GPUs per PLX on that board. Needs verify on other H12D BIOS revs — see below. |
| HP Z4 G4 | Firmware described as 32-bit MMIO with V620 — BAR / crosstalk pain; dual-CPU Z6/Z8 G4 are a different (more complex) story. #motherboard (Sep 16), Xeon W-2133 host: BIOS PCIe MIMO Assignment = 32-bit and ReBAR on. That 32-bit ceiling would fail to map 64 GB of VRAM; Linux then reallocates with GRUB pci=realloc=off pci=nocrs iommu=pt amdgpu.aspm=0 amdgpu.gpu_recovery=1. Needs verify on other Z4 BIOS revs. |
| HP Z6 G4 | #motherboard (18–23 Oct), single-CPU / 96 GB host, Fedora or Ubuntu: after a BIOS upgrade, front / memory-header blower fans could sit at the wrong PWM until a BIOS factory reset (settings looked pegged at 100%). Same thread: a second V620 in slot 5 failed with PSP load kdb failed! / PSP init error; that V620 POSTed in slot 2, and a small Quadro in slot 5 was fine. MMIO 32-bit, ACS off, ReBAR, PCI reset, and the Z4 GRUB realloc line were already set. #motherboard (29 Oct): community slot map slots 2 and 5 = x16, slot 4 = x8; a hidden BIOS setting (not in the visible menu) is the current guess for why a second V620 fails to init. Same thread (26 Oct): another Z-class host put V620s in slots 1 and 3 (x16) and a Quadro in slot 5 (x8). Unresolved / Needs verify — not a dual-V620 recipe yet. |
| ASUS WS-Z270 + ReBAR | #motherboard WIP on MI50 (not V620). Above 4G on, CSM off, ReBARUEFI. One card at 32 GB ReBAR, two cards collapsing to 16 GB / POST code 96 is not a gfx1030 recipe. Sep 15: ReBarState > 14 with two 32 GB cards threw code 96; UEFIPatch hit PciBus only, not PciRootBridge. Suggested A/B: GpuMMIOFix (OS remap, typically every boot) — Needs verify. |
| Modern desktop (Z690-class, etc.) | Often POSTs 4× V620 + PLX without hidden MMIO patches (community contrast to Precision). |
Supermicro H12D
#general (Oct 6 2026): dual-SP3 H12D (community also uses H12D-8D as a P2P / bifurcation host) can fail to POST a V620 with a repeating debug-LED loop. Community first-success set:
- SR-IOV — disabled (also reported required for 4 GPUs behind one PLX on this board).
- Above 4G decode — on.
- CSM — off.
- ReBAR — on.
That is a menu-level combo, not the Dell hidden-mmiohsize path above. Do not factory-reset /
clear CMOS after it works — on other boards that re-enables SR-IOV and turns ReBAR off. Needs
verify on other H12D revisions.
BIOS editors and unsigned flashes void warranty and can brick the board. Use the vendor flashback / recovery path if you have one. This wiki does not publish byte patches.
Tools (public)
| Tool | Use |
|---|---|
| UEFITool | Decode the same BIOS update you are running; find hidden setup variables. |
| ReBARUEFI | Expose / patch ReBAR + related MMIO options when the menu hides them. |
| GpuMMIOFix | OS-side BAR remap above 4 GB (#motherboard Sep 15–16). Community: load each boot. Needs verify — not a substitute for a correct MMIO High / SR-IOV firmware fix on Precision towers. |
| Vendor BIOS .exe / capsule for your revision | Source of truth for variable layouts. |
Related
- Supported hardware — card identity
- Multi-GPU P2P — after the host POSTs
- Getting started
- Useful resources
Power Tuning (120 W floor)
The Radeon PRO V620 (gfx1030) ships with its power limit floor locked to 250 W in the VBIOS.
That’s wasteful for inference, where the card spends most of its time memory-bound. This page summarizes
how to unlock a 120 W floor and apply a 180 W boot cap, following the
powertuning/ feature of the
v620_toolbox repo.
Validated on Fedora 43 (kernels 6.17.6 pre-7 / 7.1.7 post-7) and Ubuntu 26.04 LTS (kernel
7.0.0-30-generic). Community confirmation: Fedora Server 44 + kernel 6.19, 4× V620, powerfix + 180 W cap (cap_min=120 W). This involves patching and rebuilding a kernel module — do it at your own risk.
Why it’s needed
The V620’s VBIOS declares 250 W as its minimum power limit, and the amdgpu driver trusts that number,
so any lower cap is rejected:
echo 180000000 | sudo tee /sys/class/hwmon/hwmonX/power1_cap
# -> Invalid argument
The SMU firmware actually accepts values down to 120 W — only the kernel is in the way.
#general (17 Oct 2026): that “Invalid argument” story is not universal. A Debian 12.12 /
kernel 6.1 host accepted echo 180000000 to power1_cap without the toolbox patch
(power1_cap_min stayed 0, power1_cap_max stayed 250 W). Temps dropped vs stock 250 W.
The same thread pointed at the public
r/linux_gaming report that AMD
sysfs power limiting is effectively broken on Linux 6.7+.
Maintainer: forgot the pre-7.x behavior; the 180 W write did lower temps from 250 W on that
report; the toolbox path still works on 7.x.
Treat a successful write on an old kernel as a soft cap only — it does not unlock the
120 W floor (power1_cap_min=0 means the driver never advertised 120 W). After a 6.7+ or 7.x
upgrade, expect the write to start failing again until you apply the patch. The supported
unlock is still this page’s toolbox path.
The fix
A tiny patch to sienna_cichlid_get_power_limit() in
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c clamps the reported minimum to 120 W — but only
when the GPU matches the V620 reference board by PCI identity:
- PCI device
1002:73a1, subsystem1002:0e34
It does not touch the VBIOS, pp_table, or pp_features, and works on any kernel ≥ 5.15 with any
number of V620s in the host. The canonical patch is
patches/v620-powercap-min-120W.patch
(portable across pre-7 and post-7 kernels via noinline).
+ if (smu->adev->pdev->vendor == 0x1002 &&
+ smu->adev->pdev->device == 0x73a1 &&
+ smu->adev->pdev->subsystem_vendor == 0x1002 &&
+ smu->adev->pdev->subsystem_device == 0x0e34)
+ sienna_cichlid_v620_min_powercap_fix(smu, min_power_limit);
Other gfx1030 boards (RX 6900 XT / 6800 use device
0x73bf) have different PCI IDs. To power-tune those, change the identity match in the patch accordingly.
Platform paths
| Platform | Toolbox path | How the patch lands |
|---|---|---|
| Fedora 43 | powertuning/ | Kernel RPM bake or out-of-tree amdgpu.ko override |
| Ubuntu 26.04 | ubuntu_powertuning/ | v620-rebuild-amdgpu — patches Ubuntu amdgpu source and installs to /lib/modules/.../updates/ |
Both platforms share the same 120 W floor patch logic, the same
v620-cap-apply.sh
runtime script, and the same
v620-powercap.service
boot cap. Follow the README in the folder for your distro.
Ubuntu quick path
git clone https://github.com/blivioniag/v620_toolbox.git
cd v620_toolbox/ubuntu_powertuning
# Install deps (see ubuntu_powertuning/README.md), then:
sudo cp v620-rebuild-amdgpu /usr/local/sbin/
sudo cp ../powertuning/scripts/v620-cap-apply.sh /usr/local/sbin/
sudo chmod 755 /usr/local/sbin/v620-rebuild-amdgpu /usr/local/sbin/v620-cap-apply.sh
sudo /usr/local/sbin/v620-rebuild-amdgpu "$(uname -r)"
sudo reboot
After reboot: sudo dmesg | grep -i 'V620 powerfix' and
../powertuning/scripts/v620-verify.sh. Install the systemd unit and optional
kernel/postinst.d/v620-amdgpu hook so future kernel updates rebuild the module —
see ubuntu_powertuning/README.md.
Secure Boot: disable it or sign the rebuilt module — unsigned overrides won’t load with SB on.
Two ways to apply it (Fedora)
The toolbox provides scripts under
powertuning/scripts/:
- Bake a kernel RPM —
v620-kernel-bake.shbuilds a Fedora dist-git kernel RPM with the patch (and the P2P kernel-config delta) baked in. Survives cleanly across reboots. - Out-of-tree module override —
v620-module-install.shbuilds a patchedamdgpu.koagainst your running kernel and installs it as an override. Re-run after every kernel update.
Then apply the runtime cap at boot:
scripts/v620-cap-apply.sh— writes the 180 W cap (matches the V620 by PCI ID).systemd/v620-powercap.service— a oneshot unit that runsv620-cap-apply.sh 180at boot.
Verify
# The kernel logs the fix on match:
sudo dmesg | grep -i 'V620 powerfix'
# The reported minimum is now 120 W (120000000 µW):
cat /sys/class/hwmon/hwmon*/power1_cap_min
# The toolbox's own check:
sudo ./powertuning/scripts/v620-verify.sh
v620-verify.sh confirms both the V620 powerfix dmesg marker and power1_cap_min=120000000.
After the override, idle around ~7 W per card has been reported (Fedora 44, 4× V620). If idle
is still ~50 W, the floor/cap path is not active — re-run verify.
Token cost vs stock 250 W
#llamacpp: at the stock 250 W floor, V620 inference can look ~15% more expensive per token than a
high-end Nvidia reference; with a 180 W cap after the floor unlock, the same report called V620
~20% cheaper per token, with falloff “undetectable” down to ~200 W and only small percentages below
that. Cap at 160 / 140 W mainly for PSU headroom, not because 180 W is slow. #general (Sep 2026)
similarly calls ~120–170 W the practical sweet spot — little gained above that for the extra watts.
Undervolt experiments exist; community: about −25 mV was stable for one host, while more aggressive
settings started emitting random tokens. #vllm-rdna (27 Oct): looping !!!! tokens
reproduced on one host with undervolt larger than ~20 mV or core above ~2479 MHz.
Other community clocks that did not show that loop: 2350 MHz core / 1050 MHz
memory at stock 250 W, and 2400 / 1075 MHz at 160 W. Treat UV / high-core as
optional and A/B carefully — token loops.
Slot power and PSU transients
Unlike many gaming cards, a V620 can reach TDP from the PCIe slot once it has enumerated.
That makes the +12 V rail and slot power delivery more sensitive than a 3080-class swap-in.
Enumeration is separate: #general (29 Oct): cards with only one 6+2 / 8-pin aux
cable plugged can light LEDs and still never appear in the OS. Community: dual 8-pin
(a single 8-pin from the PSU can Y-split) and slot power. Missing aux connectors is a
common “I have 8 cards but lspci only sees 5” miss.
-
Prefill / tensor-split can trip old or miner PSUs even when average watts look fine — see llama.cpp PSU troubleshooting.
-
If a new card hard-reboots the host on load, try a gentler SMU ramp before blaming the kernel:
sudo rocm-smi --setperflevel standard # community: ~80 W min / ~150 W max, softer ramp(
STANDARD/standard— checkrocm-smi --helpon your ROCm; the enum name varies.) -
Cap at 160 W or 140 W if 180 W still trips protection.
Multi-card PSU sizing (community)
#forum / #general (Sep 2026): an 8× V620 @ 180 W build targets ~1440 W for GPUs alone,
leaving headroom for CPU/board. One reported pick that avoids sketchy splitters:
SilverStone HELA 2050 Platinum (SST-AX2050MCPT-A). US hosts often need a 240 V circuit
for that class of load — stock 250 W × 8 on a 120 V / 20 A breaker is a non-starter. Prefer
the 120–180 W caps for both thermals and wall power.
#general (Sep 22–23): 1600 W Platinum was enough for 5× V620 at stock 250 W
(~1250 W GPU TDP). A 1200 W ATX 3.1 for 4× at stock is tight (1000 W GPU TDP
before CPU/board). Same thread: 0.7 A blowers were enough at 180 W; stock 250 W
full-power inference hit ~86 °C on that host. Community is still unsure whether
rocm-smi caps catch brief transients — size the PSU for stock TDP if you have not
applied the floor yet.
#general (31 Oct): an 8× V620 host saw IOMMU page faults then fatal
PCIe errors during TP8 or model load. The six cards on a 1500 W server
PSU → breakout board dropped from the OS; the two cards powered entirely by a
workstation PSU stayed. Unresolved (power delivery vs riser/cable vs
driver). Needs verify. A/B the disappearing group’s aux power and dmesg
for IOMMU / AER — the first card to log the fault is not necessarily the bad
one. See general troubleshooting.
See the full recipe, prerequisites, and the deep-dive docs
(docs/POWERCAP.md)
in the repo.
Soft unlock (passthrough VMs)
Different problem, different tool:
Tamalero/amd-v620-soft-unlock unlocks OverDrive
clock + power controls on a V620 that is PCIe-passthrough into a Linux VM (Proxmox / QEMU /
libvirt). Stock passthrough often leaves OverDrive empty (LACT / CoreCtrl / sysfs), a fixed ~1825 MHz
core pstate, and a hard 250 W power cap.
| Approach | What it changes | Typical use |
|---|---|---|
v620_toolbox power floor (this page) | Kernel reports power1_cap_min 120 W; boot-cap ~180 W | Baremetal or guest efficiency — lower watts for inference |
Soft unlock (amd-v620-soft-unlock) | 4-byte PowerPlay OD capability patch via QEMU romfile= — no flash, keeps 72 CUs | VM passthrough: expose OD clocks (core / VRAM) and power range ~232–275 W |
| W6800 VBIOS flash | Permanent signed cross-flash | Avoid — drops V620 CUs (72 → 54). See hardware |
How soft unlock works (summary — follow the upstream README):
- Guest kernel:
amdgpu.ppfeaturemask=0xffffffff - Dump the card’s own VBIOS from the guest (
/sys/kernel/debug/dri/*/amdgpu_vbios) - Patch with
make_odcaps_rom.py(sets OD caps 0–3 + ATOM checksum; no ROMs shipped) - Attach as QEMU
romfile=/ Proxmoxhostpci…,romfile=/ libvirt<rom file=…/> - Verify
pp_od_clk_voltageshows anOD_RANGE, then tune with sysfs /tools/v620/ LACT
Warnings from upstream (do not skip):
- Never write guest
pp_featuresor sysfspp_tableon this card — can wedge the SMU; V620 has no FLR, so recovery is a host reboot. - Soft unlock is per-VM (
romfile=). Nothing is written to the physical flash; removeromfile=to revert. - Passive baremetal ACPI VFCT delivery path is documented upstream as experimental / untested.
- Passive server cards need real airflow before raising clocks / 275 W.
#general: community reports of reliable use under Proxmox passthrough (weeks-long). This wiki has
not independently validated TFLOPS or power-range claims — treat benches in the upstream README
as community-reported.
Disabling ECC (Pro VRAM)
WIP: Procedure is documented for Radeon PRO W6800 in lunnova’s guide.
#vllm-rdnaand#generalreport the same ECC-on-by-default behavior on V620. Treat the two-reboot kernel-param path as community until you confirmrocm-smion your own cards. See Verification status.
Workstation/data-center Navi 21 cards (PRO V620, PRO W6800) ship with on-board ECC enabled. That costs about 7% of VRAM (~2 GB on a 32 GB card). Consumer RX 6800 / 6900 cards have no ECC and already show the full 16 GB.
| ECC | Typical rocm-smi VRAM (32 GB Pro card) |
|---|---|
| On (factory default) | ~30 700 MiB (~30 GB) |
| Off | ~32 768 MiB (full 32 GB) |
#vllm-rdna (pinned): extra ~2 GB per GPU if you disable it. Some members keep ECC on for bit-flip
protection; others disable it for long-context KV cache.
#general (Sep 23): stress-test VRAM before turning ECC off. One returned V620 only showed a
single correctable ECC error in dmesg; a Vulkan memtest-class load produced many errors in
minutes. Community: the extra ~2 GB is not worth it if the card is already throwing ECC errors
— leave ECC on and RMA / replace. Do not treat a quiet dmesg as a clean card.
#general (Sep 26): Flash-Next can surface ECC that a 27B serve does not. One host only saw
correctable errors in dmesg while running Qwen3.8 Flash-Next; the same cards stayed quiet on
Qwen3.8-27B. A follow-up Vulkan memtest of about 5–8 minutes per GPU (wait until temps
stabilize) was enough to catch a bad card that then started erroring immediately. A replacement
passed. Leave ECC on when dmesg reports errors even if a short 27B smoke looks fine.
Check whether ECC is on
sudo dmesg | grep -i ecc
# "MEM ECC is active" / "GECC is enabled" → ECC is on
# "MEM ECC is not presented" → consumer card / no ECC
rocm-smi --showmeminfo vram
# ~30.7 GB total on a 32 GB Pro card → ECC is eating the rest
Linux: amdgpu.ras_enable=0 (two reboots)
There is no Radeon control-panel toggle on Linux. The community path (lunnova, 6.x kernels) is:
- Add the kernel parameter
amdgpu.ras_enable=0. - Reboot twice, leaving the parameter in place both times.
GRUB (Ubuntu / Debian / Fedora):
# Ubuntu/Debian: edit GRUB_CMDLINE_LINUX_DEFAULT in /etc/default/grub
# Fedora: sudo grubby --update-kernel=ALL --args="amdgpu.ras_enable=0"
sudo nano /etc/default/grub
# …add amdgpu.ras_enable=0 to GRUB_CMDLINE_LINUX_DEFAULT, then:
sudo update-grub # Ubuntu/Debian
# Fedora uses grubby above instead of update-grub
sudo reboot
After the first reboot, dmesg should mention that GECC will be disabled on the next boot:
GECC will be disabled in next boot cycle if set amdgpu_ras_enable and/or amdgpu_ras_mask to 0x0
Reboot again. On the second boot you want:
amdgpu: GECC is disabled
and rocm-smi --showmeminfo vram should report the full ~32 768 MiB.
To turn ECC back on: remove the kernel parameter and reboot twice.
An older
amdgpu-no-ecc.patchis not needed on 6.x kernels. Keep it only if you are still on 5.x and the two-reboot path does nothing — details in lunnova’s article.
Notes
- Consumer gfx1030 (RX 6800 / 6800 XT / 6900 XT / 6950 XT): skip this page.
- Secure Boot / signed kernels: same caveats as power tuning — unsigned module overrides will not load.
- This does not replace the 120 W power-cap patch. ECC and the VBIOS power floor are independent.
Related
Multi-GPU PCIe P2P
For multi-card V620 rigs, enabling GPU↔GPU PCIe Peer-to-Peer (P2P) lets the GPUs DMA directly to each
other’s VRAM instead of bouncing through system memory — important for tensor/pipeline parallel serving.
This page summarizes the
pcie_p2p/ feature of the
v620_toolbox repo.
Validated end-to-end on Fedora 43 + AMD CPU (EPYC 7452), 4× Radeon PRO V620. Result:
rocminfoenumerates 5 HSA agents andamd-smi topologyshows 12/12 GPU↔GPU P2P ENABLED.Power-cap tuning on Ubuntu 26.04 is supported separately via
ubuntu_powertuning/— P2P recipes here remain Fedora-validated for now. Community Intel notes (Ice Lake) are in When P2P helps — and when it does not.
Two validated kernel paths
| Path | Kernel | Validated on | Notes |
|---|---|---|---|
| Pre-7 | ≤ 6.19.x | 6.17.6 | |
| Post-7 | ≥ 7.1 | 7.1.7 |
Both kernels can be installed on the same host simultaneously; toggle the default with
grubby --set-default /boot/vmlinuz-<evr>. Both boot with the 180 W power cap from
Power Tuning.
#vllm-rdna / #general (Sep 24): Ubuntu 26 may ship a 7.0-class kernel that sits in the
gap between these two validated paths. Do not assume the Fedora Post-7 recipe applies unchanged
— rebuild with the toolbox options (or stay on a Pre-7 / ≥7.1 build), then add iommu=pt,
confirm ACS off (bit-level caveat), ReBAR / Above 4G on, CSM off. Power-cap helpers for Ubuntu 26 live under
ubuntu_powertuning/;
P2P itself remains Fedora-validated.
Key prerequisites
- AMD CPU — the KFD P2P path is wiki-validated on AMD (EPYC 7452). Intel Ice Lake can enumerate P2P (community) but often does not speed up inference — see below.
- ≥ 2 Radeon PRO V620 for a meaningful P2P topology (bench validated on 4).
- No pre-gfx1030 AMD GPU installed alongside the V620. ROCm 7.x dropped support for older ASIC
families (gfx8xx Polaris, gfx900 Vega, …). If any pre-gfx1030 AMD GPU is present at boot, KFD
registration fails and
rocminfobails withFailed to map remapped mmio page on gpu_mem 0. This only matters if your host actually has older AMD cards — remove them first.
Identify your V620 reference boards:
lspci -nn | grep '1002:73a1' # one line per V620, subsystem 1002:0e34
The full 4-tuple 1002:73a1:1002:0e34 uniquely identifies the V620 reference board and is what the
toolbox scripts match on. Other gfx1030 boards (RX 6900 XT / 6800) use device 0x73bf and different
subsystem IDs — they’d need the identity match adjusted.
Readiness & verification
The toolbox ships diagnostics that gate on kernel config, hardware, ACS/IOMMU, and runtime state:
# Four-gate readiness check (kernel + hardware + ACS/IOMMU + runtime)
sudo ./powertuning/scripts/v620-p2p-readiness.sh
# End-to-end P2P verification
sudo ./pcie_p2p/scripts/verify-p2p.sh
A healthy system shows:
rocminfo | grep -c '^ Name:.*gfx1030' # one per V620
amd-smi topology # all GPU<->GPU pairs: P2P ENABLED
For the full recipe (kernel config deltas, BIOS/IOMMU settings, what can go wrong), read
pcie_p2p/README.md and the
knowledge base
powertuning/docs/AMD_P2P.md.
ACS is several bits, not one switch
Wiki and toolbox prose still say “ACS off”. #general (25 Oct 2026): that is not a
single enable bit. PCIe Access Control Services is a per-port control word (ACSCtl).
Clearing every bit is a different recipe from “P2P Request Redirect is off.”
Community host that passed V620↔V620 after the toolbox readiness script still reported
ACSCtl = 0x0019 on the relevant switch / root ports (nine ports on that machine):
| Bit | ACS control | That host | Why it matters |
|---|---|---|---|
| 0 | Source Validation | On | Checks requester IDs against the port’s bus hierarchy. |
| 1 | Translation Blocking | Off | Blocks translated / ATS-related requests when enabled. |
| 2 | P2P Request Redirect | Off | When on, peer requests go upstream instead of local switch routing. Community: the principal P2P obstacle. |
| 3 | P2P Completion Redirect | On | Redirects peer completions upstream. |
| 4 | Upstream Forwarding | On | Enables upstream forwarding under ACS routing rules. |
| 5 | P2P Egress Control | Off | Extra peer-destination permissions. |
| 6 | Direct Translated P2P | Off | Lets already-translated requests skip peer-request redirection. Not required for ordinary P2P. |
Same thread, two recipes — do not pick a winner without a second host +
verify-p2p.sh:
| Recipe | Who / when | Result |
|---|---|---|
| All ACS bits off plus the rest of the toolbox path | Maintainer, #general 25 Oct | Works on the Fedora + AMD CPU wiki-validated host. “ACS off is one thing; the rest is in the toolbox.” |
Leave 0x0019 (bits 0 / 3 / 4 on; bit 2 off) | Community, #general 25 Oct | Toolbox readiness said ACS off while those three bits stayed on. Clearing all remaining bits broke V620↔V620 on that host. |
Inspect without copying a personal BDF. Replace 00:00.0 with your switch or CPU
root port (not the GPU):
sudo setpci -s 00:00.0 ECAP_ACS+0x06.w
# 0019 = the community-passing mask above
Then run v620-p2p-readiness.sh and verify-p2p.sh. Treat a readiness “ACS off” line as
incomplete until you have amd-smi topology P2P ENABLED and a working TP serve.
Needs verify on a second topology.
When P2P helps — and when it does not
amd-smi topology saying P2P ENABLED is not the same as faster tokens. Always A/B with
NCCL_P2P_DISABLE=1. Community reports (#general, Ice Lake 4× V620 host):
| Host | What people report |
|---|---|
| EPYC (multi-CCD / multi-die) | P2P is the case that usually wins — cards skip Infinity Fabric / cross-die hops. This is the wiki-validated toolbox path. |
| Intel Ice Lake (monolithic die) | P2P can enumerate (io=1 p2p=3 on all four V620s) and still do nothing — or regress ~4% — on both llama.cpp (Qwen3.8-27B Q8) and vLLM. Cards already share one CPU PCIe root; GPU↔GPU DMA is not cheaper than going through the CPU. |
| Desktop Ryzen (e.g. 3950X) | P2P tanked when cards trained at gen3 x4. Turn it back off. |
| Chipset / southbridge slot | P2P is worse if one card is on the chipset rather than CPU root ports. |
| vLLM on RDNA2 | Kernel P2P alone is not enough. Fork author: vLLM still needs an RDNA-side patch (these cards are not CDNA). Treat “P2P works in amd-smi” as a prerequisite, not a finished vLLM speedup. |
If bandwidth tests pass but inference regresses:
export NCCL_P2P_DISABLE=1 # llama.cpp / RCCL tensor parallel
On the RDNA2 fork, the README also documents a flag to disable P2P all-reduce fusion
(GGML_HIP_GFX1030_P2P_ALLREDUCE=off). Verified ~25 GB/s P2P between V620 pairs does not guarantee
faster token generation if links are narrow or the host is a single monolithic PCIe root.
Intel: do not disable IOMMU to “help” P2P
On Ice Lake, disabling VT-d / IOMMU broke P2P even though some generic docs say IOMMU-off is more permissive. Leave IOMMU on, then run the toolbox readiness script and ACS checks. Fedora Server 44 + kernel 6.19 + the powerfix has been reported working on 4× V620 (community; not the Fedora 43 AMD validation).
PLX / PCIe switches
- Intra-switch P2P can stay full-width (e.g. 4× Gen4 x16 behind one PLX 88096). The host↔switch
uplink (typically one x16) is the bottleneck.
#general(Sep 21): a single gen4 x16 uplink to a PEX88096 is still “full speed to the switch”; cards talk to each other on the switch bus. Consumer X570 boards that expose two CPU x16 (bifurcated x8x8 gen4 when both slots are filled) were called a cheaper host than a workstation board if you only need that uplink. #general(Sep 19): one gen4 x16 on the host → community suggestion is a PEX88096 broken out to SlimSAS and 8 risers. Alternative board: dual-SP3 Supermicro H12D-8D, bifurcate all 4 PCIe ports to x8x8 gen4. 6 GPUs is still awkward (not a clean TP size; the open question was TP=8 vs TP=2 × PP=3). One camp says buy 2/4/8 only; another says any even count can work if you plan the split — do not add a third card assuming TP=3.- 4-slot vs 5-slot switch boards (
#general, Sep 2026): a common 5-slot PLX only fits double-width cards; a 4-slot board can take triple-width GPUs (future cooler upgrades). Pick the board for card thickness, not just GPU count. - 5 GPUs: community prefers TP=4 plus a standalone fifth card (draft / embedder / second model). Pipeline-parallel on 5 can work but is “not optimal.” Odd counts still have TP3 crash notes.
- Without tensor parallel, a PLX box is usually slower than native CPU lanes: higher latency and less aggregate host bandwidth.
- Do not tensor-split across a daisy-chained pair of switches — that single inter-switch link is a TP bottleneck. Prefer TP inside one switch and pipeline-parallel between switches (vLLM can do TP+PP that way; llama.cpp generally cannot).
- Community: ACS often needs extra kernel cmdline fiddling;
pcie surprise link downcrashes were fixed by putting a small fan on the PLX heatsink (these boards often ship with no airflow notes). - Workstation hosts that do not POST with V620 + PLX (Dell Precision MMIO High / SR-IOV; Supermicro H12D POST loop): Host firmware.
- External PCIe expansion (
#general, Sep 2026 — e.g. Cubix Xpander–class enclosures): each group of cards may get full-width slots behind the switch, while only one x16 (often PCIe 3.0) returns to the host. Community: 8× GPU on that pattern was fine at low context but fell to ~3 t/s around 50–60k context. Prefer 4 GPUs on one switch + P2P / TP inside the switch over stretching TP across a narrow host uplink.
Host topology
Community reports, not wiki-benched:
| Topology | What people report |
|---|---|
| PCIe 4.0 x16 per card (CPU root ports) | Best case for TP4. Community known-good llama.cpp TP4 board: Gigabyte MC62-G40. |
| PCIe 4.0 x8 per card | Practical floor for 8× V620 without a switch; expected to still scale. |
| Three CPU x16 slots | Enough bandwidth that community recommends trying tensor split before layer-only. Still watch TP3 crash notes. |
| PCIe 3.0 x4 | Throughput often stops scaling at 3 cards and can regress at 4. |
| PLX / PCIe switch / Xpander | See PLX / PCIe switches. |
| Dual-socket (NUMA) | TP across sockets can halve prefill. Bind workers to the NUMA node of their GPUs. P2P is typically per socket. vLLM with NUMA-aware TP workers is less painful than llama.cpp crossing UPI/Infinity Fabric. |
| Odd GPU counts (TP3) | llama.cpp tensor-split on 3 cards has caused driver crashes; prefer 2 or 4 when you can. |
Layer split vs tensor split (quick)
Community explainer (#benchmarks thread, Sep 2026):
- Layer / pipeline split — VRAM grows with each card, but only one GPU works the model at a time (sequential stages). Less GPU↔GPU traffic.
- Tensor (row) split — all GPUs work together each step; needs much more interconnect bandwidth and often becomes PCIe-limited on narrow links.
On fat CPU roots (gen4 x16 × N), try tensor first. Behind a narrow switch uplink, prefer smaller TP domains or layer/PP splits.
Cabling / risers (community)
Not wiki-benched — common #general notes:
- SlimSAS / SFF-8654 cables: PCIe gen3 is usually fine at ~70 cm; gen4 needs testing per cable/insulation. Prefer known-good gen4 kits over the cheapest Amazon/eBay passive ribbon risers.
- Passive PCIe risers: several community reports of timeouts / inability to hold gen4 x16 with cheap passive risers under multi-GPU load, while the same slots work with cards seated directly. Brand-name gen4 risers (e.g. ADT-class) are often the next step — A/B one card first.
- V620 + blower shroud length: community measure ~37 cm with a common EFH-08E12W-style fan shroud installed — plan chassis / PLX slot spacing accordingly.
- 5-slot PCIe switch → ATX tray:
#other(Sep 30) published a Printables adapter (PCIe switch to ATX mounting adapter) for a 5-slot PCIe 4.0 switch on an ATX hole pattern. Community: it matched one common PLX board even when the listing photos differed. Mechanical only — not a P2P or POST fix.
vLLM on RDNA — Overview
WIP: This section is actively expanded from Discord and fork release notes. See Verification status before treating benchmarks as gospel.
The quickest way to serve LLMs on gfx1030 / RDNA is the prebuilt
blivioniag/vllm-rdna images on a
blivioniag/rocm-rdna ROCm + PyTorch base. A single
image targets seven RDNA architectures (gfx1030 through RDNA4).
Not sure whether to use vLLM or llama.cpp? Start with llama.cpp or vLLM.
Where to start
| Goal | Page |
|---|---|
| First serve on a V620 (Docker or fork + launcher) | Onboard on V620 |
| Pull an image and run your first model | Running (Docker) |
| Which image / model / card count (27B, presets) | Recipes |
| GLM-5.3-Flash on 8× (local 0.30 fork) | Recipes — GLM-5.3-Flash |
| Qwen3.8 Flash-Next (benchmarks and serve lines) | Flash-Next |
Flash-Next MonoKernel (--monokernel, HEAD) | MonoKernel |
Flash-Next DFlash2 (RECIPE=flashnext-dflash2, HEAD) | DFlash2 |
Flash-Next 2× expert offload (serve_offload.sh, HEAD #146) | 2× MoE offload |
| Env vars, CUDA graphs, Docker Compose | Configuration |
| GPTQ vs AWQ, KV cache, MTP, INT4 | Quantization |
Custom RDNA2 HIP kernels (-extras) | vLLM forks |
| What shipped vs HEAD vs backlog | Fork progress |
| Which fork is official vs historical | Fork landscape |
Host uv venv (7.2.0 or 7.14.0) | Host venv |
One launcher for Flash-Next / 27B / EXL3 (serve_rdna.sh) | Serve scripts |
| Rebuild or extend Docker images | Building images |
| Something broke | vLLM troubleshooting |
Image variants
| Variant | When to use |
|---|---|
v0.31.0-extras / v0.31.0-extras-rocm7.14.0 | Official extras on vLLM 0.31.0 — rdna_extras. #announcements (11 Oct 2026): recommended day-to-day Docker path (ROCm 7.14). Flash-Next MTP-2 (BF16 + INT4-disk) served from this tag. Same digest under both names. Start at Onboard. |
v0.28.0-extras / v0.27.1-extras* | Historical extras bakes. Source for 0.28 is rdna_extra/v0.28.0. Keep for A/B only. |
v0.27.1 / v0.27.1-rocm7.14.0 | Stock upstream vLLM — baseline or comparison. #vllm-rdna Sep 24: plain v0.27.1-rocm7.14.0 is stale / removable; prefer -extras or host venv. |
Image tags are refreshed in place when fixes land — always docker pull before debugging. Confirm your
-extras image includes the latest extras commits (AWQ dispatch, GDN HIP, TP graph fix).
#vllm-rdna (Aug 31 2026): blivioniag/vllm-rdna:v0.27.1-extras was refreshed again — re-pull even if
you already had that tag.
Official source: Kernel work lives in
opengfx1030/vllm-rdna(rdna_extras= v0.31.0 as of 11 Oct 2026). Day-to-day serving is Hubblivioniag/vllm-rdna:v0.31.0-extras. First-time path: Onboard on V620. Olderv0.27.1-extras*/v0.28.0-extras*tags stay on Hub for A/B.#vllm-rdnaSep 14–15: Flash-Next commits are inrdna_extras; the standaloneleapdragon/vllm-rdna2-qwenbranch is no longer the moving target. Prefer the 0.31 Hub tag or a host venv over the old leapdragon image. Details: Fork landscape.Upstream vLLM: Official GPU docs still omit Navi 21 / gfx1030. Keep the community fork until upstream documents it.
Related
- Choose a stack — llama.cpp vs vLLM, and what fits on a V620.
- Flash-Next — card counts, AutoRound, and serve lines.
- Multi-GPU PCIe P2P — important for tensor parallel.
- Environment variables — cheat-sheet.
- Community recipe book (mirror
opengfx1030/vllm-rdna2-recipe) — presets, patches, concurrent MTP PRs.
Onboard vLLM on V620
WIP: Happy path below follows the
#announcementsv0.31.0 release (11 Oct 2026) and day-to-day practice in#vllm-rdna. See Verification status.
Get from a bare V620 host to an OpenAI-compatible vllm serve with the community
opengfx1030/vllm-rdna fork (rdna_extras = upstream
vLLM 0.31.0 + RDNA HIP kernels). Prefer this page over the deeper vLLM docs until the first
request succeeds.
Not sure vLLM is the right stack? Read llama.cpp or vLLM first.
What you need
| Item | Notes |
|---|---|
| GPU | One or more Radeon PRO V620 (gfx1030). Cousin cards need HSA_OVERRIDE. |
| Host | Linux with working amdgpu + ROCm userspace. Multi-GPU: pin ROCm 7.2.0 or 7.14.0 — Installing ROCm. |
| Groups | Your user in video and render (reboot after usermod). Missing render → device infer failure. |
| Path | Docker (Path A) or a host Python 3.12 venv + hipcc (Path B). |
Optional but worth it on V620 before long serves: power cap, ECC, PCIe P2P for multi-GPU. Full host walkthrough: Getting started.
Pick a path
| Goal | Use |
|---|---|
| First serve today, day-to-day 27B AWQ | Path A — Hub image blivioniag/vllm-rdna:v0.31.0-extras |
| Flash-Next, HEAD kernels, or the in-tree launcher | Path B — clone the fork + host venv + serve_rdna.sh |
#announcements (11 Oct 2026): Hub v0.31.0-extras is the published 0.31 bake (ROCm 7.14,
torch 2.12, Triton 3.7.1). Older v0.27.1-extras / v0.28.0-extras tags remain on Hub for
comparison only.
Path A — Docker Hub -extras (fastest)
docker pull docker.io/blivioniag/vllm-rdna:v0.31.0-extras
docker run -it --rm \
--device /dev/kfd --device /dev/dri \
--group-add video --group-add render \
--security-opt seccomp=unconfined \
--ipc host \
-p 8000:8000 \
-v "$HOME/.cache/huggingface:/root/.cache/huggingface" \
docker.io/blivioniag/vllm-rdna:v0.31.0-extras \
vllm serve cyankiwi/Qwen3.8-27B-AWQ-INT4 \
--dtype float16 \
--max-model-len 8192 \
--language-model-only --skip-mm-profiling --trust-remote-code
- Always
docker pullbefore debugging — tags refresh in place. - Prefer
--dtype float16. RDNA2 BF16 is weak/emulated. - Multi-GPU: add
--tensor-parallel-size N. Prefer power-of-2 TP. Enable P2P when your host supports it; if P2P is broken, setNCCL_P2P_DISABLE=1(and see Path BP2P=0). - First boot is slow (Triton / torch.compile). Mount caches for restarts — Configuration.
Smoke test
curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"cyankiwi/Qwen3.8-27B-AWQ-INT4","messages":[{"role":"user","content":"Hi from V620"}]}'
Flash-Next in Docker (4× V620)
#announcements (11 Oct): the same v0.31.0-extras image can serve Flash-Next. You need local
weights plus the PLE table (wtdcode/Qwen3.8-Flash-Next-AWQ-W4A16
and primitive-ai/Qwen3.8-Flash-Next-PLE-quant).
Mount the INT4 PLE directory and pass the fork env:
# Paths are examples — use your local checkpoints.
docker run -it --rm \
--device /dev/kfd --device /dev/dri \
--group-add video --group-add render \
--security-opt seccomp=unconfined \
--ipc host \
-p 8000:8000 \
-v /path/to/Qwen3.8-Flash-Next-AWQ:/model \
-v /path/to/Qwen3.8-Flash-Next-PLE-quant/ples_int4:/ples_int4 \
-e VLLM_PLE_QUANT_DIR=/ples_int4 \
docker.io/blivioniag/vllm-rdna:v0.31.0-extras \
vllm serve /model --dtype float16 --tensor-parallel-size 4
For disk PLE (lower pinned RAM), also set -e VLLM_PLE_CPU_OFFLOAD=1. Prefer Path B’s
RECIPE=flashnext-mtp2 once you want the full tuned argv (graphs, MTP, features). Details:
Flash-Next, Serve scripts.
Path B — Fork checkout + host venv
Use this when you want HEAD of
opengfx1030/vllm-rdna (rdna_extras) or the in-tree
launcher. Build steps live on Host venv (ROCm 7.14.0 multi-arch wheels are the
usual match for the 0.31 Docker bake).
git clone -b rdna_extras https://github.com/opengfx1030/vllm-rdna.git
cd vllm-rdna
# Build torch + FlashAttention + causal-conv1d + editable vLLM — see host-venv.md
After import vllm works in the venv, serve from that checkout:
# Day-to-day dense 27B (local checkpoint or set HF_HUB_OFFLINE=0)
MODEL=/path/to/Qwen3.8-27B-AWQ VENV=/path/to/venv-7.14.0 \
bash tools/rdna/serve_rdna.sh RECIPE=27b-awq
# Flash-Next MTP=2 on 4× V620 (local weights + INT4 PLE)
MODEL=/path/to/Qwen3.8-Flash-Next-AWQ VENV=/path/to/venv-7.14.0 \
bash tools/rdna/serve_rdna.sh RECIPE=flashnext-mtp2 \
PLE=int4 PLE_QUANT_DIR=/path/to/ples_int4 \
HOST=0.0.0.0 PORT=8888
MODELandVENVare required. Recipes do not bake in home directories or IPs.- Dry-run:
PRINT=1 … RECIPE=27b-awqprints env + argv without launching. - Hosts without working PCIe P2P: add
P2P=0(#vllm-rdnaOct 11 — disablesrdna_arand setsNCCL_P2P_DISABLE=1). - Other recipes:
flashnext,flashnext-mtp0,27b-exl3,dsv4-flash,full— Serve scripts.
Which model for your card count
| Cards | Start here |
|---|---|
| 1× | Hub Path A: Qwen3.8-27B AWQ or a MoE (e.g. Qwen3.6 35B-A3B). Flash-Next is not a 1-card path. |
| 2× | Path A/B with --tensor-parallel-size 2 / recipe TP=2. Flash-Next usually wants more cards or llama.cpp. |
| 4× | Best Flash-Next layout: TP=4, Path B RECIPE=flashnext-mtp2 (or Hub Path A with PLE mounts). |
| 8× | Not the default Flash-Next recipe. Community GLM-5.3-Flash notes — Recipes. |
Full matrix: Recipes. Workload fit: What fits on V620.
If something breaks
| Symptom | Where |
|---|---|
Failed to infer device type / amdsmi | Troubleshooting — add --group-add render |
| First start takes forever | Cache volumes |
| TunableOp / rocBLAS mismatch | TunableOp |
| Flash-Next PP3 / graphs / prefix cache | Flash-Next troubleshooting |
| Multi-GPU RCCL weirdness on ROCm 7.2.1–7.13 | ROCm pin |
Ask in Discord #vllm-rdna — invite.
Next steps
- Recipes — Hub vs recipe container vs Flash-Next by card count
- Configuration — env vars, CUDA graphs, Compose
- Quantization — AWQ / GPTQ / MTP / KV
- vLLM forks — kernel landscape and PR status
- Building images — bake your own from
vllm-rdna-docker
Running vLLM (Docker)
WIP: See Verification status.
Image matrix
Base images — blivioniag/rocm-rdna
| Tag | ROCm | PyTorch | Triton |
|---|---|---|---|
7.2.0 | 7.2.0 | 2.12.0 | 3.5.1 |
7.14.0 | 7.14.0 | 2.12.0 | 3.7.1 |
Bake target base-rocm714 pins torch 2.12.0+rocm7.14.0. The docker-repo README still
says 2.13.0 for this tag — treat that README cell as stale; confirm with
python -c "import torch; print(torch.__version__)" inside a pulled container.
These are a general-purpose ROCm PyTorch base for RDNA — useful on their own if you just want a
working torch on a Radeon card.
vLLM images — blivioniag/vllm-rdna
| Tag | vLLM | Base | Variant |
|---|---|---|---|
v0.31.0-extras / v0.31.0-extras-rocm7.14.0 | v0.31.0 | ROCm 7.14 (same digest) | rdna_extras fork — current extras bake. #announcements (11 Oct 2026): torch 2.12, Triton 3.7.1. Flash-Next MTP-2 (BF16 + INT4-disk) served from this image. |
v0.28.0-extras / v0.28.0-extras-rocm7.14.0 | v0.28.0 | ROCm 7.14 | Historical extras. Source now rdna_extra/v0.28.0. Prefer v0.31.0-extras unless you need the old line. |
v0.27.1 | v0.27.1 | rocm-rdna:7.2.0 | upstream |
v0.27.1-rocm7.14.0 | v0.27.1 | rocm-rdna:7.14.0 | upstream — #vllm-rdna Sep 24: can remove; prefer -extras or host build |
v0.27.1-extras | v0.27.1 | rocm-rdna:7.2.0 | Older rdna_extras bake (Aug 2026). Keep only for A/B. |
v0.27.1-extras-rocm7.14.0 | v0.27.1 | rocm-rdna:7.14.0 | Same as v0.27.1-extras (same digest). |
v0.26.0 | v0.26.0 | rocm-rdna:7.2.0 | upstream |
v0.22.1 | v0.22.1 | — | upstream |
The -extras tags ship the rdna_extras fork (hand-written RDNA2 HIP kernels:
FlashAttention, quantized GEMM, MoE, GDN, …). Check
Docker Hub for the current tag list. Tags are
refreshed in place — docker pull before debugging.
#announcements (11 Oct 2026): v0.31.0-extras is the current extras image — rdna_extras
is now the v0.31.0 port, and that bake served Flash-Next MTP-2. First-time path:
Onboard on V620. Older Hub tags (v0.27.1-extras*, v0.28.0-extras*) do not
track HEAD. For kernels newer than the bake, clone the org repo and follow
Host venv + serve_rdna.sh. Use rocm-rdna:7.14.0 if you
only need a ROCm packaging base.
Multi-GPU: pick a 7.2.0 or 7.14.0 tag, not a host ROCm in the 7.2.1–7.13 gap. RCCL on those in-between releases is reported broken with more than one card — see Installing ROCm.
Every image bakes these PYTORCH_ROCM_ARCH targets:
gfx1030;gfx1100;gfx1101;gfx1150;gfx1151;gfx1200;gfx1201.
Run it
docker run -it --rm \
--device /dev/kfd --device /dev/dri \
--group-add video --group-add render \
--security-opt seccomp=unconfined \
--ipc host \
-p 8000:8000 \
-v "$HOME/.cache/huggingface:/root/.cache/huggingface" \
docker.io/blivioniag/vllm-rdna:v0.31.0-extras \
vllm serve cyankiwi/Qwen3.8-27B-AWQ-INT4 \
--dtype float16 \
--max-model-len 8192 \
--language-model-only --skip-mm-profiling --trust-remote-code
First-time V620 walkthrough (Docker + fork launcher): Onboard on V620.
- Give the container the GPU with
--device /dev/kfd --device /dev/driand thevideoandrendergroups. Missingrenderis a common#vllm-rdnacause ofFailed to infer device type. - Prefer
--dtype float16. RDNA2 has weak/emulated BF16; letting vLLM pick bf16 from a model’sconfig.jsoncan trigger slow float32 fallbacks. - The 27B AWQ example is the current
#vllm-rdnaday-to-day dense pick (Sep 2026). For a smaller smoke test, swap in any instruct model that fits VRAM. Model / card-count matrix: Recipes. - For a non-Navi-21 RDNA2 card (gfx1031/1032/…), add
-e HSA_OVERRIDE_GFX_VERSION=10.3.0. See HSA_OVERRIDE. - Multi-GPU: add
--tensor-parallel-size N; enabling PCIe P2P helps a lot here.
Query the OpenAI-compatible endpoint:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"cyankiwi/Qwen3.8-27B-AWQ-INT4","messages":[{"role":"user","content":"Hi from gfx1030!"}]}'
Next steps
- Choose Hub vs recipe container vs Flash-Next: Recipes
- Tune env vars and CUDA graphs: Configuration
- Pick a quant format: Quantization
- Kernel details: rdna_extras fork
vLLM recipes (pick a path)
WIP: Stack picks and tok/s figures are community-reported (
#vllm-rdna, Sep 2026). See Verification status. Prefer this page when you want “which image / which model / how many cards” — not a kernel deep-dive.
Discord keeps asking the same questions: which Docker stack, which Hugging Face weights, and whether 1× V620 is enough. This page consolidates those answers. Details for env vars and CUDA graphs live on Configuration; fork history on vLLM forks.
Which stack?
| Goal | Use | Image / repo |
|---|---|---|
| Day-to-day serving with RDNA HIP kernels | Hub -extras | blivioniag/vllm-rdna:v0.31.0-extras (same digest as v0.31.0-extras-rocm7.14.0) — Onboard / Running. #announcements (11 Oct 2026). Older v0.27.1-extras* / v0.28.0-extras* stay on Hub for A/B. |
| Latest Flash-Next / kernels newer than the bake | Host venv or Hub 0.31 | Clone opengfx1030/vllm-rdna (rdna_extras = v0.31.0) + Host venv, then tools/rdna/serve_rdna.sh. The 0.31 Hub tag already served Flash-Next MTP-2 (BF16 + INT4-disk) — Onboard. |
Tuned 27B / 122B presets, host needs only amdgpu + Docker | Recipe book container | ghcr.io/leapdragon/vllm-rdna2-recipe:0.27.1-rocm7.2.3-gfx1030 (preset:…) — mirror opengfx1030/vllm-rdna2-recipe |
| Qwen3.8 Flash-Next on 4× V620 | Hub 0.31 or host venv + launcher | tools/rdna/serve_rdna.sh RECIPE=flashnext-mtp2 (or flashnext / flashnext-mtp0). HEAD also has flashnext-dflash2 (#132) — MTP-2 still the daily path. Default branch is rdna_extras (v0.31.0). Docker: blivioniag/vllm-rdna:v0.31.0-extras — overview |
#vllm-rdna (Sep 2026): the recipe repo is treated as a parts pile (compose/env/patches against
pristine vLLM 0.27.1). New Flash-Next work lives on opengfx1030/vllm-rdna rdna_extras (Sep
14–15 cherry-picks); vllm-rdna2-qwen is the older published container. Official kernel
development is the same org extras repo — Hub -extras tags may lag HEAD until bake retargets.
Do not mix host ROCm userspace into the recipe container — the image carries its own stack.
Mounting host ROCm into it is a common break (recipe TROUBLESHOOTING.md).
Pick by card count
| Cards | Community starting point (#vllm-rdna) |
|---|---|
| 1× V620 (32 GB) | Prefer MoE (e.g. Qwen3.6 35B-A3B, Ornith-class) over dense 27B when prefill matters. Dense Qwen3.8-27B AWQ works for day-to-day chat; expect weaker PP than MoE. Flash-Next is not a 1-card path without heavy CPU/DRAM offload (weights ~60+ GB class + PLE). GLM-5.3-Flash is an 8× community path, not 1-card even with 256 GB host RAM — GLM-5.3-Flash. |
| 2× V620 | Recipe TP=2 presets for 27B GPTQ / AWQ / MixedInt4, or Hub -extras / a host-venv clone with --tensor-parallel-size 2. #vllm-rdna (Sep 26): one host built vllm-rdna from source and served cyankiwi 27B AWQ-INT4 TP=2 — community table. #vllm-rdna (Oct 6): Qwen3.8-27B fp16 TP=2 + MTP ~40–48 t/s single-stream; a Swift 1.5 27B tune on the same layout ~48 t/s single / ~70 t/s across two instances — not Flash-Next. Flash-Next on 2 cards still needs host RAM for experts: HEAD after #146 (28 Oct) has tools/rdna/mono/serve_offload.sh — 2× offload. That is not a Hub / serve_rdna.sh recipe. llama.cpp RAM/MoE offload remains the non-HEAD path (#vllm-rdna Sep 14) — llama.cpp 2×. |
| 3× V620 | vLLM tensor parallel needs an even world size. Use pipeline parallel 3 (PP=3, TP=1). Current rdna_extras HEAD: RECIPE=flashnext-pp3 / flashnext-pp3-mtp2 — PP3 recipes. Hub v0.31.0-extras (11 Oct) lags those recipes. Older pins corrupted PP3 output — corruption. Pin b33f9b6 (Sep 19) boots graphs but dies on small captured prefill — KeyError. llama.cpp can still report TP across three cards (TP3 has crash notes). |
| 4× V620 | Best vLLM path for Flash-Next is still TP=4. Prefer latest rdna_extras with merged vllm-rdna#17 (23 Sep) — fast stack. #vllm-rdna (Sep 19): PP=4 can look great on 32k prefill then tank decode. #vllm-rdna (Sep 21): #15-only public merge reproduced ~1.1–1.45k PP. Prefer TP4 over PP4. Hub v0.31.0-extras is the current extras bake. Needs verify on a second host. Same gfx1030 class: #benchmarks (Oct 10) 4× W6800X Duo, vLLM 0.30.0 TP4, Qwen3.8-27B fp16, ALU 0.9.4, MTP-2 — community table. Not a V620 serve line. |
| 6× V620 | Flash-Next minimum is 3 cards. #vllm-rdna (Sep 24): start with PP=3 + TP=2 or PP=6; keep TP power-of-2 (avoid PP=2 + TP=3 as the first try). Clone HEAD + host venv — Hub tags lag. Disagg prefill/decode across switches is open #23 (Needs verify). |
| 8× V620 | Not a Flash-Next recipe. #vllm-rdna (Sep 30): community GLM-5.3-Flash AWQ on a local vLLM 0.30 fork, TP=8, P2P off, 150 W — GLM-5.3-Flash. Day-to-day org extras are now Hub v0.31.0-extras (11 Oct); that GLM serve was still a local 0.30 fork, not Hub — Needs verify. |
Also see What fits well on V620.
#vllm-rdna (Oct 8), for llama.cpp migrants: --pipeline-parallel-size N is the vLLM analogue
of llama.cpp layer split (-sm layer); --tensor-parallel-size N is the analogue of
tensor split (-sm row / -ts). vLLM can combine them (example: TP=2 + PP=2 on four
cards). Prefer power-of-2 TP. Flash-Next on four cards still wants TP=4, not PP=4
(PP=4 can look great on long prefill then tank decode — table above).
Gemma 4 note
Community reports Gemma 4 ~26B still fails or is unfinished on current gfx1030 vLLM paths
(#vllm-rdna, Sep 13 2026). Prefer Qwen / Ornith until someone posts a working recipe.
Model cheat sheet
| Model | Cards | Stack | Notes |
|---|---|---|---|
cyankiwi/Qwen3.8-27B-AWQ-INT4 | 1–4× | Hub -extras or recipe preset | Current day-to-day 27B pick in #vllm-rdna (Sep 13 2026). compressed-tensors AWQ. |
btbtyler09/Qwen3.8-27B-GPTQ-4bit | 2×+ | Recipe preset:qwen38-27b-gptq or Hub -extras | Recipe reference preset; native GPTQ → RDNA2W4A16 on -extras. |
Pilcothink/Qwen3.8-27B-MixedInt4-AutoRound | 2× | Recipe builds/ | AutoRound MixedInt4 sibling in the recipe book. |
Intel/Qwen3.5-122B-A10B-int4-AutoRound | 3–4× | Recipe builds/ (not a one-line preset) | MoE 122B — needs recipe wrapper / weight prep; see build BUILD.md. |
| Qwen3.6 35B-A3B (FP16 / community quants) | 1–4× | Hub -extras | MoE sweet spot; MTP helps c=1, hurts high concurrency — Quantization. |
wtdcode/Qwen3.8-Flash-Next-AWQ-W4A16 + primitive-ai/Qwen3.8-Flash-Next-PLE-quant | 4× | Flash-Next fork | Production Flash-Next weights + PLE sidecar in #vllm-rdna. |
Intel/Qwen3.8-Flash-Next-W4A16-AutoRound | 4× | rdna_extras HEAD (QSA #15) / draft #5 | W4A16 + original BF16 CPU PLE. QSA live-context merge: overview. Not Hub -extras. |
cyankiwi/Qwen3.8-Flash-Next-AWQ-INT4 | 4× | Experimental | #vllm-rdna (Oct 11): incoherent output on one 4× host — prefer wtdcode AWQ-W4A16 + primitive-ai PLE. |
ukisai/Swift-1.5-Qwen3.8-Flash-Next-W4A16-AWQ | 3–4× | rdna_extras HEAD / host venv | #vllm-rdna Sep 25–26 — shorter-reasoning AWQ. 3× community ~1300 PP / ~45 TG. Two-card fit unconfirmed. Swift. |
wtdcode/GLM-5.3-Flash-AWQ-W4A16 | 8× | Local vLLM 0.30 fork (not Hub / not rdna_extras HEAD) | #vllm-rdna Sep 30 — TP=8, MTP-2, P2P off. Notes. |
Small-VRAM experiment: Ornith 9B EXL3 (~6.8 GB) vs AWQ (~9 GB) — experimental, not in published
-extras tags yet. See Quantization.
Path A — Hub -extras (recommended default)
docker pull docker.io/blivioniag/vllm-rdna:v0.31.0-extras
docker run -it --rm \
--device /dev/kfd --device /dev/dri \
--group-add video --group-add render \
--security-opt seccomp=unconfined \
--ipc host \
-p 8000:8000 \
-v "$HOME/.cache/huggingface:/root/.cache/huggingface" \
docker.io/blivioniag/vllm-rdna:v0.31.0-extras \
vllm serve cyankiwi/Qwen3.8-27B-AWQ-INT4 \
--dtype float16 \
--max-model-len 8192 \
--language-model-only --skip-mm-profiling --trust-remote-code
Short V620 walkthrough: Onboard on V620.
- Add
--tensor-parallel-size Nfor multi-GPU. Enable PCIe P2P when possible. - Prefer
--dtype float16. Mount Triton / torch-compile caches for faster restarts — Configuration. - Force the native W4A16 path when needed:
VLLM_DISABLED_KERNELS=ExllamaLinearKernel,TritonW4A16LinearKernel— confirmUsing RDNA2W4A16LinearKernelin logs.
Full env block and Compose (GPTQ + MTP): Configuration.
Hub -extras TP4 Qwen3.8-27B AWQ
Sanitized from a #vllm-rdna (Aug 31 2026) bench recipe on 4× V620 with working P2P / custom
all-reduce. Drop the custom-AR block if P2P is broken on your board — use
VLLM_DISABLE_CUSTOM_ALL_REDUCE=1 instead (Configuration).
export VLLM_USE_V2_MODEL_RUNNER=1
export VLLM_ROCM_USE_AITER=0
export VLLM_ROCM_USE_AITER_MOE=0
export FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE
export VLLM_RDNA_FORCE_FP16=1
export VLLM_USE_RDNA2_FA=1
export TORCH_BLAS_PREFER_HIPBLASLT=0
export PYTORCH_TUNABLEOP_ENABLED=1
export PYTORCH_TUNABLEOP_HIPBLASLT_ENABLED=0
export VLLM_WORKER_MULTIPROC_METHOD=spawn
export VLLM_BATCH_INVARIANT=0
export GPU_MAX_HW_QUEUES=2
# Only when GPU↔GPU P2P works:
export VLLM_FORCE_CUSTOM_ALL_REDUCE=1
export NCCL_P2P_LEVEL=pix
export RCCL_P2P_NET_DISABLE=1
export RCCL_P2P_BATCH_ENABLE=1
export NCCL_PROTO=Simple
export RCCL_MSCCL_ENABLE=0
cd /tmp # avoid sys.path collisions with a local vllm checkout
vllm serve cyankiwi/Qwen3.8-27B-AWQ-INT4 \
--port 8000 \
--tensor-parallel-size 4 \
--max-model-len 20480 \
--max-num-seqs 8 \
--gpu-memory-utilization 0.88 \
--dtype float16 \
--language-model-only --skip-mm-profiling --trust-remote-code \
--enable-prefix-caching --enable-chunked-prefill \
--compilation-config '{"cudagraph_mode": "FULL_AND_PIECEWISE", "compile_ranges_endpoints": []}'
Host-venv TP=2 Qwen3.8-27B AWQ (community, Sep 26)
#vllm-rdna (Sep 26): one host cloned opengfx1030/vllm-rdna and built from source (not a Hub
tag), then served cyankiwi AWQ-INT4 at TP=2. Same short test on both models; answers
coherent, no NaNs. Community / Needs verify.
| Qwen3-14B, TP=2 | Qwen3.8-27B, TP=2 | |
|---|---|---|
| Weights per GPU | 4.69 GiB | 9.73 GiB |
| KV cache (logged) | 266k tokens (4k context) | 159k tokens (32k context) |
| Engine start | 39 s | 425 s (first run only) |
| 4 prompts at once | 88.3 tok/s | 46.9 tok/s |
| One prompt, decode | 59.5 tok/s | 29.5 tok/s |
Day-to-day 27B on 4 cards still uses the TP4 block or a recipe preset. This table is only the two-card / source-build snapshot.
#vllm-rdna (Oct 6): a different 2× host ran unquantized fp16 Qwen3.8-27B at TP=2 with
MTP and reported ~40–48 t/s single-stream. A shorter-reasoning Swift 1.5 27B (not the
Flash-Next Swift packs) on the same card count was ~48 t/s
single-stream and ~70 t/s across two instances. Community / Needs verify. Concurrency
notes for wvSplitK vs stacked LLMM1: troubleshooting.
Path B — Recipe container (27B / 122B presets)
Fastest path when you want the recipe book’s measured knobs without installing ROCm on the host:
IMG=ghcr.io/leapdragon/vllm-rdna2-recipe:0.27.1-rocm7.2.3-gfx1030
docker pull "$IMG"
docker run --rm "$IMG" list-presets
docker run -d --name vllm-rdna2 --network=host \
--device /dev/kfd --device /dev/dri \
--group-add "$(getent group render | cut -d: -f3)" \
--group-add "$(getent group video | cut -d: -f3)" \
--ipc=host --ulimit memlock=-1 --security-opt seccomp=unconfined \
-e ROCR_VISIBLE_DEVICES=0,1 \
-v "$HOME/.cache/huggingface:/root/.cache/huggingface" \
"$IMG" preset:qwen38-27b-gptq
| Knob | Meaning |
|---|---|
preset:qwen38-27b-gptq | Reference GPTQ 27B (TP=2). AWQ / MixedInt4 siblings are also presets. |
ROCR_VISIBLE_DEVICES | Exactly two indices for TP=2 presets. |
MTP=0..3 | Speculative depth (default 2 in the recipe image). |
list-presets / DRYRUN=1 | Enumerate presets or print the resolved vllm serve line. |
First boot cold-compiles for ~10–15 minutes; mount /compile-cache and Triton caches for ~3 min
warm boots — see the recipe containers/README.md.
Community ballpark on 2× V620: ~40–49 tok/s decode when TunableOp rows are seeded; ~27 t/s flat if
they are missing (recipe troubleshooting).
122B builds need the repo wrapper / one-time weight prep — not a bare preset: one-liner.
Path C — Flash-Next
Flash-Next (Qwen3.8, PLE sidecar, 3×/4× V620 serve lines, AutoRound, DeepSeek-V4) lives on
Flash-Next. This page stays the picker for Hub -extras and the recipe-container presets.
GLM-5.3-Flash (community, Needs verify)
#vllm-rdna (Sep 30): a community 8× V620 host served public
wtdcode/GLM-5.3-Flash-AWQ-W4A16
(AWQ W4A16 of zai-org/GLM-5.3-Flash; routed
experts INT4, attention / vision / MTP left BF16) on a local vLLM 0.30 fork. TP=8,
MTP-2, P2P off (PLX), 150 W caps, dual-socket Broadwell-EP class. This is not
Hub -extras and not rdna_extras HEAD.
Org draft opengfx1030/vllm-rdna#2 is a
runtime-unverified Glm5Next load path on a side branch (later/glm53-flash-awq); HIP
gates default off. #vllm-rdna (Sep 30): at that time day-to-day extras were still
0.28 and the maintainer paused the 0.30 rebase, inviting a PR of the community 0.30
work. #announcements (11 Oct 2026): day-to-day is now Hub v0.31.0-extras — re-check
GLM on that line before treating the Sep 30 pause as current. V2 model runner can work on
the local-fork line.
Community snapshot (one host — Needs verify):
| Metric | Before local-fork work | After |
|---|---|---|
| Decode | ~2.2 t/s | ~32 t/s |
| Prefill | ~50 t/s | ~320–500 t/s (others called this low vs Flash-Next; hoped ~1000) |
| Context | — | 262k with vision; needle tests to 180k |
| Reliability | — | 377 agent requests at 40–125k tokens: 0 failures / 0 GPU faults; 5–8 s TTFT with prefix cache |
gfx1030-relevant lessons (do not treat the unpublished kernel list as a Hub recipe):
- Serve
--dtype float16, not bf16 — no bf16 hardware. Same quality; community +68% decode on this host. - Vision: MIOpen compiled the downsample conv per image size (3–4 min; killed the
engine once). Community used conv-as-matmul (158 s → 4 ms). Separate from the Flash-Next
max_pixelsOOM — troubleshooting. - Indexer / tiled-fp8 / fused mHC / skinny-int4 MoE work lived on the local fork.
Not a drop-in for 4× Flash-Next hosts. #general (25 Oct): 1× V620 + host-RAM offload
is also a poor fit. Community Maya snapshot ~200 PP / ~13 TG on one host (Needs
verify, not recently rechecked). Public 18B active implies a theoretical decode
ceiling around 30 t/s before MTP if experts stayed on-GPU; real offload will not get
close.
Related
- Serve scripts — in-tree
serve_rdna.shafter a host-venv build - Running (Docker) — image matrix and minimal
docker run - Flash-Next — Path C serve lines
- Configuration — env vars, CUDA graphs, Compose
- Quantization — GPTQ/AWQ, KV, MTP
- vLLM forks —
rdna_extrasvs Flash-Next vs recipe ports - Useful resources
Flash-Next (vLLM)
WIP: Benchmarks and serve lines are community-reported (
#vllm-rdna). See Verification status. Day-to-day 27B serving stays on Recipes (Hub-extrasor the recipe container). This page is only the Flash-Next track.
On this page
| Section | What it answers |
|---|---|
| Status by card count | 2× / 3× / 4×, QSA, KV tightness |
| Intel AutoRound | W4A16 draft checkpoint and gotchas |
| Swift 1.5 Flash-Next | Shorter-reasoning AWQ / AutoRound packs |
| Serve lines | FULL_AND_PIECEWISE, #17, PP3, MonoKernel, DFlash2, INT4 KV |
| Serve scripts | serve_rdna.sh RECIPE=flashnext-mtp2 and siblings |
| Fork progress | Hub vs HEAD vs open drafts |
When something fails, use Flash-Next troubleshooting rather than the general vLLM list.
Qwen3.8 Flash-Next on vLLM
llama.cpp still struggles with Flash-Next on gfx1030 (upstream gaps). On 4× V620, community
production is the Flash-Next vLLM stack on rdna_extras (v0.31.0) — not the old
v0.27.1-extras* Hub tags. #announcements (11 Oct 2026): Hub
blivioniag/vllm-rdna:v0.31.0-extras served Flash-Next MTP-2 (BF16 + INT4-disk).
#vllm-rdna Sep 14–15: that work lives on opengfx1030/vllm-rdna
rdna_extras;
leapdragon/vllm-rdna2-qwen
is the older published container / docs tree (still receives occasional commits; last push 11
Oct 2026). Prefer latest rdna_extras
or the 0.31 Hub tag over llama.cpp until the RDNA2 llama.cpp fork catches up.
2× V620 / RAM offload: resident Flash-Next experts still do not fit two V620s.
Merged #146 (28 Oct) is the first
in-tree vLLM path: pinned-RAM expert banks + a bounded GPU slot cache, launched with
tools/rdna/mono/serve_offload.sh on HEAD — 2× serve.
Hub v0.31.0-extras lags. #vllm-rdna (Sep 14): without that HEAD launcher, use
llama.cpp (--n-cpu-moe, -ot …=CPU).
Community 2-card llama.cpp Flash-Next is still ~25 t/s decode / ~150–200 PP — far
below the 4-card vLLM class. #vllm-rdna (16 Oct): MonoKernel alone does not make
resident Flash-Next fit 2 cards.
3× V620: vLLM wants PP=3 (even TP). Current rdna_extras HEAD (merged
#96, 13 Oct) ships
RECIPE=flashnext-pp3 / flashnext-pp3-mtp2 — PP3 recipes.
Hub v0.31.0-extras (11 Oct bake) does not include those recipes. Older Sep 15–16 pins
corrupted PP3 decode on rdna_extras —
troubleshooting.
The Sep 17–18 leapdragon overlay is a snapshot —
overlay.
4× V620 + MonoKernel (#94, 16 Oct): opt-in --monokernel on HEAD for Flash-Next decode
ITL — MonoKernel. Hub v0.31.0-extras lags.
4× V620 + HEAD HIP defaults (#130, 19 Oct): Flash-Next recipes on current rdna_extras
turn the #99 HIP set on (QSA / GDN / HC). Hub bake still has the older opt-in path —
HIP defaults.
4× V620 + DFlash2 (#132, 21 Oct): RECIPE=flashnext-dflash2 is on HEAD. Paired A/B
kept native MTP-2 faster; use DFlash2 only if you want that drafter —
DFlash2.
4× V620 + rdna_extras graphs (#vllm-rdna Sep 16–25): on current HEAD, prefer
FULL_AND_PIECEWISE (compile mode: 3) — uniform decode uses the FULL CUDA graph (same
live path as #17 FULL_DECODE_ONLY); mixed/prefill use piecewise. See
FULL_AND_PIECEWISE serve and fork
docs/rdna2/V620-FULL-AND-PIECEWISE.md.
#20 alone still redirected FULL→piecewise
(~26–34 t/s decode); the keep-FULL fix (6c26c78d, #vllm-rdna Sep 24) turns that redirect off.
#17 FULL_DECODE_ONLY remains a valid measured baseline —
Sep 23 serve notes. Older hosts that saw FULL
decode corrupt stayed on PIECEWISE —
FULL-graph corruption /
Sep 17 serve line. Community snapshot on that older
recipe: ~3331 tok/s PP / ~73 tok/s TG @ 16k/1k, c=8 (Needs verify). There is no Q3
path on vLLM.
6× V620 Flash-Next (#vllm-rdna Sep 24): minimum 3 cards. Maintainer starting points:
PP=3 + TP=2 (six GPUs) or PP=6. Prefer power-of-2 tensor parallel over PP=2 +
TP=3. Disaggregated prefill/decode (two model loads) is a separate WIP — open
#23. Needs verify — no published 6× table.
#vllm-rdna (Sep 19): pipeline parallel 4 on Flash-Next was reported to hit ~1950 tok/s
prefill at 32k while decode collapsed. The same host dropped PP4 and continued on TP=4
(~1550 tok/s prefill at long context; decode ~30–35 t/s with MTP-2). Treat PP4 as a
prefill experiment, not a 4-card default. Needs verify.
#vllm-rdna (Sep 20): opengfx1030/vllm-rdna#15
merged into rdna_extras. AMD QSA prefill scoring is bounded to the live prompt context
(decode / missing metadata still use the capacity-wide path). The same PR folds V620 startup
prerequisites from superseded PR #12. Combined-stack benches on TP=4 / PP=1 / EP=4 / MTP-2,
Intel AutoRound INT4 experts, FP16 dense, original BF16 PLE in CPU RAM — Community / Needs verify
(full host stack, not an isolated QSA A/B):
| Suite | Context | Prefill tok/s | Decode tok/s |
|---|---|---|---|
| Regular | 16k | 2,011 | 63.5 |
| Coding | 16k | 2,036 | 68.5 |
| Regular | 32k | 2,024 | 55.2 |
| Regular | 64k | 1,974 | 59.4 |
| Coding | 64k | 1,986 | 70.6 |
| Regular | 128k | 1,859 | 53.9 |
| Coding | 128k | 1,832 | 72.5 |
The PR records a 31–33% 16k/32k prefill lift versus an immediately collected ~1529–1543 tok/s
baseline on that same combined stack. Community take: near-PP4 prefill with TP4 decode. TP2+PP2
was not tried. Fused QSA multi-step draft decode with MTP-3 did not help. INT8 decode shadows
are not in this merge. Prefer Hub v0.31.0-extras or latest rdna_extras (commits after
the 11 Oct bake pin still want a host venv).
#vllm-rdna (Sep 21): do not treat the ~1.8–2.0k PP table as the public-merge floor. Two other
4× hosts on rdna_extras after #15 landed ~1.07–1.45k tok/s prefill. Decode often did
reach the PR band (~50–77 t/s) once CUDA graphs were on (one host: ~24 t/s eager vs
~66–76 t/s with graphs). One of those hosts had octachannel DDR4-3200, PCIe gen4 x16 on all
four cards, and NVMe ~6.5 GB/s — so the gap is not just “slow RAM / gen3”. A second host
(DDR4-2144 ECC, PCIe gen3, SATA SSD, ~96 GB RAM, int4 PLE in RAM) sat around ~1.1–1.2k PP /
~45–50 t/s with MTP-1. The PR author later said the 1350 → 1550 → 2000 prefill steps needed
two local changes that were not on the git checkout others pulled, and planned to re-apply
those from current rdna_extras through git. #vllm-rdna (Sep 22): the author later recovered
~1950 tok/s PP on a local tree and said something was still missing before those changes
could land on the public branch. Treat ~1.1–1.5k PP as the #15-only public-merge class.
#vllm-rdna (Sep 23): that missing stack merged as
opengfx1030/vllm-rdna#17 into rdna_extras.
PR-head 16k (same llm-context-bench harness): 1,957.8 / 1,982.8 tok/s PP, decode ~69 / ~69
t/s. A second 4× host confirmed those cells (1,983.8 / 1,985.3 tok/s PP) after rebuilding
TunableOp for its rocBLAS — mismatch.
The #15 author-host ~2k table is no longer “unpublished”; #17 shipped in Hub
v0.31.0-extras. Community / Needs verify on your topology.
#vllm-rdna (Sep 2026) ballpark on 4× V620 (host-dependent; fork author + community):
| Metric | Earlier recipe | After Sep 4–6 prefill/decode work |
|---|---|---|
| Sustained prefill | ~580–700 tok/s | ~1000–1400 tok/s (fork author RESULTS.md ~1080–1180; #vllm-rdna Sep 13 community ~1100–1390 @ 32k–128k after latest Flash-Next pull) |
| Decode (single-stream) | ~50–64 tok/s | ~60–100+ tok/s class depending on MTP acceptance / prompt (fork RESULTS.md; community Sep 13 ~53–78 t/s on long suites, MTP=2) |
| vs llama.cpp Flash-Next | — | Community: container ~40 t/s vs llama.cpp ROCm ~18–19 t/s on the same host |
Docs live under
docs/rdna2/
(README.md, RESULTS.md, TROUBLESHOOTING.md, ROCR-CPU-FIX.md). Pull latest before re-benching —
tags and container latest move with the prefill campaign.
Long-prompt stalls / timeouts: if large agentic prompts (tens of k tokens) hang or take many minutes
while short prompts are fine — or GPUs sit at 100% util / ~40 W with TTFT swinging from seconds
to minutes — try VLLM_USE_V2_MODEL_RUNNER=0. #vllm-rdna Sep 15: that switch unblocked a TP4
leapdragon container. Community: MoE on the 0.28 Flash-Next line wants the V1 runner until
upstream 0.29 (V2 becomes the default). See
vLLM troubleshooting.
KV / concurrency (4× 32 GB, #vllm-rdna Sep 14 + Sep 26–27): Flash-Next KV is expensive.
Community ballpark ~24 GiB ≈ 300k tokens once the PLE sidecar is loaded — a 4× V620 box can
still be tight (~280k tokens left on one host). The Sep 14 report that 128 GB host RAM
offload was not enough (and that tool-call sessions re-prefilled) describes the
pre-#24 / broken native path. Merged
opengfx1030/vllm-rdna#24 (27 Sep) is the
RAM-tier fix — community: three ~150k sessions while VRAM held ~270k, ~0.4 s to bring
~190k back, no full re-prefill on tool calls. PR capacity on a 48 GiB reserved tier:
~450k retained tokens. Needs verify on a second host; slower than fitting in VRAM. Hub
tags lag. Details: native KV RAM offload.
Concurrent streams still split decode (community: decode-only two streams often ~70–80 t/s;
mixed prefill + decode drops decode to ~1–6 t/s and PP below 500). Prefer one
stream plus prefix / radix cache unless you have measured overflow on #24. Merged
#36 (5 Oct) adds opt-in
VLLM_RDNA_DYNAMIC_PREFILL=1 so those interval / threshold knobs self-tune for mixed load —
Needs verify, not a default serve recipe
(troubleshooting).
#vllm-rdna (Sep 17): the logged hybrid KV token count can be ~2.5× too high versus a
measured peak — size --max-model-len from a real request, not the banner
(overstated pool). Prefix cache on
rdna_extras needed
e45dd5cb
before repeat prompts actually hit
(zero hits).
FA-RDNA2 vs QSA (#vllm-rdna 13 Oct): FA-RDNA2 is attention for any model that uses the
normal backend selector — it is not dense-only. Flash-Next QSA full-attention layers bypass
that selector (Triton QSA owner), so --attention-backend / VLLM_USE_RDNA2_FA only apply
partially. Details:
fork attention backends,
troubleshooting.
Intel AutoRound Flash-Next (draft, #vllm-rdna Sep 10–11 2026)
A second Flash-Next track is the Intel W4A16 AutoRound checkpoint
(Intel/Qwen3.8-Flash-Next-W4A16-AutoRound;
community also cites the RTN sibling
Intel/Qwen3.8-Flash-Next-W4A16-RTN-AutoRound).
Weights are ~75 GB; plan on 4× V620. Community quality notes: Intel AutoRound beats some
other INT4 Flash-Next packs on published tool-calling scores (example cited: 80.5 vs 76.0
for a different INT4). Treat those as publisher / community numbers, not wiki benches.
Draft integration: opengfx1030/vllm-rdna#5
(open, not in Hub -extras). PR validation used FP16 activations, CPU PLE / n-gram
offload, and --max-num-batched-tokens 4096. Published short-run figures on 4× V620
(no P2P in the Discord report):
| Metric | Community / PR snapshot |
|---|---|
| Uncached 1024-token prefill | ~962 tok/s (vs ~535 BF16 on that host) |
| Short decode + MTP | ~41 tok/s, ~61% MTP accept |
| Prose / code 16–64k | ~950–980 tok/s PP, ~48–56 tok/s decode |
128k after 4096 batched tokens | PP stays ~950 tok/s class (was ~375 tok/s at 2048 scheduled tokens) |
| Community long-suite (Sep 16, 4× V620) | Regular 32–128k: ~1296–1393 tok/s PP / ~56–60 tok/s TG; coding suites ~68–73 tok/s TG. Pin cited: Intel/Qwen3.8-Flash-Next-W4A16-AutoRound @ 4c67bf686b7f7fd386bae6b07ab59e8ff1d5b897. Further push hit int8 decode-shadow quality loss. |
QSA live-context (rdna_extras #15, Sep 20) | Author-host combined stack ~1830–2040 tok/s PP / ~54–73 tok/s TG. #vllm-rdna Sep 21: other 4× hosts on #15 only reproduced ~1.1–1.45k PP. The unpublished recovery merged as #17 (Sep 23) — see QSA merge. |
| Startup (warm-ish) | ~4 min vs earlier 8–10 min on the same host |
| fp16 KV fit | ~291k tokens on 4 cards (one report) |
Gotchas (do not treat as a drop-in Hub image):
- Default PLE is still the embedded BF16 n-gram table (~95 GiB tensor data) with
--engram-config '{"cpu_offload":true}'. The historical group-16 INT4 sidecar was not end-to-end validated (#vllm-rdnasaw incoherent generation on that older path). Merged#49(11 Oct,rdna_extras) plus the v0.31.0 launcherPLE=int4|int4-diskpath.#announcements(11 Oct): all three PLE modes tested; speed at parity. Hubv0.31.0-extrasincludes this. --max-num-batched-tokens 2048+ chunked prefill was the suspected cause of the 128k PP cliff. Raise to 4096 (or see troubleshooting).- Concurrent varlen GDN prefill still has a fork kernel addressing bug
(
gdn_prefill_o_rdna2.cureuses a global chunk index). Single-stream benches can look fine. - The PR is huge and dirty against
rdna_extras— wait for a cleaned cherry-pick / image before calling it production. Day-to-day Flash-Next remainsleapdragon/vllm-rdna2-qwen. #vllm-rdna(12 Oct): latestrdna_extrascan reject this Intel pack at startup even when PLE is unquantized (INCConfig/Qwen4Exp PLE embedding). Upstream vLLM #59990 is merged; the fork cherry-pick was still in queue. PreferwtdcodeAWQ +primitive-aiPLE-quant until that lands — see troubleshooting.
Also watch TheRock ROCR idle-CPU spin on ROCm 7.14 hosts.
Serve commands (4× PIECEWISE, #17, PP3, overlays) are on Flash-Next serve lines.
Swift 1.5 Flash-Next (#vllm-rdna Sep 25–26)
Public shorter-reasoning derivative of Qwen3.8 Flash-Next
(ukisai/Swift-1.5-Qwen3.8-Flash-Next-W4A16-AWQ;
AutoRound sibling
ukisai/Swift-1.5-Qwen3.8-Flash-Next-W4A16-AutoRound).
Publisher card (BF16 vs base, not a wiki bench): ~63% fewer median thinking tokens at xhigh
with under 1% claimed accuracy loss. AWQ is compressed-tensors W4A16 — same runtime class as
other Flash-Next INT4 packs, not Hub -extras.
#vllm-rdna (Sep 25–26) community first-look on 3× V620: the AWQ pack ran at about the
same speed as the host’s usual AutoRound Flash-Next line (~1300 tok/s prefill / ~45 t/s
decode) and was called more verbose. Treat tok/s as Needs verify. Two-card fit is
unconfirmed (community: “won’t fit”).
AutoRound caveat: the Swift AutoRound config is 50 iterations / light tuning (512-token
calibration). Community compared that to Intel AutoRound’s 200 iterations and noted Intel’s
attention projections stay bf16 while the Swift AutoRound pack quantized them to int4.
#vllm-rdna (Sep 26): Swift AutoRound was ~5% faster than the host’s usual Flash-Next line —
expected if the pack is more aggressively quantized, not a quality win. #vllm-rdna (Sep 27):
the same AutoRound pack looped badly on a later host — treat that as a quality warning,
not a speed footnote. Do not treat “AutoRound vs AWQ quality” as settled from Discord —
read the quant config, and prefer the AWQ sibling if you want a first try.
Community / Needs verify.
llama.cpp sibling: ukisai/Swift-1.5-Qwen3.8-Flash-Next-GSQ-RCO-GGUF
(#llamacpp Sep 30–Oct 2). Community 2× V620, IQ3_xs-class + q4_0 ngrams in ~48 GB host RAM,
MTP: ~400 PP / ~40 TG (4k/1k batch). #llamacpp Oct 2 IQ3_XXS + CPU
per_layer_token_embd + MTP: ~800 → ~650 PP at ~30k / ~35 → ~20 TG (2k/1k batch;
community called it VRAM-bound). Needs verify. See
speculative table and
serve line.
Related
- Serve lines
- Recipes — Hub
-extras, Swift, and the TP=2 27B snapshot - Quantization — MTP unbreak, AutoRound vs Swift
- Flash-Next troubleshooting
- Choose a stack
Flash-Next serve lines
WIP / community. Copy from here only after you have read Flash-Next status (which card count, which graph mode). Failures: Flash-Next troubleshooting.
Path C — Flash-Next (rdna_extras / Hub 0.31)
For agentic / long-context Flash-Next on 4× V620, use the Flash-Next vLLM stack — not the
27B recipe presets and not the old v0.27.1-extras* / v0.28.0-extras* Hub tags:
- Source of truth:
opengfx1030/vllm-rdnardna_extrasis the v0.31.0 line (#announcements11 Oct 2026). The old 0.28 aggregation lives atrdna_extra/v0.28.0. Hubblivioniag/vllm-rdna:v0.31.0-extras(ROCm 7.14) served Flash-Next MTP-2 (BF16 + INT4-disk). - In-tree launcher:
tools/rdna/serve_rdna.shRECIPE=flashnext(production tools/reasoning) orRECIPE=flashnext-mtp2/flashnext-mtp0. The oldtools/rdna/serve_gfx1030_flashnext.shname is a thin alias ofRECIPE=flashnext.#vllm-rdnaSep 21 pointed 2-card / GPTQ questions at that file. Do not copy host paths out of the tree. Prefer the recipe over agent-generated env dumps — dropVLLM_USE_BREAKABLE_CUDAGRAPH=1and do not forceVLLM_RDNA_FUSED_HC=0on Flash-Next (#vllm-rdnaOct 10). - Published container: prefer Hub
v0.31.0-extras. The olderleapdragon/vllm-rdna2-qwentree remains for legacy GHCR /docs/rdna2(occasional commits through 11 Oct 2026). - Weights:
wtdcode/Qwen3.8-Flash-Next-AWQ-W4A16.#vllm-rdna(Oct 11):cyankiwi/Qwen3.8-Flash-Next-AWQ-INT4produced incoherent output on one 4× host; switching to thewtdcodeAWQ + primitive-ai PLE pair is the documented path. - PLE / n-gram: launcher
PLE=bf16|int4|int4-disk+PLE_QUANT_DIR=…/ples_int4(primitive-ai/Qwen3.8-Flash-Next-PLE-quant).#announcements(11 Oct): all three modes tested; speed at parity. Docker disk mode:-v /path/to/ples_int4:/ples_int4 -e VLLM_PLE_QUANT_DIR=/ples_int4 -e VLLM_PLE_CPU_OFFLOAD=1. No-P2P hosts:P2P=0on the launcher (orVLLM_RDNA_AR=0).
Expect large host DRAM for the BF16 n-gram table (~95 GB class). INT4 pinned is a
~30 GB table; #vllm-rdna (Oct 11) corrected an inflated ~90 GB host-RAM figure — INT4
sidecar working set is closer to ~35 GB. int4-disk mmaps shards (MADV_RANDOM) so only the
gather/dequant working set hits RAM. That is weight offload, not KV. Native KV RAM overflow
was broken on one 4× host (Sep 14: 128 GB not enough); the
fix merged as #24 (27 Sep) —
KV offload.
Long-prompt / intermittent stalls: try VLLM_USE_V2_MODEL_RUNNER=0 —
troubleshooting.
Throughput and KV tightness: Flash-Next status.
#vllm-rdna (Sep 17): there is no Q3 / GGUF-Q3 path on vLLM. Stay on W4A16 / AWQ / AutoRound.
EXL3 ~3 bpw is still experimental — Quantization.
4× V620 Flash-Next serve (rdna_extras #17, Sep 23)
opengfx1030/vllm-rdna#17 merged 23 Sep 2026
into rdna_extras. This is the public landing of the unpublished ~1950 PP recovery after #15.
Community / Needs verify. Not a Hub tag. Do not copy host paths from the PR body — use the
in-tree docs (docs/rdna2/V620-GIT-FAST-SERVICE.md, docs/rdna2/V620-BASELINE-PORT-20260922.md)
and tunableop/.
Operational facts that are safe to copy:
- Resident W4A16 MoE (
VLLM_RDNA_MOE_RESIDENT=1): convert the checkpoint’s packed INT4 experts into the RDNA2 kernel layout once at load, keep that layout, and skip repacking every 4k prefill chunk. Precision stays W4A16.#vllm-rdna(Sep 29): a latest-rdna_extrashost saw PP fall from ~2k → ~1450 with this unset; setting1restored ~2k. Treat a sudden PP cliff after an extras pull as a missing-resident-MoE check before blaming kernels. - Mamba retirement: backport of
vllm#55450. Without it, long prompts (100k+ class) hit a deterministic preemption loop (state blocks not retired across null gaps). - Graphs (
#17measured):--compilation-config '{"mode":0,"cudagraph_mode":"FULL_DECODE_ONLY","cudagraph_capture_sizes":[3,6,12]}'with MTP-2. Prefill stays eager. - On current HEAD, prefer
FULL_AND_PIECEWISEinstead — see FULL_AND_PIECEWISE (decode uses the same FULL path as this baseline; piecewise covers mixed/prefill). - TunableOp is rocBLAS-hash locked. A mismatched CSV aborts the first GEMM or silently uses default algorithms — regenerate.
- Harness used for the PR numbers:
GeorgeMA-Strong/llm-context-bench.
PR-head 16k (author) vs second-host confirm (#vllm-rdna Sep 23):
| Cell | PR #17 | Second 4× host |
|---|---|---|
| Regular 16k PP | 1,957.8 | 1,983.8 |
| Coding 16k PP | 1,982.8 | 1,985.3 |
| Regular / coding TTFT | 8.56 / 9.11 s | 8.44 / 9.10 s |
| Decode | 69.7 / 68.5 t/s | 63.1 / 70.1 t/s |
4× V620 Flash-Next serve (FULL_AND_PIECEWISE, Sep 24–25)
Current recommended graphs on latest rdna_extras. #vllm-rdna (Sep 24): maintainer confirmed
full + piecewise is fixed. Fork-source write-up:
docs/rdna2/V620-FULL-AND-PIECEWISE.md.
What changed:
| Layer | Behavior |
|---|---|
| Uniform decode | Replays the FULL CUDA graph (same live capture as #17 FULL_DECODE_ONLY) |
| Mixed / prefill | Replays piecewise graphs |
#20 alone | Piecewise capture worked, but ROCm still redirected every FULL dispatch → piecewise → decode ~26–34 t/s |
| Keep-FULL fix | Commit 6c26c78d (#21 / rocm_full_executes_as_piecewise → False) — on rdna_extras HEAD |
Safe compile line (generalized; do not copy host paths):
--compilation-config '{"mode":3,"cudagraph_mode":"FULL_AND_PIECEWISE","cudagraph_capture_sizes":[3,6,12]}'
In-tree launcher: tools/rdna2/serve_v620_piecewise.sh
(V620_COMPILE_MODE=3, V620_CUDAGRAPH_MODE=FULL_AND_PIECEWISE). Older comments in that script
still mention the #20-era ~2× decode drop — ignore those once you are on HEAD with the keep-FULL
commit. Prefer this over bare PIECEWISE (no FULL graphs) and over the Sep 17 breakable/mode:0
workaround.
Without compilation / without VLLM_USE_BREAKABLE_CUDAGRAPH=1, a FULL_AND_PIECEWISE request
downgrades to FULL_DECODE_ONLY (keeps FULL decode) instead of dropping every graph; a bare
PIECEWISE request still becomes NONE.
rdna_extras HEAD (25 Sep, 700753d9): MTP-2 boots after the amdsmi / local-argmax draft
fix, but author-host decode stays below MTP-0 (~46–49 vs ~61 t/s). Do not expect MTP to beat
the no-draft line yet — MTP.
The older Sep 17 PIECEWISE host-venv block below is only for checkouts before #17 / the
keep-FULL fix.
4× V620 Flash-Next MonoKernel (#94, 16 Oct)
Merged opengfx1030/vllm-rdna#94 (16 Oct)
into rdna_extras. A MonoKernel is a persistent HIP kernel that runs a large part of one
Flash-Next (qwen4_exp) decoder layer in one launch (k1 hyper-connection preamble, GDN/QSA
decode cores, k2 FFN). Prefill, mixed batches, the MTP drafter, and TP all-reduce stay on
today’s path. Off by default. Hub v0.31.0-extras lags. Recipes do not pass the
flag yet.
Startup refuses --monokernel unless all of these hold: gfx10x GPU, Qwen4Exp (MTP
drafter accepted), V2 model runner, PP=1, _rocm_C ops built, and MoE on
symmetric W4A16 (CompressedTensorsWNA16RDNA2MoEMethod). Asymmetric experts are a
follow-up (open #115). PP3 MonoKernel is open backlog (#116) — do not combine this
switch with RECIPE=flashnext-pp3*.
# Build the in-tree HIP bits (from an rdna_extras checkout + venv):
bash tools/rdna/mono/build_tree.sh
MODEL=/path/to/flash-next VENV=/path/to/venv \
EXTRA_ARGS="--monokernel" \
bash tools/rdna/serve_rdna.sh RECIPE=flashnext-mtp2 \
PLE=int4 PLE_QUANT_DIR=/path/to/ples_int4
Same switch: VLLM_ROCM_MONO_DECODE=1 (alias of --monokernel; backport of
vllm#61082). A/B without the flag in
the same session. Keep GPU_MAX_HW_QUEUES=4 (Flash-Next TP4 recipes already set it —
#107); two queues share HIP queues
and skew ranks. In-tree notes: tools/rdna/mono/README.md
and docs/rdna/monokernel/.
Reproduce A/B write-up: open #120.
PR #94 same-session A/B (4× V620, TP4, PLE int4, FULL_AND_PIECEWISE, temperature 0,
HSA_FORCE_FINE_GRAIN_PCIE=1, GPU_MAX_HW_QUEUES=4) — Fork-source. Cells are
prefill tok/s/req / decode tok/s/req / TTFT s / median ITL ms. For MTP-2, prefer ITL
(decode tok/s moves with drafter acceptance):
| Recipe / cell | off | on | ITL |
|---|---|---|---|
| MTP-0 1k c=1 | 2034 / 44.97 / 0.50 / 22.2 | 2205 / 50.74 / 0.46 / 19.7 | −11.4% |
| MTP-0 1k c=8 | 524 / 25.84 / 1.95 / 35.1 | 574 / 28.56 / 1.78 / 31.7 | −9.5% |
| MTP-0 16k c=1 | 2096 / 44.38 / 7.82 / 22.5 | 2113 / 50.03 / 7.75 / 20.0 | −11.2% |
| MTP-0 16k c=8 | 1071 / 13.34 / 15.30 / 35.6 | 1083 / 13.97 / 15.13 / 32.6 | −8.5% |
| MTP-2 1k c=1 | 2053 / 58.88 / 0.50 / 28.6 | 2284 / 77.66 / 0.45 / 24.8 | −13.4% |
| MTP-2 1k c=8 | 905 / 29.47 / 1.13 / 61.0 | 1003 / 32.54 / 1.02 / 55.9 | −8.3% |
| MTP-2 16k c=1 | 2022 / 68.37 / 8.10 / 29.1 | 2040 / 104.58 / 8.03 / 25.5 | −12.4% |
| MTP-2 16k c=8 | 1397 / 13.92 / 11.73 / 62.3 | 1460 / 14.35 / 11.23 / 58.3 | −6.4% |
#vllm-rdna (16 Oct) author restated the decode-side win as about 8–10% ITL at c=1
(with or without MTP), 5–6% at c=8 without MTP, and 0–3% at c=8 with MTP-2.
Prefill / TTFT were same or better in the PR table. Serves passed probe / PPL /
prefix / concurrency gates.
Community / Needs verify (#vllm-rdna 16–17 Oct): a second 4× host called MonoKernel
slightly slower than the current HIP path, with one GPU at 100% VRAM and prefill
under 1200 tok/s on the same cells — TunableOp mismatch suspected; author-host prefill
stayed above 2.1k. A mixed RDNA2/RDNA3 host saw about 5–10% after adding the switch
(not a V620 recipe). If PP collapses after --monokernel, regenerate TunableOp before
blaming the kernel — TunableOp.
Merged #126 (18 Oct) moves the
MonoKernel QSA indexer (store / epilogue / scoring) to HIP. That is on with
--monokernel on HEAD; it does not change the default path by itself.
HEAD HIP defaults (#130, 19 Oct)
Merged #130 (19 Oct) into
rdna_extras (closes #99). Flash-Next recipes on HEAD now default the HIP set
on: VLLM_RDNA_ALL_HIP, VLLM_RDNA_QSA_HIP, VLLM_RDNA_HC_PREFILL_HIP, and
VLLM_GDN_HIP_PREFILL=1. EXL3 recipes are unchanged. Hub v0.31.0-extras lags.
Set those vars to 0 to get the older Triton paths back.
Author-host 4× TP4 (Flash-Next AWQ, PLE int4): HIP-on ITL −6 to −8% and prefill
+3–7% vs the previous default (no --monokernel). With --monokernel, MTP-2 ITL
was −2 to −4%. Clone HEAD — do not expect this from the 11 Oct Hub bake.
Do not pass num_speculative_tokens_per_batch_size (merged #127 opt-in).
#vllm-rdna (22 Oct): that schedule caused token-repeat loops. Fixed MTP-2
(RECIPE=flashnext-mtp2) stays the daily path. #vllm-rdna (25–26 Oct): loops can
survive MTP off if CPU / disk KV offload is restoring sessions — disable
--kv-offloading-size while isolating —
troubleshooting.
4× V620 Flash-Next DFlash2 (#132, 21 Oct)
Merged #132 (21 Oct). Opt-in
drafter path, not a replacement for MTP-2. Recipe enables --monokernel.
MODEL=/path/to/flash-next VENV=/path/to/venv \
bash tools/rdna/serve_rdna.sh RECIPE=flashnext-dflash2 \
PLE=int4 PLE_QUANT_DIR=/path/to/ples_int4
- Target:
wtdcode/Qwen3.8-Flash-Next-AWQ-W4A16. - Draft:
incoai/Qwen3.8-Flash-Next-DFlash2(BF16 — FP16 draft produced NaNs / near-zero acceptance). - Draft attention is FA-RDNA2
BLHNC(noncausal sliding window). Target stays HIP QSA. - Default 3 draft tokens (
[4,8,16,32]capture). For the measured 16k / 1k c=8 ladder:DFLASH_TOKENS=2([3,6,12,24]).PRINT=1shows the argv before launch.
PR paired A/B (4× V620, TP4, same boot): native MTP-2 faster in all four cells
(tuned DFlash2 aggregate output −29 / −12 / −24 / −7% at 1k c=1 / c=8 and 16k
c=1 / c=8). #vllm-rdna (22 Oct): maintainer still has MTP-2 ahead on agentic load;
community: DFlash2 can win short / single-user, MTP-2 under concurrency. Fork-source
for the recipe; community contrast Needs verify. Not Hub.
2× V620 Flash-Next MoE offload (#146, 28 Oct)
Merged #146 (28 Oct). Resident
Flash-Next experts still do not fit 2× V620. This is the first in-tree vLLM spill
path: immutable pinned-RAM expert banks, a bounded GPU slot cache, and segmented
FULL_AND_PIECEWISE graphs around host planning. #vllm-rdna (28 Oct): V1 landed.
This is not a serve_rdna.sh RECIPE= yet. Use the offload wrapper on HEAD:
PRINT=1 MODEL=/path/to/flash-next PLE_QUANT_DIR=/path/to/ples_int4 \
bash tools/rdna/mono/serve_offload.sh
- Target:
wtdcode/Qwen3.8-Flash-Next-AWQ-W4A16(compressed-tensors symmetric INT4, group 128). - Default layout: TP=2 / EP=2,
--monokernel, 96 expert slots per layer/rank, native CPU KV tier (KV_OFFLOAD_GB;0disables KV offload for an expert-only A/B). - Slot policy knobs:
SLOTS,POLICY(lfu_lruorlru),DECAY. - Offload launcher defaults
VLLM_RDNA2_W4A16_DETERMINISTIC_DENSE=1(Q32 dense accumulation). Resident 4× recipes keep their existing default. - Design notes:
docs/rdna2/moe-offloading-target.md. Do not copy host paths out of that file.
Author-host 2× V620, MTP-2, 16 GiB native CPU KV (PR + #vllm-rdna 28 Oct):
16k/1024 c=1 ~19.8 tok/s aggregate (TTFT ~17 s, ~30 decode);
c=8 ~26.7 agg (mean TTFT ~106 s, KV pool at 100% observed occupancy);
32k/256 c=1 ~30 decode / TTFT ~34 s. Fork-source on that host. The PR
does not claim a controlled resident-vs-offload speedup. Not Hub.
Needs verify on a second host.
Without HEAD, llama.cpp RAM/MoE offload is still the 2-card path — llama.cpp 2×.
INT4 KV cache (#138, 25 Oct)
Merged #138 (25 Oct). Opt-in
longer KV on the non-MonoKernel QSA path:
--kv-cache-dtype int4_fp16_block
Packed INT4 + FP16 per-32-channel block scales; native QSA dequant in registers.
Other attention backends refuse the dtype. Default FP16 KV unchanged. Not Hub.
MonoKernel + this dtype Needs verify. #vllm-rdna (21 Oct): INT8 KV restore
(draft #71) remains the stated
day-to-day priority. Details: Quantization,
Fork progress.
4× V620 Flash-Next serve (rdna_extras, PIECEWISE, Sep 17)
Sanitized from a #vllm-rdna (Sep 17) host-venv recipe on 4× V620. Community / Needs verify
— not a published Hub tag. Requires opengfx1030/vllm-rdna
rdna_extras including the GDN sanitizer commit 388a61b6f, and a rocm_sdk venv
(torch 2.12 + ROCm 7.14). Paths below are generalized.
Why this differs from the Hub -extras TP4 block: Flash-Next on current rdna_extras FULL
decode graphs still corrupt output. Community: switch
--compilation-config to PIECEWISE, keep --max-num-batched-tokens 2048, and cap
--max-num-seqs at 4–6. See
FULL-graph corruption.
Do not copy this graph mode onto the 27B -extras recipe unless you are A/B testing.
Community snapshot on that host (16k prompt / 1k gen, concurrency 8): ~3331 tok/s prefill, ~72.7 tok/s decode, TTFT ~39 s. Treat as a single-host number.
#vllm-rdna (Sep 17–18): pin rdna_extras at or after
e45dd5cb
if you want prefix cache to actually hit, and set VLLM_RDNA_DENSE_GEMV=1 if skinny wvSplitK
faults after the profile run. VLLM_USE_BREAKABLE_CUDAGRAPH=1 is the stable / no-compile path
(~39 t/s class in one A/B); 0 plus compile can be faster once graphs are clean — see
FULL-graph troubleshooting.
Do not trust the logged hybrid KV token count — overstated pool.
#vllm-rdna (Sep 18): maintainer posted an updated host-venv production block that still keeps
VLLM_USE_V2_MODEL_RUNNER=0 (V2 blocked on Qwen4Exp), VLLM_USE_BREAKABLE_CUDAGRAPH=1, and
--max-num-batched-tokens 2048, but:
- uses
--compilation-configFULL_AND_PIECEWISE. On Sep 18 trees that mode still executed as PIECEWISE on ROCm (rocm_full_executes_as_piecewise). On current HEAD the keep-FULL fix turns that redirect off — FULL_AND_PIECEWISE. Still do not use FULL-only on old trees — FULL-graph corruption - raises
--kv-cache-memory-bytesto 7000000000 (7 GiB) and--gpu-memory-utilization 0.90 - reported a 16× 16k concurrency test as fine (earlier
--max-num-seqstightness) - kills leftover processes before relaunch —
VLLM::Worker,VLLM::EngineCore, andPleOffloadWorkercan survive an API/port kill (troubleshooting) - custom all-reduce / PIX is optional — hosts without GPU↔GPU P2P should drop that block (vLLM falls back to PYNCCL) — no P2P
Prefer Hub v0.31.0-extras (or a matching host-venv clone of rdna_extras) for this
serve line. Hub v0.28.0-extras is only for historical A/B against older Sep 2026 pastes.
MODEL="wtdcode/Qwen3.8-Flash-Next-AWQ-W4A16"
export VLLM_PLE_QUANT_DIR="$(python -c "from huggingface_hub import snapshot_download; print(snapshot_download('primitive-ai/Qwen3.8-Flash-Next-PLE-quant'))")/ples_int4"
export VLLM_PLE_CPU_OFFLOAD=1
export VLLM_PLE_OFFLOAD_READY_TIMEOUT=3600
# Low-RAM hosts only: PLE_OFFLOAD_PREFAULT=0 (skips RAM prefault; ~25% slower — see env-vars)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:False
export VLLM_FORCE_CUSTOM_ALL_REDUCE=1 # only if GPU↔GPU P2P works
export VLLM_USE_V2_MODEL_RUNNER=0
export VLLM_USE_AOT_COMPILE=0
export VLLM_DISABLE_COMPILE_CACHE=1
export VLLM_USE_BREAKABLE_CUDAGRAPH=1 # compile off; A/B 0 after output is clean
export VLLM_RDNA_DENSE_GEMV=1 # if wvSplitK faults after profile
export VLLM_RDNA_FUSED_HC=0
export VLLM_ROCM_USE_AITER=0
export VLLM_ROCM_USE_AITER_MOE=0
export FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE
export VLLM_RDNA_FORCE_FP16=1
export TORCH_BLAS_PREFER_HIPBLASLT=0
export PYTORCH_TUNABLEOP_ENABLED=1
export PYTORCH_TUNABLEOP_HIPBLASLT_ENABLED=0
export PYTORCH_TUNABLEOP_FILENAME="${PYTORCH_TUNABLEOP_FILENAME:-/path/to/tunableop_results.csv}"
export VLLM_BATCH_INVARIANT=0
export GPU_MAX_HW_QUEUES=2
export VLLM_WORKER_MULTIPROC_METHOD=spawn
export NCCL_P2P_LEVEL=pix
export RCCL_P2P_NET_DISABLE=1
export RCCL_P2P_BATCH_ENABLE=1
export NCCL_PROTO=Simple
export RCCL_MSCCL_ENABLE=0
export HSA_FORCE_FINE_GRAIN_PCIE=1
cd /tmp # avoid sys.path collisions with a local vllm checkout
python -m vllm.entrypoints.cli.main serve "$MODEL" \
--host 0.0.0.0 --port 8000 \
--tensor-parallel-size 4 \
--max-model-len 32768 \
--max-num-seqs 6 \
--max-num-batched-tokens 2048 \
--kv-cache-memory-bytes 5000000000 \
--gpu-memory-utilization 0.88 \
--dtype float16 \
--trust-remote-code \
--enable-prefix-caching \
--language-model-only \
--skip-mm-profiling \
--enable-expert-parallel \
--block-size 16 \
--distributed-timeout-seconds 1800 \
--compilation-config '{"cudagraph_mode":"PIECEWISE","compile_ranges_endpoints":[]}'
Shared P2P / all-reduce env is the same as
Hub -extras TP4. Drop the custom-AR block if P2P is broken.
Concurrency vs batch: #vllm-rdna (Sep 16): --max-num-batched-tokens 2048 keeps prefill
turns ~1 s at ~1300 tok/s; 8192 can block other streams for ~6 s. Raise toward 4096
only if you hit the 128k prefill cliff
on Intel AutoRound — that 4096 knob and this PIECEWISE stability recipe are different bugs.
Vision (#vllm-rdna Sep 17–21 + the in-tree launcher): Flash-Next recipes pass
the vision-cap feature, which still applies a pixel cap.
--limit-mm-per-prompt '{"image":1}' alone is not enough (count
is already 1). Without max_pixels, mm-profiling can feed a huge dummy image (~24.8M px) and the
vision encoder SDPA math backend materializes a ~64 GiB L×L fp32 score matrix — startup OOM
on 32 GB cards. max_pixels=1605632 keeps images up to about 1424×1424.
serve_rdna.sh bakes those two flags into vision-cap.
--limit-mm-per-prompt '{"image":1}' \
--mm-processor-kwargs '{"max_pixels":1605632}'
#vllm-rdna (Sep 21): vision works on rdna_extras with those flags; community ~15–20 s per
image. Runtime is a second OOM: vLLM may not reserve vision memory, so a tight KV plus an
image can OOM after a clean start. #general (Sep 21): vision + PP3 is especially tight. Keep
--language-model-only --skip-mm-profiling if you do not need images.
Maintainer QA playbook (not a second wiki): BlivionIaG/vllm-rdna-qa.
3× V620 Flash-Next PP3 (rdna_extras HEAD)
#general (13 Oct 2026) + merged #96:
PP3 / MTP-2 is in-tree on current rdna_extras. Hub v0.31.0-extras (11 Oct bake) does
not include these recipes — clone HEAD + host venv +
serve scripts.
MODEL=/path/to/flash-next VENV=/path/to/venv \
bash tools/rdna/serve_rdna.sh RECIPE=flashnext-pp3 \
PLE=int4 PLE_QUANT_DIR=/path/to/ples_int4
MTP-2 needs a W4A16 quantized drafter (tools/rdna/quant_mtp_experts.py); bf16 draft experts
do not fit the last stage:
MODEL=/path/to/mtpq-model VENV=/path/to/venv \
bash tools/rdna/serve_rdna.sh RECIPE=flashnext-pp3-mtp2 \
PLE=int4 PLE_QUANT_DIR=/path/to/ples_int4
Recipe facts (fork comments + #general 13 Oct maintainer paste):
| Recipe | Partition | SEQS / MAXBAT / GMEM | Notes |
|---|---|---|---|
flashnext-pp3 | 16,16,16 | 8 / 2048 / 0.95 | MTP=0, text-only, 262k, KV=auto. Dense INT8 ONLY (fp16 copy next to the shadow OOMs a stage). Vision not supported under PP3 (encoder on stage 0). |
flashnext-pp3-mtp2 | 17,17,14 | 4 / 2112 / 0.975 | Drafter on last stage. GMEM 0.95 caps length ~188k on 30 GB cards. MAXBAT 2048 admits only 3 of 4 at 16k. Use up to ~4 streams; beyond that MTP=0 has more aggregate. |
#vllm-rdna (17 Oct): later HEAD merges were not re-benched against this 13 Oct table —
treat the numbers as a snapshot, not a current HEAD guarantee.
Author-host 16k/1k (#general 13 Oct, Community — not wiki-tested):
| Recipe | c=1 PP / TG / TTFT / ITL | Concurrent |
|---|---|---|
flashnext-pp3 (MTP-0) | 1848 / 38.0 / 8.87 s / 26.4 ms | c=8: 771 (1589 agg) / 7.7 / 21.3 s / 63.4 ms |
flashnext-pp3-mtp2 | 1866 / 70.9 / 8.78 s / 37.0 ms | c=4: 1071 (3088 agg) / 10.1 / 15.3 s / 122 ms (all 4 running) |
Also merged #95: int8 dense shadows are built in
row chunks so load no longer allocates a ~2.4 GiB fp32 temporary. PLE still lives on stage 0
— PLE=bf16 wants ~95 GB host RAM; smaller hosts use PLE=int4 / int4-disk.
Older Sep 15 leapdragon / overlay notes stay below as historical. If an older pin still
corrupts PP3 decode —
PP3 corruption. Sep 19 pin
b33f9b6 is a different failure (graphs boot, small prefill KeyError) —
workaround.
3× V620 Flash-Next PP3 + MTP (leapdragon era, Needs verify)
#vllm-rdna (Sep 15): one host fitted Qwen3.8-Flash-Next + MTP on 3× V620 32 GB using a
leapdragon image (W4A16 + PLE int4 CPU offload), PP=3 / TP=1. Treat as a single-host
write-up — some steps were local source patches. Prefer the HEAD recipes
when you can clone current rdna_extras.
Operational facts from that era that still match the HEAD recipes:
- Baseline PP3 without MTP sat at ~30 GiB/card with
--gpu-memory-utilization 0.95. - The MTP head is instantiated on the last pipeline stage only, so that stage OOMs first.
- Uneven layers leave the last stage light. The PLE offload worker can inherit
VLLM_PP_LAYER_PARTITION, seepp_size=1, and refuse (len(partitions)=3≠pp_size=1) — unset that env in the PLE worker process. VLLM_ROCM_MOE_PADDING=0(do not pad routed-expert weights).- Upstream
vllm#46994(MTP under pipeline parallel on the V2 runner) merged Sep 2026.
The old local int8 row-chunk rewrite is now #95
on HEAD. VLLM_RDNA_DENSE_INT8_ONLY=1 is on both flashnext-pp3* recipes.
3× overlay: leapdragon + org MoE HIP (Sep 17–18)
#vllm-rdna (Sep 17–18): a temporary public overlay
(alanoo81/flashnext-v620-pp3) ports
opengfx1030’s fused W4A16 MoE HIP kernel (moe_gptq_gemm_rdna2) onto a leapdragon
Flash-Next image so 3× V620 / PP=3 can keep leapdragon CUDA graphs + MTP while picking up
org-class prefill. Not a published Hub tag; treat as Community / Needs verify.
Public README snapshot (same harness; 160 W cap; AWQ-W4A16 + int4 PLE in host RAM):
| Stack | Prefill 4K / 16K / 64K / 130K | Decode |
|---|---|---|
| leapdragon image as shipped, graphs, PP3 | 409 / 738 / 1349 / — | ~32 t/s (~48 with dense int8) |
| leapdragon + org MoE HIP + graphs + MTP k=2 + prefix cache | 1078 / 1863 / 1989 / 2493 | ~57–63 t/s |
Community: use MTP for one user; from two streams up, leave MTP off (plain graphs scaled better in that write-up). Also backports vLLM #46994 and #54044 (MTP + graphs + prefix cache). Follow the overlay README — do not copy host paths from Discord.
#general (Sep 23): the overlay author is no longer working on the repo. Community still
reports useful 3-card numbers (one host ~45 t/s decode / ~1100 tok/s PP; overlay write-up
120+ t/s under multi-agent load, even ~200 t/s with 5–6 agents). Long context can trip
infinite KV-pool dump loops — the author capped 3 concurrent agents on long prompts.
Treat the overlay as unmaintained / snapshot; prefer rdna_extras once PP3 is clean there.
#vllm-rdna (Sep 19): that same HIP MoE kernel was reported non-deterministic (~3.5% of
top tokens change between identical runs; Triton MoE did not). #vllm-rdna (Sep 30): an fp32
deterministic path was described as opt-in (throughput cost); no public flag name. See
fork MoE note. Needs verify.
#vllm-rdna (Sep 18): the published Flash-Next checkpoint can leave the MTP draft head’s 512
experts in bf16, so speculative decode runs those through the generic Triton MoE kernel.
The overlay README adds scripts/quant_mtp_experts.py (offline W4A16, RTN int4 g128, same
packing as the main experts) so the draft experts hit the same HIP kernel. Community on
3× V620 PP3: +4–7% single-stream decode (~65–66 t/s), no acceptance loss (~70→75%), and
+60% wall throughput at 8 streams (~77 → ~123 t/s). Community / Needs verify — run the
script from the overlay repo; do not invent a Hub tag for the derived checkpoint.
DeepSeek-V4 Flash (community, Needs verify)
#vllm-rdna (Sep 17): public INT4-W4A16 weights
yiminyuan/DeepSeek-V4-Flash-0731-INT4-W4A16
plus a gfx1030 vLLM tree
yiminyuan/vllm @ gfx1030/v0.28.0.
Publisher intent: TP=4 / PP=2. This is not Hub -extras and not wiki-tested. #llamacpp
also mentioned a RDNA2 TP4 DeepSeek-V4 serve (~22 t/s, kernel unpublished) — Needs verify.
#vllm-rdna (Oct 10): on the current extras / v0.31 test line, DeepSeek-V4 is expected to
run once mixed prefill/decode stalls are fixed (suspected CUDA-graph capture range too
narrow). That is not a serve recipe yet — stay on the yiminyuan tree or wait for the stall
fix. GLM-5.3 on the same fork was asked and not answered. See
mixed prefill.
Related
- Flash-Next status — throughput, KV, AutoRound
- Serve scripts —
RECIPE=flashnext-mtp2and the other in-tree configs - Hub
-extrasTP4 — the non-Flash-Next 27B block - Configuration
- vLLM forks
vLLM Configuration
WIP: Env recipes and throughput numbers are community-reported. See Verification status.
Recommended environment (#vllm-rdna)
These settings are commonly used in the gfx1030 Discord for -extras images on ROCm 7.14:
export VLLM_TARGET_DEVICE=rocm
export VLLM_ROCM_USE_AITER=0
export VLLM_ROCM_USE_AITER_MOE=0
export VLLM_RDNA_FORCE_FP16=1
export TORCH_BLAS_PREFER_HIPBLASLT=0
export PYTORCH_TUNABLEOP_ENABLED=0 # or 1 for autotuning (see compose below)
export PYTORCH_TUNABLEOP_HIPBLASLT_ENABLED=0
export GPU_MAX_HW_QUEUES=2
export VLLM_WORKER_MULTIPROC_METHOD=spawn
export VLLM_BATCH_INVARIANT=0
export HIP_FORCE_DEV_KERNARG=1
export RCCL_MSCCL_ENABLE=0
export VLLM_USE_RDNA2_FA=1 # extras images: native RDNA2 FlashAttention
export VLLM_USE_V2_MODEL_RUNNER=1 # +17% vs V1 reported on gfx1030 `-extras`
export FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE
export SAFETENSORS_FAST_GPU=1 # faster safetensors → GPU load (`#vllm-rdna` Sep 2026)
VLLM_USE_V2_MODEL_RUNNER=1 remains the usual default on Hub -extras. On the Flash-Next
fork, long agentic prompts that stall or timeout with V2 enabled have been fixed in-community by
setting VLLM_USE_V2_MODEL_RUNNER=0 instead — see
Flash-Next long-prompt stalls.
GPU_MAX_HW_QUEUES=2 is the launcher default. Merged
#107 (16 Oct): Flash-Next TP4 recipes
(flashnext-mtp2 / flashnext-mtp0 / flashnext) set 4. That is not a Hub -extras
compose change — leave 2 on the 27B Docker example unless you measure TP4 Flash-Next on HEAD.
See env vars.
Custom all-reduce / P2P (two community stacks)
Pick one path — do not mix both:
| Topology | Env |
|---|---|
| No working GPU↔GPU P2P (common on Ice Lake / ACS-blocked hosts) | VLLM_DISABLE_CUSTOM_ALL_REDUCE=1 (previous wiki default) |
P2P works and you want the fast path (#vllm-rdna Aug 2026 benches) | VLLM_FORCE_CUSTOM_ALL_REDUCE=1, NCCL_P2P_LEVEL=pix, RCCL_P2P_NET_DISABLE=1, RCCL_P2P_BATCH_ENABLE=1, NCCL_PROTO=Simple |
If custom all-reduce misbehaves (stalls, bad latency on V620), fall back to the disable path. Some community recipes now run a short all-reduce self-test at boot and auto-fallback — pull latest recipe / fork notes.
Prefer --attention-backend RDNA_ATTN (or VLLM_USE_RDNA2_FA=1) over ROCM_ATTN on -extras.
#vllm-rdna reports ROCM_ATTN sitting in AMD Triton flash-attention compile for hours (RCCL and
Triton also fight each other). FA_RDNA2 may not show up on older -extras images or GPTQ models that
still auto-select ROCM_ATTN — that is expected on hybrid GDN; see fork.
On Flash-Next, QSA full-attention layers ignore these flags (Triton QSA path) —
partial FA.
For multi-GPU TP on current -extras images, if AOT compile cache replay causes device-bound
errors, add:
export VLLM_USE_AOT_COMPILE=0
export VLLM_DISABLE_COMPILE_CACHE=1
RDNA_ATTN / VLLM_USE_RDNA2_FA steer vLLM away from the generic AMD Triton flash-attention path,
which can be slower or crash on some Qwen head sizes. See rdna_extras fork for kernel
details. Full env cheat-sheet: Reference.
Don’t force backends or quantization unless you’re A/B testing — or avoiding a
ROCM_ATTN Triton hang.
Let vLLM read the model’s config.json unless that auto-selects the slow AMD Triton FA path.
CUDA graphs (preferred over --enforce-eager)
On current -extras images, CUDA graphs are the fast path — you generally should not use
--enforce-eager. Graph capture can take a while on first boot (Triton JIT + torch-compile cache), but
steady-state throughput is much higher once warmed up.
Recommended graph config (fork-author reported on Qwen3.8-27B-AWQ-INT4, TP4, 4× V620 — not wiki-reproduced):
vllm serve /path/to/model \
--dtype float16 \
--tensor-parallel-size 4 \
--enable-chunked-prefill \
--enable-prefix-caching \
--language-model-only \
--skip-mm-profiling \
--trust-remote-code \
--compilation-config '{"cudagraph_mode": "FULL_AND_PIECEWISE", "compile_ranges_endpoints": []}'
Reported steady-state throughput on current -extras (1024/512 bench, TP4):
| Graph mode | Total tok/s | Output tok/s |
|---|---|---|
| PIECEWISE 1024/512 | 277.99 | 92.66 |
| FULL 1024/512 | 280.34 | 93.45 |
| PIECEWISE 16k/512, c=8 | 330.97 | — (prefill peak ~1573 tok/s) |
Alternative that also avoids --enforce-eager:
--compilation-config '{"mode": "NONE", "cudagraph_mode": "FULL", "compile_ranges_endpoints": []}'
To disable graphs entirely (debugging only):
--compilation-config '{"cudagraph_mode": "NONE"}'
If graph capture still crashes, fall back to --enforce-eager — but try the updated image first
(docker pull blivioniag/vllm-rdna:v0.31.0-extras). See
vLLM troubleshooting.
Flash-Next on rdna_extras (Sep 16–25): on current HEAD, prefer
cudagraph_mode=FULL_AND_PIECEWISE with compile mode: 3 (capture e.g. [3,6,12] + MTP-2) —
uniform decode uses the FULL graph; mixed/prefill use piecewise —
serve notes. #17 FULL_DECODE_ONLY
(mode: 0) remains a valid decode baseline. #20
alone still redirected FULL→piecewise (~26–34 t/s); keep-FULL commit 6c26c78d turns that off.
Older Sep 16–17 hosts that saw FULL decode corrupt stayed on PIECEWISE —
FULL-graph troubleshooting.
The table above is the 27B -extras path, not Flash-Next.
VLLM_USE_BREAKABLE_CUDAGRAPH=1 in that recipe disables torch.compile (mode=NONE). Community
Sep 17 A/B: keep it for the no-corruption path, then try 0 if you want compile speed back.
Cache volumes (first boot is slow)
Mount these so Triton and torch-compile artifacts persist across container restarts:
volumes:
- ~/.cache/huggingface:/root/.cache/huggingface
- ~/.triton/cache:/root/.triton/cache # ~3 GB compiled Triton kernels
- ~/.triton/dump:/root/.triton/dump
- ~/.triton/llvm:/root/.triton/llvm
- ~/.cache/vllm/torch_compile_cache:/root/.cache/vllm/torch_compile_cache # ~700 MB
First startup compiles kernels and can take many minutes. Subsequent boots reuse the cache.
For recipe / Flash-Next stacks that want the compile cache (not the multi-GPU AOT-disable
workaround above), #vllm-rdna (Sep 2026) recommends keeping the cache on and pointing it at a
persistent directory:
export VLLM_DISABLE_COMPILE_CACHE=0
export VLLM_CACHE_ROOT=/path/to/persistent/vllm-cache # mount this in Docker
Community reports ~5 min vs ~10 min subsequent startups once the cache is warm — still slow cold, but
better than rebuilding every boot. Do not mix this with the TP VLLM_DISABLE_COMPILE_CACHE=1
workaround unless you have verified your image needs that disable path.
On Flash-Next long-context serves, if prefill falls off a cliff around 128k while decode
stays flat, raise --max-num-batched-tokens to 4096 before blaming kernels — see
128k prefill cliff.
On current rdna_extras Flash-Next TP serves, keep 2048 first if FULL graphs are
corrupting — 4096 is the Intel AutoRound scheduler knob, not the graph-corruption fix.
SAFETENSORS_FAST_GPU=1 is also commonly set (and already present in some vllm-rdna Dockerfiles) to
speed weight load into GPU memory — see AMD vLLM optimization notes.
Docker Compose example (GPTQ + MTP + CUDA graphs)
This #vllm-rdna setup reached ~24 output t/s on TP2 with a GPTQ model. Key points: GPTQ hits the
native RDNA2W4A16LinearKernel, CUDA graphs via --compilation-config, and VLLM_DISABLED_KERNELS
forces the RDNA2 quant path:
services:
server:
image: blivioniag/vllm-rdna:v0.31.0-extras
network_mode: host
ipc: host
devices: [/dev/kfd, /dev/dri]
group_add: [video, render]
security_opt: [label=disable]
volumes:
- ~/.cache/huggingface:/root/.cache/huggingface
- ~/.triton/cache:/root/.triton/cache
- ~/.triton/dump:/root/.triton/dump
- ~/.triton/llvm:/root/.triton/llvm
- ~/.cache/vllm/torch_compile_cache:/root/.cache/vllm/torch_compile_cache
environment:
VLLM_TARGET_DEVICE: rocm
VLLM_ROCM_USE_AITER: "0"
VLLM_USE_RDNA2_FA: "1"
PYTORCH_TUNABLEOP_ENABLED: "1"
PYTORCH_TUNABLEOP_HIPBLASLT_ENABLED: "0"
VLLM_WORKER_MULTIPROC_METHOD: spawn
GPU_MAX_HW_QUEUES: "2"
VLLM_USE_V2_MODEL_RUNNER: "1"
VLLM_DISABLED_KERNELS: ExllamaLinearKernel,TritonW4A16LinearKernel
command: >
serve btbtyler09/Qwen3.8-27B-GPTQ-4bit
--served-model-name "Qwen 27B"
--host 0.0.0.0 --port 8091
--max-model-len 262144
--gpu-memory-utilization 0.85
--kv-cache-dtype float16
--speculative-config '{"method":"mtp","num_speculative_tokens":4}'
--tensor-parallel-size 2
--dtype float16
--max-num-seqs 4
--language-model-only --skip-mm-profiling --trust-remote-code
--enable-auto-tool-choice --tool-call-parser qwen3_coder
--enable-prefix-caching --enable-chunked-prefill
--compilation-config '{"cudagraph_mode": "FULL_AND_PIECEWISE", "compile_ranges_endpoints": []}'
Confirm the kernel is active in logs: Using RDNA2W4A16LinearKernel for AutoGPTQLinearMethod.
vLLM Quantization on gfx1030
WIP: Throughput numbers are community-reported. See Verification status.
GPTQ vs AWQ
| Format | -extras kernel path | Notes |
|---|---|---|
GPTQ (e.g. btbtyler09/Qwen3.8-27B-GPTQ-4bit) | RDNA2W4A16LinearKernel — native gfx1030 HIP | Best -extras throughput. Force with VLLM_DISABLED_KERNELS=ExllamaLinearKernel,TritonW4A16LinearKernel. |
AWQ (e.g. Qwen3.8-27B-AWQ-INT4) | RDNA2W4A16LinearKernel on gfx10x | As of Aug 2026 extras, AWQ dense routes through the same native W4A16 kernel as GPTQ (fork-author reported ~151 output t/s; needs verify on your image). |
compressed-tensors (e.g. cyankiwi/Qwen3.8-27B-AWQ-INT4) | Mixed — use --quantization compressed-tensors | Custom int4 re-quants; benchmark against GPTQ/AWQ. |
AWQ-vd (e.g. ikantkode/Qwen3.8-27B-AWQ-vd) | RDNA2W4A16LinearKernel when dense | Community-tuned AWQ variant; confirm kernel in logs. |
On older images (before the AWQ→RDNA2 dispatch fix), AWQ fell through to Triton/Exllama and could
stall at ~4–5 t/s on a 27B. Pull the latest -extras image and confirm
Using RDNA2W4A16LinearKernel in startup logs. Qwen3.8-27B AWQ also needs the fork’s
head_size=256 FlashAttention path — without it, FA falls back or never lists RDNA_ATTN.
Kernel dispatch details: rdna_extras fork.
#vllm-rdna (14 Oct) + merged #98: RDNA2 W4A16
MoE no longer synthesizes symmetric zero points. Asymmetric compressed-tensors checkpoints
(e.g. cyankiwi/*-AWQ-INT4, group 32, int8 zeros) used to miss the native experts kernel and fall
back to generic Triton WNA16 MoE. Asymmetric 8-bit checkpoints still fall back. Confirm
RDNA2W4A16MoEExperts (or dense RDNA2W4A16LinearKernel) in logs. Not in Hub
v0.31.0-extras (11 Oct bake) — clone HEAD.
KV-cache dtype
| Dtype | When people use it | #vllm-rdna notes |
|---|---|---|
float16 | Long-context / agents / tool calling | Default recommendation. VLLM_USE_FA_RDNA2=1 currently needs fp16 KV. Required on current QSA / Flash-Next backends (see below). |
int8_per_token_head | Throughput on older GPTQ / Triton FA | Reported 5–10 t/s above fp8 in TG (and higher PP) in limited testing. One report that it misbehaves with chunked prefill. Not selected on QSA Flash-Next — those backends do not list int8 KV. |
fp8 | VRAM savings (older dense 27B) | #vllm-rdna Sep 22: blocked on current QSA / Flash-Next. Two independent gates — troubleshooting. Older dense-27B reports that fp8 was slower than int8_per_token_head and dropped quality on long sessions. |
| KVarN | Third-party KV compression | Raised concurrency on Qwen, broke tool calling, failed on Gemma 4. Community verdict: skip for agents. |
Prefer float16. Do not plan on --kv-cache-dtype fp8 for QSA / Flash-Next until the extras fork
re-enables a gfx1030 path. #vllm-rdna (Sep 23–24): community is testing INT8 KV via upstream
quantized KV cache
(RDNA2 has no FP8) aiming at more concurrent long context (e.g. 4× 256k). That is not the
same as INT8 decode shadows, and QSA backends still do not list int8 KV — treat as
Needs verify, not a recipe.
MTP speculative decoding
MTP (--speculative-config '{"method":"mtp","num_speculative_tokens":N}') can boost throughput on GPTQ
models with CUDA graphs enabled. Acceptance rates dropped after a v0.27.1 speculator update (~0.25), but
base decode speed remains good — worth testing on your model. Example in
Configuration.
MTP is not free at high concurrency. A #vllm-rdna TP4 matrix on Qwen3.6-35B-A3B-FP16
(4× V620, --enforce-eager, 16k/1k-style bench) reported MTP-2 +17% output tok/s at c=1, but
−53% at c=8. Use MTP for latency-critical single-stream; leave it off for batched throughput.
#vllm-rdna (Sep 15): RDNA2W4A16MoEExperts was reported to raise usable concurrency on MoE
W4A16 — confirm the kernel in logs. Pipeline-parallel MTP needs upstream
vllm#46994 (merged; next vLLM release). A 3×
V620 Flash-Next + MTP squeeze is the in-tree flashnext-pp3-mtp2 recipe on HEAD
(PP3); the older leapdragon overlay is
historical. Hub v0.31.0-extras lags.
#vllm-rdna (Sep 18): on Flash-Next, MTP can block the int4 PLE fused decode path. If logs show
Triton GDN / PLE fallback and decode is stuck in the teens of t/s, A/B MTP off before blaming
P2P. Separately, the MTP draft head may still be bf16 MoE even when the main experts are
W4A16 — quantize those draft experts offline if you stay on MTP
(3× overlay). #vllm-rdna Sep 18: no MTP on the
Hub v0.28.0-extras line; that work is aimed at the rdna_extra/v0.29.0 rebase.
rdna_extras HEAD
700753d9
(25 Sep) unbreaks MTP draft inference on gfx1030: amdsmi_shut_down() exceptions no longer
mask a successful MoE config lookup (that used to kill the drafter on ranks 1–3 and deadlock
NCCL), and Qwen4Exp MTP uses local-argmax draft sampling when
speculative_config.use_local_argmax_reduction=true. Author-host 4× V620 W4A16 Flash-Next
MTP-2 then boots (FA + FULL_DECODE_ONLY ~46 t/s; Triton + FULL_AND_PIECEWISE
~49 t/s) but stays below MTP-0 (~61 t/s) — documented ~0.73–0.85× penalty. #vllm-rdna
(Sep 25): community still reports the same “boots, not faster than MTP-0” class.
30632b2
(27 Sep) captures the draft decode graph at max_num_reqs (MTP-2 c=8 was eager).
Author-host: +18% at 8×1k / +5% at 8×16k; still ~0.87× vs MTP-0 at 16k. One later
host with a matching TunableOp table reported MTP above MTP-0 — treat that as Needs
verify, not a retraction of the 0.73–0.87× class. Present in Hub v0.31.0-extras;
commits after the bake pin still want clone + host venv.
Merged #26: concurrent MTP-2 (9–16 rows)
can stay on HIP MoE with VLLM_ROCM_MOE_SKINNY_MAX_M=16. Default remains 8. See
prefill vs decode.
#vllm-rdna (Oct 8): on current rdna_extras MTP-2, if temperature > 0, set
"draft_sample_method":"probabilistic" inside --speculative-config. The greedy / local-argmax
draft path (700753d9) is the default; non-zero temp without the probabilistic sampler is the
community-reported miss. Example:
--speculative-config '{"method":"mtp","num_speculative_tokens":2,"draft_sample_method":"probabilistic"}'
Same thread: day-to-day rdna_extras MTP-2 was ~60–90 t/s on one host (community; not a
recipe). Hub v0.31.0-extras includes the MTP=2 path; A/B acceptance on your host.
INT4 on gfx1030 (no native int4 ALUs)
RDNA2 has no hardware int4 matrix units. The -extras W4A16 kernels use vdot2 on fp16 with on-the-fly
dequant — int4 weights packed and processed via dp4a-style instructions. Both GPTQ and AWQ dense now
hit the same native HIP kernel on current -extras images.
Recent fork work on hybrid GDN models (Qwen3.8-27B-AWQ-INT4, TP4) reported ~93 output tok/s with CUDA graphs (1024/512), ~331 total tok/s at 8 concurrent requests (16k/512), and prefill peaks of 1450–1573 tok/s — with the full HIP GDN prefill + decode chain replacing Triton JIT.
Tips
- Lower
--gpu-memory-utilization(e.g.0.9→0.8) if KV-cache allocation OOMs on 16 GB cards. - For GPTQ or AWQ on
-extras: setVLLM_DISABLED_KERNELS=ExllamaLinearKernel,TritonW4A16LinearKerneland watch logs forRDNA2W4A16LinearKernel. - On older images, AWQ could fall through to Triton (~4–5 t/s on a 27B). Pull latest
-extrasand confirm the native kernel is active before blaming the quant format. - Don’t force
--attention-backendor--quantization— let vLLM auto-select unless A/B testing. - Mount Triton and torch-compile caches (see Configuration).
Experimental: EXL3 and Quark (#vllm-rdna, Sep–Oct 2026)
#announcements (11 Oct 2026): EXL3 is listed among the v0.31.0 extras features, and
the launcher ships RECIPE=27b-exl3. Older Hub tags (v0.27.1-extras*, v0.28.0-extras*) do
not have that bake. Treat EXL3 as experimental even on 0.31 — mul1-tested path; A/B
before production. AMD Quark is still not a drop-in on current -extras.
| Format | Status | Notes |
|---|---|---|
| EXL3 (e.g. community 9B 3bpw Ornith builds) | Experimental | Single-card serve recipes with CUDA graphs (FULL_AND_PIECEWISE, capture sizes 1,2,4,8) were shared in #vllm-rdna. Goal is fitting small models on 16 GB consumer cards; Triton leftovers can still bloat VRAM. Sep 19 kernel was 3inst only; #vllm-rdna Sep 24: rdna_extra/v0.29.0 now has mul1. #vllm-rdna Oct 2: HEAD is mul1-tested only; 3inst is untested. Not a drop-in on every Hub tag. |
AMD Quark (e.g. amd/Qwen3.8-27B-Quark-Qronos-INT4-W4A16) | Needs verify | Marketed near MXFP4 quality; needs Quark-capable runtime (upstream PRs #48606 / #46110). Community hit import issues — not a drop-in on current -extras. |
EXL3: 3inst only (#vllm-rdna, Sep 19)
#general (Sep 18) and #vllm-rdna (Sep 19): the gfx1030 EXL3 kernel on rdna_extras HEAD was
3inst, not mul1. 3inst is easier to execute at inference, not higher quality. Mixed
bit-widths are still not wired: MTP at 6 bpw, lm_head at 8 bpw, and vision in bf16 will not load
together. On published Hub -extras, keep uniform 3 bpw and the head in bf16.
#vllm-rdna (Sep 24): rdna_extra/v0.29.0
now implements mul1, so existing EXL3 packs can load. HIP EXL3 work is still in testing.
Needs verify — do not assume Hub tags have this.
#vllm-rdna (Sep 29–30) + rdna_extras commits (30 Sep–1 Oct): EXL3 is a weight format —
you do not need the exllamav3 runtime. mul1 decode / K=1..8 from rdna_extra/v0.30.0 is
now on rdna_extras HEAD and GPU-run on gfx1030 (215/215 EXL3 tests; Qwen3.8-27B
3.00 bpw mul1 TP=4 FULL_AND_PIECEWISE + RDNA_ATTN coherence pass). Author-host
74315f4:
1k/512 ~18.9 t/s (c=1) / ~81.8 t/s agg (c=8); 16k/1k ~13.7 t/s / ~830 tok/s
PP (c=1). Needs verify on other hosts. Not in Hub -extras. Draft
#32 is the earlier kernel-port PR; the
loader rewrite landed as follow-up commits on HEAD.
Stale inductor artifacts: VLLM_DISABLE_COMPILE_CACHE does not clear
TORCHINDUCTOR_CACHE_DIR — troubleshooting.
#vllm-rdna (Oct 2): current rdna_extras HEAD is tested for mul1 only. The maintainer has
not run 3inst. Prefer a mul1 pack on HEAD. Public community mul1 27B:
quark75/Qwen3.8-27B-EXL3-3.0bpw
(use with the 27b-exl3 serve recipe). A calibrated 3inst Flash-Next upload
exists — BlivionIaG/Qwen3.8-Flash-Next-EXL3-3bpw-3inst
— but was not GPU-tested on that date. Do not treat it as a recipe.
A mixed 3+6 bpw pack around 50 GB was called tight for 2× V620 and still needed
calibration. Experimental kernels had only been tried on an Ornith 1.5 9B quant — not
confirmed on 2× Flash-Next. #general (Sep 18) and #vllm-rdna (Oct 2): older 0.27 / 0.28
images can unpack an EXL3 download (one ~12.5 GB pack ballooned to ~54 GB) and OOM —
size host RAM, not just the download. Flash-Next EXL3 is still not a 1× V620 path without
heavy RAM offload.
An uncalibrated public 3inst upload was posted and immediately flagged for rework — do not treat
it as a stable checkpoint:
BlivionIaG/Qwen3.8-Flash-Next-EXL3-3bpw-3inst-uncalibrated.
The later calibrated 3inst repo above is still Needs verify.
#vllm-rdna (27 Oct): EXL3 vs AWQ on current gfx1030 kernels — EXL3 wins
size and quality; AWQ wins speed and complexity. Day-to-day testing still
uses AWQ. EXL3 kernel work is paused in favor of a new RDNA-oriented
weight format (BlivionIaG/hi2). Public
README: rdna_hint_flex stores each row as INT2 or INT4 (INT8 on request)
plus block scales, an optional smoother, and an order-16 Hadamard; you set a
quality target and the tool reports the bit rate (--target-bpw 3.0 is the
compact recipe). HIP kernels and the vLLM loader live in the vLLM RDNA2 fork,
not in the hi2 repo. #vllm-rdna (30 Oct): 3 bpw was called a bit
aggressive; 3.5 bpw may hold quality better but QAD is slow. There is no
vLLM RECIPE= / Hub bake yet. Do not treat hi2 as a serve path.
Prefer GPTQ/AWQ on published images until EXL3/Quark land in a tagged Docker build.
#vllm-rdna (Sep 29): W4A8 started as an explore path (public
opengfx1030/vllm-rdna#9, w4a8-wiring branch).
#vllm-rdna (Oct 1): W4A8 is in rdna_extras HEAD (VLLM_RDNA2_W4A8_SDOT4 / serve-script
W4A8=1) but was not much faster than W4A16 dequant-on-the-fly — the stated win then was
more context, not decode. #vllm-rdna (Oct 9): a later kernel on the v0.31.0 test line
was called somewhat competitive vs W4A16. Merged
#140 (26 Oct): 27b-awq recipe defaults
W4A8=1 on HEAD (int8-activation prefill GEMMs for M≥33; decode stays W4A16). Author-host
4× TP4: 16k c=1 PP 860 → 1075 tok/s; c=8 aggregate out 42.5 → 52.3; paired PPL ~unchanged.
Fork-source on that host; Hub v0.31.0-extras may still leave the knob off — check
PRINT=1. Set W4A8=0 to force W4A16 prefill. EXL3 still needs optimizations. W8A8
was called theoretically the fastest int8 layout, not a current recipe.
INT4 KV cache (int4_fp16_block, HEAD)
Merged #138 (25 Oct): opt-in
--kv-cache-dtype int4_fp16_block — packed INT4 payload + FP16 per-32-channel block scales
(plus a 4-bit zero-point in the low nibble of each scale word). The RDNA2 QSA path
reads/writes natively (dequant in registers into the same FP16 LDS tile). Backends that
cannot pack the record refuse the dtype up front. Default FP16 KV is unchanged.
Not in Hub v0.31.0-extras. MonoKernel + this dtype still Needs verify.
#vllm-rdna (21 Oct): maintainer priority for longer context is still restoring the
INT8 KV HIP path (draft #71), not
replacing day-to-day FP16 with experimental packs. Snapshot: Fork progress.
Intel AutoRound W4A16 (Flash-Next, #vllm-rdna Sep 2026)
Not in published -extras tags. Community + draft
opengfx1030/vllm-rdna#5 are exercising Intel
W4A16 AutoRound Flash-Next:
| Checkpoint | Role |
|---|---|
Intel/Qwen3.8-Flash-Next-W4A16-AutoRound | PR-validation checkpoint (W4A16 weights, FP16 serve path) |
Intel/Qwen3.8-Flash-Next-W4A16-RTN-AutoRound | RTN sibling cited in #vllm-rdna (high publisher recovery %) |
ukisai/Swift-1.5-Qwen3.8-Flash-Next-W4A16-AWQ | #vllm-rdna Sep 25 — shorter-reasoning AWQ (compressed-tensors). Swift notes |
ukisai/Swift-1.5-Qwen3.8-Flash-Next-W4A16-AutoRound | Swift AutoRound sibling — 50-iter light tune; not the Intel 200-iter pack. #vllm-rdna Sep 27: looped badly on one host — prefer the AWQ sibling first |
Community take: Intel AutoRound sits between Unsloth Q5_XL and Q6_XL on quality while the weight pack is tens of GB smaller (~75 GB). That still wants four 32 GB cards plus a large CPU PLE / n-gram table (embedded BF16 table is ~95 GiB — offload to RAM).
Do not assume the historical group-16 INT4 PLE sidecar matches published AutoRound benches
(those used BF16 PLE). Merged #49 (11 Oct)
plus the v0.31.0 launcher (PLE=int4|int4-disk) is the current INT4 path. See
overview.
#vllm-rdna (12 Oct): latest rdna_extras can fail at construction on this Intel pack
(NotImplementedError / INCConfig for the unquantized PLE table). Upstream
vLLM #59990 is merged; the gfx1030 cherry-pick
was still queued. Troubleshooting.
#vllm-rdna (Sep 20): merged opengfx1030/vllm-rdna#15
used this Intel AutoRound pack with the unquantized / original BF16 PLE table (~100 GB class
in RAM), not wtdcode AWQ + primitive-ai PLE-quant. INT8 decode shadows remain
experimental — they are excluded from that merge (one host reported ~42 → ~55 t/s without MTP;
Needs verify, and quality loss was already seen on Sep 16).
vLLM forks (RDNA2 / gfx1030)
WIP: Kernel behavior below is traced to fork source commits; published
-extrasDocker images may lag HEAD until rebuilt. See Verification status.
Fork landscape
#vllm-rdna (Sep 2026): the official gfx1030 vLLM source is the shared-org repo. File new PRs and
issues there. Flash-Next work lives on rdna_extras. Published
Docker Hub v0.31.0-extras landed 11 Oct 2026.
| # | Repo / branch | Role | Use it when… |
|---|---|---|---|
| Official | opengfx1030/vllm-rdna @ rdna_extras (default) | Hand-written RDNA HIP kernels + dispatch. Moved from the old personal blivioniag/vllm rdna2_extras line (repo 404 today). vLLM 0.31.0 as of 11 Oct 2026; old 0.28 line is rdna_extra/v0.28.0 | Clone, contribute, track HEAD |
| Flash-Next (older container) | leapdragon/vllm-rdna2-qwen (e.g. rdna2/qwen38-flash-next) | Older Flash-Next container + docs/rdna2. Day-to-day kernels / Hub bake live on org rdna_extras / v0.31.0-extras; this tree still receives occasional commits (last push 11 Oct 2026) | Existing GHCR / compose that still points here; docs/rdna2 references |
| Historical | blivioniag/vllm @ rdna2_extras (public repo gone) | Predecessor of the official repo. Do not file new PRs here | Comparing old commit SHAs only; current Hub extras bakes clone the org repo |
Day-to-day serving: pull blivioniag/vllm-rdna
v0.31.0-extras (#announcements 11 Oct 2026). Source of truth for new kernel work is
opengfx1030/vllm-rdna rdna_extras (now the v0.31.0
port). Older Hub tags stay for A/B. Do not assume org GHCR tags exist yet.
Companion (not an engine fork): leapdragon/vllm-rdna2-recipe
(mirror opengfx1030/vllm-rdna2-recipe)
collects compose/env recipes and open PRs (concurrent MTP, etc.). Wiki entry point:
Recipes. #vllm-rdna (Sep 2026): the Flash-Next author treats the recipes
repo as a parts pile (less active new work). Day-to-day Flash-Next optimization lives on
org rdna_extras (Hub v0.31.0-extras); Concurrent-MTP PRs on the recipes repo are
still worth cherry-picking into that stack.
Progress snapshot
For a dated Hub vs HEAD vs backlog table (MonoKernel, HIP defaults, PP3, INT4 KV, W4A8, open drafts), see Fork progress (26 Oct 2026). The chronicle below keeps per-PR detail.
Consolidation status (Sep 3–26 2026)
#vllm-rdna / public merges chronicle — expect this to move quickly:
| Track | Status |
|---|---|
0.28 rebase on opengfx1030/vllm-rdna | Historical (Sep 2026). Shipped as Hub v0.28.0-extras; day-to-day is now 0.31 (rdna_extras). Old line kept at rdna_extra/v0.28.0. |
| Flash-Next → org cherry-picks | #vllm-rdna Sep 14–15: leapdragon Flash-Next work landed in rdna_extras. #announcements (11 Oct 2026): Hub v0.31.0-extras serves Flash-Next MTP-2. Prefer org HEAD / that Hub tag over older leapdragon GHCR. Earlier review-only PR #1 was the first rdna_ar pass. |
| Intel AutoRound / FP16 Flash-Next | opengfx1030/vllm-rdna#5 — closed (still draft, not merged, 14 Sep 2026). Validated short-run on 4× V620 (see overview). Not a Hub image; do not treat as open backlog. |
| QSA live-context prefill | Merged opengfx1030/vllm-rdna#15 (20 Sep 2026) into rdna_extras. Bounds AMD QSA prefill scoring to the live prompt (decode / missing metadata stay capacity-wide). Folds superseded PR #12 V620 startup fixes. Combined-stack benches: overview. INT8 shadows and fused MTP-3 draft decode are not in the merge. Present in Hub v0.31.0-extras (11 Oct bake). #vllm-rdna (Sep 21–22): the #15 ~2k PP table did not reproduce on other 4× public-merge hosts (~1.1–1.45k). The unpublished recovery landed as #17 (next row). |
| Recipe ports + Hybrid W4A16 gfx10 | Draft opengfx1030/vllm-rdna#6 — in-tree Apache ports from the recipe book (Triton LDS/softmax, skinny MoE GEMV, MTP SupportsPP). RDNA2 HIP stays the auto default; Hybrid is opt-in (--linear-backend rdna_hybrid). Needs gfx1030 A/B. |
Kernel gap audit after RDNA_ATTN port | Community audit list (fix only): missing/partial layernorm bindings, FA int8/fp8 variants, some W8A8 / MLA / int8 cache bindings, VLLM_FORCE_CUSTOM_ALL_REDUCE wiring, MXFP4 oracle backend, stricter custom-paged-attention gate. Already clean on that pass: W4A16 dense+MoE, MLA sparse file, dynamo _SimpleCData fix, EXL3, arch helpers |
V620 fast stack (#17) | Merged opengfx1030/vllm-rdna#17 (23 Sep 2026) into rdna_extras. Ports the measured 4× TP4 serving stack: resident W4A16 MoE (pack INT4 into the RDNA2 layout once at load; skip per-chunk repack), Mamba state retirement across null gaps (backport vllm#55450 — previously a long-prompt preemption loop that halved usable context), and FULL_DECODE_ONLY graphs. PR-head 16k: ~1958 / ~1983 tok/s PP. #vllm-rdna (Sep 23): a second 4× host confirmed those 16k cells after regenerating TunableOp for its rocBLAS. Present in Hub v0.31.0-extras. Details: overview, TunableOp. |
| Flash-Next production | 4× V620 still the vLLM path; prefer latest rdna_extras (includes #17, #20, and the keep-FULL decode fix) over a stale leapdragon checkout. Published containers may lag. 3× PP3: current HEAD ships flashnext-pp3 / flashnext-pp3-mtp2 (#96, 13 Oct) — PP3 recipes. Sep 15–16 rdna_extras pins still garbage — troubleshooting. Community Sep 17–18 overlay alanoo81/flashnext-v620-pp3 is a snapshot — recipe; #general (Sep 23): overlay unmaintained. Graphs on HEAD: FULL_AND_PIECEWISE — uniform decode replays the FULL CUDA graph (same path as #17 FULL_DECODE_ONLY); mixed/prefill use piecewise. #20 (merged 24 Sep) made piecewise capture work but still redirected FULL→piecewise (~26–34 t/s decode). Follow-up commit 6c26c78d (#21 work; #vllm-rdna Sep 24 “fixed full and piecewise”) sets rocm_full_executes_as_piecewise → False. In-tree: docs/rdna2/V620-FULL-AND-PIECEWISE.md. |
| vllm-rdna-qa | BlivionIaG/vllm-rdna-qa (#vllm-rdna Sep 17): maintainer QA / landing playbook for opengfx1030/vllm-rdna. Not a second kernel wiki. |
| Docker bake | Source moved to opengfx1030/vllm-rdna-docker. #announcements (11 Oct 2026): Hub blivioniag/vllm-rdna:v0.31.0-extras (same digest as v0.31.0-extras-rocm7.14.0; ROCm 7.14, torch 2.12, Triton 3.7.1) is the current extras bake and served Flash-Next MTP-2. Older v0.27.1-extras* / v0.28.0-extras* stay on Hub for A/B. Plain v0.27.1-rocm7.14.0 (non-extras) was called removable; keep rocm-rdna:7.14.0 as a packaging base. Kernels newer than the bake still want clone + host venv + tools/rdna/serve_rdna.sh. |
| 0.28 MTP / 0.29 rebase | #vllm-rdna Sep 18: no MTP support on the 0.28.0 extras line — rebase continues on rdna_extra/v0.29.0 to pick up upstream Qwen4Exp. Flash-Next long-prompt hosts that needed VLLM_USE_V2_MODEL_RUNNER=0 should re-A/B before bumping (V2 becomes the default on 0.29). |
| Upstream vLLM 0.30 / Qwen4 rebase | #general (Sep 22): v0.30 released; official images cite ROCm 10.0. gfx1030 is still not in mainline. Side branch rdna_extra/v0.30.0 exists. Superseded as the day-to-day rebase by v0.31.0 (next rows). |
GLM-5.3-Flash / Glm5Next (#2) | Open #2 on side branch later/glm53-flash-awq — runtime-unverified (no GPU at author time); HIP gates default off. #vllm-rdna (Sep 30): a local 0.30 fork (not this PR) served wtdcode/GLM-5.3-Flash-AWQ-W4A16 on 8× TP=8 — recipes. |
MTP unquantized drafter (#19) | Merged opengfx1030/vllm-rdna#19 (24 Sep): detect MTP tensors that exporters left unquantized (missing quantization_config.dynamic exclusions) so the drafter loads instead of AttributeError on w2_weight. Hub -extras lags. |
MTP draft unbreak (700753d9) | rdna_extras HEAD (25 Sep): swallow failing amdsmi_shut_down() so MoE config lookup can fall back; Qwen4Exp MTP local-argmax draft sampling. Author-host MTP-2 boots but stays ~0.73–0.85× vs MTP-0. #vllm-rdna Sep 25 confirmed “closer, still a loss”. MTP=2 path is in Hub v0.31.0-extras — acceptance still Needs verify. Quantization. |
GPTQ BLOCK_KN_SIZE (#18) | Open #18: bump GPTQ BLOCK_KN_SIZE 128 → 256 on gfx1030. #vllm-rdna (Sep 24): hold merge until an M > 32 sweep through at least 2048. |
| MTP under pipeline parallel | Upstream vllm#46994 merged (#vllm-rdna Sep 15). Needed for PP3 + MTP on 3× V620. In-tree recipes #96 (13 Oct): flashnext-pp3 / flashnext-pp3-mtp2 — PP3. Hub v0.31.0-extras (11 Oct bake) still lags. |
rdna_ar / custom all-reduce (#22) | Merged #22 (27 Sep): two-shot rdna_ar so serve scripts can leave VLLM_FORCE_CUSTOM_ALL_REDUCE=0. Library default for VLLM_RDNA_AR stays off (failed self-test falls back to RCCL). #vllm-rdna Sep 15–24: force-custom crashed one host. A/B on your topology before making it a default. |
Disagg prefill/decode (#23) | Open #23: local PCIe P2P KV bridge so prefill and decode can sit on different PLX switches (TP stays inside a switch; KV handoff is SDMA). #vllm-rdna (Sep 24): stated as a multi-system objective. Needs verify — not a recipe yet. |
| hippihx | BlivionIaG/hippihx (#hippihx Sep 16): HIP kernel op zoo meant to keep rdna_extras thin. Not wired into a published image yet. |
| Prefix cache on Flash-Next | #vllm-rdna Sep 17: pre-fix rdna_extras reported 0% hits. Fix: e45dd5cb (QSA ring / hybrid min). Port of vllm#55506 is 741e5bc3 (V2 mamba spec-decode tables) — did not replace the 0% fix. — troubleshooting. |
| DeepSeek-V4 Flash | Community INT4 + gfx1030 tree (yiminyuan, #vllm-rdna Sep 17) — recipes. In-tree launcher recipe RECIPE=dsv4-flash under tools/rdna/recipes/ (fp8 dense + MXFP4 experts, breakable graphs on). Needs verify. |
| LMCache | Still no published gfx1030 recipe. Do not remake the standalone image — run official lmcache/standalone in CPU mode and add a vLLM connector (LMCacheConnectorV1 / LMCacheMPConnector) to a bare-metal / venv rdna_extras serve. Official CUDA image lmcache/vllm-openai is not the RDNA path. #lmcache (Sep 23–24): a community 0.5.6.dev wheel built against gfx1030; official kernels are CDNA-only (generic fallback + Mamba align issues). Hybrid Qwen (MambaSpec + QSA FullAttentionSpec) needs HMA; LMCacheConnectorV1 is not HMA-capable and dies at startup (Failed to promote local KV cache specs). — troubleshooting. |
| Upstream CPU KV offload (ROCm) | #vllm-rdna Sep 20: vllm#57160 (mainline, not 0.29) uses private pinned tensors for CPU KV offload after cudaHostRegister failures on large TP. Tracking note only — the gfx1030-facing fix is the next row. |
RAM KV offload (#24) | Merged opengfx1030/vllm-rdna#24 (27 Sep 2026) into rdna_extras. Fixes ROCm RAM-tier corruption (per-rank pinned buffers, hybrid group indices, MTP/EAGLE trailing block, scratch-group filter). #vllm-rdna Sep 26–27: ~190k RAM→VRAM in ~0.4 s; three ~150k sessions while VRAM held ~270k. PR swap: ~2.1 s reload of ~200k, decode ~112 t/s (no 1 t/s collapse). SSD tier untested. In Hub v0.31.0-extras. — troubleshooting. |
Skinny HIP MoE 9–16 rows (#26) | Merged #26 (27 Sep). Opt-in VLLM_ROCM_MOE_SKINNY_MAX_M=16 so concurrent MTP-2 batches (9–16 token rows) stay on native HIP instead of tile Triton. Default cap remains 8. PR regular-text c=3: +11% aggregate gen. No single-chat claim; coding-suite dominant_repeated_token failures retained. |
MTP draft graph (30632b2) | rdna_extras (27 Sep): capture the speculator draft graph at max_num_reqs so MTP-2 c=8 is not eager. Author-host +18% (8×1k) / +5% (8×16k). Still ~0.87× vs MTP-0 at 16k. #vllm-rdna: better, not great. |
FA-RDNA2 kernel pass (#28) | Merged #28 (28 Sep). Causal tile skip / in-place FA output / GQA softmax. Not GPU-validated on gfx1030 at merge (offline / CPU emulation only). Draft #29 (split decode for MTP verify) is stacked on it and also untested on device. Do not claim tok/s from either. |
Adaptive prefill (#36) | Merged #36 (5 Oct 2026). Opt-in VLLM_RDNA_DYNAMIC_PREFILL=1 self-tunes --long-prefill-token-threshold and --prefill-schedule-interval for mixed prefill+decode. Default off. #vllm-rdna (Oct 4–5): static flags still paused decode during prefill; the dynamic path kept decode moving (~25 t/s burst at 3 decode + 1 prefill). Author Oct 5: recovered about half the mixed-prefill cliff (below 500 → ~1100 PP) and auto-adjusts with load. Synthetic benches called a poor measure. In Hub v0.31.0-extras (opt-in). — troubleshooting. |
MoE expert DRAM cache (#37) | Draft #37: earlier opt-in hot-expert VRAM / host-RAM cache. Superseded by merged #146 (28 Oct) — 2× serve. Do not treat #37 as a recipe. |
INT4 PLE (#49) + disk sidecar | Merged #49 (11 Oct 2026) into rdna_extras, then shipped in the v0.31.0 release. Launcher PLE=bf16|int4|int4-disk + PLE_QUANT_DIR=…/ples_int4 (primitive-ai/Qwen3.8-Flash-Next-PLE-quant). #announcements (11 Oct): all three modes tested on 4× V620; speed at parity. #vllm-rdna (Oct 11): INT4 host-RAM working set is ~35 GB, not the earlier inflated ~90 GB figure. Docker: -v …/ples_int4:/ples_int4 -e VLLM_PLE_QUANT_DIR=/ples_int4 (-e VLLM_PLE_CPU_OFFLOAD=1 for disk). |
v0.31.0 release (#47) | #47 closed; #announcements (11 Oct 2026): rdna_extras = upstream vLLM v0.31.0 + RDNA port. Old 0.28 line: rdna_extra/v0.28.0. Hub blivioniag/vllm-rdna:v0.31.0-extras. One launcher: bash tools/rdna/serve_rdna.sh RECIPE=… (flashnext-mtp2, flashnext-mtp0, flashnext, 27b-awq, 27b-exl3, dsv4-flash, full). Author-host 4× V620 TP=4 (probes, PPL, prefix cache, concurrency, 0 GPU faults): Flash-Next AWQ ~2000 tok/s prefill, 45 (MTP-0) / 69 (MTP-2) tok/s decode, ~205 tok/s aggregate at 8 users — Fork-source. Also tested 27B AWQ (+W4A8, +TP=2), Qwen3.6-35B-A3B GPTQ MTP-0/2, DeepSeek-V4-Flash MXFP4. #vllm-rdna (Oct 11): P2P=0 for hosts without PCIe P2P. PP3 recipes are HEAD-only (next rows) — not in the 11 Oct Hub bake. |
PP3 Flash-Next (#96 / #95) | Merged #96 (13 Oct): RECIPE=flashnext-pp3 / flashnext-pp3-mtp2. Under PP the MTP drafter no longer keeps a second GPU embedding/lm_head; it shares the target’s on that stage. #95: int8 dense shadows in row chunks (load used to OOM a ~2.4 GiB fp32 temporary). #general (13 Oct) author-host 16k/1k: MTP-0 1848/38 c=1, 771/7.7 c=8; MTP-2 1866/70.9 c=1, 1071/10.1 c=4 — Community. PP3. |
Prefix-cache off (#97) | Merged #97 (14 Oct): ENABLE_PREFIX_CACHING=0 now passes --no-enable-prefix-caching. Omitting the enable flag left vLLM’s default on. |
Asymmetric W4A16 MoE (#98) | Merged #98 (14 Oct): RDNA2 W4A16 MoE no longer synthesizes symmetric zero points. Asymmetric compressed-tensors checkpoints (e.g. cyankiwi/*-AWQ-INT4, group 32, int8 zeros) used to fall back to generic Triton WNA16 MoE. Asymmetric 8-bit checkpoints still fall back. — quantization. |
Flash-Next TP4 HW queues (#107) | Merged #107 (16 Oct): GPU_MAX_HW_QUEUES=4 on Flash-Next TP4 recipes. Launcher default stays 2. Neutral with fork kernels off; removes per-rank skew when rdna_mono_* kernels are in the graph. |
rocprofiler register (#108) | Merged #108 (16 Oct): launchers default ROCPROFILER_REGISTER_ENABLED=0. #vllm-rdna (16 Oct): rocprofiler registration spun ≥1 core per GPU and kept the host out of idle. Distinct from ROCR busy-spin. Profiling: set =1. |
Flash-Next MonoKernel (#94) | Merged #94 (16 Oct) into rdna_extras. Opt-in persistent decode kernel for Qwen3.8-Flash-Next (qwen4_exp) on gfx1030 TP4: --monokernel or VLLM_ROCM_MONO_DECODE=1 (off by default; backport of vllm#61082). Prefill, mixed batches, the MTP drafter, and TP all-reduce stay on the current path. Not in Hub v0.31.0-extras. Recipes do not turn it on yet. Serve: MonoKernel. Follow-up docs PR #120 (open). |
| Triton 3.9 drops gfx1030 | #vllm-rdna (17 Oct): RDNA1/RDNA2 are removed from Triton 3.9+. Hub extras and the host venv pin 3.7.1 (ROCm 7.14) / 3.5.1 (ROCm 7.2). Do not bump Triton “to latest” on a gfx1030 venv. The fork’s HIP path is the long-term escape; stay on the pinned wheel until then. |
MonoKernel QSA HIP (#126) | Merged #126 (18 Oct). Under --monokernel, QSA indexer store / one-launch epilogue / scoring move to HIP. Default path unchanged. Opt-in VLLM_RDNA_QSA_HIP=1 without --monokernel also uses the HIP indexer. Not Hub. |
Dynamic MTP opt-in (#127) | Merged #127 (18 Oct): #119 dynamic MTP graph shapes, opt-in. Fixed MTP-2 is unchanged unless num_speculative_tokens_per_batch_size is set. #vllm-rdna (22 Oct): leave the schedule off — community A/B blamed it for token-repeat loops. Proper dynamic drafting is still open #125. |
rdna_ar sticky abort (#128) | Merged #128 (19 Oct). Rare silent decode hang: GPUs at 99% util / 0% memory, host idle, RPC call … timed out, no WEDGED. After one lost peer flag the one-shot re-waited 120 s per collective. Now fails fast as WEDGED and the next boot falls back to RCCL. — hang. |
HIP set default-on (#130, closes #99) | Merged #130 (19 Oct). Ports #99 QSA/GDN/HC HIP kernels with MonoKernel #126. Flash-Next recipes now default VLLM_RDNA_ALL_HIP, VLLM_RDNA_QSA_HIP, VLLM_RDNA_HC_PREFILL_HIP, and VLLM_GDN_HIP_PREFILL=1 (EXL3 unchanged). Set those to 0 to get Triton back. Author-host ITL −6 to −8% without --monokernel. Hub v0.31.0-extras lags. Vectorized one-shot (#129) stayed out. |
Non-mono graph hang (#131) | Merged #131 (19 Oct). Intermittent hang without --monokernel: workers silent, ~300 s RPC timeout. gfx10x SharedExperts no longer forks to an aux HIP stream inside CUDA-graph capture (ROCm 7.14 signal-reuse). Eager overlap stays. — hang. |
Flash-Next DFlash2 (#132) | Merged #132 (21 Oct): RECIPE=flashnext-dflash2 — wtdcode AWQ target + incoai/Qwen3.8-Flash-Next-DFlash2 BF16 drafter, FA-RDNA2 BLHNC draft attention. Default 3 draft tokens; DFLASH_TOKENS=2 is the measured 16k c=8 ladder. Paired A/B: native MTP-2 still faster in all four cells. #vllm-rdna (22 Oct): maintainer same for agentic; DFlash2 can win short / single-user. Not Hub. — DFlash2. |
EXL3 Flash-Next (#117) | Merged #117 (17 Oct): RECIPE=flashnext-exl3 for turboderp/Qwen3.8-Flash-Next-exl3 (3.05bpw). PLE=exl3 mmaps ngram_embedding.safetensors via the CPU sidecar; MTP=0; expert-parallel on (EXL3 128-wide blocks do not split under TP=4 alone). Drafts #122/#123/#124 cover MTP / vision / MoE cut. Not Hub. — Serve scripts. |
MTP-2 MonoKernel (#137) | Merged #137 (24 Oct): MTP Mono K1/K2 sticky-fault containment + opt-in post-proposal TP status reduce before tokens return. Ordinary native MTP-2 skips that collective. Graph / eager fault qualification noted in the PR. Still opt-in via --monokernel. Not Hub. |
INT4 KV int4_fp16_block (#138) | Merged #138 (25 Oct): packed INT4 + FP16 per-32-channel block scales as a real CacheDType. Native write/read on the non-MonoKernel QSA path; other backends refuse the dtype (silent corruption risk). Opt-in --kv-cache-dtype int4_fp16_block. Default FP16 KV unchanged. #vllm-rdna (21 Oct): maintainer still prioritizes restoring INT8 KV (draft #71) for day-to-day. Not Hub. |
fp16 SSM + W4A8 default (#140) | Merged #140 (26 Oct): GDN prefill can keep mamba state in fp16 (page ~half → denser KV); launcher derives prefill budget from the mamba block; 27b-awq recipe defaults W4A8=1 (int8-activation prefill GEMMs for M≥33; decode stays W4A16). Author-host 4× TP4 27B: 16k c=1 PP 860 → 1075 tok/s; c=8 agg out 42.5 → 52.3; paired PPL ~4.94 → 4.91. Not Hub. |
TP2 AWQ MoE expert offload (#146) | Merged #146 (28 Oct): Flash-Next TP=2 / EP=2 expert-weight spill to pinned host RAM with a bounded GPU slot cache (default 96 slots/layer, lfu_lru or lru). #vllm-rdna (28 Oct): V1 landed. In-tree launcher is tools/rdna/mono/serve_offload.sh — not a serve_rdna.sh RECIPE= yet. Design notes: docs/rdna2/moe-offloading-target.md. Author-host 2× V620, wtdcode AWQ-W4A16, MTP-2, 16 GiB native CPU KV: 16k/1024 c=1 ~19.8 tok/s aggregate (TTFT ~17 s, ~30 decode); c=8 ~26.7 agg; 32k/256 c=1 ~30 decode / TTFT ~34 s — Fork-source, no controlled resident-vs-offload speedup claimed. Offload launcher defaults VLLM_RDNA2_W4A16_DETERMINISTIC_DENSE=1 (resident recipes stay as they were). Not Hub. — 2× serve. |
Official-fork feature set called out in-channel (HIP): MXFP4, AWQ INT4, GPTQ INT4, GDN
prefill/decode linear attention, FA-RDNA2, one-shot all-reduce, FULL_AND_PIECEWISE, EXL3, MTP=2.
Treat Hub v0.31.0-extras as the current extras bake; clone HEAD for work after that tag.
Readable snapshot: Fork progress.
The rdna_extras fork
The official extras source is
opengfx1030/vllm-rdna on the default rdna_extras
branch (formerly personal blivioniag/vllm rdna2_extras — public repo 404 today). It adds
hand-written RDNA2 HIP kernels and the vLLM plumbing to dispatch to them.
Current Hub extras bakes (v0.28.0-extras, v0.31.0-extras) clone this org branch via
vllm-rdna-docker (VLLM_REPOSITORY=…/opengfx1030/vllm-rdna.git,
VLLM_REF=rdna_extras). Older v0.26 / v0.27.1-extras* bake targets still name the removed
personal BlivionIaG/vllm @ rdna2_extras clone. Pull Hub v0.31.0-extras for serving;
clone the org repo to contribute.
Why it exists: RDNA2 (gfx1030) has no matrix/WMMA cores — those arrived with RDNA3 (gfx11xx). So
quantized GEMM, attention, and MoE have to be implemented efficiently on RDNA2’s regular vector ALUs.
This fork does exactly that (with RDNA3 WMMA variants where it makes sense).
INT4/W4A16 on gfx1030 does not use native int4 compute. The RDNA2 kernels dequant on the fly using
vdot2 fp16 instructions with int4 packed via dp4a. Community testing found no faster INT8-based
HIP kernel vs fp16 for these paths — fp16 dequant is the winning approach on V620.
Branches
| Branch | Purpose |
|---|---|
main | Fork baseline tracking upstream vLLM. |
rdna_extras | Default. Aggregated RDNA extras (HIP kernels, EXL3 WIP, …). File PRs here. |
Historical names on the old personal fork (feat/enable-gfx1030, perf/rdna2_w4a16, rdna2_extras)
are superseded. Only the older v0.26 / v0.27.1-extras* bake targets still name that removed
repo; current extras bakes use VLLM_REF=rdna_extras on opengfx1030/vllm-rdna.
What’s in it
The custom device code lives under csrc/rocm/*_rdna2.cu (with _rdna3 variants where WMMA applies),
wired into vLLM through Python kernel/layer modules and covered by targeted tests under
tests/kernels/.
Attention
fa_rdna2.cu— a FlashAttention kernel tuned for RDNA2, exposed viavllm/v1/attention/ops/fa_rdna2_backend.pyand thevllm/v1/attention/backends/rdna_attn.pybackend. Now supportshead_size=256on gfx10x (needed for Qwen3.8-27B-AWQ-INT4; previously capped at 128 and caused Triton GDN compile hangs).#vllm-rdna(Sep 22–24): when the extras fork went public the maintainer dropped the FP16 FA pieces to focus on validating W4A16. In-treefa_rdna2is still the org target, but it is currently disabled / not working after the#17stack changes (prefix-cache + piecewise first). Independent2kiss/flash-attention-rdna2is stale — do not treat it as a drop-in. Needs verify.sparse_mla_rdna2.cu+rocm_rdna2_mla_sparse.py— sparse MLA (multi-head latent attention, DeepSeek-style).indexer_paged_mqa_rdna2.cu— paged MQA indexer.
Quantized GEMM (mixed-precision linear)
q_gemm_rdna2.cu/q_gemm_rdna2_prefill.cu(+q_gemm_rdna2_common.cuh) — W4A16 quantized GEMM for decode and prefill.q_gemm_w8a16_fp8_rdna2.cu,gemm_w8a8_fp8_dense_rdna2.cu— FP8 W8A16 / W8A8 paths.qdq_4_rdna2.cuh,qdq_8_rdna2.cuh,qdq_fp8_rdna2.cuh— quant/dequant helpers.- Python:
model_executor/kernels/linear/mixed_precision/rdna2_w4a16.py,.../scaled_mm/rdna2_w8a16_fp8*.py,rdna2_w8a8_fp8.py, and therdna_hybrid_w4a16.pyselector. - EXL3 (in-tree on
rdna_extras;#announcements11 Oct 2026 lists it on the v0.31.0 extras bake /RECIPE=27b-exl3):exl3_hadamard.cu,exl3_dot2_*.cu, plusvllm/.../quantization/exl3.py. Still experimental.#vllm-rdna(Sep 24):rdna_extra/v0.29.0added mul1 so existing EXL3 packs can load.#vllm-rdna(Sep 29–30) +rdna_extrascommits (30 Sep–1 Oct): mul1 / K=1..8 plus the v0.30 loader rewrite are on HEAD and GPU-run on gfx1030 (215/215 tests; 27B 3.00 bpw mul1 TP=4 graphs).#vllm-rdna(Oct 2): that path is mul1-tested only — 3inst packs are untested. Draft#32was the earlier kernel-port PR. Older Hubv0.27.1-extras*tags do not have this — Quantization.
MoE (mixture of experts)
moe_q_gemm_rdna2.cu,moe_w8a16_rdna2.cu,moe_w8a16_fp8_rdna2.cu— quantized expert GEMMs.- Python experts
fused_moe/experts/rdna2_mxfp4_moe.py,rdna2_w8a16_fp8_moe.py, andcompressed_tensorsMoE glue (..._fp8_rdna2,..._w4a4_mxfp4_rdna2,..._wna16_rdna2).
#vllm-rdna (Sep 19): a quality A/B reported the fused HIP MoE kernel is not deterministic.
On the same server and the same tokens, about 3.5% of the most-probable tokens changed between
runs, costing about +0.2–0.3% perplexity versus the best reference that host could run. The
Triton MoE path was bit-identical across repeats. Cause not isolated (fp16 accumulation
order vs a real race). Proposed, not landed as of Sep 19: replace the atomic_add_pk4_f16
CAS loop with global_atomic_add_f32 (fewer atomics, possibly worse bandwidth). #vllm-rdna
(Sep 30): an fp32 deterministic MoE mode was described as opt-in because it cuts
throughput — flag name was not posted; do not invent an env var. Default stays the
faster path. Needs verify — do not switch kernels on this note alone.
GDN (gated delta-net / linear attention)
Kernels for gated-delta-net models (e.g. Qwen3.8-27B hybrid linear attention). As of Aug 2026 the full GDN chain is hand-ported to HIP — no Triton JIT on the hot path:
| Kernel | File | Role |
|---|---|---|
| Decode | gdn_decode_rdna2.cu | Packed decode; fork microbench reports ~9.3× vs Triton at B=1 (community) |
| Prefill prep | gdn_prefill_prep_rdna2.cu | Q/K/V staging |
| Prefill KKT | gdn_prefill_kkt_rdna2.cu | KKT accumulation |
| Prefill solve WY | gdn_prefill_solve_wy_rdna2.cu | WY solve |
| Prefill delta_h | gdn_prefill_delta_h_rdna2.cu | Delta-h update |
| Prefill output | gdn_prefill_o_rdna2.cu | Output projection |
This replaces the Triton FLA GDN path that previously caused 16k/1k prefill hangs and slow decode on hybrid models. Recent tuning commits improved delta_h register pressure, o-kernel block-vector width, and prep-kernel vectorization.
Using it
The easiest path is a prebuilt -extras image — no compilation required:
docker run -it --rm \
--device /dev/kfd --device /dev/dri --group-add video --group-add render \
--security-opt seccomp=unconfined --ipc host -p 8000:8000 \
docker.io/blivioniag/vllm-rdna:v0.31.0-extras \
vllm serve <model> --dtype float16
See Running (Docker) for the full run recipe and Building images
for how the -extras variant is produced (VLLM_VARIANT=extras-fork, current extras targets
VLLM_REF=rdna_extras on opengfx1030/vllm-rdna).
Kernel dispatch on gfx1030
On -extras images, vLLM picks kernels based on quantization format:
| Quant method | Kernel selected | How to force |
|---|---|---|
GPTQ (AutoGPTQLinearMethod) | RDNA2W4A16LinearKernel | VLLM_DISABLED_KERNELS=ExllamaLinearKernel,TritonW4A16LinearKernel |
| AWQ (dense, gfx10x) | RDNA2W4A16LinearKernel | Same VLLM_DISABLED_KERNELS as GPTQ; AWQ dense now routes through the native W4A16 kernel |
| FP8 W8A16 / W8A8 | gemm_w8a16_fp8_rdna2 etc. | Automatic on -extras when model uses FP8 |
Check startup logs for lines like Using RDNA2W4A16LinearKernel for AutoGPTQLinearMethod. If you see
TritonW4A16LinearKernel or ExllamaLinearKernel instead, the RDNA2 quant path isn’t active.
Attention backends
VLLM_USE_RDNA2_FA=1— enables the customfa_rdna2.cuFlashAttention backend on Hub-extras.#vllm-rdna(Sep 15): on current Flash-Next /rdna_extrasHEAD, native FA is still WIP — community A/B usedVLLM_USE_RDNA2_FA=0(and sometimesVLLM_GDN_HIP_PREFILL=0) when chasing PP3 correctness. Do not copy that disable onto a working 0.27.1-extras27B serve.--attention-backend RDNA_ATTN— alternative RDNA-tuned attention path (useful for Qwen models with head size 256 where generic AMD Triton FA is slow or broken).FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE— enables AMD Triton FA as a fallback; often slower on gfx1030.- Optional FA-RDNA2 knobs on
rdna_extras(rdna_attn.py, Oct 2026):VLLM_FA_RDNA2_GQA_MODE(defaultsubgroup),VLLM_FA_RDNA2_SPLIT_DECODE(default1). A/B only — not a serve recipe.
#vllm-rdna (13 Oct): FA-RDNA2 is general attention, not “dense models only”. On Flash-Next,
full-attention layers are owned by the QSA path (Qwen4ExpQSA*), which picks its Triton backend
directly and does not consult --attention-backend / VLLM_USE_RDNA2_FA. Seeing Triton in the
stack for those layers is expected. A full switch would need HIP QSA split-K attention plus
INT4 PLE n-gram lookup — still open work (community cited fork backlog around #64). Prefer
not treating FA flags as a Flash-Next speed lever until that lands —
troubleshooting.
On v0.27.1, hybrid GDN models may still auto-select ROCM_ATTN even with VLLM_USE_RDNA2_FA=1 for the
attention layers — that’s expected. The GDN linear-attention layers now use the native HIP kernels above
(not Triton FLA). For graph capture issues, see
CUDA graphs and
vLLM troubleshooting.
CUDA graph capture (TP comm fix)
A common _SimpleCData.__new__ crash during V2 cudagraph capture on multi-GPU TP setups was fixed by
marking TP communication wrappers with allow_in_graph. With current -extras images, CUDA graphs
are the preferred fast path — you should not need --enforce-eager for this class of failure anymore.
On multi-GPU, if AOT compile cache replay misbehaves, try
VLLM_USE_AOT_COMPILE=0 VLLM_DISABLE_COMPILE_CACHE=1.
Disabling fallback kernels
export VLLM_DISABLED_KERNELS=ExllamaLinearKernel,TritonW4A16LinearKernel
This is the main lever for forcing GPTQ onto the native RDNA2 W4A16 path. The variable accepts a comma-separated list of kernel class names registered in vLLM’s linear-kernel registry.
To test Exllama instead (still relevant on some quants per #general):
--linear-backend exllama
Omit VLLM_DISABLED_KERNELS when testing Exllama — it competes with the RDNA2 kernel for dispatch.
Building from source (advanced)
Create the venv and install torch first — the ROCm 7.2.0 and 7.14.0 commands are on
Host venv. Dockerfile.vllm then does an editable install (not
requirements/dev.txt):
git clone -b rdna_extras https://github.com/opengfx1030/vllm-rdna.git
cd vllm-rdna
export PYTORCH_ROCM_ARCH=gfx1030
export ROCM_HOME="${ROCM_HOME:-/opt/rocm}"
VLLM_USE_PRECOMPILED=0 ENABLE_CK=0 FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE \
uv pip install -e . --no-build-isolation
On ROCm 7.2.0 only, add --torch-backend=rocm7.2. On 7.14.0, leave it off and install the
multi-arch device wheels first. Details: Host venv.
The kernels have their own tests, e.g.:
pytest tests/kernels/quantization/test_rdna2_w4a16.py
pytest tests/kernels/attention/test_fa_rdna2_shape_sweep.py
These kernels are actively evolving. Treat the fork as experimental, pin to a known-good image tag for reproducible serving, and file issues on
opengfx1030/vllm-rdnaif you hit correctness or performance problems.
vLLM fork progress (RDNA2 / gfx1030)
WIP snapshot: Readable status of
opengfx1030/vllm-rdnardna_extras. Dated 31 Oct 2026 from public merges +#vllm-rdna/#announcements. Kernel file lists and older chronicle rows stay on Fork landscape. See Verification status.
How to read this
| Layer | What you get |
|---|---|
Hub v0.31.0-extras (11 Oct 2026) | Day-to-day Docker — Running, Onboard |
rdna_extras HEAD | Everything after that bake — clone + host venv + serve_rdna.sh |
| Open drafts | Backlog / WIP — not a recipe until merged |
Published Hub tags lag HEAD. If a row says “Not Hub”, do not expect it on
blivioniag/vllm-rdna:v0.31.0-extras until a newer extras bake.
Shipped in Hub v0.31.0-extras (11 Oct)
#announcements (11 Oct 2026): rdna_extras = upstream vLLM 0.31.0 + RDNA port.
Bake: ROCm 7.14, torch 2.12, Triton 3.7.1.
| Area | In the bake |
|---|---|
| Quants / MoE | W4A16 AWQ/GPTQ dense+MoE HIP; opt-in W4A8 prefill; MXFP4 MoE; EXL3 (27B recipe) |
| Attention / GDN | FA-RDNA2 (split decode), GDN HIP decode, fused hyper-connection |
| Spec / graphs | MTP=2; FULL_AND_PIECEWISE; decode-stall cap; shipped TunableOp table |
| Flash-Next PLE | PLE=bf16|int4|int4-disk — all three tested on 4× V620 |
| Launcher | serve_rdna.sh RECIPE=flashnext-mtp2|flashnext-mtp0|flashnext|27b-awq|27b-exl3|dsv4-flash|full |
Author-host 4× V620 TP=4 (probes / PPL / prefix cache / concurrency, 0 GPU faults): Flash-Next AWQ ~2000 PP, 45 (MTP-0) / 69 (MTP-2) TG, ~205 agg @ 8 users — Fork-source. Details: fork.md v0.31 row.
On HEAD since the bake (13–28 Oct)
Prefer these over Hub when you need the feature. Serve lines: Flash-Next serve, Serve scripts.
Flash-Next / serving
| Merged | What landed | Serve |
|---|---|---|
#96 / #95 (13 Oct) | PP3 recipes flashnext-pp3 / flashnext-pp3-mtp2; row-chunk INT8 shadows | PP3 |
#117 (17 Oct) | EXL3 Flash-Next — RECIPE=flashnext-exl3, PLE=exl3, turboderp pack | Serve scripts |
#94 (16 Oct) | MonoKernel decode — --monokernel / VLLM_ROCM_MONO_DECODE=1 (off by default) | MonoKernel |
#126 (18 Oct) | MonoKernel QSA indexer in HIP | same |
#130 (19 Oct) | HIP set default-on for Flash-Next recipes (closes #99) | HIP defaults |
#132 (21 Oct) | DFlash2 recipe flashnext-dflash2 + FA-RDNA2 BLHNC draft | DFlash2 |
#137 (24 Oct) | MTP-2 MonoKernel fault containment / status reduce | opt-in --monokernel |
Correctness / graphs / AR
| Merged | What landed |
|---|---|
#127 (18 Oct) | Dynamic MTP graph shapes — opt-in; leave schedule unset for day-to-day (note) |
#128 (19 Oct) | rdna_ar sticky abort → WEDGED (hang) |
#131 (19 Oct) | Non-mono CUDA-graph hang: no SharedExperts aux-stream fork on gfx10x (hang) |
#107 / #108 (16 Oct) | Flash-Next TP4 GPU_MAX_HW_QUEUES=4; ROCPROFILER_REGISTER_ENABLED=0 |
Memory / dense / KV
| Merged | What landed | Notes |
|---|---|---|
#138 (25 Oct) | INT4 KV dtype int4_fp16_block (FP16 per-32-channel block scales); native QSA read | Opt-in --kv-cache-dtype int4_fp16_block. Other backends refuse it. Not Hub. MonoKernel path still Needs verify for this dtype. |
#140 (26 Oct) | fp16 SSM state (smaller mamba pages); derived prefill budget; W4A8=1 default on 27b-awq | Author-host 27B: 16k c=1 PP 860 → 1075 tok/s; c=8 agg out 42.5 → 52.3 — Fork-source. Quality paired PPL ~unchanged. |
#146 (28 Oct) | TP2 AWQ MoE expert offload — pinned-RAM expert banks + bounded GPU slots (serve_offload.sh) | Author-host 2× V620 Flash-Next AWQ MTP-2 — 2× serve. Not Hub. Supersedes draft #37. |
#98 (14 Oct) | Asymmetric W4A16 MoE for compressed-tensors AWQ | Quantization |
Tooling / cleanup (HEAD hygiene)
#97 prefix-cache off flag;
#100–#106 / #88 dead-path cleanup;
#92 TunableOp grid expand;
#141 stale-doc / lint fixes.
Open backlog (selected)
Do not treat drafts as recipes. Full list:
open PRs on rdna_extras.
| Track | PR | Why it matters |
|---|---|---|
| INT8 KV + scales | Draft #71 | #vllm-rdna (21 Oct): maintainer priority ahead of experimental INT4-KV ideas; restore native INT8 HIP path |
| Dynamic speculative drafting | Draft #125 | Proper per-step K; builds on #119/#127 |
Vectorized rdna_ar | Open #129 | Left out of #130 |
| MonoKernel MTP drafter | Draft #109 | Drafter still off-mono today |
| MonoKernel PP3 | Draft #116 | Do not combine --monokernel with flashnext-pp3* yet |
| EXL3 Flash-Next MTP / vision / MoE cut | Drafts #122 / #123 / #124 | flashnext-exl3 is MTP=0 for now |
| DFlash2 BF16 GEMV opts | Draft #135 | Follow-up to #132 |
| W8A8 sdot4 dense/MoE | Draft #93 | Explore — not day-to-day |
| Disagg prefill/decode | Open #23 | Cross-PLX KV bridge — Needs verify |
| GLM-5.3 / Glm5Next | Drafts #51 / #133 | Correctness WIP |
| Tiered expert budgets + hybrid KV paging | Draft #148 | #vllm-rdna (30 Oct): follow-up to merged #146. Live paging stalls; PR stays draft until mixed-workload gaps look acceptable. Not a recipe. |
#vllm-rdna (21 Oct): community DeepSeek-V4-Flash correctness write-up on a fork of
rdna_extras (bf16→fp16 cast, logits all-gather, EP routing). In-tree
RECIPE=dsv4-flash still Needs verify — serve.
Practical defaults (31 Oct)
| Goal | Prefer |
|---|---|
| Docker / least friction | Hub v0.31.0-extras |
| 4× Flash-Next day-to-day on HEAD | RECIPE=flashnext-mtp2 (+ HIP defaults from #130) |
| Faster Flash-Next decode experiment | EXTRA_ARGS="--monokernel" — A/B ITL; regenerate TunableOp if PP cliffs |
| 3× Flash-Next | RECIPE=flashnext-pp3 or flashnext-pp3-mtp2 (HEAD only) |
| Longer KV on QSA path | --kv-cache-dtype int4_fp16_block (HEAD; opt-in) |
| 2× Flash-Next (weights do not fit) | HEAD tools/rdna/mono/serve_offload.sh (#146) — Needs verify on a second host. llama.cpp RAM/MoE offload remains the non-HEAD path. |
| 27B AWQ prefill | RECIPE=27b-awq with HEAD W4A8=1 (recipe default after #140) |
| Spec draft A/B | Native MTP-2 first; flashnext-dflash2 for short/single-user experiments |
Related
- Fork landscape + chronicle — repos, kernels, full consolidation table
- Flash-Next / Serve lines
- Serve scripts
- Verification
Host venv (no Docker)
WIP: Commands below follow
opengfx1030/vllm-rdna-docker(Dockerfile.base,Dockerfile.vllm,docker-bake.hcl) and theopengfx1030/vllm-rdnardna_extrastree. See Verification status.
Stable day-to-day Docker is Hub v0.31.0-extras — Onboard /
Running (Docker). Use this page when you want kernels newer than that bake,
serve_rdna.sh, or a host Python 3.12 uv venv with no image rebuild. You
need a ROCm toolchain with hipcc. For more than one GPU, pin ROCm 7.2.0 or 7.14.0
unless you are deliberately lab-testing ROCm 10 —
Installing ROCm.
#vllm-rdna (29 Oct): a fresh Ubuntu 26.04 host can ship /opt/rocm/core-10
(and core-10.1) with no core-7.14 tree. Do not copy the 7.14 ROCM_HOME
path blindly. Community: ROCm 10 serves; the maintainer has not pinned a
Triton wheel for that userspace yet. #vllm-rdna (30 Oct): ROCm 10 and 7.14
were called the same for day-to-day serving — do not reinstall just to chase
10.x. One 10.1 host-venv attempt failed (libnuma / optional HIP package
path mess) before a clean 7.14 retry — Needs verify. Stay on the bake pins
below unless you are A/B-ing 10.x. TunableOp already has a thin ROCm 10 profile —
serve scripts.
The image bake lists seven gfx targets. A gfx1030-only venv can set PYTORCH_ROCM_ARCH=gfx1030.
ROCm 7.2.0
#general (1 Aug 2026) plus bake target base-rocm720. Wheels come from the PyTorch ROCm 7.2
index. That index does not publish rocm-sdk-device-* or amd-torch-device-* — do not add them.
uv venv --python 3.12 venv-7.2.0
source venv-7.2.0/bin/activate
uv pip install --pre --force-reinstall \
--index-url https://download.pytorch.org/whl/rocm7.2 \
"torch==2.12.0" "triton==3.5.1" torchvision torchaudio
The image pins triton==3.5.1. The same #general thread also had triton-rocm==3.7.1 installed
beside it. Triton is a wheel either way — do not build it from source for this path.
Then build FlashAttention, causal-conv1d, and vLLM. On 7.2.0 only, add
--torch-backend=rocm7.2 to the vLLM uv pip install.
ROCm 7.14.0
Do not swap the 7.2 index for https://download.pytorch.org/whl/rocm7.14. On Python 3.12
x86_64 that index has no matching torchaudio wheel (#vllm-rdna, 21 Sep 2026).
Bake target base-rocm714 uses the multi-arch index and then installs the per-GPU device
packages. triton==3.7.1 on that index is a wheel (triton-3.7.1+git….rocm7.14.0), not a
source build. gfx103X still has no aotriton, so PyTorch’s SDPA flash path stays off; that is
separate from the Triton package.
docker-bake.hcl pins torch 2.12.0+rocm7.14.0 for base-rocm714. The docker-repo README
still claims PyTorch 2.13.0 for published 7.14.0 — that README cell is stale; the
image matrix matches the bake (2.12.0). Recreate with the pins
below; if you are matching an image you already pulled, use whatever torch.__version__ that
container prints (a true 2.13 wheel would pair with torchvision==0.28.0+rocm7.14.0 and
amd-torch-device-gfx1030==2.13.0+rocm7.14.0 on the same index).
#vllm-rdna (17 Oct): Triton 3.9+ removes RDNA1/RDNA2. Stay on the bake pin
(triton==3.7.1 here, 3.5.1 on ROCm 7.2). Do not uv pip install -U triton. The
rdna_extras HIP path is the long-term escape; a 3.9 wheel will not grow gfx1030
support back.
uv venv --python 3.12 venv-7.14.0
source venv-7.14.0/bin/activate
uv pip install --pre --force-reinstall \
--index-url https://repo.amd.com/rocm/whl-multi-arch/ \
"torch==2.12.0+rocm7.14.0" \
"torchvision==0.27.0+rocm7.14.0" \
"torchaudio==2.11.0+rocm7.14.0" \
"triton==3.7.1"
uv pip install \
--index-url https://repo.amd.com/rocm/whl-multi-arch/ \
"rocm-sdk-device-gfx1030==7.14.0" \
"amd-torch-device-gfx1030==2.12.0+rocm7.14.0"
What [device-gfx1030] is
On a multi-arch index package, torch[device-gfx1030] is only a shortcut for the two wheels
above (amd-torch-device-gfx1030 and rocm-sdk-device-gfx1030). The Docker file installs those
packages by name. It does not pass the extra.
Without them, an index torch looks for code objects under the venv’s _rocm_sdk_* tree and
kernel launch fails with hipErrorInvalidImage (Dockerfile.base). /opt/rocm/lib/rocblas/library
is not the tree that wheel consults.
Wheels you built yourself
leapdragon/vllm-rdna2-qwen tools/rdna2/build-torch-rocm714.sh
compiles PyTorch, Triton, and torchvision with PYTORCH_ROCM_ARCH=gfx1030. Those .whl files
already are gfx1030 builds. They have no device-gfx1030 extra. Passing it makes uv warn
and does nothing — for example torch==2.12.0+git6bbd260 and torchvision==0.27.1+… from
~/wheels/rdna2/.
Install the files. Do not add amd-torch-device-* on top:
uv pip install ~/wheels/rdna2/torch-*.whl \
~/wheels/rdna2/triton-*.whl \
~/wheels/rdna2/torchvision-*.whl
Library path (index / rocm-sdk venv)
The 7.14 image writes these into ldconfig. A host venv needs them in the environment before
vllm serve (#vllm-rdna serve blocks). Skip this if you installed a from-source gfx1030 wheel
and have no _rocm_sdk_* directories.
SP="$(python -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])')"
export LD_LIBRARY_PATH="$SP/_rocm_sdk_libraries/lib:$SP/_rocm_sdk_core/lib/host-math/lib:$SP/_rocm_sdk_core/lib/rocm_sysdeps/lib:$SP/_rocm_sdk_core/lib/core/lib:$SP/torch/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export ROCM_HOME="${ROCM_HOME:-/opt/rocm}"
export HIP_PATH="$ROCM_HOME"
Point ROCM_HOME at the tree that contains bin/hipcc. The image base is
rocm/dev-ubuntu-22.04:7.14.0-full (/opt/rocm). A TheRock layout is often
/opt/rocm/core-7.14.
Do not pass --torch-backend=rocm7.14 when installing vLLM. That flag selects the PyTorch
rocm7.14 index, which is the one missing the 3.12 x86_64 torchaudio wheel.
Build into the venv
Same three steps on 7.2.0 and 7.14.0, after torch is importable. Dockerfile.vllm is the
source for the flags and the causal-conv1d pin. The 1 Aug #general paste left the
FlashAttention clone as a placeholder and did not pin causal-conv1d; the image build fills both
in as below.
FlashAttention
gfx1030 is not on the Dao-AILab allowlist
(native, gfx90a, gfx942, gfx950, gfx1100–gfx1201). Leave it out of GPU_ARCHS.
gfx1030 uses Triton FA at runtime (FLASH_ATTENTION_TRITON_AMD_ENABLE).
git clone https://github.com/Dao-AILab/flash-attention.git
cd flash-attention
git submodule update --init
export ENABLE_CK=0
export PREBUILD_KERNELS=0
export FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE
GPU_ARCHS="gfx1100;gfx1101;gfx1150;gfx1151;gfx1200;gfx1201" \
uv pip install --no-build-isolation .
cd ..
causal-conv1d
HIP_ARCHITECTURES is the variable this commit reads (not GPU_ARCHS). The image pins
4f6ae4e26ae5fe8af9372f8d312ab25cc4595223.
CAUSAL_CONV1D_FORCE_BUILD=TRUE \
HIP_ARCHITECTURES=gfx1030 \
ROCM_PATH="${ROCM_HOME:-/opt/rocm}" \
uv pip install --no-build-isolation \
"git+https://github.com/Dao-AILab/causal-conv1d.git@4f6ae4e26ae5fe8af9372f8d312ab25cc4595223"
vLLM (rdna_extras)
uv pip install -e . --no-build-isolation is what Dockerfile.vllm runs. It does not install
requirements/rocm.txt or requirements/dev.txt (dev.txt pulls the CUDA test set).
On 7.2.0, append --torch-backend=rocm7.2. On 7.14.0, leave that flag off.
git clone -b rdna_extras https://github.com/opengfx1030/vllm-rdna.git
cd vllm-rdna
VLLM_USE_PRECOMPILED=0 \
ENABLE_CK=0 \
FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE \
ROCM_HOME="${ROCM_HOME:-/opt/rocm}" \
PYTORCH_ROCM_ARCH=gfx1030 \
uv pip install -e . --no-build-isolation
Smoke test, from Getting started:
python -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))"
python -c "import vllm, vllm._rocm_C; print('vllm', vllm.__version__)"
Once import vllm works, serve from that checkout with
tools/rdna/serve_rdna.sh. Pass MODEL and VENV yourself;
the recipes do not bake in paths.
Related
- Serve scripts —
RECIPE=flashnext-mtp2,27b-awq,27b-exl3, … - Running (Docker) — prefer this unless you need a host venv.
- Building images — the bake graph this page mirrors.
- vLLM forks — kernel behavior after the install.
Fork serve scripts
WIP / fork-source. See Verification status. Knobs below are the in-tree launcher on
opengfx1030/vllm-rdna(tools/rdna/serve_rdna.sh,tools/rdna/recipes/*.env,tunableop/README.md). Same path onrdna_extras(v0.31.0 as of 11 Oct 2026). The old 0.28 line isrdna_extra/v0.28.0. Build the venv first: Host venv. First-time V620 path: Onboard. Card-count picks stay on Recipes. Flash-Next graph history stays on Serve lines.
The fork ships one serve entry point under tools/rdna/ (moved from the old
scripts/ tree). A recipe file holds only that config’s deltas. The script owns
the venv, ROCm library path, TunableOp profile, GPU selection, cache roots,
stale-worker teardown, and the vllm serve argv.
Run it from a checkout of the branch you built (rdna_extras is the v0.31.0
line). Hub v0.31.0-extras is the matching Docker bake and already includes this
launcher’s PLE / P2P knobs:
MODEL=/path/to/checkpoint VENV=/path/to/venv \
bash tools/rdna/serve_rdna.sh RECIPE=<name> [KEY=value …]
MODEL and VENV (or an already-activated $VIRTUAL_ENV) are required. Nothing
in the script or the recipes bakes in a home directory, host, or IP.
RECIPE is a script argument (RECIPE=name on the command line). MODEL
and VENV are environment variables; a trailing KEY=value can set them too.
Precedence, lowest to highest: recipe file → caller environment → trailing
KEY=value.
The launcher defaults HF_HUB_OFFLINE=1 and TRANSFORMERS_OFFLINE=1. Pass a
local checkpoint in MODEL. To pull a Hub id on this run, export
HF_HUB_OFFLINE=0 and TRANSFORMERS_OFFLINE=0 in the caller environment.
2× Flash-Next expert offload is a sibling wrapper, not a RECIPE= row:
tools/rdna/mono/serve_offload.sh after #146
(28 Oct). Same MODEL / PLE_QUANT_DIR hygiene — 2× serve.
Recipes
Files live in tools/rdna/recipes/.
Copy one and change only the deltas to add a config.
| Recipe | Model / config | Defaults worth knowing |
|---|---|---|
flashnext-mtp2 | Flash-Next AWQ-W4A16, MTP=2. Recipe note (27 Sep 2026): MTP=2 wins at 8×16k / 1k, c=8. Daily 4× path. | TP=4, port 18096, API server, MAXLEN=262144, block size 1024, KV 4026531840, COMPILE_MODE=3, FULL_AND_PIECEWISE, ATTN=fa, V2 runner. #107 (16 Oct): GPU_MAX_HW_QUEUES=4 on Flash-Next TP4 recipes (launcher default stays 2). #130 (19 Oct): HIP set on by default (not Hub). Opt-in MonoKernel: EXTRA_ARGS="--monokernel" — serve. |
flashnext-dflash2 | Flash-Next AWQ-W4A16 + DFlash2 BF16 drafter. Merged #132 (21 Oct). Not Hub. MTP-2 still faster in the PR A/B. | Same TP4 / graphs family as flashnext-mtp2. Default 3 draft tokens; DFLASH_TOKENS=2 for the measured 16k c=8 ladder. Recipe sets EXTRA_ARGS=--monokernel. — DFlash2. |
flashnext-mtp0 | Same family, MTP=0. Recipe note: MTP=0 wins at 8×1k / 512, c=8 (short prompts). | Same ports and graphs as flashnext-mtp2, with MTP=0. |
flashnext | Flash-Next production stack: tools + reasoning, six in-flight sequences. Separate from flashnext-mtp0. | Port 18094, --host 0.0.0.0, CLI entry, KV 7000000000, gpu-memory-utilization 0.90, block size 1024, ATTN=fa, V2 runner. |
flashnext-exl3 | Flash-Next EXL3 (turboderp/Qwen3.8-Flash-Next-exl3). Merged #117 (17 Oct). Not Hub. | Port 18094, TP=4, MTP=0, PLE=exl3, expert-parallel on, FULL_AND_PIECEWISE, AOT compile off. Drafts #122/#123/#124 for MTP/vision/MoE. |
flashnext-pp3 | Flash-Next AWQ-W4A16, PP=3 / TP=1, MTP=0. Merged #96 (13 Oct). Not in Hub v0.31.0-extras. | Port 18096, partition 16,16,16, MAXLEN=262144, KV=auto, GMEM=0.95, SEQS=8, MAXBAT=2048, dense INT8 ONLY, text-only. PP3. |
flashnext-pp3-mtp2 | Same layout, MTP=2. Needs a W4A16 quantized drafter (tools/rdna/quant_mtp_experts.py). | Port 18097, partition 17,17,14, SEQS=4, MAXBAT=2112, GMEM=0.975. Use up to ~4 streams. |
27b-awq | Qwen3.8-27B AWQ INT4, compressed-tensors W4A16. HEAD after #140 (26 Oct): recipe defaults W4A8=1 (VLLM_RDNA2_W4A8_SDOT4 — int8-activation prefill for M≥33; decode stays W4A16). Hub bake may still default off — check PRINT=1. | Port 18210, MTP=0, KV 8000000000, no MAXLEN (the checkpoint’s own context). language-model-only. Prefill MAXBAT derived from KV/SSM dtype on HEAD. Set W4A8=0 to force W4A16 prefill. |
27b-exl3 | Qwen3.8-27B EXL3 3.00bpw mul1. Eager bring-up (EAGER=1): no torch.compile / CUDA graphs until you turn that off. | Port 18105, MAXLEN=20480, KV 6000000000. HIP_VISIBLE_DEVICES=4,5,6,7 (second PLX on an 8-GPU chassis). On a 4-card host set HIP_VISIBLE_DEVICES=0,1,2,3. |
dsv4-flash | DeepSeek-V4-Flash (K128): fp8 dense + MXFP4 experts. Needs verify. | Port 18300, TP=4, MAXLEN=32768, KV 6000000000, ATTN=none, --kv-cache-dtype fp8. This recipe does set VLLM_USE_BREAKABLE_CUDAGRAPH=1 (piecewise needs it on that model). |
full | The old serve_gfx1030_full.sh config (FA-RDNA2 + W4A16 + HIP KV + HIP GDN, breakable FULL_AND_PIECEWISE). | TP=2, devices 0,1, MAXLEN=200000 (floor 32768), KV 7000000000. HOST is empty so vLLM binds its default address. |
PLE / n-gram on current recipes
#announcements (11 Oct 2026): three PLE modes are tested on 4× V620 (speed at
parity under coding-agent load at 1k / 16k / 32k). The launcher knob is PLE=:
PLE= | What it does | Host RAM (launcher comments) |
|---|---|---|
bf16 (default if no quant dir) | Upstream pinned BF16 n-gram table | ~95 GB class |
int4 | INT4 table from PLE_QUANT_DIR in pinned RAM | ~30 GB table; #vllm-rdna (Oct 11) corrected an inflated ~90 GB host-RAM figure — INT4 sidecar working set is closer to ~35 GB |
int4-disk | Same INT4 table mmap’d from disk via the CPU sidecar (VLLM_PLE_CPU_OFFLOAD=1) | page cache only |
exl3 | EXL3 n-gram trellis (ngram_embedding.safetensors outside the model index). flashnext-exl3 only (#117) | ~32.6 GB at ng5, page cache (CPU sidecar mmap) |
PLE_QUANT_DIR (or VLLM_PLE_QUANT_DIR) must point at a ples_int4 directory
that contains META.json, from
primitive-ai/Qwen3.8-Flash-Next-PLE-quant.
Docker: -v /path/to/ples_int4:/ples_int4 -e VLLM_PLE_QUANT_DIR=/ples_int4 and,
for disk mode, -e VLLM_PLE_CPU_OFFLOAD=1. First-time path: Onboard.
See Flash-Next serve lines.
Do not paste these onto Flash-Next
#vllm-rdna (Oct 10): agent / Unsloth / old overlay pastes still break serves.
| Knob | Flash-Next (flashnext*) | Why |
|---|---|---|
VLLM_USE_BREAKABLE_CUDAGRAPH=1 | Remove | Turns compile off / wrong path on current recipes. Only dsv4-flash sets it on purpose. |
VLLM_RDNA_FUSED_HC=0 | Do not set | Fused hyper-connection is a small win now; leave the default on. |
| Gemini / old Hub Docker as Flash-Next | No | Use v0.31.0-extras (11 Oct bake) or host venv + this launcher. Do not treat v0.27.1-extras* / leapdragon GHCR as current Flash-Next. |
Recipes that omit HIP_VISIBLE_DEVICES use the harness default 0,1,2,3
(override with GPUIDS or HIP_VISIBLE_DEVICES).
Dry-run
PRINT=1 (aliases: DRY_RUN=1, --dry-run, -n) prints the recipe path, the
TunableOp profile it would select, the export block, and the exact command,
then exits. It does not launch vLLM. Print mode still requires MODEL and
VENV, and it skips the check that $VENV/bin/python exists.
MODEL=/path/to/checkpoint VENV=/path/to/venv \
PRINT=1 bash tools/rdna/serve_rdna.sh RECIPE=27b-exl3
Examples
Flash-Next speculative decode (MTP=2). Long context is where this recipe’s own note says MTP=2 wins:
MODEL=/path/to/flash-next VENV=/path/to/venv \
bash tools/rdna/serve_rdna.sh RECIPE=flashnext-mtp2 \
PLE=int4 PLE_QUANT_DIR=/path/to/ples_int4
No PCIe P2P on the host (#vllm-rdna Oct 11): add P2P=0 (sets VLLM_RDNA_AR=0
and NCCL_P2P_DISABLE=1; RCCL uses host shared memory). Also try
VLLM_RDNA_AR=0 by itself when output is garbage on a no-P2P box.
MODEL=/path/to/flash-next VENV=/path/to/venv \
bash tools/rdna/serve_rdna.sh RECIPE=flashnext-mtp2 \
PLE=int4 PLE_QUANT_DIR=/path/to/ples_int4 P2P=0
27B AWQ at MTP=2, with port and KV overrides:
MODEL=/path/to/qwen3.8-27b-awq VENV=/path/to/venv \
bash tools/rdna/serve_rdna.sh RECIPE=27b-awq MTP=2 KV=8000000000 PORT=18210
EXL3 stays eager unless you clear that flag. CG_MODE=FULL_AND_PIECEWISE is
already the recipe default; it applies once EAGER=0:
MODEL=/path/to/qwen3.8-27b-exl3 VENV=/path/to/venv \
bash tools/rdna/serve_rdna.sh RECIPE=27b-exl3 EAGER=0 CG_MODE=FULL_AND_PIECEWISE \
HIP_VISIBLE_DEVICES=0,1,2,3
Disable TunableOp lookups for an A/B:
MODEL=/path/to/flash-next VENV=/path/to/venv \
bash tools/rdna/serve_rdna.sh RECIPE=flashnext-mtp2 TUNABLEOP=0
Option map
| Knob | Role |
|---|---|
TP | --tensor-parallel-size (harness default 4). |
PORT / HOST | Bind address. Harness defaults 18094 and 127.0.0.1. An empty HOST (the full recipe) omits --host. |
MTP | 0 skips spec decode. 1+ adds MTP with num_speculative_tokens and local-argmax reduction. Capture sizes become (MTP+1) × {1,2,4,8} unless CG_SIZES is set. |
ATTN | fa → --attention-backend RDNA_ATTN. triton → TRITON_ATTN. none omits the flag (the recipe may still set VLLM_USE_RDNA2_FA). |
MAXLEN | --max-model-len. full also enforces MIN_MAXLEN (default floor 32768). |
BLOCK_SIZE | --block-size. |
SEQS | --max-num-seqs (default 8). |
MAXBAT | --max-num-batched-tokens (default 2048). |
LPTH | --long-prefill-token-threshold (static). Merged #36 can self-tune this when VLLM_RDNA_DYNAMIC_PREFILL=1. |
PREFILL_INTERVAL | --prefill-schedule-interval (static). Same #36 controller when the dynamic flag is on. |
KV | --kv-cache-memory-bytes. Required (a recipe with no KV budget aborts). |
GMEM | --gpu-memory-utilization. |
COMPILE_MODE | Compilation mode inside --compilation-config. |
CG_MODE | cudagraph_mode (default FULL_AND_PIECEWISE). |
CG_CAPTURE_SIZES | 1 (default) writes cudagraph_capture_sizes into the compile JSON. 0 leaves capture sizes to vLLM. |
CG_SIZES | Replaces the capture-size list itself (for example [1,2,4,8]). |
EAGER | 1 passes --enforce-eager and skips --compilation-config. |
TUNED_CONFIG | 1 points VLLM_TUNED_CONFIG_FOLDER at <tree>/tuned-moe. |
W4A8 | Maps to VLLM_RDNA2_W4A8_SDOT4 (27b-awq default 0). |
RDNA_AR | Maps to VLLM_RDNA_AR. |
PLE | bf16 / int4 / int4-disk. int4* needs PLE_QUANT_DIR (a ples_int4 dir with META.json). |
PLE_QUANT_DIR | Path to INT4 PLE shards. Alias: VLLM_PLE_QUANT_DIR. |
P2P | 1 (default) leaves topology alone. 0 forces VLLM_RDNA_AR=0 and NCCL_P2P_DISABLE=1. |
HIP_VISIBLE_DEVICES | GPU set. Alias: GPUIDS. |
TUNABLEOP | 1 (default) loads a profile. 0 sets PYTORCH_TUNABLEOP_ENABLED=0. |
FEATURES | Space-separated tokens (table below). |
EXTRA_ARGS | Extra words appended to the vLLM command. #vllm-rdna (16 Oct): EXTRA_ARGS="--monokernel" turns on Flash-Next MonoKernel (#94) — same as VLLM_ROCM_MONO_DECODE=1. Off by default. MonoKernel. |
Legacy names the entry point still accepts: MODEL←MODEL_PATH,
KV←KVCAP←KV_CACHE_MEMORY, SEQS←MAX_NUM_SEQS,
MAXBAT←MAX_BATCHED_TOKENS, MAXLEN←MAX_MODEL_LEN, GMEM←GPU_MEM.
FEATURES tokens the script knows:
| Token | Flag |
|---|---|
prefix-caching | --enable-prefix-caching. Merged #97 (14 Oct): ENABLE_PREFIX_CACHING=0 now passes --no-enable-prefix-caching. Omitting the flag used to leave prefix cache on (vLLM default) — a “cache off” run still showed hits. |
language-model-only | --language-model-only |
skip-mm-profiling | --skip-mm-profiling |
mamba-align | --mamba-cache-mode align |
reasoning | --reasoning-parser qwen3 |
auto-tool | --enable-auto-tool-choice --tool-call-parser qwen3_coder |
expert-parallel | --enable-expert-parallel |
trust-remote-code | --trust-remote-code |
prompt-tokens-details | --enable-prompt-tokens-details — #vllm-rdna (Oct 7): DeepSeek / Pi harnesses that always show 0% cache hits usually lack this metadata flag, not a dead prefix cache. |
vision-cap | --limit-mm-per-prompt '{"image":1}' and --mm-processor-kwargs '{"max_pixels":1605632}' |
An unknown token aborts. vision-cap is how Flash-Next recipes keep the pixel
cap that prevents the vision-encoder startup OOM — see
Flash-Next serve lines.
TunableOp
Rows are named profiles, one folder per rocBLAS build, registered in
tunableop/profiles.json.
Solver IDs are build-specific. The helper
(tools/rdna2_028/tunableop_env.sh) selects the folder whose
lib_sha256[:12] matches the loaded librocblas.so.5.
| Profile | rocBLAS / torch | librocblas.so.5 sha256[:12] | Rows / rank |
|---|---|---|---|
rocm7.14-rocblas5.5/ | 5.5.0 / 2.12.0+rocm7.14.0 | f30bb442e9b5 | 783 (canonical). Covers Flash-Next MTP=0/2, 27B AWQ, and EXL3 27B. |
rocm10-rocblas5.6/ | 5.6.0 / 2.13.0+rocm10.0.0 | c27e2252cc7a | 70, thin. Those shapes are tuned; every other GEMM uses the rocBLAS heuristic. |
- Auto-select is the default. No recipe or launcher change is required when the venv’s
librocblas.so.5hash changes. A ROCm 7.14 start logsTunableOp profile rocm7.14-rocblas5.5 auto-selected for rocBLAS build f30bb442e9b5. TUNABLEOP_PROFILE=<name>forces a registered profile. A hash mismatch fails the launch.TUNABLEOP_ALLOW_MISMATCH=1is the experiment-only override (hard warning, then it uses the rows anyway). Solver IDs are build-specific, so a mismatched profile is never applied silently.- Lookup is read-only (
PYTORCH_TUNABLEOP_TUNING=0). The helper does not write rows to/tmpor the process CWD. If no profile matches, it uses a legacyrocblas-<hash>/folder when that folder exists, then$HOME/.cache/tunableop/tunableop_results.csv. TUNABLEOP=0turns lookups off (PYTORCH_TUNABLEOP_ENABLED=0) for an A/B against the heuristic.PRINT=1reports which profile it would pick, including “NOT registered” ifTUNABLEOP_PROFILEis unknown.
ROCm 10 and rocBLAS 5.6
A venv whose torch loads rocBLAS 5.6 (librocblas.so.5 sha256[:12] c27e2252cc7a) selects rocm10-rocblas5.6 by that hash. Same recipe, same script:
MODEL=/path/to/checkpoint VENV=/path/to/rocm10-venv \
bash tools/rdna/serve_rdna.sh RECIPE=27b-awq
MODEL=/path/to/checkpoint VENV=/path/to/rocm10-venv \
PRINT=1 bash tools/rdna/serve_rdna.sh RECIPE=27b-awq
Print mode (library present in that venv) reports:
# tunableop: rocm10-rocblas5.6 (auto-selected for librocblas.so.5 c27e2252cc7a)
A real launch logs TunableOp profile rocm10-rocblas5.6 auto-selected for rocBLAS build c27e2252cc7a.
Thin means the shipped CSV covers 70 shapes per rank. Those GEMMs use the recorded solver. Every other shape falls back to the rocBLAS heuristic: safe, and untuned. The validated serving numbers on this wiki were captured on gfx1030 + ROCm 7.14 (rocm7.14-rocblas5.5, 783 rows). Recipe knobs (TP, KV, MTP, graphs) do not depend on the ROCm version. Treat the first ROCm 10 boot as bring-up: run PRINT=1 and confirm the profile line before leaving it up.
#vllm-rdna (Oct 1): hosts not on rocBLAS 5.5 + ROCm 7.14 do not get the canonical
783-row benefit from the serve script — they need a matching profile (the thin ROCm 10 set,
a local $HOME/.cache/tunableop/ table, or a contributed CSV). The shipped 7.14 rows are the
4-card serving set; 8× shapes were not in that table yet — generate local rows on
that host rather than expecting a silent speedup.
To fill the gap on that machine, tune there and register the result. The in-tree pipeline keeps scratch under <tree>/cache/tunableop-rows (never /tmp) and does not overwrite the repo profile:
VENV=/path/to/rocm10-venv \
bash tools/rdna2_028/tunableop_rows_pipeline.sh tune
Curate with tools/rdna2_028/curate_tunableop_rows.py, freeze the CSVs into tunableop/<profile-name>/, and add that name to profiles.json with this library’s sha256. Then prove the lookup actually hits:
python tools/rdna2_028/verify_tunableop_lookup.py \
--rows tunableop/<profile-name>/tunableop_results0.csv \
--out hits.json
A hit means the solver TunableOp recorded equals the shipped row. Contributing that profile back is how the 70-row set grows. The older qualify flow is still documented under Regenerate for another rocBLAS build.
Guardrails for a ROCm 10 (or any other) library:
| Situation | What happens |
|---|---|
Loaded sha is c27e2252cc7a | Auto-selects rocm10-rocblas5.6. |
| Loaded sha matches neither profile | Legacy tunableop/rocblas-<sha12>/ if that folder exists, otherwise $HOME/.cache/tunableop/tunableop_results.csv. The 7.14 rows are not loaded. |
TUNABLEOP_PROFILE=rocm10-rocblas5.6 but the loaded library is a different sha | Launch refuses to start. |
TUNABLEOP_ALLOW_MISMATCH=1 | Proceeds with a hard warning. Experiments only. |
TUNABLEOP=0 | Lookups off. |
Mismatch symptoms and the historical ~25% prefill gap: TunableOp troubleshooting.
Foreground, aliases, stale workers
serve_rdna.sh execs in the foreground. Background it yourself and poll
readiness:
MODEL=/path/to/checkpoint VENV=/path/to/venv \
nohup bash tools/rdna/serve_rdna.sh RECIPE=27b-awq >serve.log 2>&1 &
# port follows the recipe (27b-awq is 18210)
curl -sf http://127.0.0.1:18210/v1/models
Before exec, the harness signals processes whose environment has the same
VLLM_CACHE_ROOT (API server, VLLM::Worker, VLLM::EngineCore,
PleOffloadWorker). The default cache root is <tree>/cache/vllm. A second
serve that shares that root will tear the first one down.
The old filenames are thin aliases. They forward the environment and any
trailing KEY=value:
| Old script | Calls |
|---|---|
tools/rdna/serve_gfx1030_flashnext.sh | RECIPE=flashnext |
tools/rdna/serve_gfx1030_flashnext_mtp.sh | RECIPE=flashnext-mtp2 |
tools/rdna/serve_gfx1030_27b_dense.sh | RECIPE=27b-awq |
tools/rdna/serve_gfx1030_exl3_27b.sh | RECIPE=27b-exl3 |
tools/rdna/serve_gfx1030_full.sh | RECIPE=full |
Related
- Host venv — build the tree this script expects
- Recipes — Hub image vs recipe container vs this checkout
- Flash-Next serve lines — graph modes and PLE
- Environment variables
- TunableOp mismatch
Building the Images
The blivioniag/rocm-rdna and
blivioniag/vllm-rdna images are produced by
opengfx1030/vllm-rdna-docker
(#vllm-rdna, Sep 14 2026 — moved from
BlivionIaG/vllm-rdna-docker). The bake repo is
deliberately small: two Dockerfiles, one bake graph, one CI workflow — no Python layer, no custom
linter.
#announcements (11 Oct 2026): Hub v0.31.0-extras is the current published extras bake
(ROCm 7.14 / torch 2.12 / Triton 3.7.1; Flash-Next MTP-2 served). The Sep 14–15 note about a
pending 0.28 bake is historical — that line shipped as v0.28.0-extras and is now
superseded by 0.31. #vllm-rdna (17 Oct): do not bump the image Triton pin to 3.9+ —
those releases drop RDNA1/RDNA2. Stay on 3.7.1 until the bake moves.
Layout
| File | Purpose |
|---|---|
Dockerfile.base | The ROCm + PyTorch + Triton base (rocm-rdna). |
Dockerfile.vllm | Clones and builds vLLM on top of a base image (vllm-rdna). |
docker-bake.hcl | Source of truth — defines every target, tag, and build arg. |
patches/*.patch | RDNA-specific fixes applied after the vLLM clone. |
.github/workflows/build.yml | CI: builds on tag push (v*) and manual dispatch. |
The seven RDNA archs gfx1030;gfx1100;gfx1101;gfx1150;gfx1151;gfx1200;gfx1201 are baked into every image
via PYTORCH_ROCM_ARCH.
Build locally
Everything runs through stock docker buildx bake:
# Build everything (bases + vLLM images)
docker buildx bake --file docker-bake.hcl all
# Just the base images, or just the vLLM images
docker buildx bake --file docker-bake.hcl all-bases
docker buildx bake --file docker-bake.hcl all-vllm
# A single target
docker buildx bake --file docker-bake.hcl vllm-0271-rocm720
# Print the plan without building
docker buildx bake --file docker-bake.hcl --print all
Targets are named vllm-<source>-<base>, e.g. vllm-0271-rocm720, vllm-0271-rocm720-extras. Groups:
all, all-bases, all-vllm.
Key build arguments (Dockerfile.vllm)
Set per-target in docker-bake.hcl:
| ARG | Purpose |
|---|---|
BASE_IMAGE | Published base image, e.g. blivioniag/rocm-rdna:7.2.0. |
VLLM_REPOSITORY / VLLM_REF | vLLM clone URL and git ref (tag or branch). Current extras bakes (v0.28.0-extras, v0.31.0-extras) clone opengfx1030/vllm-rdna @ rdna_extras. Older v0.26 / v0.27.1-extras* targets still point at the removed personal BlivionIaG/vllm @ rdna2_extras clone (404 today). |
VLLM_COMMIT | Full 40-char commit; the build fails if HEAD doesn’t match (reproducibility). |
VLLM_VARIANT | upstream or extras-fork (recorded as an image label). |
PYTORCH_ROCM_ARCH | Semicolon-joined gfx targets. |
TORCH_BACKEND | uv --torch-backend value, e.g. rocm7.2. |
FLASH_ATTENTION_INSTALL | base | vllm | none, plus FLASH_ATTENTION_REPO / _REF. |
USE_SCCACHE | 1 to wrap HIP compilation in sccache (base must also be built with it). |
VLLM_PATCH_FILE | A .patch in patches/ applied after the clone (empty = none). |
The patches/ directory
vLLM occasionally needs small RDNA fixes (e.g. platform detection so consumer Radeon cards are picked up). The repo keeps these as versioned diffs, for example:
patches/v0.26.0-rocm-platforms.patchpatches/v0.27.1-rocm-platform-detect.patchpatches/v0.27.1-amdsmi-wrapper-guard.patchpatches/v0.27.1-extras-*.patch
To add one for a new vLLM release: reproduce the fix against a fresh clone, git diff the changed
file(s) into patches/, verify it applies against a clean checkout of that tag, then point the target’s
VLLM_PATCH_FILE at it.
Adding a new base or vLLM source
- New base: copy a
target "base-<id>"block, set the ROCm/PyTorch/Triton versions and index URL, and add the id toall-bases+all-vllm. - New vLLM source: add a
target "vllm-<source>-<base>"block per base withVLLM_REPOSITORY,VLLM_REF,VLLM_COMMIT,VLLM_VARIANT,IMAGE_TAG, and add the ids toall-vllm.
See the vllm-rdna-docker README for the full,
authoritative instructions.
CI
.github/workflows/build.yml builds and pushes to docker.io/blivioniag/ on tag push (v*), and
supports manual dispatch of a single target (optionally pushing). It uses stock docker/setup-buildx,
docker/login, docker/metadata, and docker/bake actions with GitHub Actions cache.
llama.cpp on gfx1030 — Overview
llama.cpp is a fast, low-dependency way to run GGUF LLMs on gfx1030. This section covers stock builds and the community RDNA2-optimized fork.
Where to start
| Goal | Page |
|---|---|
| Build stock llama.cpp (ROCm or Vulkan) | Building & running |
| Multi-GPU tensor parallel, MMQ tuning, DFlash2 | RDNA2 fork overview |
| Fork benchmarks and PR status | RDNA2 benchmarks |
| DFlash2, MTP, ngram speculative decoding | RDNA2 speculative decoding |
| Launch commands, Docker, limits | RDNA2 serving |
| Something broke | llama.cpp troubleshooting |
Which path?
- Stock llama.cpp — good starting point, single-GPU. Vulkan without ROCm is possible but
#llamacppprefers HIP for--split-mode tensor(RADV has crashed V620 hosts). On Ubuntu + ROCm 7.14, use the extra HIP cmake flags in Building — default llama.cpp HIP flags were called not enough (#general/#llamacpp, Oct 2026). edwinbrowwn/llama.cpp-rdna2— multi-GPU V620 rigs, tensor parallel, RCCL all-reduce, DFlash2. Most#llamacppperformance work happens here. A matched A/B on Qwen3.8-27B Q6_K + MTP reported +57% vs stock with identical outputs — see Benchmarks.
llama.cpp vs vLLM
The comparison table and the “what fits on a V620” notes live on llama.cpp or vLLM. Short version: GGUF and single-stream start here; concurrency and 4× Flash-Next go to vLLM.
Multi-GPU tensor parallel benefits greatly from PCIe P2P.
llama.cpp on gfx1030
WIP: Tips marked community-validated in this page come from
#llamacpp— see Verification status.
llama.cpp is a fast, low-dependency way to run GGUF LLMs on
gfx1030. This page has two stock HIP recipes from #llamacpp: Fedora + ROCm 7.2.0, and
Ubuntu + ROCm 7.14 (/opt/rocm/core-7.14). A Vulkan path is included as an alternative that
doesn’t require ROCm.
Adjust package names and ROCm prefixes for your distro. The Fedora block uses
/opt/rocm+hipconfig; the Ubuntu block uses TheRock-style/opt/rocm/core-7.14.
Looking for heavy multi-GPU tuning? See the RDNA2-optimized fork (
edwinbrowwn/llama.cpp-rdna2) with RDNA2/V620 tensor-parallel and MMQ optimizations.
Dependencies (Fedora)
sudo dnf install @development-tools glm-devel cmake libpng-devel wayland-devel libpciaccess-devel \
libX11-devel libXpresent libxcb xcb-util libxcb-devel libXrandr-devel xcb-util-keysyms-devel \
xcb-util-wm-devel python3 git lz4-devel libzstd-devel python3-distutils-extra qt gcc-g++ \
wayland-protocols-devel ninja-build python3-jsonschema qt5-qtbase-devel qt6-qtbase-devel \
libcurl-devel xinput libXinerama xcb-util-cursor
ROCm (recommended)
Install ROCm
Example: Fedora with ROCm 7.2.0. Create /etc/yum.repos.d/rocm.repo:
[rocm720]
name=ROCm 7.2.0 repository
baseurl=https://repo.radeon.com/rocm/el10/7.2/main
enabled=1
gpgcheck=1
priority=50
gpgkey=https://repo.radeon.com/rocm/rocm.gpg.key
Then install ROCm and add yourself to the GPU access groups:
sudo dnf clean all
sudo dnf makecache
sudo rpm --import https://repo.radeon.com/rocm/rocm.gpg.key
sudo dnf install rocm rocm-hip-runtime-devel
sudo usermod -a -G render,video $LOGNAME
# log out / back in (or reboot) so the group change takes effect
See Installing ROCm for more detail and for non-Fedora distros.
Build llama.cpp with ROCm (HIP)
git clone https://github.com/ggml-org/llama.cpp.git
export MAX_JOBS=8 # adjust to your CPU cores / available RAM
export ROCM_HOME=/opt/rocm
export PATH=${ROCM_HOME}/bin:${PATH}
HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -R)" \
cmake -S llama.cpp -B build \
-DLLAMA_CURL=ON -DGGML_HIP=ON -DCMAKE_BUILD_TYPE=Release -DGPU_TARGETS=gfx1030 && \
cmake --build build --config Release -- -j ${MAX_JOBS}
-DGPU_TARGETS=gfx1030 targets Navi 21. For a non-Navi-21 RDNA2 card, build for its real target (e.g.
gfx1031/gfx1032) or add it to the list; see HSA_OVERRIDE for RDNA2 Cousins.
Ubuntu + ROCm 7.14 (community, Oct 2026)
#llamacpp (13 Oct) and #general: stock ggml-org/llama.cpp on Ubuntu with ROCm 7.14.
Community: llama.cpp’s default HIP cmake flags are not enough on gfx1030 — this extra set was
reported ~3–6% faster than a default mainline build on 2× V620. The
RDNA2 fork is still faster than even this tuned stock build.
Community host class: Dell Precision 5820, Xeon W-2155, 128 GB quad-channel, each GPU PCIe 3.0 x16, Proxmox passthrough into a dedicated Ubuntu VM.
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
export HSA_OVERRIDE_GFX_VERSION=10.3.0
export HIP_PATH=/opt/rocm/core-7.14
export HIPCXX=/opt/rocm/core-7.14/lib/llvm/bin/clang
export LD_LIBRARY_PATH=/opt/rocm/core-7.14/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
cmake -S . -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=/usr/bin/cc \
-DCMAKE_CXX_COMPILER=/usr/bin/c++ \
-DCMAKE_HIP_COMPILER=/opt/rocm/core-7.14/lib/llvm/bin/clang \
-DCMAKE_HIP_PLATFORM=amd \
-DCMAKE_PREFIX_PATH=/opt/rocm/core-7.14 \
-DAMDGPU_TARGETS=gfx1030 \
-DCMAKE_HIP_ARCHITECTURES=gfx1030 \
-DGGML_HIP=ON \
-DGGML_HIP_RCCL=ON \
-DGGML_HIP_GRAPHS=ON \
-DGGML_HIP_NO_VMM=ON \
-DGGML_NATIVE=ON \
-DGGML_AVX2=OFF \
-DGGML_AVX512=OFF \
-DGGML_CUDA=OFF \
-DLLAMA_BUILD_SERVER=ON \
-DLLAMA_BUILD_TESTS=OFF
cmake --build build --config Release -- -j$(nproc)
Serve with the same short env stack the fork uses (this report applied it to stock HIP):
HSA_OVERRIDE_GFX_VERSION=10.3.0 \
HSA_NO_SCRATCH_RECLAIM=1 \
GGML_HIP_RDNA2_AUTO=1 \
GGML_HIP_SAFE_STATE_IO=1 \
GGML_TP_SHARDED_OUTPUT=1 \
HIP_VISIBLE_DEVICES=0,1 \
./build/bin/llama-server \
-m /path/to/model.gguf
GGML_TP_SHARDED_OUTPUT=1 is TP2+ only. GGML_AVX2=OFF / GGML_AVX512=OFF were part of this
Skylake-W recipe — A/B if your CPU is newer. If your 7.14 install is not under
/opt/rocm/core-7.14, see Installing ROCm.
Vulkan (alternative)
The Vulkan backend works without ROCm and runs across many GPUs/drivers. For multi-GPU tensor
split, prefer the ROCm build (or the RDNA2 fork) —
#llamacpp finds HIP/-sm tensor faster, and RCCL TP is a ROCm path.
Mesa RADV has been reported to hard-crash V620 llama.cpp; AMDVLK can stay up but is severely slower. If you must use Vulkan, pin the ICD explicitly:
export VK_ICD_FILENAMES=/etc/vulkan/icd.d/amd_icd64.json # AMDVLK, not RADV
export GGML_VULKAN_DEVICE=0
Vulkan SDK from your distro
sudo dnf install mesa-vulkan-drivers vulkan-devel glslc spirv-headers-devel
Vulkan SDK from source
Example with version 1.4.350.1, assuming you keep things in ~/Apps/llama.cpp:
export VULKAN_VERSION=1.4.350.1
wget https://sdk.lunarg.com/sdk/download/${VULKAN_VERSION}/linux/vulkansdk-linux-x86_64-${VULKAN_VERSION}.tar.xz
mkdir vulkan
cd vulkan
tar xf ../vulkansdk-linux-x86_64-${VULKAN_VERSION}.tar.xz
export VULKAN_SDK=~/Apps/llama.cpp/vulkan/${VULKAN_VERSION}/x86_64
export PATH=${VULKAN_SDK}/bin:${PATH}
export LD_LIBRARY_PATH=$VULKAN_SDK/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
export VK_LAYER_PATH=${VULKAN_SDK}/share/vulkan/explicit_layer.d
export VK_ADD_LAYER_PATH=${VULKAN_SDK}/share/vulkan/explicit_layer.d
export PKG_CONFIG_PATH=$VULKAN_SDK/share/pkgconfig:$VULKAN_SDK/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}
export CMAKE_PREFIX_PATH=${VULKAN_SDK}:${VULKAN_SDK}/lib/VulkanLoader
Build with Vulkan
git clone https://github.com/ggml-org/llama.cpp.git
export MAX_JOBS=8 # adjust to your CPU cores / available RAM
cmake -S llama.cpp -B build \
-DLLAMA_CURL=ON -DGGML_VULKAN=ON -DCMAKE_BUILD_TYPE=Release && \
cmake --build build --config Release -- -j ${MAX_JOBS}
Usage
Multi-GPU llama-server examples with speculative decoding (MTP) and tensor-split across four cards.
ROCm:
llama-server -hf unsloth/Qwen3.5-122B-A10B-MTP-GGUF:UD-Q4_K_XL \
--no-mmap -dio -fa on -ngl 999 -np 1 \
--spec-type draft-mtp --spec-draft-n-max 2 \
--device ROCm0,ROCm1,ROCm2,ROCm3 --split-mode tensor --host 0.0.0.0
Vulkan:
llama-server -hf unsloth/Qwen3.5-122B-A10B-MTP-GGUF:UD-Q4_K_XL \
--no-mmap -dio -fa on -ngl 999 -np 1 \
--spec-type draft-mtp --spec-draft-n-max 6 \
--device Vulkan0,Vulkan1,Vulkan2,Vulkan3 --split-mode tensor --host 0.0.0.0
Flag notes (tune to your setup):
-ngl 999— offload all layers to the GPU(s).-fa on— flash attention.--device ROCm0,ROCm1,…/Vulkan0,Vulkan1,…— select the backend devices to use.--split-mode tensor— split each tensor across the selected GPUs (needs good inter-GPU bandwidth; see Multi-GPU PCIe P2P).--spec-type draft-mtp --spec-draft-n-max N— Multi-Token-Prediction speculative decoding; the Vulkan example above uses a largerN(6) than the ROCm one (2).--spec-draft-device ROCm0— run the MTP draft model on a single GPU while the main model is tensor-split across multiple cards (community-validated on TP2).--no-mmap,-dio— memory/IO tuning;-np 1sets the number of parallel sequences.
For RDNA2-tuned multi-GPU serving (DFlash2, RCCL all-reduce, higher throughput), see the
RDNA2-optimized fork — that’s where most #llamacpp performance work
happens.
Adjust the model, quant, device list, and speculative-decoding settings for your hardware.
RDNA2 fork — Overview
WIP: See Verification status.
edwinbrowwn/llama.cpp-rdna2 is a community fork of
llama.cpp with RDNA2-specific optimization work, developed on
ROCm 7.14 / Ubuntu Server 26 and validated primarily on four Radeon PRO V620 (gfx1030) GPUs.
The focus is tensor parallel (TP) and MMQ/MMVQ (quantized matmul) kernels.
Actively evolving and experimental. Treat throughput claims as needing your own matched before/after runs. See Benchmarks.
#llamacpp(Sep 2026): RDNA3 (gfx11xx) support is landing on the fork soon — this wiki still focuses ongfx1030/ V620 until that path is documented.
What it does
A native RDNA2 profile activates automatically at runtime — unsupported models, shapes, quants, and topologies fall back to stock llama.cpp. Headline areas:
- MMQ / MMVQ: RDNA2 expert-width MMQ, Q4_0 DOT8 MMVQ, MXFP4/NVFP4 native arithmetic, MTP/DFlash paths.
- FlashAttention: native tiled RDNA2 arithmetic/reductions.
- Tensor parallel: RCCL tuner + P2P all-reduce schedules, embedding-sharded LM head, TP4 P2P fusion.
- Graph fusion: ADD/RMSNorm, Q8_1 reuse, SwiGLU→Q8_1, GDN sibling projection (Qwen3.5/3.6 MoE).
Optimization highlights (author-reported)
- RCCL tensor-parallel all-reduce —
GGML_CUDA_ALLREDUCE=nccl; reported +10% tgen / +20% prefill on Qwen 122B. - DFlash2 speculative decoding with ngram helpers — see Speculative decoding.
- RCCL autotuner, parallel multi-GPU weight uploads, AMD checkpoint backports for Qwen.
See the fork’s README.md and docs/gfx1030-* / docs/rdna2-* for the authoritative list.
Requirements
- Linux, CMake, ROCm with HIP clang and RCCL.
- Validated path: four V620 /
gfx1030with tensor splitting. - Compatible main GGUF; optional DFlash/MTP draft GGUF.
- Fastest fork quants in
#llamacpp/#harnessesare Q4_0 and Q8_0 (native MMVQ paths). Q6 / UD-Q4_K can be slower even when they “fit”. MXFP4 has been reported a bit faster than Q4_0 on some 27B runs — A/B on your cards. - For GPU-side sampling paths, install
hipcub-devel(package name varies by distro) before building — otherwise TOP_K / draft sampling falls back to CPU.
Build
git clone https://github.com/edwinbrowwn/llama.cpp-rdna2.git
cd llama.cpp-rdna2
./scripts/build-rdna2-portable.sh
Override discovery when needed:
ROCM_PATH=/path/to/rocm TARGET_ARCH=gfx1030 BUILD_DIR=build ./scripts/build-rdna2-portable.sh
Maintainer helper for gfx1030 / ROCm 7.14: scripts/build-rdna2-rocm.sh (defaults: ROCm
/opt/rocm/core-7.14, target gfx1030).
Next steps
- Benchmarks — author-reported numbers (PR #10 / #12 merged).
- Serving — launch commands and Docker.
- Speculative decoding — DFlash2, MTP, ngram configs.
RDNA2 fork — Benchmarks
WIP: All numbers below are author- or Discord-reported. Run matched before/after on your hardware. See Verification status.
Point-in-time numbers using edwinbrowwn/llama.cpp-rdna2,
ROCm/RCCL, Flash Attention on, F16 KV, batch/ubatch 2048/256, with the env prefix
GGML_CUDA_DISABLE_GRAPHS=1 GGML_CUDA_ALLREDUCE=nccl HSA_OVERRIDE_GFX_VERSION=10.3.0 HSA_NO_SCRATCH_RECLAIM=1 (ROCm 7.14 libs on LD_LIBRARY_PATH).
4× V620 (24 CPU threads)
| Model | Quant | Split | pp512 (t/s) | tg128 (t/s) |
|---|---|---|---|---|
| Qwen3.6-27B | F16 | tensor | 850.54 | 18.52 |
| Qwen3.6-27B (DavidAU/Fable) | Q4_K_M | tensor | 1,017.25 | 27.76 |
| Qwen3.5-122B-A10B | Q4_K_M | tensor | 1,064.40 | 39.12 |
| Qwen3.6-35B-A3B | Q4_K_M | layer | 2,293.36 | 72.17 |
| Qwen3.6-35B-A3B | Q4_K_M | tensor | 1,939.80 | 58.30 |
2-GPU tensor split (TP2)
| Model | Quant | Split | pp512 (t/s) | tg128 (t/s) |
|---|---|---|---|---|
| Qwen3.6-27B (DavidAU/Fable) | Q4_K_M | tensor | 707.14 | 25.63 |
| Qwen3.6-27B | F16 | tensor | 448.02 | 13.15 |
Latest fork update (Aug 2026, #llamacpp)
MTP-4 TP4 on a pelican prompt:
| Quant | Average t/s | Peak t/s |
|---|---|---|
| Q4_0 + MTP-4 | 85 | 115 |
| Q8_0 + MTP-4@Q4_0 | 75 | 105 |
DFlash2 on TP2: ~52 t/s coding at 0–31k context, ~40 t/s at 64k. Checkpoint fix in PR #12 (merged 17 Aug 2026).
Stock llama.cpp vs this fork (community A/B)
#llamacpp matched run on Qwen3.8-27B Q6_K + MTP (same prompts, temp 0, seed 42, 400 tok,
3 runs). Outputs were byte-identical; the fork was faster:
| Lane | Mean t/s | Spread |
|---|---|---|
| Stock / “production” llama.cpp | 24.22 | 1.9% |
llama.cpp-rdna2 TP2 | 37.98 | 0.3% |
+56.8% on that workload. Stock + llama-swap in the mid-20s t/s on 27B is a common “I have not switched to the fork” report; 2× V620 + fork + Q4_0 has been quoted at 500–600 PP and 40–50 t/s decode.
pp512= prefill (512-token prompt);tg128= generation (128 tokens). For A3B MoE, layer split beats tensor split; dense models use tensor split.
Long-context community sweeps (Aug 29–30 2026)
Community #benchmarks posts (4× V620, RDNA2 fork, short env stack, --ubatch-size 1024, MTP). Treat
as single-host snapshots — not wiki-reproduced.
Quant comparison (one host, tensor-split + MTP)
Prompt-eval and generation across context tiers; Q8_0 often wins on this fork (native MMVQ path):
| ctx | Q4_K_L tg | Q6_K_L tg | Q8_0 tg | bf16 tg |
|---|---|---|---|---|
| 16k | 16.7 | 16.0 | 17.5 | 15.7 |
| 32k | 24.4 | 27.5 | 31.7 | 18.6 |
| 64k | 21.8 | 23.6 | 22.2 | 11.0 |
| 128k | 23.0 | 22.4 | 26.7 | 12.4 |
Prefill ranking on that host: Q8_0 > Q4 ≈ Q6 > bf16. A separate real ~107k-token prose prompt on Q8_0 reported ~667 PP / ~23 tg with ~45% MTP accept.
ROCm 7.1 vs 10.0 (Ice Lake 4× V620, Q6_K_XL + MTP)
Same fork commit / command shape; community numbers are close across ROCm 7.1 and 10.0 on that host (regular 16k ~963–965 PP / ~46 tg). Prefer ROCm 7.2.0 or 7.14.0 for multi-GPU RCCL unless you are deliberately lab-testing TheRock/10.x.
Reproduce long-context benches with fixed non-repeating prompts (16/32/64/128k) and full command +
commit — community tool: GeorgeMA-Strong/llm-context-bench.
MMVQ / GDN optimizations (PR #10)
Status: merged 13 Aug 2026 — PR #10. Env vars below were the PR-head recipe; confirm defaults on current fork tip.
Reported improvements: 15.9–61.2% lower MMVQ latency, up to 17.7% faster GDN prefill, +4.39% tgen from DeltaNet sibling fusion. MTP works up to 6 with minimal hit on low acceptance.
Peak throughput (4× V620 @ 140 W)
| Model | Quant | tg (t/s) | pp (t/s) |
|---|---|---|---|
| Qwen3.5-122B-A10B | Q4 | 100+ | ~1300 |
| Qwen3.6-35B-A3B | Q4 | 180+ | ~3800 |
| Qwen3.6-27B | Q8 | 75 | ~880 |
See Power Tuning for the 140 W cap. Long-context PP HIP crash fix tracks ROCm/rocm-systems#4817.
Environment used for PR #10 results
GGML_HIP_SAFE_STATE_IO=1 GGML_HIP_GFX1030_Q8_CACHE=1 GGML_HIP_GFX1030_GDN_SIBLING_FUSION=1 \
GGML_HIP_GFX1030_Q8_1_FUSION=1 GGML_HIP_GFX1030_NATIVE=1 NCCL_P2P_DISABLE=0 NCCL_P2P_LEVEL=PXB \
GGML_TP_SHARDED_OUTPUT=1 GGML_CUDA_ALLREDUCE=nccl HSA_OVERRIDE_GFX_VERSION=10.3.0 \
HSA_NO_SCRATCH_RECLAIM=1 GGML_CUDA_P2P=1 GGML_HIP_GRAPHS=1
RDNA2 fork — Speculative decoding
WIP: Community-tested configs. See Verification status.
DFlash / MTP basics
--spec-type draft-dflash \
--spec-draft-model /path/to/dflash.gguf \
--spec-draft-n-max 6
--spec-draft-n-max is a workload knob; start at the draft model’s block size and tune.
DFlash2 + ngram (community-tested)
DFlash2 shines on real workloads (coding, agents, long context) more than short synthetic benches — community members saw DFlash2 alone score lower than MTP on a 20k bench (~30 vs ~40 t/s) but win on actual agent/coding sessions (~47 t/s with 700+ t/s prefill).
Draft model quant: use Q4_K_M for the DFlash2 draft GGUF — do not use Q8_0 for the drafter (same acceptance, slower).
Recommended draft GGUFs (Aug 2026):
Coding / ngram-map-k4v:
--spec-type draft-dflash,ngram-map-k4v \
--spec-draft-n-max 5 \
--spec-ngram-map-k4v-size-n 12 \
--spec-ngram-map-k4v-size-m 48
General / ngram-mod:
--spec-type draft-dflash,ngram-mod \
--spec-draft-n-max 5 \
--spec-ngram-mod-n-match 24 \
--spec-ngram-mod-n-min 48 \
--spec-ngram-mod-n-max 64
Use tg1024+ (not tg32) for realistic decode benchmarks. DFlash2 is more consistent at long context;
MTP acceptance tends to fall off. #llamacpp (Aug 26 2026): prefer the DFlash2 Q4_K_M drafter
over MTP when context grows — same advice as the draft-quant row above.
Prefill cost: DFlash tends to hurt prompt processing more than MTP. If PP is the bottleneck (short chats, many reconnects), A/B MTP first; if long-context decode matters more, keep DFlash2.
Qwen3.8 Flash-Next (experimental)
Community benches (4× V620, layer vs tensor split) show Flash-Next layer-split can run, while tensor split on experimental qwen4exp / Flash-Next branches is still rough. Fork maintainers have deferred dedicated Flash-Next work until upstream settles — expect experimental support via upstream merges only, not a polished gfx1030 profile.
#llamacpp / forum (Sep 2026): Flash-Next on llama.cpp often lands around ~15–30 t/s on multi-V620
hosts and is widely called out as weaker than the
vLLM Flash-Next recipe (~60–100+ t/s decode class
after the Sep prefill campaign). Prefer stable Qwen3.8-27B / MoE recipes for production TP on llama.cpp;
use vLLM for Flash-Next until upstream/fork gaps close.
MTP load: #llamacpp / #general (Sep 16–18): Unsloth Studio and some RDNA2 forks
often refused Flash-Next MTP until you built a tree with the upstream MTP PR, or used
Unsloth desktop. Community Sep 18: stock llama.cpp + MTP was the path that loaded for one
host when forks did not. #llamacpp (Sep 19): two public trees did load MTP when Studio’s
bundled llama.cpp would not (including versus that Studio fine-tune) —
markldn/llama.cpp-qwen4exp-rdnaport-latest
and okigan/llama.cpp qwen4exp-mtp-fix.
The same host could not get tensor parallel on either. #llamacpp (Sep 20): that host then
reported Studio’s bundled llama.cpp now loads MTP (called a same-day bundle fix) — re-try the
bundled binary before compiling a fork. Needs verify (one report). Public walkthrough:
Unsloth Qwen3.8-Flash-Next / MTP. Ubuntu 26.04
shipping ROCm 7.1 is a separate A/B from MTP (wiki still prefers 7.2.0 or 7.14.0 for
multi-GPU). 3× V620 + 32 GB host RAM was not enough; community later loaded 3× + MTP with
about 64 GB host RAM (SSD offload untested). 4× + 128 GB with Q4 weights / Q8 KV / Q8 MTP
is the class that got a larger server up.
#llamacpp (Sep 10–11 2026) community snapshots — still not a polished gfx1030 profile:
| Setup | Quant / backend | Prefill | Decode | Notes |
|---|---|---|---|---|
2× V620, LocalAI rocm-llama-cpp-development | Qwen3.8 Flash-Next Q4 | low | ~6 t/s | n-gram offloaded to NVMe; 64 GB host RAM |
| 2× V620, 64 GB VRAM | mudler/Qwen3.8-Flash-Next-APEX-GGUF compact (~85 GB GGUF) | ~370+ t/s | ~26 t/s | n-gram table on NVMe (no extra host RAM); 156k KV at q8 |
| 2× V620, layer split + CPU MoE | Flash-Next UD-IQ4_XS + F16 mmproj | ~150–200 t/s | ~25 t/s | #vllm-rdna / #llamacpp Sep 14–15 — see recipe below; vLLM not recommended on 2 cards |
| 2× V620, official llama.cpp ROCm server | Unsloth Flash-Next UD-IQ3_XXS + F16 mmproj, n-gram in host RAM | ~530 t/s (lower -ub; 600+ if it fits) | ~30 t/s empty / ~10 t/s at 80k+ ctx | #general / #forum Sep 15 — stock ROCm server, not the RDNA2 fork; Vulkan A/B was ~25% slower |
| 2× V620, llama.cpp Flash-Next | UD-IQ4_XS class (layer split) | ~300 t/s | ~25 t/s | #llamacpp Sep 16 — called normal for llama.cpp Flash-Next; drops toward ~200 PP / ~15 t/s on long agentic ctx |
| 2× V620, llama.cpp (no MTP) | Navin-Models/Qwen3.8-Flash-Next-Uncensored-AD-4.27-GGUF | ~550 t/s | ~29–30 t/s (about half on long/heavy) | #llamacpp Sep 28–29 — weights minus n-gram in 64 GB VRAM; 262k KV at q8. MTP headers still failed. Host was PCIe 3.0 / DDR4 (HP Z4 G4 class). Same thread also cited ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-Coder-GGUF as sitting between Unsloth Q3_XL and Q4_XS (no tok/s). #llamacpp Sep 30: another 2× host used the ISTA-DASLab coder pack and preferred it over 27B Q8 for one coding task (Needs verify). LocalAI YAML: serving |
| 2× V620, llama.cpp MTP | ukisai/Swift-1.5-Qwen3.8-Flash-Next-GSQ-RCO-GGUF IQ3_xs-class + q4_0 ngrams | ~400 t/s | ~40 t/s | #llamacpp Sep 30 — ~48 GB host RAM. --batch-size 4096 --ubatch-size 1024 helped PP a little. Shorter-reasoning Swift; quality Needs verify |
| 2× V620, llama.cpp MTP, IQ3_XXS | Same Swift GSQ-RCO IQ3_XXS + BF16 mmproj + Q4_0 MTP | ~800 → ~650 t/s at ~30k | ~35 → ~20 t/s | #llamacpp Oct 2 — tensor split 1,1.1, -ot 'per_layer_token_embd\\.weight=CPU', --lazy-mode off --load-mode none, -c 71680, -b 2048 -ub 1024. Community: VRAM-bound. Recipe: serving |
| 3× V620, llama.cpp + MTP | Flash-Next | — | loaded | #llamacpp Sep 17 — ~64 GB host RAM; 32 GB did not load. SSD offload untested. |
| 4× V620, patched llama.cpp MTP | Q4 + Q8 KV + Q8 MTP | ~400 t/s | ~27–45 t/s | #llamacpp Sep 17 — MTP needed a compiled PR; others call 400 PP low vs ~700–800 PP on 2× at low ctx. Layer split can halve TG. |
| 4× V620, n-gram in host RAM | Flash-Next (non-APEX) | ~200–400 t/s | ~20–35 t/s | Context-dependent; PP/tg still below 27B on the same rig |
Host RAM for Flash-Next n-gram: keeping the n-gram table off storage is on the order of ~50 GB of system RAM (community, 4× V620). Budget that on top of OS + any CPU offload — or keep the table on fast NVMe and accept the slower path (APEX report: NVMe-resident n-gram was fine).
#vllm-rdna (Sep 14): if you must CPU/RAM-offload Flash-Next (2× V620, or 4× with a too-small
KV pool), llama.cpp is the better offload engine than Hub / resident vLLM. HEAD after
#146 (28 Oct) adds a vLLM expert-offload
wrapper — 2× serve. vLLM still wins on
4× when everything stays in VRAM.
2× V620 community recipe (IQ4_XS, layer split)
Sanitized from a community “fastest I got” serve line. -t / --threads-batch are host-specific
— set them to your cores. Layer-split ratios (-ts 53,47) and --n-cpu-moe 6 are starting points,
not a fork profile.
ROCBLAS_USE_HIPBLASLT=1 ./build/bin/llama-server \
-m /path/to/Qwen3.8-Flash-Next-UD-IQ4_XS-00001-of-00003.gguf \
--alias flashnext \
-ngl 99 -sm layer -ts 53,47 \
-c 65000 --flash-attn on --parallel 1 \
--cache-type-k f16 --cache-type-v f16 \
--n-cpu-moe 6 \
--mmproj /path/to/mmproj-F16.gguf \
-ot "ple_ngram_embd=CPU" \
-t 8 --threads-batch 14 -b 2048 -ub 512 \
--spec-type ngram-mod \
--spec-ngram-mod-n-match 24 \
--spec-ngram-mod-n-min 12 \
--spec-ngram-mod-n-max 16 \
--temp 1.0 --top-p 0.95 --top-k 20 --min-p 0.0 \
--host 0.0.0.0 --port 8081 --jinja --load-mode none
Community snapshot on that host: ~25 t/s decode, ~150–200 t/s prefill. Prefer the
RDNA2 fork over a random ROCm build. --load-mode none avoids
DAX mmap issues if the GGUF
sits on a special mount.
Full DFlash2 serve example (TP4, Qwen3.8-27B)
HSA_NO_SCRATCH_RECLAIM=1 GGML_HIP_RDNA2_AUTO=1 GGML_HIP_SAFE_STATE_IO=1 \
GGML_TP_SHARDED_OUTPUT=1 HSA_OVERRIDE_GFX_VERSION=10.3.0 \
./build/bin/llama-server \
-m ./models/qwen38-27b-q4s8/autoround/Qwen3.8-27B-Q4_0.gguf \
-ngl all --split-mode tensor --tensor-split 1,1,1,1 \
--device ROCm0,ROCm1,ROCm2,ROCm3 --flash-attn on \
--ctx-size 262144 --batch-size 8192 --ubatch-size 4096 \
--host 0.0.0.0 --port 8080 --metrics \
--reasoning-effort xhigh --reasoning-preserve \
--spec-type draft-dflash,ngram-map-k4v \
--spec-ngram-map-k4v-size-n 12 --spec-ngram-map-k4v-size-m 48 \
--spec-draft-n-max 5 \
-md ./models/qwen38-27b-q4s8/dflash2/Qwen3.8-27B-DFlash2-Q4_K_M.gguf \
--device-draft ROCm0 --parallel 1 --spec-draft-ubatch-size 4096 \
--cache-ram 65535
MTP on tensor-split setups
Pin the draft to one GPU while the main model stays tensor-split:
--spec-type draft-mtp --spec-draft-n-max 4 --spec-draft-ngl 999 --spec-draft-device ROCm0
Community tuning tip (Qwen3.8-27B Q8, TP4, real prompts): --spec-draft-n-max 3 often beat
n=4 (higher acceptance / mean accepted length). A/B on your workload — do not trust 100% draft
acceptance in synthetic benches (usually a bad prompt).
MXFP4 quants (e.g. quark75/Qwen3.8-27B-MXFP4-GGUF) pair well with MTP on TP2 — see
Serving.
HIP sidecar speculative decoding is now an opt-in fork path (#llamacpp, Sep 2026):
export SPEC_SIDECAR=1 # moves MTP/DFlash logic outside the main llama.cpp process
Pair with --spec-draft-p-min 0.0 (fork maintainer tip). Sidecar work is still evolving — pull latest
edwinbrowwn/llama.cpp-rdna2 and prefer MTP over DFlash on the sidecar path while DFlash remains slow.
Track the fork README for flag churn; do not treat SPEC_SIDECAR as required for the built-in MTP flags
above.
Sidecar / DFlash gotchas (Sep 2026)
#llamacpp reports to know about:
| Issue | What happens | Mitigation |
|---|---|---|
| Draft GGUF identity mismatch | Sidecar probe fails with target GGUF model identity differs; falls back to native MTP / no sidecar | Prefer the same publisher family for target + draft (community: Unsloth Qwen3.8-27B Q8_0 loaded sidecar; some Bartowski / AtomicChat Q8_0 builds did not). Re-pull fork after identity-matching fixes |
DFlash2 MEMORY_APERTURE_VIOLATION | Crash in gemv_mmvq2_* / [dflash-sidecar] illegal memory access; server may enter target-only then abort | Reboot / clean env, pull latest DFlash sidecar fixes, A/B MTP instead of DFlash2; report host + quant on #llamacpp |
--spec-draft-p-min ≠ 0 | Community: non-zero p-min can effectively disarm MTP acceptance | Keep --spec-draft-p-min 0 (or 0.0) unless you have measured otherwise |
| Quark / MXFP4 lockups | Quark-AWQ-MXFP4 GGUFs can look great then wedge after long ctx | Prefer Q6+ / Q8 for long sessions; community: sub-Q6 feels unusable over long context |
| MTP + LCP slot reuse | HTTP 200, no tokens; inconsistent sequence positions / llama_decode(ctx_dft) after find_slot: non-consecutive | Disable MTP, force a fresh slot, or see MTP LCP position desync. --ctx-checkpoints 0 does not prevent this |
RDNA2 fork — Serving
Recommended env stack
HSA_OVERRIDE_GFX_VERSION=10.3.0 is required for the tested V620/gfx1030 native profile.
Prefer this short stack (#llamacpp, Aug 2026). Older long lists of GGML_HIP_GFX1030_*
knobs are mostly redundant with the override and can clash with the RCCL autotune path:
HSA_OVERRIDE_GFX_VERSION=10.3.0 \
HSA_NO_SCRATCH_RECLAIM=1 \
GGML_HIP_RDNA2_AUTO=1 \
GGML_HIP_SAFE_STATE_IO=1 \
GGML_TP_SHARDED_OUTPUT=1 # TP2+ only
GGML_HIP_SAFE_STATE_IO=1— recommended default; mitigates a known ROCm FA crash class.GGML_CUDA_ALLREDUCE=nccl— community reports +10% tgen / +20% prefill on Qwen 122B when RCCL is healthy.- Optional TP4 mode:
GGML_HIP_GFX1030_P2P_ALLREDUCE=auto-expanded(topology-gated). - If you see
internal AllReduce init failed (n_devices != 2)or wild PP variance, strip customGGML_HIP_GFX1030_*/ P2P knobs back to the short stack and re-test on ROCm 7.2.0 or 7.14.0 (not mid-7.2.x such as 7.2.4). See Installing ROCm.
Launch
TP2+ (four-GPU example):
HSA_OVERRIDE_GFX_VERSION=10.3.0 \
HSA_NO_SCRATCH_RECLAIM=1 \
GGML_HIP_RDNA2_AUTO=1 \
GGML_HIP_SAFE_STATE_IO=1 \
GGML_TP_SHARDED_OUTPUT=1 \
./build/bin/llama-server \
-m /path/to/main.gguf \
-ngl all \
--split-mode tensor \
--tensor-split 1,1,1,1 \
--flash-attn on \
--host 0.0.0.0 --port 8080
TP1 — omit tensor split and GGML_TP_SHARDED_OUTPUT:
HSA_OVERRIDE_GFX_VERSION=10.3.0 \
HSA_NO_SCRATCH_RECLAIM=1 \
GGML_HIP_SAFE_STATE_IO=1 \
./build/bin/llama-server -m /path/to/main.gguf -ngl all --flash-attn on --host 0.0.0.0 --port 8080
Batch / ubatch tips
For tensor-split prefill, #llamacpp often does better with larger ubatch than the old
2048/256 bench defaults — roughly ~1024 ubatch per GPU (e.g. TP4 → --ubatch-size 4096) while
keeping --batch-size ≥ ubatch. Small prompts may regress slightly; long prompts usually win.
Recent long-context community recipes commonly use --batch-size 16384 --ubatch-size 1024 on TP4
(see Benchmarks).
Host tips that affect llama-server
- CPU governor: if any hot path stays on the host (Flash-Next n-gram tables,
--override-tensor …=CPU, MoE/KV offload),powersavecan lag bursty PP. Community: switching Intelintel_pstatetoperformanceimproved Flash-Next PP ~33% while VRAM-resident 27B was unchanged. Check/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor. See General troubleshooting. - DAX / Optane model store: fast loads are nice for swap-testing; never mmap GGUFs from
dax=alwaysmounts into ROCm — use--no-mmap/--load-mode none. See troubleshooting. - Qwen chat templates:
#vllm-rdna(Oct 8) pointed atfroggeric/Qwen-Fixed-Chat-Templatesas a drop-in--chat-template-filewhen official Qwen Jinja wastes tokens or stalls agents.#general(Oct 9): community reports tool calls holding up on that Jinja (OG Qwen3.8 + Open WebUI). Needs verify — resources.
Full validated example (4× V620, Qwen3.5-122B-A10B-MTP)
GGML_CUDA_DISABLE_GRAPHS=1 GGML_CUDA_ALLREDUCE=nccl HSA_OVERRIDE_GFX_VERSION=10.3.0 \
HSA_NO_SCRATCH_RECLAIM=1 LD_LIBRARY_PATH=/opt/rocm/core-7.14/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} \
./build/bin/llama-server \
-m /path/to/Qwen3.5-122B-A10B-MTP-UD-Q4_K_M.gguf \
-ngl all --split-mode tensor --tensor-split 1,1,1,1 --main-gpu 0 \
--ctx-size 262144 --cache-type-k f16 --cache-type-v f16 --kv-unified \
--batch-size 2048 --ubatch-size 256 --parallel 4 \
--host 0.0.0.0 --port 8080 --temp 0.6 --metrics --jinja --numa distribute \
--reasoning on --reasoning-format deepseek --chat-template-kwargs '{"preserve_thinking": true}' \
--spec-type draft-mtp --spec-draft-n-max 3 --spec-draft-type-k f16 --spec-draft-type-v f16 \
--spec-draft-p-min 0.0 --spec-draft-p-split 0.10 --no-spec-draft-backend-sampling --cache-ram 0
Docker example
TP2 + MTP4 from #llamacpp (ROCm 7.14, MXFP4 Qwen3.8-27B):
environment:
HSA_NO_SCRATCH_RECLAIM: "1"
GGML_HIP_RDNA2_AUTO: "1"
GGML_HIP_SAFE_STATE_IO: "1"
GGML_TP_SHARDED_OUTPUT: "1"
HSA_OVERRIDE_GFX_VERSION: "10.3.0"
command: >
llama-server
-hf quark75/Qwen3.8-27B-MXFP4-GGUF:MXFP4
-ngl 999 -fa on -sm tensor -ts 1,1 -fit off
--flash-attn on --ctx-size 32768
--cache-type-k f16 --cache-type-v f16
--batch-size 4096 --ubatch-size 4096 --parallel 1 --cont-batching
--host 0.0.0.0 --port 8091 --temp 0.7 --jinja --metrics -kvu
--reasoning-preserve
--chat-template-kwargs '{"preserve_thinking": true}'
--spec-type draft-mtp --spec-draft-n-max 4 --spec-draft-ngl 999
--ctx-checkpoints 0
Build with ./scripts/build-rdna2-portable.sh. RCCL needs working PCIe P2P. If P2P
is enabled but slower, set NCCL_P2P_DISABLE=1. If all-reduce fails, try
GGML_HIP_GFX1030_P2P_ALLREDUCE=off or GGML_CUDA_ALLREDUCE=none.
LocalAI YAML (2× Flash-Next, #llamacpp Sep 30)
Community LocalAI backend rocm-llama-cpp-development for
Navin-Models/Qwen3.8-Flash-Next-Uncensored-AD-4.27-GGUF
on 2× V620. Paths generalized. Needs verify — not a fork profile.
backend: rocm-llama-cpp-development
batch: 4096
ubatch: 1024
cache_type_k: q8_0
cache_type_v: q8_0
context_size: 229376 # 32k under 262144 so a second user can grow KV
fit_params: false
flash_attention: true
main_gpu: 0
mmap: true
mmproj: /path/to/mmproj-Qwen3.8-Flash-Next-Uncensored-F16.gguf
split_mode: tensor
tensor_split: 1,1.1
options:
- use_jinja:true
- parallel:1
- cache_reuse:256
- context_shift:true
- cache_ram:8192
- kv_unified:true
parameters:
min_p: 0.05
model: /path/to/Qwen3.8-Flash-Next-Uncensored-AD-4.27-00001-of-00033.gguf
temperature: 1
top_k: 40
top_p: 0.8
template:
use_tokenizer_template: true
Same thread: --batch-size 4096 --ubatch-size 1024 also helped Swift GSQ-RCO PP a little
(speculative table).
Swift IQ3_XXS + MTP (2× V620, #llamacpp Oct 2)
Community llama-server line for
ukisai/Swift-1.5-Qwen3.8-Flash-Next-GSQ-RCO-GGUF
IQ3_XXS on 2× V620. Paths generalized. Needs verify — VRAM was called the bottleneck.
HIP_VISIBLE_DEVICES=0,1 ./build/bin/llama-server \
-m /path/to/Swift-Qwen3.8-Flash-Next-GSQ-RCO-IQ3_XXS-00001-of-00002.gguf \
--mmproj /path/to/mmproj-Swift-Qwen3.8-Flash-Next-BF16.gguf \
-ngl all -sm tensor -ts 1,1.1 \
-ot 'per_layer_token_embd\\.weight=CPU' \
--lazy-mode off --load-mode none \
-c 71680 -fa on -ctk f16 -ctv f16 \
-b 2048 -ub 1024 \
-np 1 --cache-ram 8192 \
--jinja --reasoning-preserve \
-md /path/to/mtp-Qwen3.8-Flash-Next-Q4_0.gguf \
--spec-type draft-mtp --spec-draft-ngl all --spec-draft-n-max 3 \
--temp 1.0 --top-k 40 --top-p 0.8 --min-p 0.05 \
--host 127.0.0.1 --port 8085
Community snapshot: PP starts around ~800 t/s and falls to ~650 by ~30k context; decode ~35 → ~20 t/s. The Sep 30 Swift row used 4k/1k batch and reported ~400 / ~40 — treat both as single-host numbers, not a recipe bake-off.
The RDNA2 fork’s recent HIP/RCCL work is validated primarily against ROCm 7.14 (#llamacpp,
Sep 2026). Mid-7.2.x (e.g. 7.2.4) is not a confident target — upgrade or pin per
Installing ROCm.
Single-GPU community ballpark (Qwen3.8-27B)
#llamacpp (Sep 2026), 1× V620, RDNA2 fork, short env stack — treat as single-host snapshots:
| Quant | Decode (community) | Notes |
|---|---|---|
| Q4_0 | ~39–49 t/s | Fastest native MMVQ path on the fork |
| Q5_K_XL | ~24 t/s | Slower unpack path |
| Q8_0 | often ≥ Q5 | Less unpacking/shuffling; needs the VRAM (easier on TP2+) |
| MXFP4 (~14.5 GB) | ≈ Q4_0 (slightly slower in one report) | Fits 1× 32 GB with reduced context |
On 4× V620, long-context MTP benches (community suite) saw decode hold ~60–65 t/s at 32k on coding
prompts but drop harder by 64k — ngram / sidecar MTP work aims to lift acceptance; A/B with
llm-context-bench.
Idle power with embedded servers
Running an embedding server (nomic, etc.) alongside chat on the same cards can add ~40 W per GPU
even when the embedder looks idle (#llamacpp). Park embedders on a spare card or stop them when not
needed if you care about power.
Concurrent slots / multi-agent (V620)
#llamacpp (Sep 2026): on V620 (no matrix cores), --parallel > 1 can crush per-stream decode —
community report of ~35–50 t/s → ~5–9 t/s when two generations overlap, and prefill of a second
request can stall the first. Prefer one stream per process and scale out with separate instances
(different GPUs / aliases) if you need multi-agent throughput. KV-aware load balancers (e.g.
paddler) and shared KV layers (LMCache
on the vLLM side) are discussed in #llamacpp / #lmcache but are not wiki-validated recipes yet.
Faster GGUF loads (upstream WIP)
Community (#vllm-rdna / #llamacpp, Sep 2026): upstream
llama.cpp PR #22466 (async pinned upload for
-sm tensor loads) dropped a 122B-Q4 load from >2 min to <35 s on one host. Watch that PR /
fork merges if cold-start time matters.
Notable limits
- Validated primarily on 4× V620 gfx1030, ROCm 7.14; other systems use conservative fallbacks. TP4 does work on known-good server boards (e.g. Gigabyte MC62-G40) and on some dual-socket Broadwell-EP hosts. Most successful TP4 + P2P reports are on AMD CPUs.
- Multi-socket hosts can hurt TP — single-socket EPYC preferred. Dual-Xeon UPI traffic has
halved prefill in
#generaleven when theoretical cross-socket bandwidth looked fine. - KV checkpoints crash on tensor split — use
--ctx-checkpoints 0. GGML_TP_SHARDED_OUTPUTandGGML_TP_VOCAB_SHARDED_OUTPUTare incompatible modes.- Tensor-split prefill spikes current — layer split can look fine while TP shuts the PSU off at prefill start (transient on the +12 V rail, classic with old miner PSUs). Try 160 W (~2–4% slower) or 140 W (~8–10% slower vs unlocked) before blaming the fork. See Power Tuning.
- TP3 (three cards) has caused driver crashes; stick to 2 or 4 when possible. On boards with three full CPU x16 slots, community still prefers trying tensor split first if the links are PCIe 4.0 x16 — see Host topology.
- Most
GGML_HIP_GFX1030_*flags are redundant withHSA_OVERRIDE_GFX_VERSION=10.3.0unless A/B testing — prefer the short env stack. - FA / q8 KV: quantized V cache needs FA on; FA occupancy asserts on some head-256 models — see troubleshooting.
- GPU sampling (
--spec-draft-backend-samplingand related): installhipcub-devel(or distro equivalent) at build time. Without it, expectdevice 'Meta()' does not have support for op TOP_Kand fall back to slower CPU sampling. - Long-context quant quality: community (
#llamacpp): below Q6 often looks fine on short benches then loops / stalls as context grows; Q8 is noticeably more stable. Pair with sidecar gotchas.
For stock builds see Building & running. Speculative decoding configs: RDNA2 speculative decoding.
Troubleshooting
Common errors on gfx1030 / RDNA2 and how to fix them. Pick the section that matches your stack:
| Stack | Page |
|---|---|
| ROCm install, hipBLASLt, BF16, iGPU, Secure Boot, CPU governor, V620 cooling, multi-PSU / IOMMU card drop | General |
| Host never POSTs with 4× V620 / PLX (Dell Precision, H12D) | Host firmware |
vLLM Docker, CUDA graphs, TunableOp / rocBLAS mismatch, Inductor cache, GLM vision compile, AMDSMI, RCCL, rocprofiler idle CPU, rdna_ar / non-mono hangs, KV-offload loops | vLLM |
Flash-Next stalls, PP3 / FULL graphs, hybrid KV, PLE, QSA vs FA-RDNA2, AutoRound INCConfig, vision OOM, wvSplitK, dynamic MTP / KV-restore loops | vLLM Flash-Next |
| llama.cpp RCCL, KV checkpoints, FA occupancy abort, DAX mmap, tensor split, PSU, Vulkan ICD, Windows Unsloth / WSL | llama.cpp |
WIP: Fixes involving latest
-extrasimages assume a current image pull — see Verification status.
Still stuck?
- ROCm troubleshooting docs
- Community resources
- Contributing — add your fix so others don’t rediscover it
General troubleshooting
torch.cuda.is_available() returns False
- Confirm ROCm sees the card:
rocminfo | grep -m1 -o 'gfx[0-9]*'. - Confirm you installed the ROCm build of PyTorch (
torch.__version__should end in+rocmX.Y). - Make sure your user is in the
renderandvideogroups:groups | grep -E 'render|video'. If not:sudo usermod -aG render,video "$LOGNAME"and re-login.
"no kernel image is available for execution on the device"
Set the override:
export HSA_OVERRIDE_GFX_VERSION=10.3.0
See HSA_OVERRIDE. If building from source, use PYTORCH_ROCM_ARCH /
AMDGPU_TARGETS for your real target.
hipErrorNoBinaryForGpu / Memory access fault
- Usually wrong/missing arch — apply the override or rebuild.
- Can also mean OOM; check
rocm-smiand reduce batch size / context.
hipBLASLt errors
export TORCH_BLAS_PREFER_HIPBLASLT=0
BF16 is extremely slow
Force FP16 everywhere (--dtype float16 in vLLM, dtype=torch.float16 in PyTorch). See
Environment variables. #general (Sep 28): ComfyUI image/video
graphs that default to bf16 are a poor V620 fit for the same reason — prefer fp16 / int8
workflows (hardware).
The iGPU is being selected instead of my discrete card
export HIP_VISIBLE_DEVICES=0 # index of your discrete GPU in `rocminfo`
First diffusion / MIOpen run is very slow
MIOpen compiles kernels on first use in ~/.cache/miopen. Later runs are fast.
Secure Boot blocks the amdgpu-dkms module
Either sign the module or disable Secure Boot.
CPU governor hurts host-resident models
Symptom: Flash-Next (or any model with large CPU-side tables / offload) has weak prefill; VRAM-only 27B is fine.
On Intel intel_pstate, default powersave still boosts but ramps lazily. Bursty host work
(n-gram hash + gather from a multi-GB host table) finishes before the governor reacts. Community:
performance improved Flash-Next PP ~33% on a ~6k prompt; GPU-bound Qwen3.8-27B unchanged; idle
clocks still drop.
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
Persist with a systemd oneshot if needed (resets on reboot). Skip this if every tensor stays in VRAM.
Unsupported AMD GPU in the box “steals” ROCm
Symptom: env overrides look correct, but ROCm / vLLM acts as if only an old unsupported AMDGPU exists
(e.g. Polaris / WX4100) and ignores the V620s — or rocminfo crashes with topology errors about an
unsupported KFD node.
#general / #llamacpp: some ROCm code paths punt the entire stack when they see an unsupported
AMD device, instead of skipping that one card. ROCR_VISIBLE_DEVICES alone is unreliable for this
on mixed hosts.
Workarounds (pick one):
- Unbind the display/legacy card from
amdgpuafter boot (keep it for POST / recovery, but out of the compute topology). - Use a non-amdgpu display GPU (old NVIDIA / Intel / Terascale HD that never binds
amdgpu) or run the host headless. - Hide devices carefully with
HIP_VISIBLE_DEVICES/ROCR_VISIBLE_DEVICESand re-checkrocminfostill enumerates every V620.
Docker device passthrough of only the V620 does not always isolate an unsupported host GPU from HSA topology init — VM passthrough or unbind is the reliable fix when mixed AMD cards fight ROCm.
Overheating / thermal paste on V620
#general: V620s are passive server cards — airflow matters more than most desktop GPUs.
| Report | Notes |
|---|---|
| Stock pads | Some hosts call factory graphene / graphite pads high quality; a bad repaste can worsen temps |
| Batch heating | Community reports of cards that overheat or fail to init under ROCm after long load — test new cards under load for a long stretch; OS may still list an AMD GPU while rocm-smi does not |
| Temps | Rough community ballpark: ~86 °C at full load can be “OK”; 94–96 °C is high (often stress / curve tuning) — improve airflow / power cap first |
| Cooling | Cap at 180 W (or lower); single-fan / weak blower setups struggle at stock 250 W |
| Unducted case 120 mm | #general (Sep 13 2026): loud 5000 rpm 120 mm fans and no ducts still hit ~95 °C at a 120 W cap. A blower / ducted shroud on the card immediately dropped temps enough to hold 180 W. |
| Ducted 120 mm (push) | Community dual-V620: Arctic P12 Pro through a duct, ~62–70 °C at 175 W depending on ambient. Needs static pressure; air bypasses the heatsink if you leave a gap. #general (Sep 27): public 120 mm → fanless GPU ducts. |
| 80 mm high-static (4-card) | #other (Sep 28): four 80 mm ~7k fans at 50–60% PWM held ~60 °C on 4× 180 W vLLM (community). Two fans may be enough on that chassis. |
| 40 mm axial on the card | Works but is a high-pitched screamer. Prefer a blower-style mount (example: Thingiverse 7153218) for compactness vs noise. |
| Unused on-card fan pads | #general (Oct 7): the V620 PCB has an unused 4-pad fan footprint on the back. Community: do not wire it as a PWM header — current firmware would run the fan at 100% with no curve, and one teardown could not use it as PWM. Prefer an external blower / hub (rows above). |
| 9733 blower (4U last slot) | #general (Oct 4–6 2026): Thingiverse 7296707 mounts a 9733 blower on V620 with intake toward the CPU so the last 4U slot does not suck the case wall. Fan rating cited ~2.94 A / 12 V. Molex-only power runs the fan at 100% (no curve). Community: loud at 100% when a cheap PWM box pulses full/off instead of true PWM. One report that one Molex can feed four — Needs verify. |
| EFH-08E12W + PWM hub | #general (Oct 4): quieter idle path than a 9733-at-100% is EFH-08E12W-JP01 on Thingiverse 7153218 plus a real PWM hub (example: Arctic ACFAN00351A) and a software curve (CoolerControl). |
| SUNON 9733 + SATA PWM hub | #general (Oct 6): community quieter swap from the stock-loud 2.94 A 9733 is SUNON PF97331B1-B00U-S99 (12 V, ~19.2 W, 4-wire 97 mm). Power / PWM through a SATA-fed hub such as SilverStone CPF04 (one header → up to eight fans) plus a BIOS or software fan curve. Molex on the old 9733 stays 100%. |
PCB photos for cooler compatibility: community link Linus Tech Tips V620 thread. W6800 waterblocks are not a guaranteed fit.
IOMMU faults then a PSU group of cards disappears
#general (31 Oct): on an 8× V620 host, a TP8 request or sometimes
model load logged IOMMU page faults, then fatal PCIe errors, then
six cards vanished from the OS. Those six shared auxiliary power from a
1500 W server PSU through a breakout board. The two cards powered entirely
from a workstation PSU stayed. The first GPU to report the IOMMU fault was
not always the same card, and was not necessarily the problem card.
Unresolved: power delivery vs riser/cable vs driver. Needs verify. A/B before blaming the fork:
- Confirm dual 8-pin on every card in the disappearing group — power.
- Read
dmesgfor IOMMU / AER / fatal PCIe around the drop. - Cap TDP and retry TP8 vs a smaller world size.
- Do not treat a mixed PSU / breakout layout as a wiki default.
vLLM troubleshooting
CUDA graph capture crashes
Symptom: crash at GDN _output_projection all-reduce / _SimpleCData.__new__, or OOM during graph capture.
Root cause (fixed in current extras): TP comm wrappers were not allow_in_graph. Fork fix:
fix(distributed): allow TP comm ops in torch.compile graph capture.
First, pull the latest image:
docker pull blivioniag/vllm-rdna:v0.31.0-extras
Then try CUDA graphs (fast path):
--compilation-config '{"cudagraph_mode": "FULL_AND_PIECEWISE", "compile_ranges_endpoints": []}'
Mount cache volumes — see Configuration.
Fallback: --enforce-eager
On multi-GPU AOT cache issues: VLLM_USE_AOT_COMPILE=0 VLLM_DISABLE_COMPILE_CACHE=1
TORCHINDUCTOR_CACHE_DIR survives VLLM_DISABLE_COMPILE_CACHE
rdna_extras (1 Oct, EXL3 27B mul1 TP=4): piecewise assert_size_stride kept failing after a
fake-kernel stride fix because Inductor reused a stale compiled graph.
VLLM_DISABLE_COMPILE_CACHE does not cover TORCHINDUCTOR_CACHE_DIR — clear that
directory (or unset and delete the default cache) after kernel / fake-tensor changes, then
recapture. See Quantization.
Low throughput (~4–5 t/s on 27B)? Check for older image where AWQ still used Triton — see Quantization.
GLM-5.3 vision: MIOpen compiles every image size
#vllm-rdna (Sep 30), community 8× GLM-5.3-Flash AWQ on a local 0.30 fork (not Hub):
MIOpen compiled the vision downsample conv per image size (3–4 min; one report that it
killed the engine). Community workaround: implement that conv as a matmul (158 s →
4 ms). This is not the Flash-Next max_pixels startup OOM
(Flash-Next vision). Needs verify on org extras
— recipes.
First boot is extremely slow
Triton and torch.compile JIT on first run. Typical cache: ~/.triton/cache (~3 GB),
~/.cache/vllm/torch_compile_cache (~700 MB).
GPTQ/AWQ not using RDNA2 kernels
Check logs for Using RDNA2W4A16LinearKernel. If you see Triton/Exllama instead:
export VLLM_DISABLED_KERNELS=ExllamaLinearKernel,TritonW4A16LinearKernel
Confirm -extras image from current extras. See Fork kernel dispatch.
TunableOp aborts or is ~20% slow after a ROCm / rocBLAS bump
#vllm-rdna (Sep 23–24) + in-tree
tunableop/: solver IDs are
locked to one librocblas.so.5 build. Reusing them across a different rocBLAS, even when the
version string matches, is unsafe.
Current registry (profiles.json on rdna_extras):
| Profile | sha256[:12] | Rows / rank | Role |
|---|---|---|---|
rocm7.14-rocblas5.5/ | f30bb442e9b5 | 783 | Canonical serving build (Flash-Next, 27B AWQ, EXL3 27B) |
rocm10-rocblas5.6/ | c27e2252cc7a | 70 | Thin. Tuned shapes only; other GEMMs use the rocBLAS heuristic |
tools/rdna/serve_rdna.sh auto-selects the profile whose hash matches the loaded
library. A ROCm 10 venv on rocBLAS 5.6 (c27e2252cc7a) already picks
rocm10-rocblas5.6 — no launcher change. Untuned shapes stay on the heuristic
until that host runs a capture campaign and registers the new rows.
TUNABLEOP_PROFILE=<name> forces a registered name and aborts on
mismatch. TUNABLEOP_ALLOW_MISMATCH=1 is only for experiments. An unmatched
sha uses rocblas-<sha12>/ or $HOME/.cache/tunableop/, not the other
profile. Details:
Serve scripts.
Symptoms when the table does not match the library:
- First GEMM aborts / TunableOp turns itself off.
- Prefill sits ~25% below the
#17published table (community: ~1496 vs ~1958 tok/s at 16k) until a matching table is loaded. ROCm 10 vs 7.14 was not the gap on that host.
Fix: stop the serve, then regenerate and qualify for this library — see
Regenerate for another rocBLAS build.
Lookup stays on and tuning stays off (PYTORCH_TUNABLEOP_ENABLED=1,
PYTORCH_TUNABLEOP_TUNING=0). The helper refuses a mismatched named profile
instead of loading it. A legacy tunableop/rocblas-<hash>/ folder is still
honoured when no registered profile matches.
Do not commit a host-specific CSV into the wiki. Do not copy another machine’s library hash.
vLLM picks the wrong platform / doesn’t see my Radeon
Use published blivioniag/vllm-rdna images with patches/*rocm-platform* fixes rather
than stock upstream builds.
Failed to infer device type / AMDSMI_STATUS_NOT_INIT
Symptom: vLLM logs ROCm platform is not available because no GPU is found and
AMDSMI_STATUS_NOT_INIT - Device not initialized (often right after CUDA/NVML is also missing — that
part is expected on AMD).
Check the Docker device/group block exactly — #vllm-rdna hits this when render is missing:
devices: [/dev/kfd, /dev/dri]
group_add: [video, render] # both — video alone is not enough on many hosts
ipc: host
security_opt: [label=disable] # or seccomp=unconfined on docker run
Host user still needs render/video as in General troubleshooting. Debug with
VLLM_LOGGING_LEVEL=DEBUG. If the same compose worked on an older tag, docker pull a known-good
image — a bad rebuild can also fail AMDSMI init.
ROCM_ATTN hangs for hours (Triton compile)
AMD Triton flash-attention compile on gfx1030 can sit there for hours (RCCL vs Triton). On -extras,
use --attention-backend RDNA_ATTN and/or VLLM_USE_RDNA2_FA=1 instead of ROCM_ATTN. See
Configuration.
FA_RDNA2 / RDNA_ATTN may not appear in the backend list on older -extras images or some GPTQ
models (logs only show Triton / ROCM / TurboQuant). Pull the latest -extras tag and confirm
Using RDNA2W4A16LinearKernel / native FA in startup logs. Qwen3.8-27B AWQ needs head size 256
on the fork — see Quantization.
shm_broadcast / one GPU + one CPU pegged
Symptom (#vllm-rdna Sep 2026, often Flash-Next / multi-GPU): serve looks wedged; logs repeat
something like:
No available shared memory broadcast block found in 60 seconds.
This typically happens when some processes are hanging or doing some time-consuming work
(e.g. compilation, weight/kv cache quantization).
Community diagnosis: classic Triton JIT compile fighting RCCL — not necessarily a dead process. Guidance:
- Wait — first boots can sit like this a long time; keep the Triton / compile cache volumes mounted (Configuration).
- Stay on ROCm 7.2.0 or 7.14.x — avoid mid-7.2.x (same pin as multi-GPU RCCL).
- Prefer HIP /
RDNA_ATTNpaths over AMD Triton FA where the fork offers them — less Triton means fewer of these stalls. - Next cold start with a warm cache should be much shorter; if it never recovers after hours, A/B
VLLM_USE_V2_MODEL_RUNNER=0and the long-prompt notes.
Multi-GPU RCCL hangs or cards drop offline
If TP works on one image and dies after a host ROCm bump, check the ROCm version before the model. 7.2.1 through ~7.13 are reported to have a multi-card RCCL bug. Stay on 7.2.0 or 7.14.0 — see Installing ROCm.
Silent decode hang / RPC call … timed out (rdna_ar)
Symptom (#vllm-rdna / fork #128, 18–19 Oct): all ranks at ~99% GPU util and 0% memory
activity, host idle, then RPC call … timed out. No rdna_ar wedged line. Seen on rdna_extras
without --monokernel (MonoKernel does those all-reduces inside its FFN kernel).
Merged #128 (19 Oct): the one-shot
now honors its sticky abort, fails the engine as WEDGED, and the next boot falls back to RCCL.
Hub v0.31.0-extras lags — clone HEAD. If you still see the hang on a bake older than #128,
A/B VLLM_RDNA_AR=0 (RCCL) or P2P=0.
A different non-mono hang (workers silent, same RPC timeout, #128 never reported WEDGED)
was the CUDA-graph shared-experts aux-stream — next section.
Non-mono engine hang after ~minutes (CUDA-graph aux stream)
Symptom: serve looks healthy, then workers stop answering (~300 s RPC timeout) without
--monokernel. #vllm-rdna (19 Oct) + merged
#131: gfx10x SharedExperts forked to
a second HIP queue inside captured FULL/PIECEWISE graphs; ROCm 7.14 could decrement a
barrier signal twice and wait forever. Eager steps keep the overlap.
Fix is on HEAD (#131). Cost in the PR matrix was ~0 at c=1; MTP-0 c=8 up to ~1.5%
slower. If you cannot pull HEAD, --monokernel avoided the hang in ~40 author-host serves
(far fewer captured fork/joins per step) — not a substitute for the patch.
Prefill blocks decode / MTP stalls under concurrency
Symptom: with speculative decode (MTP) and multiple in-flight requests, generation stalls while
prefill runs; or graph + MTP3 reaches “Application startup complete” then hangs on PLE lookup /
sample_tokens timeout.
Community notes (#vllm-rdna):
- Prefer GPTQ + RDNA2 W4A16 (or AWQ HIP) paths over GGUF-in-vLLM for these cards.
#vllm-rdna(Sep 15):RDNA2W4A16MoEExpertswas reported to raise usable concurrency vs the older MoE path — confirm the kernel name in logs; A/B if your image is older. - One prefill stream can fully block other decode streams (community Sep 15). When you bench, alternate prefill+decode in flight — concurrency-only or decode-only numbers miss this.
- Concurrent MTP / prefill-vs-decode fixes land in community recipes first — see open PRs on
leapdragon/vllm-rdna2-recipe. - MTP=0 vs MTP=3 are different bug surfaces; a commit that “works” at MTP=3 can still emit spurious tokens at MTP=0. A/B and pin a known-good recipe commit.
- Slow or broken P2P + custom all-reduce can look like MTP latency bugs — A/B the disable vs PIX custom AR stacks.
- If MTP never starts (drafter dies on ranks 1–3 / 60 s NCCL watchdog during
profile_run), pullrdna_extras700753d9or later (amdsmi shutdown masking + local-argmax draft).#vllm-rdna(Sep 25): MTP-2 then boots but stays slower than MTP-0 on the author host. 30632b2(27 Sep) captures the draft decode graph atmax_num_reqsso MTP-2 c=8 is not eager every step. Author-host: +18% at 8×1k / +5% at 8×16k. Still ~0.87× vs MTP-0 at 16k —#vllm-rdna: “better MTP, still not great.”#vllm-rdna(Sep 27–29): decode-only concurrency is usable (two streams often ~70–80 t/s; three starts to sag). Mixed prefill + decode is the cliff — decode drops to ~1–6 t/s, prefill below 500 tok/s, MTP accept collapses. A local scheduler experiment first showed asVLLM_PREFILL_DEFER_INTERVAL=4+--long-prefill-token-threshold 256, then as CLI--prefill-schedule-interval2 or 4 (higher = more decode time between prefills) with--long-prefill-token-threshold256 / 512 / 1024. Community: interval 4 + threshold 256 recovered ~20–30 t/s decode with a parallel prefill but halved single-stream PP. Interval 2 was called a milder prefill penalty. One host’s live 4-agent run at 1024 / 8 held mixed ~1030–1050 tok/s PP / ~33 t/s gen (decode-only ~24 t/s with ~94% prefix hit; single-stream PP sometimes ~1750). Synthetic benches were called untrustworthy vs live agentic.--max-num-batched-tokens 2048slightly helped ITL on that host.- Merged
opengfx1030/vllm-rdna#36(5 Oct 2026) is the public landing of that work: opt-inVLLM_RDNA_DYNAMIC_PREFILL=1self-tunes the same two knobs (chunk cap + step cadence) from live traffic. Default off — the static CLI path is unchanged.#vllm-rdna(Oct 4–5): the earlier static pair still paused decode while a prefill ran; the dynamic controller kept decode moving (~25 t/s burst with pauses at 3 decode + 1 prefill). Author follow-up (Oct 5): recovered about half of the mixed-prefill cliff (below 500 → ~1100 tok/s PP) and auto-adjusts with load. Author: synthetic benches will not show much (slight tok/s drop, better inter-token latency). Still Needs verify on a second host; not in Hub-extras. When chasing max single-stream PP, leave the dynamic flag off and unset the static interval / threshold — they trade PP for mixed decode. Same Sep 29 thread: a ~2k → ~1450 PP drop on latest extras was resident MoE off (VLLM_RDNA_MOE_RESIDENT=1recovered ~2k), not the scheduler flags. - Concurrent MTP 9–16 token rows (three chats × MTP-2) used to fall back to tile Triton. Merged
#26opts inVLLM_ROCM_MOE_SKINNY_MAX_M=16(default stays 8). PR regular-text c=3: ~47 → ~52 t/s aggregate (+11%). No single-chat gain. Coding-suite quality still faileddominant_repeated_token— do not treat as a quality fix. #vllm-rdna(Oct 9–10): on the v0.31 test line, mixed prefill/decode still stalls (per-request, then hangs). Maintainer: the fix looks like widening CUDA-graph capture range; c=8 also looked wrong on that host. DeepSeek-V4 is expected to work after that lands. Needs verify — no public flag / endpoint list yet; do not inventcompile_ranges_endpoints. Day-to-day stays onrdna_extrasHEAD.
wvSplitK vs stacked LLMM1 (concurrency)
#vllm-rdna (Oct 6): this is not the Flash-Next post-profile GPU fault
(VLLM_RDNA_DENSE_GEMV=1). On a 4× W6800X host
(same gfx1030 as V620) serving Qwen3.8-27B fp16, no quant, community said skinny-GEMM
stacked LLMM1 is a poor decode path and that selecting rocBLAS wvSplitK (“opening the
gate”) read weights better. Decode-only concurrency (no MTP) at 1k context:
| Concurrency | Community tok/s |
|---|---|
| 1 | ~29.6 |
| 2 | ~56.0 (was ~40 on stacked LLMM1) |
| 3 | ~78.3 |
| 4 | ~102.2 |
Same host at 240k context: c=1 ~20.2, c=2 ~36.8, c=3 ~44.2 (c=4 not posted). With
MTP that host reported ~36 t/s. Needs verify on V620; do not unset
VLLM_RDNA_DENSE_GEMV=1 on hosts that already fault wvSplitK_hf_sml_* after profile.
#vllm-rdna (Oct 6) also posted 2× V620, Qwen3.8-27B fp16, TP=2, MTP, no quant:
~40–48 t/s single-stream. A shorter-reasoning Swift 1.5 27B tune on the same 2× / TP=2 /
MTP layout: ~48 t/s single-stream and ~70 t/s across two instances (community: scales
better than stock 3.8 27B). Not the Flash-Next Swift packs — two-card Flash-Next fit is still
unconfirmed. Community / Needs verify. See recipes.
W6800X Duo ALU 0.9.4 (community, 0.30 MTP-2)
#benchmarks (Oct 10): same gfx1030 class as V620 — 4× W6800X Duo, vLLM 0.30.0
TP=4, Qwen3.8-27B fp16 (no quant), ALU 0.9.4, 512 generated tokens. Community,
not wiki-tested, not a V620 serve recipe. Contrast the Sep 24 0.29.0 / MTP-0 row
(~29 → ~19 TG, ~1394 → ~560 PP) in Verification.
Concurrency 1, APC off, MTP-2:
| Context | Community PP t/s | Community decode t/s |
|---|---|---|
| 1k | ~1398 | ~66.2 |
| 16k | ~1366 | ~57.8 |
| 64k | ~1042 | ~55.2 |
| 128k | ~812 | ~43.5 |
| 255k | ~546 | ~31.8 |
APC on, MTP-2 (per-stream / aggregate decode):
| Context | c=2 | c=3 |
|---|---|---|
| 1k | ~62 / ~122 | ~57 / ~165 |
| 16k | ~56 / ~111 | ~51 / ~147 |
| 64k | ~44 / ~83 | ~35 / ~97 |
| 255k | ~22 / ~42 | ~14 / ~40 |
Prefill on the c=1 table stays in the ~1400–550 band of the older 0.29 no-MTP run; MTP-2 is the decode jump. Needs verify on V620.
Native vLLM KV RAM offload
#vllm-rdna (Sep 15): stock / pre-fix CPU → SSD KV cache offload (not LMCache) failed to
bring blocks back to VRAM usefully. Community: decode fell to the ~1 t/s class. Mamba / SSM
state models were called out as especially unreliable on that path (including on Hopper-class hosts
in-channel). Treat that as the broken baseline, not the current fork experiment.
#vllm-rdna (Sep 26–27) +
opengfx1030/vllm-rdna#24
(merged 27 Sep 2026 into rdna_extras): built-in RAM-tier KV offload — private
pinned CPU buffers per ROCm rank, hybrid-group index corrections, MTP/EAGLE boundary blocks, and
scratch-group filters. Community: ~190k tokens RAM→VRAM in ~0.4 s; three concurrent
sessions of ~150k tokens each while VRAM held only ~270k; tool-call turns did not
re-prefill the parked session. Slower than fitting everything in VRAM, especially when several
sessions prefill at once. #24 is in Hub v0.31.0-extras; commits after the bake pin still
want clone + host venv.
PR-recorded live swap (author host, 48 GiB RAM tier, swap off, SSD tier not enabled):
| Step | Community / PR snapshot |
|---|---|
| Cold ~200k TTFT | ~117 s |
| Reload ~200k TTFT | ~2.1 s (PR: 198,656 tokens from RAM, 11.5 GB in 0.429 s) |
| Decode after reload | ~112 t/s — no 1 t/s collapse, sentinels intact |
| Coding bench 64k / 128k | ~1982 / ~1852 PP, ~70–72 TG (same harness class as #17) |
| Capacity (this layout) | ~450k retained prompt tokens in 48 GiB; two 200k sessions, or one 256k + ~190k. Two full 256k windows ~55 GiB, three ~82 GiB. |
#vllm-rdna (Sep 27): a ~8 GiB RAM tier was ballparked at ~100k tokens. That is
Needs verify and will scale with model / KV layout — do not treat 8 GiB as a production
overflow budget. vLLM can also attach a second (storage) tier; #24 did not enable or
test SSD.
#vllm-rdna (Oct 7): the user-facing CLI on current extras / 0.30+ trees is
--kv-offloading-size <GiB> (optional --kv-offloading-backend native). Community parked
unused sessions with --kv-offloading-size 64 (64 GiB total across TP ranks, not per
GPU — see upstream cache config).
RAM-tier only; storage offload still untested on gfx1030. Hybrid Qwen may still need
--disable-hybrid-kv-cache-manager if the connector refuses HMA — that is a compatibility
trade, not a speed win.
Needs verify on a second host. #24 / --kv-offloading-size are in Hub
v0.31.0-extras; commits after the bake pin still want host venv.
See fork landscape and
Flash-Next KV.
#vllm-rdna (25–26 Oct): a community isolation that already left the #127 dynamic MTP
schedule unset still token-repeated with MTP-2 and then with MTP off. Strongest
suspect was CPU-memory / disk KV cache restoration. After KV offloading disabled
(no --kv-offloading-size, no disk KV tier), the same host ran 4 h+ without a loop
(VLLM_FA_RDNA2_GQA_DECODE=1 stayed on). #vllm-rdna (26 Oct follow-up): prefix cache +
CPU-memory KV offload stayed loop-free for 6 h+ when filesystem / disk KV offload
was off. Treat disk KV restore as the first A/B; RAM-tier parking is a weaker suspect
on that host — Needs verify. Details:
dynamic MTP.
#vllm-rdna (30 Oct): filesystem / disk KV at huge context can write terabytes
per day to NVMe (one 8× V620 host with ~1M-token disk offload). Community:
do not use consumer NVMe as a KV spill unless you accept that wear, or use
Optane. Optane guidance from the same thread: M.2 M10 class is slow;
prefer U.2 / PCIe / DIMM Optane. LMCache still has no working NVMe path
in-channel. Draft #148
adds experimental native hybrid KV paging — the PR itself says live paging
stalls; that is not a recipe. Prefer RAM-tier --kv-offloading-size or
no offload while isolating loops.
Repeating !!!! tokens (clocks / undervolt)
#vllm-rdna (27 Oct): a different token-repeat (!!!! / !!!!!!) showed up while
hunting the KV-restore loop. One host could only reproduce it with undervolt
larger than ~20 mV or core above ~2479 MHz. Another host at 2350 MHz core /
1050 MHz memory, no undervolt, stock 250 W did not see it. A third reported
2400 / 1075 MHz at 160 W. Hardware check suggested in-channel:
GpuZelenograd/memtest_vulkan
plus dmesg for ECC errors. Community / Needs verify — do not treat those clocks
as a wiki default. Power caps: Power tuning.
#vllm-rdna (Sep 16): public RAM-offload Flash-Next weight packs (example:
Minachist/Qwen3.8-Flash-Next-INT4-Mixed-AutoRound)
are a different topic. Recipes that need --no-enable-prefix-caching remain a non-starter
on gfx1030 vLLM — parking non-linear state in host RAM fights prefix cache.
#vllm-rdna (Sep 20): upstream vllm#57160
(mainline ROCm, not v0.29) uses private pinned tensors after cudaHostRegister failures on
large TP. #24 is the gfx1030-facing follow-through — do not assume mainline #57160 alone
fixes rdna_extras without the fork PR.
#vllm-rdna / #general (Sep 18–19): official rocm/pytorch images are the wrong place to
compile an LMCache connector (missing HIP / developer packages). Intended shape:
- Run
lmcache/standalonein CPU mode — see the standalone starter. - Add the LMCache connector to a bare-metal / venv
rdna_extrasserve, or patch it ontoblivioniag/vllm-rdna/blivioniag/rocm-rdna. - Do not use
lmcache/vllm-openaion gfx1030 — that image is the CUDA path.
NVMe-as-KV is the usual motive (low host RAM). Until someone posts a working gfx1030 compose, treat this as Needs verify.
#vllm-rdna (Sep 22) + #lmcache (Sep 23–24): still no working gfx1030 compose. Extra facts:
- Do not remake standalone — use
lmcache/standalone. - A community 0.5.6.dev wheel built against gfx1030; that is the library, not a proven
connector. Official LMCache kernels are CDNA-only; generic fallback still has Mamba align
problems (last known real blocker on
0.5.4). - Hybrid Qwen (MambaSpec + QSA FullAttentionSpec) creates multiple KV groups and needs HMA.
LMCacheConnectorV1is not HMA-capable (SupportsHMAmissing; vendored copy still asserts a single group) → startupValueError: Failed to promote local KV cache specs to one unified type. - A community LDS ~143 KB vs 64 KB claim is still Needs verify (LLM-sourced, no compile log).
Keep the standalone-CPU + connector shape; expect fork patches before this is a recipe.
Leftover vLLM / PLE workers after a restart
#vllm-rdna (Sep 18): killing the OpenAI API process is not enough. VLLM::Worker,
VLLM::EngineCore, and PleOffloadWorker can stay up and hold VRAM / the PLE sidecar. Before
relaunch, stop those leftover processes (match the process names, not a broad pattern) and wait
a few seconds. The 4× Flash-Next recipe already
cds to /tmp so GPU coredumps do not land in a checkout.
ROCR idle CPU spin (TheRock 7.14)
Symptom: after starting a multi-GPU vLLM serve on TheRock / ROCm 7.14 (ROCR 1.21), the host holds several CPU cores at high utilization even when the GPUs are idle (~one core per HIP process, plus more once RCCL initializes).
Root cause: AsyncEventsLoop / signal-wait paths busy-spin without backoff
(ROCm/TheRock#7051,
ROCm/ROCm#6522). Stock env knobs
(HSA_ENABLE_INTERRUPT, etc.) do not fix multi-GPU cases.
Fix: rebuild only libhsa-runtime64.so with the poll-backoff patch and LD_PRELOAD it. Step-by-step
for host builds (and note that recipe containers already bake the patch):
docs/rdna2/ROCR-CPU-FIX.md
in leapdragon/vllm-rdna2-qwen.
Pull latest recipe / container before re-debugging idle CPU.
rocprofiler register idle CPU (#108)
Symptom (#vllm-rdna 16 Oct 2026): a multi-GPU vLLM serve holds ≥1 CPU core per GPU even when
the GPUs are idle. This is not the TheRock ROCR AsyncEventsLoop busy-spin
(ROCR idle CPU).
Root cause: HIP/HSA rocprofiler client registration on every serve process. Merged
opengfx1030/vllm-rdna#108 (16 Oct):
tools/rdna/rdna_launcher_common.sh defaults ROCPROFILER_REGISTER_ENABLED=0.
Fix: stay on current rdna_extras HEAD (or export ROCPROFILER_REGISTER_ENABLED=0 yourself).
Hub v0.31.0-extras (11 Oct bake) lags this default. Profiling runs set =1.
Flash-Next stalls, graph corruption, KV accounting, PP3, and PLE issues are on Flash-Next troubleshooting.
Flash-Next troubleshooting
Symptoms that show up on the Qwen3.8 Flash-Next / rdna_extras path. Startup failures that also hit
Hub -extras (CUDA graphs, AMDSMI, RCCL version pin, first-boot compile) stay on
vLLM troubleshooting.
Serve lines: Flash-Next.
Do not enable dynamic MTP schedules
Merged #127 (18 Oct) gates #119 dynamic
MTP graph shapes behind num_speculative_tokens_per_batch_size. Fixed MTP-2
(RECIPE=flashnext-mtp2) is unchanged.
#vllm-rdna (22 Oct): a community isolation matrix blamed that opt-in schedule for
token-repeat loops (other flags, including --monokernel, passed alone). Leave the schedule
unset until open #125 lands. Do not
copy agent-generated draft_sample_method / per-batch-K dumps onto a daily serve.
#vllm-rdna (25–26 Oct): the same token-repeat symptom continued after the schedule
was off, and still looped with MTP off. Isolation then pointed at CPU / disk KV
restore, not MTP. One host: 4 h+ without a loop after KV cache offloading disabled
(--kv-offloading-size unset; no RAM/disk KV tier). Needs verify — see
KV offload.
Flash-Next long-prompt stalls
Symptom (Flash-Next fork / recipe containers, #vllm-rdna Sep 2026): short prompts decode fine, but
large prompts (tens of k tokens — agentic coding, session resume) take many minutes, timeout, or
appear wedged. Temps and power caps look healthy. Sep 15 community add-on: intermittent TTFT
from a few seconds to minutes (one host: up to ~300 s on a tiny prompt), with one or more GPUs
at 100% util but ~40 W — not a PCIe drop; looks like an RCCL / runner stall.
Community fix that unblocked 4× V620 hosts:
export VLLM_USE_V2_MODEL_RUNNER=0
One host then saw stable ~68 tok/s with dense INT8 + custom all-reduce; another (leapdragon
container, TP4) reported the stall gone after the same switch. #vllm-rdna Sep 15: MoE on
the 0.28 Flash-Next line wants V1 until upstream 0.29 (V2 becomes the default). The Flash-Next
docs already call V2=0 out. Official-extras authors note separate Dense-on-V2 fixes on the org
rebase — A/B both values on your image.
Also rule out thermal / power first (Power tuning), and measure expected prefill time (~1k tok/s class ⇒ ~40 s for 40k tokens, not minutes). Prefill campaign numbers: vLLM overview.
Flash-Next 128k prefill cliff
Symptom (#vllm-rdna Sep 2026, Intel AutoRound / draft
opengfx1030/vllm-rdna#5): prefill holds
~950 tok/s through 64k, then falls to ~375 tok/s at 128k while decode stays flat
(~48–55 tok/s). Looks like a scheduler / chunking misconfig more than a kernel cliff.
Community fix on that host: raise the batch cap:
--max-num-batched-tokens 4096
The suspected combination was enable_chunked_prefill=True with 2048 scheduled / batched
tokens. After 4096, 128k prose/code PP returned to the ~950 tok/s class (same 4× V620, FP16
KV, CPU PLE offload). See overview.
If output is wrong rather than just slow, stay on 2048 and switch graphs to PIECEWISE first — FULL-graph corruption.
If 128k is still slow after 4096, A/B V2 runner. Default PLE is
the embedded BF16 n-gram table. Historical INT4 sidecar paths were the incoherent ones;
merged #49 INT4 on the upstream path is
opt-in via VLLM_PLE_QUANT_DIR (rdna_extras HEAD, not Hub).
Flash-Next PP3 output corruption on rdna_extras
#vllm-rdna (Sep 15): Qwen Next / Flash-Next on 3× V620, PP=3 / TP=1, TheRock 10.0,
--enforce-eager. A leapdragon tree (with the same local PP patches) decoded correctly. The same
prompt on rdna_extras HEAD (community pin f663686) corrupted after ~3 chunks — first
request of a fresh server, ~4k-token prompt, only a fraction of tokens correct.
Disabling VLLM_USE_V2_MODEL_RUNNER, VLLM_USE_RDNA2_FA, VLLM_GDN_HIP_PREFILL, prefix cache, and
forcing single-chunk prefill (--max-num-batched-tokens 8192) did not fix it. Suspected area:
HIP GDN decode / prefix-cache interaction — not confirmed.
#vllm-rdna (Sep 16): a fresh rdna_extras pull still corrupted on PP3. One host still decoded
on a leapdragon tree. Community suspected
vllm/model_executor/layers/mamba/gdn/qwen_gdn_linear_attn.py (_forward_core_decode_non_spec /
gdn_decode_rdna2) — Needs verify. --max-num-seqs 4 (and later 6 with CUDA-graph capture
sizes [1,2,4,8]) reduced some TP corruption while debugging; it is not a PP3 fix.
What to do: on current rdna_extras HEAD, use the in-tree recipes RECIPE=flashnext-pp3 /
flashnext-pp3-mtp2 (merged #96, 13 Oct) —
PP3 recipes. Hub v0.31.0-extras (11 Oct bake)
does not include them. Older Sep 15–16 pins and the Sep 19 b33f9b6 KeyError stay below as
historical. A leapdragon image is only a fallback if you cannot clone HEAD. Do not treat an
arbitrary mid-September org pin as a drop-in for PP3.
Flash-Next PP3 graph KeyError on small prefill (b33f9b6)
#vllm-rdna (Sep 19): community test of
rdna_extras @ b33f9b6
with a production config transposed to PP=3 / TP=1 on 3× V620 (P2P distance PHB, V1
runner, FULL_AND_PIECEWISE + breakable graphs). Six PP3 patches for that pin are public in
alanoo81/flashnext-v620-pp3 patches/rdna_extras-b33f9b6
(write-up: docs/opengfx1030-report.md). This is a later pin than the
Sep 15–16 corruption — do not collapse the two bugs.
On that pin:
- CUDA graphs booted under PP.
- Deterministic NaN with prefix caching + concurrent requests was gone on their stab (seed 1, 45 iterations including 4-stream bursts, 0 corrupted outputs). That does not retract older pins.
Still blocking, PP only: the engine dies on the first prefill batch small enough to hit a
captured CUDA-graph size. A 74-token prompt failed, and so did the 240-token tail of a
4336-token prompt; 2048 and 4096 passed. Symptom: KeyError on the request id inside
scheduler.py update_from_output (model_runner_output.req_id_to_index, path
step_with_batch_queue). No worker-side error. Same failure with cudagraph_mode=PIECEWISE,
prefix caching off, and TunableOp off. Eager is fine.
Workaround — pin capture sizes so prefill stays eager:
--compilation-config '{"cudagraph_mode":"FULL_AND_PIECEWISE","cudagraph_capture_sizes":[1,2,4,8]}'
Community numbers with that workaround on the same host: prefill 1077 / 1611 tok/s at 4K / 16K, decode 27.8 tok/s versus 26.7 eager (graphs bought ~4% under PP). Needs verify.
Also on that run:
- Stage 0 OOM when
--kv-cache-memory-byteswent above about 1.5e9 (qsa_mqa_pagedon the first long prompt at 2.5e9). Do not copy the 4× recipe’s 7 GiB cap onto this PP3 pin. - Logged prefix-cache hit rate stayed 0.0%. Maintainer: the cache fix is in, but hit-rate reporting is unreliable — judge by repeat-prompt TTFT, not the counter. See prefix cache.
Flash-Next FULL-graph decode corruption
Symptom (#vllm-rdna Sep 16–17, rdna_extras Flash-Next, TP): serve starts, then output
corrupts after a few chunks or after turning features back on. Prefix cache + graphs can look
healthy, then fail again. Community isolated FULL CUDA graphs (decode) as the bad path;
PIECEWISE held.
Community workarounds that unblocked a 4× V620 host:
--compilation-config '{"cudagraph_mode":"PIECEWISE","compile_ranges_endpoints":[]}'
--max-num-seqs 6
--max-num-batched-tokens 2048
Also used while hunting: HSA_NO_SCRATCH_RECLAIM=1, --max-num-seqs 4 (stricter), and leaving
CUDA-graph capture sizes unpinned so vLLM chose [1,2,4,8]. A 16k/1k × 8 concurrency
snapshot was called a stable base before performance claw-back.
This does not replace PP3 corruption. Hub -extras 27B
can still use FULL_AND_PIECEWISE — see Configuration.
Sanitized serve line: Flash-Next PIECEWISE recipe.
The in-tree Flash-Next launcher (tools/rdna/serve_gfx1030_flashnext.sh, comment 18 Sep 2026) used
FULL_AND_PIECEWISE and stated that mode executed as PIECEWISE on ROCm
(rocm_full_executes_as_piecewise). It also attributed an earlier “corrupts at c=8” report to
probe artifacts (reasoning-parser field / reasoning-budget), not the graphs.
#vllm-rdna (Sep 23–25): merged vllm-rdna#17
measured FULL_DECODE_ONLY. Merged #20
(24 Sep) made compiled FULL_AND_PIECEWISE boot, but the ROCm FULL→piecewise redirect still
dropped decode ~63–70 → ~26–34 t/s. Keep-FULL commit
6c26c78d (#vllm-rdna Sep 24: “fixed
full and piecewise”) sets rocm_full_executes_as_piecewise → False on rdna_extras HEAD —
uniform decode keeps the FULL graph; mixed/prefill keep piecewise. Prefer
--compilation-config '{"mode":3,"cudagraph_mode":"FULL_AND_PIECEWISE",…}' on HEAD —
serve notes. Do not treat the
old launcher “executes as PIECEWISE” comment as current.
#vllm-rdna (Sep 17): VLLM_USE_BREAKABLE_CUDAGRAPH=1 (in that recipe) turns torch.compile off.
Community A/B on a 4× TP Flash-Next tree: ~39 t/s with breakable/eager vs ~55 t/s after compile
stayed on (VLLM_USE_BREAKABLE_CUDAGRAPH=0) plus a .contiguous() on a hyper-connection injection
view. Keep 1 until output is clean; then A/B 0 if you want the compile path back.
wvSplitK GPU fault after profile
#vllm-rdna (Sep 17), rdna_extras pin 50120e13b, TheRock 7.14.1, 4× V620 TP4: right after
the profile run, skinny GEMM wvSplitK_hf_sml_<half,…> (skinny_gemms) raised
HSA_STATUS_ERROR_EXCEPTION. VLLM_RDNA_DENSE_GEMV=1 avoided the fault on more than one host.
It does not fix PP3 corruption.
#vllm-rdna (Oct 6): on a different (27B fp16, no-fault) host, leaving wvSplitK enabled
improved decode concurrency vs stacked LLMM1 — vLLM troubleshooting.
Keep VLLM_RDNA_DENSE_GEMV=1 if you still hit this exception.
The GPU core dumps written on that path are several GB each and land in the process working
directory — start the server from a scratch dir (the 4× recipe already cds to /tmp).
Flash-Next vision startup / runtime OOM
Two different OOM modes (#vllm-rdna Sep 17–21 + the in-tree launcher):
| When | Cause | What to do |
|---|---|---|
| Startup | mm-profiling dummy image (~24.8M px) → vision SDPA math backend builds a ~64 GiB L×L fp32 score matrix | Set --mm-processor-kwargs '{"max_pixels":1605632}'. --limit-mm-per-prompt '{"image":1}' alone is not enough (count was already 1). |
| Runtime | vLLM may not reserve vision memory; a tight KV plus an image OOMs after a clean start | Leave more free VRAM / lower --max-model-len; community ~15–20 s per image. #general (Sep 21): vision + PP3 is especially tight. |
Leave --language-model-only --skip-mm-profiling if you do not need images. See
4× recipe vision notes.
Flash-Next hybrid KV log overstates capacity
#vllm-rdna (Sep 17): Flash-Next hybrid KV (main KV + GDN conv/SSM + PLE conv per page) can
overstate usable tokens by ~2.5×. Community measured vs log:
| What the log said | Measured single-request peak | Notes |
|---|---|---|
| ~411k tokens | ~166k (MTP=0) / ~100k (MTP=3) | One tree on 4× V620 |
| ~468k tokens | ~190k (100k prompt ≈ 52%; 150k ≈ 79%) | rdna_extras 50120e13b, no MTP |
A prompt between the real pool and --max-model-len can livelock: KV fills, resets, refills,
and num_preemptions stays 0. Size --max-model-len / --kv-cache-memory-bytes from a
measured peak (one long request, watch % usage), not the advertised token count.
Flash-Next prefix cache never hits (pre-fix HEAD)
#vllm-rdna (Sep 17): on rdna_extras before
e45dd5cb,
--enable-prefix-caching reported 0% hits on repeat Flash-Next / Qwen4Exp prompts (community
18k / 4.7k tests). The QSA compression ring returned length 0 at a group boundary, and the hybrid
coordinator took the min across groups.
Fix (fork-source): pull rdna_extras at or after that commit. Maintainer validation on 4×
V620 TP4 PIECEWISE: repeat ~18.8k prompt TTFT 12.2 s → 0.3 s, server hit rate 0% → ~50%.
A leapdragon tree without MTP still showed 97–99% hits from the second request; leapdragon + MTP
needed a second computation and
vLLM #54044 (reset Mamba align metadata after
profiling) before MTP + graphs + prefix cache stayed correct. #55506 /
741e5bc3
is a separate V2 mamba spec-decode block-table port — community: it did not fix the 0% /
!!! prefix-cache path on V1.
If you still see 0% hits, confirm the commit, then A/B --no-enable-prefix-caching only as a
correctness test (you lose the TTFT win).
#vllm-rdna (Sep 19): a PP3 run on b33f9b6 still logged 0.0% hits for the whole session.
Maintainer: prefix caching was fixed, but the reported hit rate can stay wrong. A 0%
counter is not proof the cache is dead — A/B repeat-prompt TTFT. Details:
PP3 graph KeyError.
#vllm-rdna (Oct 7): a DeepSeek harness (and one Pi host) showed 0% cache hits on every
turn while the server was actually reusing prefix. That is missing response metadata, not the
Sep 17 QSA 0% bug. Pass --enable-prompt-tokens-details (launcher token
prompt-tokens-details — serve scripts). Then A/B repeat-prompt TTFT
before chasing a cache rewrite.
FP8 KV rejected on QSA / Flash-Next
#vllm-rdna (Sep 22): --kv-cache-dtype fp8 fails at startup on current QSA Flash-Next rather
than falling back. Two independent gates:
- QSA backends are unquantized-only. Community traceback:
QSAStateBackend/ the AMD QSA owner declaresupported_kv_cache_dtypes = ["auto", "bfloat16", "float16"]. Backend selection recordskv_cache_dtype not supportedand never picks those layers — so there is no backend that can serve--kv-cache-dtype fp8(orint8_per_token_head) on this model. - ROCm FP8 KV path is AITER / CDNA. Separate hosts got an AITER and CDNA only refusal even off the QSA stack. Maintainer: fp8 KV used to work on older dense 27B and may be re-enableable; it is not unlocked on current extras.
Stay on fp16 KV. See Quantization — KV-cache dtype.
FA-RDNA2 only partial on Flash-Next / QSA
Symptom (#vllm-rdna, 13 Oct 2026): startup or profiler shows Triton on Flash-Next
full-attention layers even with --attention-backend RDNA_ATTN / VLLM_USE_RDNA2_FA=1. Community
also asked whether FA-RDNA2 is “dense only”.
What is going on:
- FA-RDNA2 is general attention (not dense-only). Dense / non-QSA models can use the normal backend selector.
- Flash-Next QSA full-attention layers set their backend to the Qwen4Exp QSA Triton owner
(
amd/qsa.py) and do not call the--attention-backendselector. Those flags have no effect on QSA layers. Triton in the path is expected. - Maintainer: a full FA/HIP switch needs QSA split-K attention and INT4 PLE n-gram
lookup in HIP (still open; community pointed at fork backlog work around
#64). Until then, FA coverage on Flash-Next stays partial.
What to do: do not A/B FA flags expecting Flash-Next QSA speedups. Keep day-to-day Flash-Next
recipes (PLE modes, graphs, TunableOp). Optional FA knobs
(VLLM_FA_RDNA2_GQA_MODE, VLLM_FA_RDNA2_SPLIT_DECODE) only matter on layers that actually select
FA-RDNA2 — env vars, fork.
AutoRound Flash-Next rejected: INCConfig / PLE embedding
Symptom (#vllm-rdna, 12 Oct 2026): latest rdna_extras fails to start
Intel/Qwen3.8-Flash-Next-W4A16-AutoRound
even when the PLE table is unquantized. Typical raise:
NotImplementedError: Qwen4Exp PLE embedding does not support quantization config INCConfig
vLLM loads that AutoRound checkpoint as INCConfig. Upstream
vLLM #59990 (merged 5 Oct) asks INC whether the
PLE layer is quantized and then uses the unquantized PLE method. #vllm-rdna: a cherry-pick of that
fix is in the fork queue — not confirmed on Hub v0.31.0-extras yet. Community also warned that
the upstream patch alone can store the BF16 PLE table as FP16 with this model config; wait
for the fork cherry-pick rather than applying the PR blindly.
What to do today:
- Prefer the day-to-day Flash-Next path:
wtdcodeAWQ +primitive-ai/Qwen3.8-Flash-Next-PLE-quantandPLE=bf16|int4|int4-disk— serve lines. - If you need the Intel AutoRound pack, stay on a known-good older pin / draft
#5until the cherry-pick lands, or watchrdna_extrasafter that merge. - Do not treat “AutoRound PLE is quantized” as the cause — the checkpoint marks
.*ple.*as 16-bit float.
Needs verify on gfx1030 after the cherry-pick.
Flash-Next: no P2P, or MTP blocks PLE
Two #vllm-rdna (Sep 18) reports that look like “this image is slow” but are env / feature
mismatches:
| Symptom | What to try |
|---|---|
| Custom all-reduce / PIX recipe fails to load or logs PYNCCL | Host has no GPU↔GPU P2P. Drop VLLM_FORCE_CUSTOM_ALL_REDUCE and the PIX/RCCL P2P block — those are env flags, not a different tree. Use VLLM_DISABLE_CUSTOM_ALL_REDUCE=1 — Configuration. #vllm-rdna (Oct 11): launcher P2P=0 (or VLLM_RDNA_AR=0) on the v0.31 serve script. |
| Bench ~800 PP / ~50 t/s, then Open WebUI / Hermes ~14 t/s | Client / harness, or MTP on while PLE fused decode is required. Community: MTP off recovered ~38 t/s decode and ~95% prefix reuse on a no-P2P host (plus --enable-prefix-caching). Treat tok/s as Community. |
| GDN decode on Triton, gfx1030 FP16 | Expected fallback when the HIP GDN path is not selected — confirm VLLM_RDNA_FORCE_FP16=1 and native GDN in logs before chasing P2P. |
llama.cpp troubleshooting
KV checkpoint crash on tensor split
Symptom: fatal error in ggml-backend-meta.cpp during warmup with tensor split.
Fix: --ctx-checkpoints 0. Known on stock llama.cpp and the RDNA2 fork. See
RDNA2 serving limits.
FlashAttention abort: max_blocks_per_sm > 0
Symptom: server aborts with something like:
fattn-common.cuh:…: GGML_ASSERT(max_blocks_per_sm > 0) failed
launch_fattn<256, …>
#llamacpp / community reports this on gfx1030 when the HIP occupancy query returns 0 for
the head-size 256 FA tile kernel (common on Qwen3.8 dense and some MoE paths).
Constraints that make this painful:
| Goal | Constraint |
|---|---|
Quantized V cache (q8 KV, etc.) | Requires --flash-attn on — no bypass |
--flash-attn off | Forces f16 KV |
--split-mode tensor | Effectively needs FA on many workloads |
Mitigations to try (in order):
- Prefer the RDNA2 fork build script (
./scripts/build-rdna2-portable.sh) so FA paths match the fork’s gfx1030 profile. - Keep the simplified env stack — especially
GGML_HIP_SAFE_STATE_IO=1(known ROCm FA crash workaround). Do not pile on everyGGML_HIP_GFX1030_*flag; that set can clash with the RCCL autotune path. See Serving. - If FA still aborts on head-256 models under TP: fall back to f16 KV + FA on only after a fork update / local occupancy patch, or temporarily use layer split for that model until FA occupancy is fixed upstream/fork-side.
DAX-backed mmap oopses amdgpu SVM
Symptom: loading a GGUF from an Optane / pmem dax=always mount with default mmap → kernel fault
in svm_range_dma_map_dev, process becomes unkillable, VRAM leaked on all cards, reboot required.
Fix: --no-mmap and/or --load-mode none whenever the model file lives on a DAX mount. Storage
only affects load time (community: Optane DAX ~4 GB/s vs NVMe hundreds of MB/s for a ~30 GB
GGUF); once weights are in VRAM, inference is unchanged. Great for swap-testing models; useless for a
single long-lived production load.
RCCL all-reduce fails (HIP “operation cannot be performed”)
Symptom: ggml_backend_cuda_comm_allreduce_nccl crash, NCCL WARN HIP failure.
Try in order:
- Confirm PCIe P2P is working.
- Set
NCCL_P2P_LEVEL=PHBorNCCL_P2P_DISABLE=1. - On the RDNA2 fork:
GGML_HIP_GFX1030_P2P_ALLREDUCE=offorGGML_CUDA_ALLREDUCE=none. - Check ACS — CPU root-port ACS can block GPU-direct P2P. “ACS off” is several bits, not one switch; clearing every bit has broken V620↔V620 on one host — ACS bits.
P2P enabled but slower inference
Bandwidth tests can pass while inference regresses on gen3 x4 or ACS-blocked topologies. A/B with
NCCL_P2P_DISABLE=1. See When P2P helps — and when it does not.
PSU dies the moment tensor-split prefill starts
Symptom: layer split is stable; --split-mode tensor kills power (no HIP error in logs). #llamacpp
traced this to PSU transients, not the kernels — especially old miner PSUs and Lenovo P620
proprietary GPU cables (that chassis PSU often only feeds two cards).
- Cap at 160 W or 140 W (Power Tuning).
- A/B card pairs — one slot pair can trip protection while others do not.
- Prefer 2 or 4 GPUs; TP3 has caused driver crashes after a “successful” run.
- Split GPU power off the motherboard PSU if the board only has two GPU power ports.
Dual-socket / NUMA is slow
Pin llama.cpp to one socket (numactl --cpunodebind=0 --membind=0) and keep all TP GPUs on that
socket. Crossing NUMA for tensor split is a known prefill killer — see
Host topology.
Vulkan RADV hard-crashes; AMDVLK is slow
#llamacpp: Mesa RADV can hard-reboot or crash the host on V620 llama.cpp; switching the ICD to
AMDVLK (VK_ICD_FILENAMES=/etc/vulkan/icd.d/amd_icd64.json) can get inference running but is
much slower. For multi-GPU --split-mode tensor, the community path is ROCm / HIP, not
Vulkan — tensor parallel needs RCCL. See Building llama.cpp.
If a new V620 hard-reboots a box that was stable with a 3080, read Slot power and PSU transients before chasing Vulkan ICDs.
Windows Unsloth / Vulkan is far below Linux ROCm
#general (Oct 10): a Windows host running Unsloth (bundled llama.cpp) over Vulkan
on 2× V620 (plus an RX 6800 for display) with Qwen3.8-27B Q8 reported about 12–13 t/s
decode (prefill not posted). Community: that is far below Linux ROCm two-card expectations
(~600–800 PP / ~60 decode without MTP, ~70–80 with MTP — ballpark, not a recipe).
Check, in order:
- Unsloth actually sees both GPUs.
- Model Settings → Advanced Options → GPU Offload / Layer Splitting is using both cards (community: Q8 + cache will not fit one 32 GB V620).
- A/B Q4_0 on a single V620 — that quant should fit one card with context left over.
This wiki’s day-to-day path is Linux ROCm, not Windows Vulkan. Unofficial Windows vLLM: resources. Needs verify.
#general (Oct 11): V620s do not work in WSL. On native Windows, llama.cpp was reported to
silently fall back to CPU for GPU↔GPU traffic (DMA mappings exist but AMD→other-vendor
direction failed). Community fix: install a Linux distro (Ubuntu / Fedora are the usual
documented hosts). Needs verify.
DFlash2 / sidecar crashes
Symptoms (#llamacpp Sep 2026):
HSA_STATUS_ERROR_MEMORY_APERTURE_VIOLATIONin a DFlashgemv_mmvq2_*kernel, then[dflash-sidecar] an illegal memory access was encounteredand ROCm abort.- Sidecar probe:
qwen35-mtp target mismatch: target GGUF model identity differs→ falls back off sidecar.
See Sidecar / DFlash gotchas: match
publisher families for target/draft GGUFs, keep --spec-draft-p-min 0, pull latest fork, A/B MTP.
MTP slot wedge: LCP / prompt-cache position desync
Symptom (#llamacpp, Sep 2026): llama-server stays up and the HTTP API returns 200, but no
tokens are generated (clients such as Hermes show 0 tok/s). Common on long agentic sessions
(>~40k tokens; community failures clustered around 32–89k). Restarting the process is not
required — a later new-context request often recovers the wedged slot.
Typical stderr fingerprint (M-RoPE / draft context):
W find_slot: non-consecutive token position … after … for sequence …
E init: the tokens of sequence … have inconsistent sequence positions:
- the last position stored in the memory module … is X = …
- the tokens … have a starting position of Y = …
for M-RoPE, it is required that the position satisfies: X < Y
E spec process: llama_decode(ctx_dft) head=0 failed rc=-1
E srv decode: failed to process speculative batch
X = Y and X > Y both show up. The main decode can accept the batch; the MTP draft
context (ctx_dft) is what rejects it.
This is not the same as the KV checkpoint crash.
Reporters already had --ctx-checkpoints 0. The trigger is the LCP / prompt-cache slot-reuse
path (selected slot by LCP similarity) plus --spec-type draft-mtp: a reused prefix is
re-spanned at a stale position while the draft context holds another. It also is not specific
to quantized KV — the same wedge was seen after switching KV from q8_0 back to f16.
Community setup that reproduced it daily: RDNA2 fork, 3× V620 tensor-split, Qwen3.8-27B
Quark-AWQ-MXFP4, --parallel 2, Flash Attention on, --spec-type draft-mtp --spec-draft-n-max 4,
--ctx-checkpoints 0.
Mitigations to try (in order):
- Turn MTP off for that slot / session (or gate it when logs show
non-consecutive token position). - Avoid prefix-cache reuse: new session /
--parallel 1, or force a fresh slot after a 200-with-no-tokens event. - Prefer Q6+ / Q8 long-session quants over Quark-AWQ-MXFP4 — see Sidecar / DFlash gotchas.
- Pull latest
edwinbrowwn/llama.cpp-rdna2and report the three-step fingerprint on#llamacppif it still wedges. - Community (
#llamacpp, Sep 13 2026): the same config stopped throwing the M-RoPEX < Ydraft error onlemonade-sdk/llamacpp-rocm(not the RDNA2 fork). Tok/s were about the same (~5% less PP in a casual log compare). Treat as an A/B, not a replacement for the gfx1030 fork.
If the hang is a failed tool call or a premature stop token (raw payload looks complete), that is a different class — inspect the harness payload before blaming MTP.
Concurrent decode collapses
Symptom: single-stream is ~35–50 t/s; with two overlapping generations (or a second prefill) decode falls to single-digit t/s.
Expected on V620 for many llama.cpp configs — see
Concurrent slots. Prefer separate instances /
GPUs over high --parallel for multi-agent.
Environment Variables & Quick Reference
WIP: vLLM and llama.cpp tables include Discord-sourced defaults — see Verification status.
A cheat-sheet of the settings that matter most when running ML workloads on gfx1030 / RDNA2.
Key environment variables
| Variable | Example | What it does |
|---|---|---|
HSA_OVERRIDE_GFX_VERSION | 10.3.0 | Makes non-Navi-21 RDNA2 cards run gfx1030 kernels. See override guide. |
HIP_VISIBLE_DEVICES | 0 | Restrict which GPUs a HIP program sees (hide an iGPU or pick one card). |
ROCR_VISIBLE_DEVICES | 0 | Same idea, at the ROCr runtime level. |
PYTORCH_ROCM_ARCH | gfx1030;gfx1100;… | Target arch(es) when building PyTorch/vLLM/extensions from source. The RDNA images bake gfx1030;gfx1100;gfx1101;gfx1150;gfx1151;gfx1200;gfx1201. |
AMDGPU_TARGETS | gfx1030 | Target arch(es) for CMake/HIP builds. |
TORCH_BLAS_PREFER_HIPBLASLT | 0 | Force PyTorch to use rocBLAS instead of hipBLASLt (works around Navi 21 hipBLASLt gaps). |
ROCM_PATH | /opt/rocm | Where ROCm is installed; used by many build systems. |
HSA_ENABLE_SDMA | 0 | Occasionally needed to work around DMA issues on some setups. |
vLLM on gfx1030 (#vllm-rdna)
| Variable | Example | What it does |
|---|---|---|
VLLM_TARGET_DEVICE | rocm | Pin the ROCm platform (Compose / CI; avoids CUDA autodetection). |
VLLM_ROCM_USE_AITER | 0 | Disable aiter fused kernels (CDNA-oriented; community default on RDNA2). |
VLLM_ROCM_USE_AITER_MOE | 0 | Disable AITER MoE (same reason). |
VLLM_RDNA_FORCE_FP16 | 1 | Force FP16 compute paths — avoids slow BF16 emulation on RDNA2. |
VLLM_USE_RDNA2_FA | 1 / 0 | Enable native RDNA2 FlashAttention on Hub -extras. Flash-Next / rdna_extras HEAD: community treated FA as WIP and A/B’d 0 (#vllm-rdna Sep 15). Flash-Next QSA layers ignore this — partial FA. |
VLLM_FA_RDNA2_GQA_MODE | subgroup | FA-RDNA2 prefill GQA path on rdna_extras (rdna_attn.py). Default subgroup uses fa_rdna2_prefill_paged_varlen_gqa; other values fall back. A/B only. |
VLLM_FA_RDNA2_GQA_DECODE | 1 | FA-RDNA2 GQA decode path. serve_rdna.sh sets this when ATTN=fa. Not a Flash-Next QSA lever. |
VLLM_FA_RDNA2_SPLIT_DECODE | 1 | FA-RDNA2 split-K decode (default on in rdna_attn.py). A/B only — not a Flash-Next QSA lever. |
VLLM_GDN_HIP_PREFILL | 1 | HIP GDN prefill. Merged #130 (19 Oct): Flash-Next recipes default 1. Set 0 to fall back to Triton/FLA. Older “disable to chase PP3 corruption” notes still apply as an A/B — it did not fix PP3. Hub v0.31.0-extras lags. |
VLLM_RDNA_ALL_HIP | 1 | Master HIP-kernel gate. #130 turns it on for Flash-Next HEAD recipes (with VLLM_RDNA_QSA_HIP and VLLM_RDNA_HC_PREFILL_HIP). Set 0 to restore Triton. EXL3 recipes unchanged. Not Hub. |
VLLM_RDNA_QSA_HIP | 1 | HIP QSA path. #126 (18 Oct) also routes the MonoKernel indexer here. Default on for Flash-Next HEAD after #130. |
VLLM_RDNA_HC_PREFILL_HIP | 1 | HIP hyper-connection prefill. Same #130 default-on set. |
VLLM_PP_LAYER_PARTITION | 17,18,13 | Uneven pipeline-parallel layer split. Community 3× Flash-Next + MTP (48 layers) left the last stage light for the drafter. Unset this in the PLE worker or it refuses (pp_size=1). |
VLLM_ROCM_MOE_PADDING | 0 | Do not pad routed-expert weights (3× MTP VRAM squeeze). |
VLLM_RDNA_AR | 1 | RDNA all-reduce. Library default off. Merged #22 (27 Sep) adds two-shot so serve scripts can leave VLLM_FORCE_CUSTOM_ALL_REDUCE=0. Failed self-test falls back to RCCL. A/B on your topology. Optional knobs: VLLM_RDNA_AR_MAX_KB, VLLM_RDNA_AR_ONESHOT_KB, VLLM_RDNA_AR_ALGO, VLLM_RDNA_AR_BLOCKS, VLLM_RDNA_AR_PACE. #vllm-rdna (Oct 11): on a host without PCIe P2P, set 0 or pass launcher P2P=0 (also sets NCCL_P2P_DISABLE=1). Merged #128 (19 Oct): one-shot honors a sticky abort and reports WEDGED instead of a silent RPC timeout — hang. |
VLLM_RDNA_AR_WAIT_MS | 120000 | One-shot wait bound (default 120 s). #128 reads the sticky abort on entry so a lost peer does not re-wait this bound on every later collective in the captured step. |
VLLM_ROCM_MOE_SKINNY_MAX_M | 16 | Opt-in HIP MoE row cap for concurrent MTP (9–16 token rows). Default 8. Merged #26. No single-chat gain. |
VLLM_RDNA_DENSE_GEMV | 1 | Skip skinny wvSplitK GEMM. #vllm-rdna Sep 17: mandatory on hosts that fault wvSplitK_hf_sml_* right after the profile run (HSA_STATUS_ERROR_EXCEPTION). GPU core dumps can be several GB in the process CWD — troubleshooting. Oct 6: on a no-fault 4× W6800X 27B fp16 host, leaving wvSplitK on beat stacked LLMM1 for decode concurrency — vLLM. |
VLLM_USE_BREAKABLE_CUDAGRAPH | 1 | Sets compilation mode=NONE (no torch.compile); GDN/FA/all-reduce run eagerly between graph segments. #vllm-rdna Sep 17: community ~39 t/s vs ~55 t/s with 0 + compile. The 4× PIECEWISE recipe still sets 1 for the stable path — A/B 0 only after graphs are clean. |
VLLM_PLE_QUANT_DIR | path/ples_int4 | Flash-Next INT4 PLE (primitive-ai/Qwen3.8-Flash-Next-PLE-quant). Launcher PLE=int4 loads the table in pinned RAM; PLE=int4-disk mmaps shards (MADV_RANDOM) so only the gather/dequant working set hits RAM. Directory must contain META.json. #announcements (11 Oct 2026): all three PLE modes tested. |
VLLM_PLE_CPU_OFFLOAD | 1 | PLE CPU sidecar (launcher PLE=int4-disk). Pair with VLLM_PLE_OFFLOAD_READY_TIMEOUT (launcher default 3600). Not the same as KV RAM offload (#24). |
PLE_OFFLOAD_PREFAULT | 0 / 1 | After GPU workers load, fault PLE table pages into RAM (default on). #vllm-rdna Oct 8: set 0 on low-RAM hosts so the sidecar does not compete with swap (community: ~22–28% slower tok/s vs prefault=1 on prose). Overlay / leapdragon trees use this unprefixed name; some other trees expose VLLM_PLE_OFFLOAD_PREFAULT. Not on org extras HEAD. Community: ~1:2 RAM:VRAM is enough for typical Flash-Next PLE; 32 GiB host RAM with 2× V620 is tight. |
VLLM_USE_V2_MODEL_RUNNER | 1 / 0 | V2 runner; #vllm-rdna reported +17% vs V1 on gfx1030 -extras. On Flash-Next, try 0 if long prompts stall — troubleshooting. |
VLLM_DISABLED_KERNELS | ExllamaLinearKernel,TritonW4A16LinearKernel | Force GPTQ onto RDNA2W4A16LinearKernel. |
VLLM_DISABLE_CUSTOM_ALL_REDUCE | 1 | Disable custom all-reduce (safer when P2P is broken / Ice Lake). |
VLLM_FORCE_CUSTOM_ALL_REDUCE | 1 | Force custom all-reduce when P2P works (#vllm-rdna PIX stack). #vllm-rdna Sep 24: crashed one whole server — avoid as default. Merged #22 is the two-shot rdna_ar replacement. Mutually exclusive intent with disable. |
NCCL_P2P_LEVEL | pix / PXB / PHB | RCCL P2P topology level — pix used with the force-custom stack. |
RCCL_P2P_NET_DISABLE | 1 | Pair with PIX custom all-reduce benches. |
RCCL_P2P_BATCH_ENABLE | 1 | Pair with PIX custom all-reduce benches. |
NCCL_PROTO | Simple | Protocol pin used in PIX custom all-reduce benches. |
VLLM_WORKER_MULTIPROC_METHOD | spawn | Worker spawn method — avoids fork issues with ROCm. |
VLLM_BATCH_INVARIANT | 0 | Batch-invariant mode forces hipBLASLt; keep off on gfx1030. |
GPU_MAX_HW_QUEUES | 2 | Launcher default 2. Merged #107 (16 Oct): Flash-Next TP4 recipes set 4 (neutral with fork kernels off; removes per-rank skew with rdna_mono_* / MonoKernel #94 in the graph). Other recipes keep 2 until measured. |
VLLM_ROCM_MONO_DECODE | 1 | Alias of --monokernel. Merged #94 (16 Oct). Opt-in Flash-Next persistent decode on gfx1030. Off by default. Needs V2 runner, PP=1, symmetric W4A16. Not Hub. MonoKernel. Follow-up #137 (24 Oct) improves MTP-2 MonoKernel fault containment. |
--kv-cache-dtype | int4_fp16_block | Merged #138 (25 Oct). Opt-in packed INT4 KV with FP16 block scales; native QSA read. Default FP16 unchanged. Not Hub. INT4 KV. |
VLLM_RDNA2_W4A8_SDOT4 / W4A8 | 1 | Int8-activation W4A8 prefill GEMMs (M≥33); decode stays W4A16. #140 (26 Oct): 27b-awq recipe defaults on on HEAD. Hub may lag. |
HSA_KERNARG_POOL_SIZE | 262144 | #vllm-rdna (17 Oct): community TP=8 host reclaimed ~14 GB of host RAM vs the 4 MB default (padded kernarg pool). c=8 @ 16k speed change was noise (under 1%). Maintainer: legacy; usual path is HIP_FORCE_DEV_KERNARG=1 (already in the common stack). Needs verify on 4×. |
ROCPROFILER_REGISTER_ENABLED | 0 | Merged #108 (16 Oct): launchers default 0 so HIP/HSA do not register a rocprofiler client on every serve process. #vllm-rdna (16 Oct): that registration spun ≥1 idle core per GPU. Profiling runs set 1. Distinct from ROCR busy-spin. |
HIP_FORCE_DEV_KERNARG | 1 | HIP kernel-arg in device memory (common #vllm-rdna stack). #vllm-rdna (17 Oct): prefer this over shrinking HSA_KERNARG_POOL_SIZE unless you are reclaiming host RAM on a large-TP box. |
RCCL_MSCCL_ENABLE | 0 | Disable MSCCL (stream-hungry; conflicts with Triton on some TP hosts). |
FLASH_ATTENTION_TRITON_AMD_ENABLE | TRUE | Enable AMD Triton FA fallback. Prefer RDNA_ATTN / VLLM_USE_RDNA2_FA on -extras. |
PYTORCH_TUNABLEOP_ENABLED | 0 / 1 | 0 for reproducible benches; 1 to load a qualified table (TUNING=0 in the #17 launcher). |
PYTORCH_TUNABLEOP_TUNING | 0 | Keep off in serve. Online tuning is a separate regenerate step. |
PYTORCH_TUNABLEOP_FILENAME | set by serve_rdna.sh | Hash-locked named profile (rocm7.14-rocblas5.5, 783 rows, or thin rocm10-rocblas5.6). The launcher picks it from librocblas.so.5. Override with TUNABLEOP_PROFILE; mismatch aborts — serve scripts, troubleshooting. |
PYTORCH_TUNABLEOP_HIPBLASLT_ENABLED | 0 | Disable hipBLASLt in tunableop (pair with TORCH_BLAS_PREFER_HIPBLASLT=0). |
VLLM_RDNA_MOE_RESIDENT | 1 | #17 resident W4A16 MoE path (pack once at load). #vllm-rdna Sep 29: leaving this off on latest rdna_extras dropped Flash-Next PP from ~2k → ~1450; restoring 1 recovered ~2k. |
VLLM_RDNA_DYNAMIC_PREFILL | 1 | Opt-in adaptive mixed prefill+decode (#36, merged 5 Oct). Must be the string 1. Default off — static --prefill-schedule-interval / --long-prefill-token-threshold stay as set. Leave off for max single-stream PP. — troubleshooting. |
VLLM_RDNA_DYN_FLOOR_TPS | 5.0 | Per-decoder tok/s floor the #36 controller must not break (default 5). Other VLLM_RDNA_DYN_* knobs (window, cap ladder, interval ceiling) are documented on the PR; restart required to change them. |
PYTORCH_ALLOC_CONF | expandable_segments:True | Reduces CUDA/HIP allocator fragmentation. |
VLLM_USE_DEEP_GEMM | 0 | Disable DeepGEMM (NVIDIA-oriented). |
VLLM_USE_FLASHINFER_SAMPLER | 0 | Disable FlashInfer sampler (not useful on RDNA2). |
VLLM_USE_AOT_COMPILE | 0 | Disable AOT compile on multi-GPU if cache replay causes device-bound errors. |
VLLM_DISABLE_COMPILE_CACHE | 1 | Disable torch.compile cache (pair with VLLM_USE_AOT_COMPILE=0 for TP stability). For faster recipe startups, invert: 0 + set VLLM_CACHE_ROOT to a persistent mount (#vllm-rdna Sep 2026). |
VLLM_CACHE_ROOT | /path/to/vllm-cache | Persistent vLLM compile cache root (Docker volume). |
SAFETENSORS_FAST_GPU | 1 | Faster safetensors → GPU weight load (common in #vllm-rdna / some Dockerfiles). |
TORCHINDUCTOR_COMPILE_THREADS | 1 | Limit inductor threads (stability during first-boot compile). |
llama.cpp RDNA2 fork (#llamacpp)
Prefer the short stack below. Long lists of GGML_HIP_GFX1030_* knobs are usually redundant with
HSA_OVERRIDE_GFX_VERSION=10.3.0 and can clash with RCCL autotune — see
Serving.
| Variable | Example | What it does |
|---|---|---|
HSA_OVERRIDE_GFX_VERSION | 10.3.0 | Required to activate the V620/gfx1030 native RDNA2 profile. |
HSA_NO_SCRATCH_RECLAIM | 1 | Avoid scratch reclaim issues on long-context runs. |
GGML_HIP_RDNA2_AUTO | 1 | Enable automatic RDNA2 kernel selection. |
GGML_HIP_SAFE_STATE_IO | 1 | Safer HIP state I/O; mitigates a known ROCm FA crash class (recommended default). |
GGML_TP_SHARDED_OUTPUT | 1 | Sharded output head for tensor parallel (TP2+). |
GGML_CUDA_ALLREDUCE | nccl | Use RCCL for tensor-parallel all-reduce (+10% tgen reported). |
GGML_HIP_GFX1030_P2P_ALLREDUCE | off / auto-expanded | P2P all-reduce tuning; set off if RCCL misbehaves. Optional — not part of the short stack. |
GGML_CUDA_DISABLE_GRAPHS | 1 | Disable HIP graphs (some benchmark profiles use this). |
SPEC_SIDECAR | 1 | Opt-in MTP/DFlash sidecar outside the main process (#llamacpp Sep 2026; pull latest fork). |
NCCL_P2P_LEVEL | PXB / PHB | RCCL P2P topology level for all-reduce. |
NCCL_P2P_DISABLE | 0 / 1 | Disable P2P in RCCL (fallback when topology is broken). |
vLLM compilation / CUDA graphs
| Flag | Example | What it does |
|---|---|---|
--compilation-config | '{"cudagraph_mode":"FULL_AND_PIECEWISE","compile_ranges_endpoints":[]}' | Enable CUDA graphs (preferred fast path on current -extras 27B images). |
--compilation-config | '{"cudagraph_mode":"PIECEWISE","compile_ranges_endpoints":[]}' | Flash-Next on rdna_extras (#vllm-rdna Sep 16–17): FULL decode graphs corrupt; use PIECEWISE. |
--compilation-config | '{"mode":"NONE","cudagraph_mode":"FULL","compile_ranges_endpoints":[]}' | Alternative graph mode without torch.compile. |
--compilation-config | '{"cudagraph_mode":"NONE"}' | Disable graphs entirely. |
--enforce-eager | — | Fallback: disable all graph capture. Use only when graphs crash. |
10.3.0is the magic value for gfx1030 because the target decodes asgfx+10(major)3(minor)0(stepping) →gfx1030.
V620 / gfx1030 PCI identity
Used by the tuning scripts to match the right board:
| Board | PCI device | Subsystem | 4-tuple |
|---|---|---|---|
| Radeon PRO V620 (reference) | 1002:73a1 | 1002:0e34 | 1002:73a1:1002:0e34 |
| RX 6900 XT / 6800 (gfx1030) | 1002:73bf | varies | — |
lspci -nn | grep '1002:73a1' # find V620 reference boards
Handy commands
rocminfo # full agent/GPU info; look for "Name: gfx1030"
rocminfo | grep -m1 -o 'gfx[0-9]*' # just the target name
rocm-smi # live clocks, temps, VRAM, power, utilization
rocm-smi --showmeminfo vram # VRAM usage
clinfo | grep -i board # OpenCL board name
/opt/rocm/bin/rocminfo | grep -i wavefront # confirm wave32 on RDNA2
VRAM rules of thumb (LLMs)
| Card VRAM | Comfortable 4-bit model size |
|---|---|
| 16 GB (RX 6800/6800 XT/6900 XT/6950 XT) | 7B–13B, some 14B |
| ~30 GB (PRO W6800 / V620, ECC on) | up to ~30B–34B |
| 32 GB (same cards, ECC off) | same class, extra KV / longer context |
Pro cards show ~30 GB until you disable ECC.
FP16 vs BF16
RDNA2 has no fast BF16. Always prefer FP16 for hot paths:
- PyTorch: pass
dtype=torch.float16. - vLLM:
--dtype float16(see Running vLLM). - The
rdna_extrasfork adds quantized (W4A16 / FP8) RDNA2 kernels to cut VRAM and sidestep BF16 entirely.
Verification status (WIP)
This wiki is work in progress. Pages expanded from Discord (
#vllm-rdna,#llamacpp,#general) and fork release notes mix solid facts, fork-source claims, and community benchmarks that have not been independently reproduced in this repo.
Legend
| Status | Meaning |
|---|---|
| Solid | Hardware fact, upstream/ROCm docs, or fork source code confirms the behavior exists. |
| Fork-source | Confirmed in opengfx1030/vllm-rdna rdna_extras commits (and historical personal-fork SHAs where noted); may still need a fresh -extras image build. |
| Community | Reported in Discord or by a fork author; plausible but not wiki-verified on our hardware. |
| Needs verify | Should be re-tested before treating as guidance (image lag, single-host bench, or opinion). |
| Opinion | Subjective quality/speed trade-off from community testing. |
Global gaps (read first)
| Topic | Status | Notes |
|---|---|---|
Docker -extras images vs extras HEAD | Needs verify | Hub v0.31.0-extras (11 Oct 2026) bakes from opengfx1030/vllm-rdna @ rdna_extras (commit pin in docker-bake.hcl). HEAD after that pin still wants clone + host venv. Older v0.27.1-extras* targets named the removed personal BlivionIaG/vllm clone. |
| Performance numbers (tok/s, × speedups) | Community | Unless marked Solid, treat throughput tables as single-host snapshots. |
| Env-var recipes | Community | Common stacks from Discord; A/B on your topology. |
| ROCm 7.2.1+ multi-card RCCL bug | Community | #vllm-rdna (fork author): stay on 7.2.0 or 7.14.0 |
vLLM (vllm/)
Flash-Next narrative lives in flash-next.md, serve commands in flash-next-serve.md, and
Flash-Next failure modes in troubleshooting/vllm-flash-next.md. Rows below still name the page
they were written against (recipes.md, overview.md, configuration.md).
onboarding.md
| Statement | Status | Verify how |
|---|---|---|
Hub v0.31.0-extras is day-to-day Docker | Community | #announcements 11 Oct 2026; Hub tags v0.31.0-extras / v0.31.0-extras-rocm7.14.0 dated 11 Oct |
rdna_extras = upstream vLLM 0.31.0 + RDNA port | Fork-source | #announcements 11 Oct; org default branch rdna_extras |
| Path A 27B AWQ docker run | Community | Same announcement + prior #vllm-rdna day-to-day model pick |
Path B serve_rdna.sh + PLE=int4 Flash-Next | Community | #announcements + #vllm-rdna Oct 11 launcher example |
P2P=0 for hosts without PCIe P2P | Fork-source | tools/rdna/serve_rdna.sh + #vllm-rdna Oct 11 |
running.md
| Statement | Status | Verify how |
|---|---|---|
| Image tag matrix | Needs verify | Docker Hub tags |
Hub v0.31.0-extras | Fork-source | #announcements 11 Oct 2026 + Hub push 11 Oct 15:14 UTC (same digest as v0.31.0-extras-rocm7.14.0). ROCm 7.14 / torch 2.12 / Triton 3.7.1. Flash-Next MTP-2 (BF16 + INT4-disk) served. |
Hub v0.28.0-extras | Historical | Sep 18 test tag. Prefer v0.31.0-extras. Source now rdna_extra/v0.28.0. |
PYTORCH_ROCM_ARCH list | Solid | vllm-rdna-docker build |
Prefer --dtype float16 | Solid | RDNA2 BF16 limitation |
Default smoke model cyankiwi/Qwen3.8-27B-AWQ-INT4 | Community | #vllm-rdna Sep 13 2026 day-to-day 27B pick |
recipes.md
| Statement | Status | Verify how |
|---|---|---|
Three stacks (Hub -extras / recipe GHCR / Flash-Next fork) | Community | #vllm-rdna Sep 2026; public READMEs |
Recipe image 0.27.1-rocm7.2.3-gfx1030 + preset: | Community | Recipe containers/README.md |
| 1× V620: prefer MoE; Flash-Next not 1-card | Community | #vllm-rdna Sep 13 2026 |
| Gemma 4 unfinished on gfx1030 vLLM | Needs verify | #vllm-rdna Sep 13 — single-thread reports |
Flash-Next weights wtdcode + primitive-ai PLE | Community | #vllm-rdna Aug 30 / Sep 13 |
| Sep 18 4× serve deltas (7 GiB KV, leftover workers, V2 blocked on Qwen4Exp) | Community | #vllm-rdna Sep 18 host-venv paste |
MTP draft experts W4A16 (quant_mtp_experts.py) | Community | #vllm-rdna Sep 18 + overlay README; 3× PP3 tok/s Needs verify |
PP3 b33f9b6 graph KeyError / 1.5e9 KV | Needs verify | #vllm-rdna Sep 19 — public overlay patches; not a 7 GiB 4× cap |
PP3 HEAD flashnext-pp3 / flashnext-pp3-mtp2 (#96 / #95) | Fork-source / Community | #96 merged 13 Oct. #general 13 Oct author-host 16k/1k: MTP-0 1848/38 c=1, 771/7.7 c=8; MTP-2 1866/70.9 c=1, 1071/10.1 c=4. Hub v0.31.0-extras lags |
| TP4 cyankiwi AWQ env block | Community | #vllm-rdna Aug 31 bench paste (paths sanitized) |
| Flash-Next 4× PIECEWISE serve (Sep 17) | Community | #vllm-rdna — GDN sanitizer 388a61b6f; ~3331/73 @ 16k/1k c=8 |
Flash-Next 4× #17 FULL_DECODE_ONLY (Sep 23) | Community | Merged opengfx1030/vllm-rdna#17; second host confirmed 16k PP |
| Flash-Next vLLM PP4 ~1950 PP / decode collapse | Needs verify | #vllm-rdna Sep 19 — same host returned to TP4 (~1550 PP; ~30–35 t/s MTP-2) |
QSA live-context #15 ~1.8–2.0k PP / ~54–73 TG (TP4 PP1) | Needs verify | #vllm-rdna Sep 20 author-host table + merged opengfx1030/vllm-rdna#15. Sep 21: other 4× hosts on #15 only got ~1.1–1.45k PP. The unpublished recovery is #17 (merged 23 Sep) |
| Recipe decode ~40–49 vs ~27 without TunableOp | Community | Recipe container README / troubleshooting |
configuration.md
| Statement | Status | Verify how |
|---|---|---|
| Recommended env block | Community | Discord default stack |
| Custom AR disable vs PIX force | Community | #vllm-rdna Aug 2026 — pick by P2P topology |
VLLM_USE_V2_MODEL_RUNNER +17% vs V1 | Community | #vllm-rdna bench comment (-extras) |
VLLM_USE_V2_MODEL_RUNNER=0 for Flash-Next long prompts | Community | #vllm-rdna Sep 2026 — stalls/timeouts fixed; ~68 t/s dense INT8 |
VLLM_USE_AOT_COMPILE=0 / VLLM_DISABLE_COMPILE_CACHE=1 | Fork-source | Multi-GPU TP workaround |
CUDA graphs preferred over --enforce-eager | Fork-source | TP allow_in_graph fix; needs verify on image |
ROCM_ATTN Triton hang | Community | Hours-long compile; use RDNA_ATTN |
| Throughput table (277/93/331 tok/s) | Community | Fork author, TP4, 4× V620 |
| Docker Compose ~24 t/s TP2 | Community | #vllm-rdna report |
| Cache sizes ~3 GB / ~700 MB | Community | Order-of-magnitude |
SAFETENSORS_FAST_GPU=1 | Community | #vllm-rdna Sep 2026 + AMD optimization docs |
Flash-Next TP4 GPU_MAX_HW_QUEUES=4 (#107) | Fork-source | #107 16 Oct; launcher default stays 2. Neutral with fork kernels off |
VLLM_CACHE_ROOT + compile cache on | Community | Flash-Next / recipe startups (~5 vs ~10 min) |
| Flash-Next ~580–700 PP / ~50–53 decode | Community | Early Sep recipe; superseded by prefill campaign below |
| Flash-Next ~1000–1400 PP / ~53–100+ decode | Community | #vllm-rdna Sep 4–7 + Sep 13 suite + Flash-Next RESULTS.md; host-dependent |
| Flash-Next container ~40 t/s vs llama.cpp ~18–19 | Community | #vllm-rdna Sep 2026 same-host comparison |
| Intel AutoRound Flash-Next ~962 PP / ~41–56 decode | Community | #vllm-rdna Sep 10–11 + draft opengfx1030/vllm-rdna#5; 4× V620; dirty PR |
--max-num-batched-tokens 4096 fixes 128k PP cliff | Community | #vllm-rdna Sep 11 — 375 → ~950 PP; A/B on your scheduler |
| Intel AutoRound ~75 GB / BF16 PLE ~95 GiB | Community | Publisher checkpoint + PR validation notes |
| Quantized group-16 INT4 PLE incoherent | Needs verify | Historical #vllm-rdna sidecar path — not #49. Known-good AutoRound benches used BF16 PLE |
| GDN varlen second-seq output bug | Fork-source | gdn_prefill_o_rdna2.cu in draft PR #5; concurrent prefill |
| Recipe ports / Hybrid gfx10 opt-in | Needs verify | Draft opengfx1030/vllm-rdna#6 — RDNA2 stays auto default |
| vLLM 0.29 defaults V2 runner | Community | #vllm-rdna Sep 11 (when Hub day-to-day was still 0.27.1); Sep 18 rdna_extra/v0.29.0 rebase. Day-to-day Hub is now v0.31.0-extras — re-A/B V2 on that line. |
No MTP on Hub v0.28.0-extras | Community | #vllm-rdna Sep 18 — MTP aimed at 0.29 / Qwen4Exp |
| MTP can block int4 PLE fused decode | Community | #vllm-rdna Sep 18 — A/B MTP off on no-P2P hosts |
MTP-2 ~0.73–0.85× vs MTP-0 after 700753d9 | Community | Author-host 4× W4A16 Flash-Next; #vllm-rdna Sep 25 “boots, still a loss”. 30632b2 (27 Sep) lifts c=8 but stays ~0.87× at 16k |
| ROCR 1.21 idle CPU spin on 7.14 | Community | TheRock#7051; patch in Flash-Next fork ROCR-CPU-FIX.md |
| EXL3 / Quark on gfx1030 | Needs verify | #announcements 11 Oct: EXL3 listed on v0.31.0 extras / RECIPE=27b-exl3 — still experimental. Sep 29–1 Oct: mul1 + v0.30 loader on rdna_extras HEAD GPU-run (215/215; 27B TP=4). Oct 2: mul1-tested only; 3inst untested. Quark still not Hub |
| Intel AutoRound W4A16 Flash-Next | Community | #vllm-rdna Sep 10–11 — draft PR #5; not in Hub -extras |
Official extras source is opengfx1030/vllm-rdna rdna_extras | Solid | #vllm-rdna Sep 2026 move; default branch rdna_extras; PRs go to the org. Current Hub extras bakes (v0.28 / v0.31) clone this repo |
Draft PRs #5 / #6 on org extras | Needs verify | #5 AutoRound closed unmerged (14 Sep); #6 recipe ports still open/draft — do not treat as released |
opengfx1030/vllm-rdna ready as published Docker | Fork-source | Bake repo opengfx1030/vllm-rdna-docker; Hub v0.31.0-extras published 11 Oct 2026 from org rdna_extras |
Flash-Next source is rdna_extras | Fork-source | #vllm-rdna Sep 14–15 cherry-picks + #announcements 11 Oct Hub bake served Flash-Next MTP-2. leapdragon tree is legacy container / docs |
| Org 0.28 rebase / Flash-Next cherry-picks | Historical | #vllm-rdna Sep 3–15 era; superseded by v0.31.0 release row |
| Flash-Next KV ~24 GiB ≈ 300k tokens | Community | #vllm-rdna Sep 14 — 4× 32 GB still tight. Sep 14 “128 GB RAM offload not enough” is the pre-#24 path |
| Flash-Next concurrency splits TG / tanks PP | Community | #vllm-rdna Sep 14 — ~70–80 t/s total vs ~70 single; PP ~500 |
| 2× V620 Flash-Next: llama.cpp not vLLM | Community | #vllm-rdna Sep 14 — RAM offload |
| vLLM 3-card → PP=3 (even TP) | Community | #vllm-rdna Sep 14 |
| Flash-Next V2=0: 100% util / ~40 W stall | Community | #vllm-rdna Sep 15 — TP4 leapdragon container; MoE wants V1 before 0.29 |
Flash-Next PP3: leapdragon OK, rdna_extras garbage | Needs verify | #vllm-rdna Sep 15–16 — historical pins. HEAD recipes #96 supersede leapdragon-only advice |
Flash-Next PP3 HEAD recipes #96 / #95 | Fork-source / Community | #96 merged 13 Oct: flashnext-pp3 / flashnext-pp3-mtp2. #general 13 Oct author-host table. Not Hub |
Flash-Next PP3 b33f9b6 small-prefill KeyError | Needs verify | #vllm-rdna Sep 19 — capture sizes [1,2,4,8]; NaN+concurrent gone on that pin only |
| Flash-Next FULL graphs corrupt; PIECEWISE holds | Needs verify | #vllm-rdna Sep 16–17 — TP rdna_extras; --max-num-seqs 4–6 + batched 2048 |
| Flash-Next 4× PIECEWISE serve ~3331 PP / ~73 TG | Community | #vllm-rdna Sep 17 — 16k/1k c=8; GDN sanitizer 388a61b6f; not Hub |
VLLM_RDNA_DENSE_GEMV=1 avoids wvSplitK fault | Community | #vllm-rdna Sep 17 — wvSplitK_hf_sml_* after profile; multi-GB coredumps |
| Flash-Next hybrid KV log ~2.5× high | Needs verify | #vllm-rdna Sep 17 — livelock between real pool and max-model-len |
VLLM_USE_BREAKABLE_CUDAGRAPH=1 disables compile | Community | #vllm-rdna Sep 17 — ~39 vs ~55 t/s A/B |
Prefix cache 0% before e45dd5cb | Fork-source | #vllm-rdna Sep 17 + opengfx1030/vllm-rdna commit; TTFT 12.2s → 0.3s |
vllm#55506 port 741e5bc3 | Fork-source | V2 mamba spec-decode tables; did not fix V1 0% / !!! |
| 3× leapdragon + org MoE HIP overlay | Community | #vllm-rdna Sep 17–18 — alanoo81/flashnext-v620-pp3; ~1078–2493 PP / ~57–63 TG |
| DeepSeek-V4 Flash INT4 + gfx1030 tree | Needs verify | #vllm-rdna Sep 17 — yiminyuan HF + gfx1030/v0.28.0; intended TP=4 PP=2. Oct 10: extras DSV4 expected after mixed-stall / CUDA-graph-range fix |
| No Q3 on vLLM Flash-Next | Community | #vllm-rdna Sep 17 — stay W4A16 / AWQ; EXL3 3bpw experimental |
--no-enable-prefix-caching KV offload non-starter | Community | #vllm-rdna Sep 16 — QSA/RAM weight packs; still prefer prefix cache. Native KV overflow is #24, not this |
| Intel AutoRound 32–128k ~1296–1393 PP / ~56–73 TG | Community | #vllm-rdna Sep 16 — 4× V620; pin 4c67bf6…; int8 decode-shadow quality |
QSA live-context bound merged on rdna_extras | Fork-source | opengfx1030/vllm-rdna#15 merged 20 Sep 2026; Hub -extras lags |
QSA #15 combined-stack ~1830–2040 PP / ~54–73 TG | Needs verify | PR recorded table + #vllm-rdna Sep 20 author-host; not reproduced on two other 4× hosts Sep 21 (~1.07–1.45k PP). The unpublished recovery is #17 |
QSA #15 public-merge prefill ~1.1–1.45k PP | Community | #vllm-rdna Sep 21 — two 4× hosts after #15 only |
V620 fast stack #17 merged | Fork-source | opengfx1030/vllm-rdna#17 merged 23 Sep 2026; resident W4A16 + Mamba #55450 + FULL_DECODE_ONLY |
#17 16k PP ~1958 / ~1983; second host ~1984 / ~1985 | Community | PR-head table + #vllm-rdna Sep 23 confirm after TunableOp regen |
| TunableOp rows locked to rocBLAS hash | Fork-source | rdna_extras/tunableop README; named profiles rocm7.14-rocblas5.5 (783) and rocm10-rocblas5.6 (70, thin); mismatch ~25% PP drop / first GEMM abort |
#20 PIECEWISE capture (FULL→piecewise redirect) | Fork-source / Community | Merged opengfx1030/vllm-rdna#20 (24 Sep); decode ~26–34 t/s while redirect was on |
Keep-FULL FULL_AND_PIECEWISE (6c26c78d) | Fork-source | rocm_full_executes_as_piecewise → False on rdna_extras HEAD; #vllm-rdna Sep 24; docs V620-FULL-AND-PIECEWISE.md |
#19 unquantized MTP drafter load | Fork-source | Merged opengfx1030/vllm-rdna#19 (24 Sep) |
MTP draft unbreak 700753d9 (amdsmi + local-argmax) | Fork-source | rdna_extras HEAD 25 Sep; MTP-2 boots, ~0.73–0.85× vs MTP-0 on author 4× host |
rdna_extra/v0.30.0 Qwen4 rebase | Needs verify | Branch exists (#vllm-rdna Sep 25); tip f87be4dc MoE capture-buffer fix. Not the day-to-day Flash-Next line |
v0.31.0 extras release (#47 closed) | Fork-source | #announcements 11 Oct 2026 + Hub blivioniag/vllm-rdna:v0.31.0-extras (same digest as v0.31.0-extras-rocm7.14.0). rdna_extras = upstream vLLM 0.31.0 + RDNA port. Old 0.28: rdna_extra/v0.28.0. Author 4× V620 TP=4 Flash-Next AWQ ~2000 PP / 45 (MTP-0) / 69 (MTP-2) TG / ~205 agg @ 8 users. PP3 recipes (#96) are HEAD-only — not in the 11 Oct Hub bake |
| Swift 1.5 Flash-Next AWQ / AutoRound | Community | #vllm-rdna Sep 25–27 — public HF packs; 3× ~1300 PP / ~45 TG Needs verify; AutoRound is 50-iter light, ~5% faster / more quantized; Sep 27 looping on one host |
GLM-5.3-Flash org #2 vs community 8× | Needs verify | #2 side branch runtime-unverified; #vllm-rdna Sep 30 local 0.30 fork ~32 t/s / 320–500 PP on 8× |
| Host-venv TP=2 cyankiwi 27B AWQ | Needs verify | #vllm-rdna Sep 26 — one source-build host; 29.5 t/s single / 46.9 t/s ×4 |
| Host-venv TP=2 Qwen3.8-27B fp16 + MTP ~40–48 t/s | Needs verify | #vllm-rdna Oct 6 — 2× V620; Swift 1.5 27B ~48 / ~70 two-instance |
#18 GPTQ BLOCK_KN_SIZE 128→256 | Needs verify | Open PR; hold for M>32…2048 sweep (#vllm-rdna Sep 24) |
#22 two-shot rdna_ar vs force custom AR | Fork-source | Merged 27 Sep; library default still off; A/B topology |
#23 PCIe P2P KV disagg prefill/decode | Needs verify | Open PR; local PLX-switch split — not a recipe |
Flash-Next 6× PP=3+TP=2 / PP=6 | Needs verify | #vllm-rdna Sep 24 — min 3 cards; no published 6× table |
| Qwen3.8-27B fp16 stock 0.29.0 TP4 W6800X Duo | Community | #benchmarks Sep 24 — 1k–255k ctx, no MTP; ~1394→560 PP / ~29→19 TG |
| Qwen3.8-27B fp16 vLLM 0.30.0 TP4 W6800X Duo ALU 0.9.4 MTP-2 | Community | #benchmarks Oct 10 — 512 gen; 1k ~1398 PP / ~66 TG; 255k ~546 / ~32; c=3 1k ~165 agg. Not a V620 recipe |
Flash-Next vision pixel cap (max_pixels=1605632) | Fork-source | rdna_extras tools/rdna/serve_rdna.sh vision-cap (old serve_gfx1030_flashnext.sh is an alias); --limit-mm-per-prompt alone is not enough |
| Flash-Next vision ~15–20 s/image + runtime OOM | Community | #vllm-rdna / #general Sep 21 — works with launcher flags; no reserved vision pool; PP3 especially tight |
Flash-Next FULL_AND_PIECEWISE executes as PIECEWISE on ROCm | Fork-source (historical) | Launcher comment 18 Sep 2026 + #20-era redirect. Superseded on HEAD by 6c26c78d (rocm_full_executes_as_piecewise → False) — prefer FULL_AND_PIECEWISE again |
| QSA fused MTP-3 draft decode no gain | Needs verify | #vllm-rdna Sep 20 — one host; prefill held ~2k |
INT8 decode shadows excluded from #15 | Fork-source | PR body; Discord ~42 → ~55 t/s without MTP is Needs verify / quality risk |
| vllm-rdna-qa playbook | Needs verify | #vllm-rdna Sep 17 — public repo; maintainer QA only |
| Flash-Next PP3 + MTP on 3× V620 | Needs verify | #vllm-rdna Sep 15 — leapdragon-era; local int8 patches. Prefer HEAD #96 recipes |
Upstream MTP under PP (vllm#46994) | Fork-source / Needs verify | Merged Sep 2026; absent from Hub 0.27.1 -extras. Re-check on Hub v0.31.0-extras / HEAD (PP3 still Needs verify) |
RDNA2W4A16MoEExperts raises concurrency | Community | #vllm-rdna Sep 15 — confirm kernel in logs |
| Native RDNA2 FA WIP on Flash-Next HEAD | Community | #vllm-rdna Sep 15 — A/B VLLM_USE_RDNA2_FA=0; Hub -extras still uses 1 |
Flash-Next QSA bypasses FA / --attention-backend | Community / Fork-source | #vllm-rdna 13 Oct — QSA Triton owner; FA not dense-only; full HIP QSA/PLE still open (#64 backlog). Knobs VLLM_FA_RDNA2_GQA_MODE / VLLM_FA_RDNA2_SPLIT_DECODE in rdna_attn.py |
rdna_ar not a recommended default | Community | #vllm-rdna Sep 15–24 — prefer simpler RDNA_AR over force custom AR; #22 merged 27 Sep (still default-off); one host crash on force custom AR |
| hippihx kernel zoo | Needs verify | #hippihx Sep 16 — public repo; not in published images |
| Upstream vLLM KV CPU/SSD offload ~1 t/s | Community | #vllm-rdna Sep 15 broken baseline. Superseded as the gfx1030 path by merged #24 (next row) |
RAM KV offload #24 (~0.4 s / ~190k; ~2.1 s reload) | Fork-source / Needs verify | Merged opengfx1030/vllm-rdna#24 (27 Sep); #vllm-rdna Sep 26–27. SSD tier untested. 8 GiB ≈ ~100k Needs verify. In Hub v0.31.0-extras |
--kv-offloading-size RAM parking | Community / Needs verify | #vllm-rdna Oct 7 — community --kv-offloading-size 64 (GiB total across TP). Storage tier still untested |
| KV offload restore token-repeat loops | Community / Needs verify | #vllm-rdna 25–26 Oct — loops survived MTP off; 4 h+ clean after KV offload disabled |
MTP draft_sample_method=probabilistic when temp>0 | Community | #vllm-rdna Oct 8 — required on current rdna_extras MTP-2; greedy/local-argmax is the default |
PLE_OFFLOAD_PREFAULT=0 low-RAM | Community / Needs verify | #vllm-rdna Oct 8 — ~22–28% slower vs prefault=1 (prose). Unprefixed overlay name; ~1:2 RAM:VRAM OK; 32 GiB + 2× V620 tight |
Skinny HIP MoE 9–16 rows #26 | Fork-source / Community | Merged 27 Sep; VLLM_ROCM_MOE_SKINNY_MAX_M=16; +11% concurrent regular-text. No single-chat claim |
MTP draft graph 30632b2 | Fork-source | 27 Sep; +18% / +5% at c=8 1k / 16k; still ~0.87× vs MTP-0 at 16k |
| Mixed prefill+decode ~1–6 t/s | Community | #vllm-rdna Sep 27–29 — decode-only 2 streams OK; mixed cliff. Static --prefill-schedule-interval / --long-prefill-token-threshold trade PP for mixed decode. Sep 29: unset those flags for max single-stream PP |
Adaptive prefill #36 (VLLM_RDNA_DYNAMIC_PREFILL=1) | Fork-source / Needs verify | Merged opengfx1030/vllm-rdna#36 (5 Oct). Default off. #vllm-rdna Oct 4–5: ~25 t/s burst at 3 decode + 1 prefill; author Oct 5 recovered below 500 → ~1100 mixed PP. Synthetic benches called a poor measure. In Hub v0.31.0-extras (opt-in) |
| wvSplitK vs stacked LLMM1 concurrency | Community / Needs verify | #vllm-rdna Oct 6 — 4× W6800X Qwen3.8-27B fp16 decode-only; C2 ~40 → ~56 t/s. Keep VLLM_RDNA_DENSE_GEMV=1 if the Sep 17 fault still hits |
| Qwen3.8-27B fp16 2× V620 TP=2 MTP ~40–48 t/s | Community / Needs verify | #vllm-rdna Oct 6 — no quant; Swift 1.5 27B tune ~48 single / ~70 two-instance. Not Flash-Next |
VLLM_RDNA_MOE_RESIDENT=1 missing tanks Flash-Next PP | Community | #vllm-rdna Sep 29 — latest extras ~2k → ~1450 PP with resident MoE off; 1 recovered ~2k |
EXL3 mul1 port #32 + HEAD loader | Fork-source / Needs verify | #vllm-rdna Sep 29–30 + rdna_extras 30 Sep–1 Oct — mul1 / K=1..8 GPU-run (215/215 tests; 27B 3.00 bpw TP=4 graphs). Author-host 74315f4 1k/512 ~18.9 / ~81.8 t/s; 16k/1k ~13.7 t/s / ~830 PP. Not Hub. Oct 2: HEAD mul1-tested only; 3inst untested |
| GLM-5.3-Flash AWQ 8× TP=8 ~32 t/s / 320–500 PP | Community / Needs verify | #vllm-rdna Sep 30 — wtdcode/GLM-5.3-Flash-AWQ-W4A16 on a local 0.30 fork; 262k + vision; org #2 still unverified side branch |
| W4A8 vs W4A16 | Needs verify | #vllm-rdna Sep 29 explore #9; Oct 1: in HEAD (W4A8=1) not much faster (context room). Oct 9: 0.31-line kernel called somewhat competitive vs W4A16 — not a recipe |
FA-RDNA2 #28 / split-decode #29 | Needs verify | #28 merged 28 Sep without gfx1030 GPU runs; #29 draft, stacked, also untested |
Two-shot rdna_ar #22 | Fork-source | Merged 27 Sep; library default still off; A/B topology |
vllm#57160 private pinned CPU KV tensors | Needs verify | #vllm-rdna Sep 20 — mainline ROCm; gfx1030 follow-through is merged #24, not this PR alone |
| LMCache RDNA Docker integration | Needs verify | #lmcache Sep 23–24: 0.5.6.dev wheel built; official kernels CDNA-only; hybrid Qwen HMA + LMCacheConnectorV1 not HMA-capable. Still no working compose |
| Upstream vLLM 0.28 / 0.30 gfx1030 support | Needs verify | Official 0.28–0.30 still omit Navi 21 (#general Sep 22: 0.30 + ROCm 10.0). Keep extras |
quantization.md
| Statement | Status | Verify how |
|---|---|---|
GPTQ → RDNA2W4A16LinearKernel | Fork-source | Startup logs |
AWQ dense → RDNA2W4A16LinearKernel | Fork-source | Commits 73eb04a/5ac31e4; needs verify on image |
| Older AWQ ~4–5 t/s (Triton) | Community | True on old images only |
| KV cache prefer float16 | Opinion | Community quality / agents |
int8_per_token_head vs fp8 | Community | Faster TG than fp8 in limited older #vllm-rdna testing; not the QSA path |
QSA / Flash-Next --kv-cache-dtype fp8 startup fail | Community | #vllm-rdna Sep 22 — QSA backends unquantized-only + AITER/CDNA gate |
| KVarN | Community | Skip for tool calling |
| MTP acceptance ~0.25 | Community | Model-dependent |
| MTP-2 hurts high concurrency (35B-A3B) | Community | TP4 #vllm-rdna 4-cell matrix |
| INT4 vdot2 fp16 dequant | Solid | ISA + fork code |
Qwen3.8-27B AWQ needs head_size=256 | Fork-source | Same as fa_rdna2 commit; confirm on image |
| GDN hybrid ~93/331 tok/s | Community | Fork author bench |
| EXL3 9B / Quark W4A16 | Needs verify | #vllm-rdna Sep 2026 — experimental; Sep 19 3inst-only; Sep 24 v0.29.0 mul1; Sep 29–1 Oct HEAD mul1 GPU-run (27B 3.00 bpw TP=4). Oct 2: mul1-tested only; public quark75 27B mul1; calibrated 3inst Flash-Next untested. Not Hub |
| INT8 KV (not decode shadows) | Needs verify | #vllm-rdna Sep 23–24 — community testing; QSA backends still unquantized-only |
| HIP MoE non-deterministic vs Triton | Needs verify | #vllm-rdna Sep 19 — ~3.5% top-token drift; Sep 30 fp32 deterministic path described as opt-in (perf cost); flag name not posted |
| Intel AutoRound W4A16 Flash-Next | Community | #vllm-rdna Sep 10–11 + draft opengfx1030/vllm-rdna#5; Sep 20 QSA #15 used this pack + BF16 PLE (not wtdcode + PLE-quant) |
| Swift 1.5 Flash-Next AWQ first-look ~1300/45 on 3× | Needs verify | #vllm-rdna Sep 25–27 — public ukisai packs; AutoRound 50-iter vs Intel 200; Sep 27 AutoRound looping |
INT8 decode shadows not in QSA #15 | Fork-source | #vllm-rdna Sep 20 — excluded from merge; quality loss already noted Sep 16 |
Asymmetric W4A16 MoE #98 | Fork-source | #98 merged 14 Oct — native experts for asymmetric compressed-tensors (e.g. cyankiwi/*-AWQ-INT4). 8-bit still Triton. Not Hub |
fork.md
| Statement | Status | Verify how |
|---|---|---|
Fork landscape: official opengfx1030/vllm-rdna rdna_extras; Hub v0.31.0-extras current | Solid | Org repo + default branch; #announcements 11 Oct 2026 Hub bake. leapdragon is legacy container/docs |
| Consolidation / 0.28 gap audit | Community | #vllm-rdna Sep 3–7 channel notes; treat as WIP |
| No WMMA on RDNA2 | Solid | Architecture |
| Kernel file list | Solid | Fork tree (rdna_extras) |
fa_rdna2 head_size=256 | Fork-source | Commit 03b2d91 |
Public extras fa_rdna2 dropped FP16 pieces | Community | #vllm-rdna Sep 22 — maintainer focused on W4A16 validation |
2kiss/flash-attention-rdna2 | Needs verify | #vllm-rdna Sep 22–24 — independent kernel; stale; org fa_rdna2 currently disabled after #17 |
| GDN decode ~9.3× vs Triton | Community | Fork microbench |
| GDN full HIP prefill chain | Fork-source | Commits 69d2efe, b53a7a2c |
TP allow_in_graph fix | Fork-source | Commit b583d64 |
| HIP MoE non-deterministic (~3.5% top-token drift) | Needs verify | #vllm-rdna Sep 19 — Triton MoE bit-identical; Sep 30 fp32 deterministic opt-in (perf cost); no public flag name |
| QSA live-context prefill bound | Fork-source | Merged opengfx1030/vllm-rdna#15; Python-only scoring width change |
Upstream vllm#57160 CPU KV offload pin | Needs verify | #vllm-rdna Sep 20 — mainline, not 0.29; #24 is the gfx1030-facing follow-through |
Adaptive prefill #36 | Fork-source / Needs verify | Merged 5 Oct; #vllm-rdna Oct 4 community mixed-load notes. In Hub v0.31.0-extras (opt-in) |
MoE expert DRAM cache #37 | Needs verify | Draft opengfx1030/vllm-rdna#37; #vllm-rdna Oct 4; no gfx1030 tok/s |
| v0.31.0 extras release | Fork-source | #announcements 11 Oct + Hub v0.31.0-extras. Three PLE modes tested. Author Flash-Next benches above. |
PP3 Flash-Next #96 / #95 | Fork-source / Community | #96 merged 13 Oct; #95 int8 row-chunk shadows. Author-host 16k/1k Community |
Prefix-cache off #97 | Fork-source | #97 merged 14 Oct — ENABLE_PREFIX_CACHING=0 now --no-enable-prefix-caching |
Asymmetric W4A16 MoE #98 | Fork-source | #98 merged 14 Oct |
Flash-Next TP4 HW queues #107 | Fork-source | #107 merged 16 Oct — GPU_MAX_HW_QUEUES=4; launcher default 2 |
rocprofiler register #108 | Fork-source / Community | #108 merged 16 Oct; #vllm-rdna idle ≥1 core/GPU. Distinct from ROCR TheRock#7051 |
Flash-Next MonoKernel #94 | Fork-source | #94 merged 16 Oct; --monokernel / VLLM_ROCM_MONO_DECODE=1; off by default; not Hub; recipes do not enable yet |
#94 same-session ITL table (4× TP4) | Fork-source | PR body 16 Oct — ITL −6% to −13%; MTP-2 decode tok/s follows acceptance. Use ITL |
| MonoKernel second-host PP cliff / 100% VRAM | Community / Needs verify | #vllm-rdna 16 Oct — TunableOp suspected; author-host PP stayed >2.1k |
| Flash-Next vLLM 2-card still does not fit | Community | #vllm-rdna 16 Oct — MonoKernel does not change that |
| Triton 3.9+ drops RDNA1/RDNA2 | Community | #vllm-rdna 17 Oct — stay on bake 3.7.1 / 7.2 pin 3.5.1 |
HSA_KERNARG_POOL_SIZE=262144 ~14 GB host RAM | Community / Needs verify | #vllm-rdna 17 Oct — TP=8; c=8 16k under 1%. Prefer HIP_FORCE_DEV_KERNARG=1 |
| PP3 13 Oct table not re-benched after later HEAD | Community | #vllm-rdna 17 Oct — snapshot, not a current-HEAD guarantee |
MonoKernel QSA HIP #126 | Fork-source | #126 merged 18 Oct; --monokernel indexer in HIP; default path unchanged |
Dynamic MTP opt-in #127 | Fork-source / Community | #127 merged 18 Oct; #vllm-rdna 22 Oct leave num_speculative_tokens_per_batch_size unset (repeat loops) |
rdna_ar sticky abort #128 | Fork-source | #128 merged 19 Oct — WEDGED instead of silent RPC timeout |
HIP set default-on #130 (closes #99) | Fork-source | #130 merged 19 Oct; Flash-Next recipes HIP on; ITL −6 to −8% without --monokernel. Not Hub |
Non-mono graph hang #131 | Fork-source | #131 merged 19 Oct — no aux-stream SharedExperts in CUDA graphs on gfx10x |
Flash-Next DFlash2 #132 | Fork-source | #132 merged 21 Oct; RECIPE=flashnext-dflash2; MTP-2 faster in PR A/B. Not Hub |
| DFlash2 vs MTP-2 agentic | Community / Needs verify | #vllm-rdna 22 Oct — maintainer MTP-2 still ahead; DFlash2 can win short / single-user |
EXL3 Flash-Next #117 | Fork-source | #117 merged 17 Oct; RECIPE=flashnext-exl3 / PLE=exl3; MTP=0. Not Hub |
MTP-2 MonoKernel #137 | Fork-source | #137 merged 24 Oct — sticky-fault containment; still opt-in --monokernel. Not Hub |
INT4 KV int4_fp16_block #138 | Fork-source | #138 merged 25 Oct — opt-in; native QSA path; other backends refuse. Not Hub |
| INT4 KV + MonoKernel | Needs verify | #138 documents non-mono QSA; mono combo not claimed |
INT8 KV restore #71 | Needs verify | Draft; #vllm-rdna 21 Oct maintainer priority |
fp16 SSM + W4A8 default #140 | Fork-source | #140 merged 26 Oct; 27b-awq W4A8=1; author-host 860→1075 PP / 42.5→52.3 agg. Not Hub |
| HP Z6 G4 slot-5 PSP / fan PWM | Community / Needs verify | #motherboard 18–23 Oct — BIOS factory reset unstuck blowers; slot 5 PSP load kdb failed! unresolved |
| DeepSeek-V4 correctness write-up | Community / Needs verify | #vllm-rdna 21 Oct — community fork of rdna_extras; in-tree dsv4-flash still Needs verify |
fork-progress.md
| Statement | Status | Verify how |
|---|---|---|
| Snapshot dated 26 Oct 2026 | Fork-source / Community | Public merges on rdna_extras + #announcements / #vllm-rdna |
Hub v0.31.0-extras feature set | Fork-source | #announcements 11 Oct |
HEAD table (#94–#140) | Fork-source | Merged PR dates on opengfx1030/vllm-rdna |
| Open backlog rows | Needs verify | Draft/open PRs — not recipes |
host-venv.md
| Statement | Status | Verify how |
|---|---|---|
7.2.0 index download.pytorch.org/whl/rocm7.2, torch 2.12.0, triton 3.5.1 | Solid | vllm-rdna-docker base-rocm720 |
7.2.0 host paste also had triton-rocm==3.7.1 | Community | #general 1 Aug 2026 |
7.14.0 index repo.amd.com/rocm/whl-multi-arch/, torch 2.12.0+rocm7.14.0, triton 3.7.1 | Solid | docker-bake.hcl base-rocm714 |
Published 7.14.0 tag described as PyTorch 2.13.0 | Solid (bake) / stale README | docker-bake.hcl base-rocm714 pins 2.12.0+rocm7.14.0; wiki Running matches bake. Docker-repo README 2.13.0 cell is stale |
pytorch.org/whl/rocm7.14 has no cp312 x86_64 torchaudio | Community | #vllm-rdna 21 Sep 2026 |
Device wheels rocm-sdk-device-gfx1030 + amd-torch-device-gfx1030 | Solid | Dockerfile.base INSTALL_ROCM_SDK_DEVICE=1 |
Missing device wheels → hipErrorInvalidImage on index torch | Fork-source | Dockerfile.base comment |
[device-gfx1030] is only an extra on multi-arch index wheels | Solid | TheRock device extras; source wheels have no such extra |
From-source gfx1030 wheels: install the .whl, no device extra | Community | uv warning on ~/wheels/rdna2/ (torch==2.12.0+git6bbd260) |
| FA allowlist drops gfx1030; Triton FA at runtime | Solid | Dockerfile.base |
causal-conv1d pin 4f6ae4e + HIP_ARCHITECTURES | Solid | Dockerfile.vllm |
Do not pass --torch-backend=rocm7.14 | Community | That flag selects the PyTorch index that failed on 21 Sep |
_rocm_sdk_* LD_LIBRARY_PATH | Community | #vllm-rdna serve blocks; same dirs as the image ldconfig |
| Triton 3.9+ drops gfx1030 | Community | #vllm-rdna 17 Oct — do not bump past 3.7.1 on 7.14 / 3.5.1 on 7.2 |
serve-scripts.md
| Statement | Status | Verify how |
|---|---|---|
tools/rdna/serve_rdna.sh is the single entry point; old serve_gfx1030_*.sh names are aliases | Fork-source | tools/rdna/ on rdna_extras and rdna_extra/v0.31.0 (moved from scripts/) |
Recipe deltas (flashnext-mtp2 / mtp0 / flashnext / flashnext-dflash2 / 27b-awq / 27b-exl3 / dsv4-flash / full) | Fork-source | tools/rdna/recipes/*.env. flashnext-dflash2 is #132 (21 Oct); Hub lags |
| MTP=2 wins at 8×16k/1k c=8; MTP=0 wins at 8×1k/512 c=8 | Fork-source | Recipe file comments dated 2026-09-27. Tok/s tables stay on Flash-Next serve lines |
Flash-Next PLE bf16 / int4 / int4-disk | Fork-source | #announcements 11 Oct + serve_rdna.sh PLE=. INT4 table ~30 GB; #vllm-rdna Oct 11 corrected inflated ~90 GB host-RAM figure (~35 GB working set). Disk mmap via VLLM_PLE_CPU_OFFLOAD=1. Speed at parity on author 4× V620. |
Drop VLLM_USE_BREAKABLE_CUDAGRAPH=1 / do not force VLLM_RDNA_FUSED_HC=0 on Flash-Next | Community | #vllm-rdna Oct 10 (agent pastes). dsv4-flash still sets breakable graphs. |
PRINT=1 prints env, command, and TunableOp profile and does not launch | Fork-source | serve_rdna.sh header; RECIPE is an argument, MODEL and VENV stay required |
TunableOp auto-select by librocblas.so.5 hash; TUNABLEOP_PROFILE mismatch aborts | Fork-source | tunableop/README.md + profiles.json + tools/rdna2_028/tunableop_env.sh: rocm7.14-rocblas5.5 (783 rows, f30bb442e9b5), rocm10-rocblas5.6 (70, c27e2252cc7a) |
| ROCm 10 / rocBLAS 5.6 needs no launcher change; 70-row profile is thin | Fork-source | Same helper. Untuned GEMMs use the rocBLAS heuristic. Validated serve numbers are gfx1030 + ROCm 7.14. Extend rows with tunableop_rows_pipeline.sh + verify_tunableop_lookup.py |
27B EXL3 recipe defaults EAGER=1 and HIP_VISIBLE_DEVICES=4,5,6,7 | Fork-source | tools/rdna/recipes/27b-exl3.env (bring-up; second PLX on an 8-GPU chassis) |
Launcher is foreground (exec); stale kill is scoped to VLLM_CACHE_ROOT | Fork-source | serve_rdna.sh + rdna_kill_stale in tools/rdna/rdna_launcher_common.sh |
flashnext-pp3 / flashnext-pp3-mtp2 | Fork-source | #96 13 Oct; partition 16,16,16 / 17,17,14. Not Hub |
ENABLE_PREFIX_CACHING=0 → --no-enable-prefix-caching | Fork-source | #97 14 Oct |
Flash-Next TP4 GPU_MAX_HW_QUEUES=4 | Fork-source | #107 16 Oct; launcher default stays 2 |
ROCPROFILER_REGISTER_ENABLED=0 | Fork-source | #108 16 Oct; rdna_launcher_common.sh |
EXTRA_ARGS="--monokernel" / VLLM_ROCM_MONO_DECODE | Fork-source | #94 16 Oct; off by default |
llama.cpp (llama-cpp/)
building.md
| Statement | Status | Verify how |
|---|---|---|
| Fedora + ROCm 7.2.0 build | Solid | Standard recipe |
Ubuntu + ROCm 7.14 stock HIP cmake (GGML_HIP_RCCL / GRAPHS / NO_VMM) | Community | #llamacpp / #general Oct 13 — 2× V620 Precision 5820; ~3–6% vs default mainline |
--spec-draft-device on TP2+ | Community | Discord pattern |
rdna2-benchmarks.md
| Statement | Status | Verify how |
|---|---|---|
| All benchmark tables | Community | Author-reported; run your own before/after |
| Stock vs fork +56.8% (Qwen3.8-27B Q6_K MTP) | Community | #llamacpp matched A/B, byte-identical outputs |
| Q4_0 / Q8_0 fastest on fork | Community | #harnesses / #llamacpp |
| Long-context quant sweep (Q8 wins) | Community | #benchmarks Aug 30 — single host |
| ROCm 7.1 vs 10.0 Ice Lake sweep | Community | Close numbers; prefer 7.14 for RCCL day-to-day |
| Flash-Next ~28 t/s llama.cpp vs ~60 t/s vLLM | Community | #llamacpp 4× V620 comparison |
| Flash-Next APEX GGUF ~370 PP / ~26 t/s (2× V620) | Community | #llamacpp Sep 11 — mudler/Qwen3.8-Flash-Next-APEX-GGUF |
| Flash-Next Q4 ~6 t/s on 2× V620 (LocalAI) | Community | #llamacpp Sep 10 — n-gram on NVMe |
| Flash-Next IQ4_XS ~150–200 PP / ~25 t/s (2× V620) | Community | #llamacpp / #vllm-rdna Sep 14–15 — layer split + --n-cpu-moe |
| Flash-Next llama.cpp ~300 PP / ~25 t/s “normal” (2×) | Community | #llamacpp Sep 16 — drops ~200/15 on long ctx |
| Flash-Next MTP needs PR / Unsloth desktop | Community | #llamacpp Sep 17 — stock / Studio bundled llama.cpp refused MTP |
| Unsloth Studio bundled llama.cpp loads Flash-Next MTP | Needs verify | #llamacpp Sep 20 — one host; called a same-day bundle fix |
| Flash-Next 4× patched MTP ~400 PP / ~27–45 t/s | Needs verify | #llamacpp Sep 17 — others call 400 PP low |
| Flash-Next 3× + 32 GB RAM does not load | Community | #llamacpp Sep 17 — n-gram / host RAM bound |
| Flash-Next 3× + MTP needs ~64 GB RAM | Community | #llamacpp Sep 17 — later report; SSD offload untested |
| Flash-Next MTP: stock llama.cpp can load when forks refuse | Needs verify | #llamacpp Sep 18 — single-thread |
Flash-Next MTP on markldn / okigan trees, no TP | Needs verify | #llamacpp Sep 19 — MTP loaded; tensor parallel did not |
| DeepSeek-V4 llama.cpp TP4 ~22 t/s | Needs verify | #llamacpp Sep 17 — kernel unpublished |
| Flash-Next UD-IQ3_XXS ~530 PP / ~30 t/s (2× V620, stock ROCm) | Community | #general / #forum Sep 15 — official llama.cpp ROCm; ~10 t/s at 80k+; Vulkan ~25% slower |
| Flash-Next AD-4.27 GGUF ~550 PP / ~29–30 t/s (2× V620, no MTP) | Community | #llamacpp Sep 28–29 — Navin-Models/Qwen3.8-Flash-Next-Uncensored-AD-4.27-GGUF; 262k q8 KV; MTP headers failed; PCIe 3.0 host. Sep 30 LocalAI YAML + ISTA-DASLab GSQ-RCO-Coder used on another 2× host |
| Swift 1.5 Flash-Next GSQ-RCO GGUF ~400 PP / ~40 TG (2×, MTP) | Community | #llamacpp Sep 30 — ukisai/Swift-1.5-Qwen3.8-Flash-Next-GSQ-RCO-GGUF; IQ3_xs + q4_0 ngrams; ~48 GB RAM; batch/ubatch 4k/1k |
| Swift GSQ-RCO IQ3_XXS ~800→650 PP / ~35→20 TG (2×, MTP) | Community | #llamacpp Oct 2 — same pack IQ3_XXS; -ot per_layer_token_embd=CPU; -c 71680; 2k/1k; VRAM-bound |
| Flash-Next n-gram table ~50 GB RAM | Community | #llamacpp Sep 10 — 4× V620 to avoid storage offload |
| PR #10 / #12 status | Solid | Both merged on edwinbrowwn/llama.cpp-rdna2 (#10 13 Aug 2026; #12 17 Aug 2026) |
rdna2-speculative.md
| Statement | Status | Verify how |
|---|---|---|
| DFlash2 draft Q4_K_M not Q8_0 | Community | Discord consensus |
| DFlash2 vs MTP bench (~30 vs ~40) | Community | Synthetic bench caveat documented |
| DFlash hurts PP more than MTP | Community | #llamacpp Aug 28 |
| MTP n=3 often beats n=4 (27B Q8 TP4) | Community | Real-prompt A/B; acceptance dropped at n=4 |
| Flash-Next TP experimental / deferred | Community | Fork update + forum benches; layer-split only |
| Flash-Next llama.cpp << vLLM | Community | #llamacpp / forum Sep 2026 — except 2-card / RAM-offload |
| 2× V620 IQ4_XS layer-split + ngram-mod | Community | #llamacpp / #vllm-rdna Sep 14–15 — host-specific -t |
| 2× V620 AD-4.27 GGUF ~550 PP / ~29–30 t/s | Community | #llamacpp Sep 28–29 — no MTP; 262k q8; ISTA-DASLab GSQ pack mentioned, no tok/s |
SPEC_SIDECAR=1 MTP path | Community | Fork maintainer tip; pull latest |
| Sidecar GGUF identity / Unsloth vs other Q8 | Community | #llamacpp Sep 2026 — match publisher families |
| DFlash2 aperture violation crash | Community | #llamacpp Sep 2026 — pull latest / A/B MTP |
--spec-draft-p-min ≠ 0 disarms MTP | Community | #benchmarks Sep 2026 tip |
| Full DFlash2 TP4 command | Community | Author production recipe |
| MTP + LCP prompt-cache position desync | Community | #llamacpp Sep 10 — HTTP 200 / no tokens; --ctx-checkpoints 0 does not fix |
markldn / okigan MTP trees, no tensor parallel | Needs verify | #llamacpp Sep 19 — one host |
| Unsloth Studio bundled llama.cpp loads Flash-Next MTP | Needs verify | #llamacpp Sep 20 — one host; re-try bundled binary first |
rdna2-serving.md
| Statement | Status | Verify how |
|---|---|---|
| Short env stack preferred | Community | #llamacpp — long GFX1030_* lists can clash with RCCL |
GGML_HIP_SAFE_STATE_IO=1 FA workaround | Community | Fork maintainer note |
| ubatch ~1024 per GPU | Community | #llamacpp PP tuning tip |
| Docker compose TP2 MTP4 | Community | #llamacpp example |
| KV checkpoint workaround | Community | --ctx-checkpoints 0 |
| Multi-socket hurts TP | Community | Topology advice |
| 160 W / 140 W PSU workaround | Community | Transients on TP prefill; miner PSU / P620 cables |
| TP3 driver crash | Community | Prefer 2 or 4 GPUs |
hipcub-devel for GPU sampling | Community | Forum / #llamacpp build note |
| Single V620 Q4_0 ~39–49 t/s (27B) | Community | #llamacpp Sep 2026 |
| Embedder idle +~40 W/GPU | Community | #llamacpp — nomic/etc. alongside chat |
| Fork day-to-day on ROCm 7.14 | Community | #llamacpp Sep 2026 — not mid-7.2.x |
Concurrent --parallel crush (~5–9 t/s) | Community | #llamacpp Sep 2026 V620 multi-agent |
| Upstream PR #22466 fast tensor loads | Needs verify | Community <35 s on 122B-Q4; watch merge |
| Long-ctx prefer Q6+/Q8 | Opinion | #llamacpp Sep 2026 quality reports |
Reference & troubleshooting
| Area | Status | Notes |
|---|---|---|
reference/env-vars.md tables | Community | Cheat-sheet; not exhaustive upstream API |
VLLM_PLE_QUANT_DIR INT4 (#49 / older mmap) | Fork-source / Community | #49 (11 Oct) on rdna_extras: INT4 into upstream pinned storage. Older 700753d9 mmaps shards. #vllm-rdna Oct 11: on-disk load still WIP |
troubleshooting/vllm.md graph fix | Fork-source | Same image-lag caveat |
troubleshooting/vllm.md AMDSMI / missing render | Community | #vllm-rdna Docker compose |
tuning/power.md Fedora path | Solid | From v620_toolbox powertuning |
tuning/power.md Ubuntu 26.04 path | Community | ubuntu_powertuning/ — validated kernel 7.0.0-30-generic; re-verify after kernel upgrades |
tuning/power.md Fedora Server 44 / kernel 6.19 | Community | Ice Lake 4× V620 host — power floor + 180 W + ~7 W idle |
tuning/power.md V620 slot-power / setperflevel | Community | #llamacpp — TDP from slot, not 8-pin |
tuning/power.md soft unlock (amd-v620-soft-unlock) | Community | Upstream README + #general passthrough reports; wiki-unverified TFLOPS / 232–275 W range |
setup/hardware.md prefer soft unlock over W6800 flash | Community | Soft unlock keeps 72 CUs; W6800 flash → 54 CU |
tuning/ecc.md two-reboot ras_enable=0 | Community | lunnova on W6800; Discord reports V620 ECC-on (~30 GB). Confirm rocm-smi after two reboots |
tuning/ecc.md Vulkan memtest before ECC-off | Community | #general Sep 23 — quiet dmesg ≠ clean card; leave ECC on if errors |
tuning/ecc.md Flash-Next can trip ECC that 27B misses | Community | #general Sep 26 — dmesg only on Flash-Next; 5–8 min Vulkan memtest; replacement OK |
tuning/p2p.md validation | Solid | From v620_toolbox on Fedora + AMD CPU |
tuning/p2p.md Ubuntu 26 / 7.0 kernel gap | Community | #vllm-rdna Sep 24 — validated Pre-7 ≤6.19 or Post-7 ≥7.1; 7.0 not the Fedora recipe |
tuning/p2p.md ~25 GB/s bandwidth | Community | Bandwidth ≠ inference speed |
tuning/p2p.md host topology table | Community | Dual-socket, gen3 x4, PLX, TP3 — #general / #llamacpp |
tuning/p2p.md Ice Lake P2P no-op / ~4% regression | Community | Ice Lake 4× V620 host — llama.cpp + vLLM |
tuning/p2p.md Intel IOMMU-off breaks P2P | Community | Ice Lake host; opposite of some generic docs |
tuning/p2p.md ACS bits / ACSCtl=0x0019 | Community / Needs verify | #general 25 Oct — all-off vs leave bits 0/3/4; toolbox “ACS off” can still show 0x0019. Clearing remaining bits broke V620↔V620 on one host |
tuning/p2p.md PLX daisy-chain / heatsink fan | Community | #general PLX 88096 |
tuning/p2p.md PEX88096 8-riser / H12D-8D x8x8 | Community | #general Sep 19 — 6 GPUs still awkward; 2/4/8 vs any even count |
tuning/p2p.md X570 x8x8 gen4 + single x16 PEX88096 uplink | Community | #general Sep 21 — cards talk on the switch bus |
troubleshooting/llama-cpp.md RADV crash / AMDVLK slow | Community | #llamacpp — prefer ROCm for TP |
troubleshooting/llama-cpp.md Windows Unsloth Vulkan | Needs verify | #general Oct 10 — 2× V620 Q8 ~12–13 t/s |
troubleshooting/llama-cpp.md FA max_blocks_per_sm abort | Community | head-256 occupancy 0 on gfx1030; q8 KV needs FA |
troubleshooting/llama-cpp.md DAX mmap SVM oops | Community | --no-mmap mandatory on dax=always |
troubleshooting/general.md CPU governor / unsupported AMDGPU punt | Community | Flash-Next PP; Polaris/WX4100-in-box ROCm skip; unbind > ROCR_VISIBLE alone |
troubleshooting/vllm.md leftover EngineCore / PleOffloadWorker | Community | #vllm-rdna Sep 18 |
troubleshooting/vllm.md TunableOp rocBLAS hash lock | Fork-source | #vllm-rdna Sep 23–24 + tunableop/ README (named profiles; canonical f30bb442e9b5) |
troubleshooting/vllm.md Flash-Next vision pixel-cap / runtime OOM | Fork-source / Community | Launcher max_pixels; #vllm-rdna Sep 21 ~15–20 s/image |
troubleshooting/vllm.md FP8 KV rejected on QSA | Community | #vllm-rdna Sep 22 — unquantized-only backends + AITER/CDNA |
troubleshooting/vllm.md no-P2P PYNCCL / MTP vs PLE | Community | #vllm-rdna Sep 18 |
troubleshooting/vllm.md MTP concurrency / PLE stall | Community | #vllm-rdna — recipe PRs + P2P A/B |
troubleshooting/vllm.md ROCR idle CPU spin | Community | TheRock 7.14 / ROCR 1.21 — Flash-Next fork patch |
troubleshooting/vllm.md rocprofiler register idle CPU #108 | Fork-source / Community | #vllm-rdna 16 Oct — distinct from ROCR busy-spin; launchers default ROCPROFILER_REGISTER_ENABLED=0. Not Hub |
troubleshooting/vllm-flash-next.md PP3 HEAD recipes #96 | Fork-source | #96 13 Oct supersedes leapdragon-only “what to do” |
reference/env-vars.md GPU_MAX_HW_QUEUES=4 on Flash-Next TP4 | Fork-source | #107 16 Oct |
reference/env-vars.md ROCPROFILER_REGISTER_ENABLED | Fork-source / Community | #108 16 Oct |
reference/env-vars.md VLLM_ROCM_MONO_DECODE | Fork-source | #94 16 Oct |
reference/env-vars.md HSA_KERNARG_POOL_SIZE | Community / Needs verify | #vllm-rdna 17 Oct — TP=8 ~14 GB; not a 4× recipe |
vllm/flash-next-serve.md MonoKernel #94 ITL table | Fork-source | PR #94 16 Oct; Hub lags |
vllm/flash-next-serve.md MonoKernel second-host PP | Community / Needs verify | #vllm-rdna 16 Oct |
vllm/host-venv.md / images.md Triton 3.9 drop | Community | #vllm-rdna 17 Oct |
reference/env-vars.md VLLM_FA_RDNA2_GQA_DECODE | Fork-source | launcher ATTN=fa sets 1; not a Flash-Next QSA lever |
vllm/quantization.md asymmetric W4A16 MoE #98 | Fork-source | #98 14 Oct; not Hub |
vllm/flash-next-serve.md PP3 HEAD 16k/1k table | Community | #general 13 Oct author-host; not wiki-tested |
troubleshooting/vllm.md Flash-Next V2=0 long prompts | Community | #vllm-rdna Sep 2026; Sep 15 100%/~40 W stall |
troubleshooting/vllm.md Flash-Next PP3 rdna_extras corruption | Needs verify | #vllm-rdna Sep 15–16 — leapdragon OK; fresh pull still bad |
troubleshooting/vllm.md PP3 b33f9b6 graph KeyError | Needs verify | #vllm-rdna Sep 19 — [1,2,4,8] capture; 1.5e9 KV cap; 0% hit-rate log unreliable |
troubleshooting/vllm.md Flash-Next FULL-graph corruption | Needs verify | #vllm-rdna Sep 16–17 — PIECEWISE workaround |
troubleshooting/vllm.md wvSplitK / VLLM_RDNA_DENSE_GEMV | Community | #vllm-rdna Sep 17 fault + Oct 6 4× W6800X concurrency contrast |
troubleshooting/vllm.md hybrid KV overstated / livelock | Needs verify | #vllm-rdna Sep 17 |
troubleshooting/vllm.md prefix cache 0% / e45dd5cb | Fork-source | #vllm-rdna Sep 17 + org extras commit |
troubleshooting/vllm-flash-next.md --enable-prompt-tokens-details | Community | #vllm-rdna Oct 7 — DeepSeek / Pi harness 0% is missing metadata, not a dead cache |
troubleshooting/vllm-flash-next.md AutoRound INCConfig PLE reject | Needs verify | #vllm-rdna Oct 12 — latest rdna_extras; upstream vLLM #59990 merged; fork cherry-pick queued |
troubleshooting/vllm-flash-next.md FA-RDNA2 partial on QSA | Community / Fork-source | #vllm-rdna Oct 13 — QSA Triton owner ignores --attention-backend |
troubleshooting/vllm.md --kv-offloading-size | Community / Needs verify | #vllm-rdna Oct 7 — 64 GiB total RAM parking; SSD untested |
troubleshooting/vllm.md / Flash-Next KV-restore loops | Community / Needs verify | #vllm-rdna 25–26 Oct — token-repeat after MTP off; 26 Oct: CPU-RAM KV + prefix cache OK when disk KV offload is off |
troubleshooting/vllm.md repeating !!!! tokens | Community / Needs verify | #vllm-rdna 27 Oct — UV >~20 mV or core >~2479 MHz; memtest_vulkan + dmesg ECC |
vllm/quantization.md EXL3 vs AWQ / hi2 | Community | #vllm-rdna / #hi2 27 Oct — EXL3 size/quality, AWQ speed; hi2 rdna_hint_flex public, no recipe. 30 Oct + public README: Hadamard + QAD, quality target, 3 bpw compact maybe aggressive |
vllm/host-venv.md / setup/installing-rocm.md ROCm 10 on Ubuntu 26.04 | Community / Needs verify | #vllm-rdna 29 Oct — core-10 / core-10.1 (no core-7.14); Triton pin unconfirmed. 30 Oct: 10 ≈ 7.14 for serving; one 10.1 host-venv fail Needs verify |
setup/host-firmware.md HP Z6 G4 slot map | Community / Needs verify | #motherboard 26–29 Oct — slots 2+5 x16, slot 4 x8; hidden BIOS guess for 2nd V620 |
tuning/power.md V620 dual 8-pin enumeration | Community | #general 29 Oct — one aux cable can light LEDs without lspci |
vllm/fork.md v0.31.0 release | Fork-source | #announcements 11 Oct + Hub v0.31.0-extras + closed #47. Author 4× V620 Flash-Next benches. PP3 recipes (#96) are HEAD-only |
vllm/fork.md MonoKernel #94 | Fork-source | #94 merged 16 Oct; not Hub; recipes do not enable |
vllm/fork.md #126 / #127 / #128 / #130 / #131 / #132 | Fork-source | Merged 18–21 Oct; Hub v0.31.0-extras lags |
vllm/fork.md #117 / #137 / #138 / #140 | Fork-source | Merged 17–26 Oct; EXL3 Flash-Next, MTP mono, INT4 KV, W4A8 default. Not Hub |
vllm/fork.md / flash-next-serve.md #146 TP2 MoE offload | Fork-source | #146 merged 28 Oct; serve_offload.sh; author-host 2× V620 16k/1024 ~19.8 / ~26.7 agg. Not Hub. Needs verify on a second host |
vllm/fork-progress.md snapshot | Fork-source / Community | 31 Oct Hub vs HEAD vs backlog |
vllm/fork-progress.md draft #148 | Fork-source | #vllm-rdna 30 Oct + public draft — tiered KV paging; live paging stalls; not a recipe |
troubleshooting/vllm.md disk KV write-amp / Optane | Community / Needs verify | #vllm-rdna 30 Oct — terabytes/day NVMe at huge context; prefer U.2/PCIe/DIMM Optane over M10; LMCache NVMe still unused |
troubleshooting/general.md / tuning/power.md IOMMU + PSU-group drop | Community / Needs verify | #general 31 Oct — 8× V620 TP8/load; 6 cards on 1500 W breakout vanished; 2 on workstation PSU stayed |
vllm/flash-next-serve.md HIP defaults #130 | Fork-source | 19 Oct — Flash-Next HEAD recipes HIP on |
vllm/flash-next-serve.md DFlash2 #132 | Fork-source | 21 Oct — MTP-2 still faster in PR A/B |
troubleshooting/vllm.md rdna_ar silent hang #128 | Fork-source | 19 Oct |
troubleshooting/vllm.md non-mono graph hang #131 | Fork-source | 19 Oct |
troubleshooting/vllm-flash-next.md dynamic MTP #127 | Fork-source / Community | #vllm-rdna 22 Oct — leave schedule off. 25–26 Oct: loops can continue with MTP off if KV offload restore is on |
setup/host-firmware.md HP Z6 G4 PSP / fans | Community / Needs verify | #motherboard 18–23 Oct |
vllm/fork.md PLE three modes | Fork-source | #announcements 11 Oct + launcher PLE= + #vllm-rdna Oct 11 RAM correction |
troubleshooting/vllm.md W6800X Duo ALU 0.9.4 MTP-2 | Community | #benchmarks Oct 10 — 4× W6800X Duo, vLLM 0.30.0 TP4, Qwen3.8-27B fp16, 512 gen |
vllm/quantization.md W4A8 somewhat competitive | Needs verify | #vllm-rdna Oct 9 — 0.31 test line |
vllm/quantization.md W4A8 #140 author-host table | Fork-source | #140 26 Oct — 27B 860→1075 PP / 42.5→52.3 agg; Hub may lag |
vllm/quantization.md INT4 KV #138 | Fork-source | #138 25 Oct — int4_fp16_block; native QSA; not Hub |
troubleshooting/vllm.md mixed stall / CUDA-graph range | Needs verify | #vllm-rdna Oct 9–10 — no public flag; DSV4 expected after |
vllm/flash-next-serve.md DSV4 on extras WIP | Needs verify | #vllm-rdna Oct 10 — will work after stall fix; stay on yiminyuan tree |
llama-cpp/rdna2-serving.md froggeric tool calls | Needs verify | #general Oct 9 — OG Qwen3.8 + Open WebUI |
troubleshooting/llama-cpp.md Windows Unsloth Vulkan | Needs verify | #general Oct 10 — 2× V620 Q8 ~12–13 t/s; check both GPUs / Q4_0 |
troubleshooting/llama-cpp.md V620 not in WSL / Windows P2P CPU fallback | Needs verify | #general Oct 11 — silent CPU path for GPU↔GPU; install Linux |
vllm/serve-scripts.md launcher P2P=0 | Fork-source | serve_rdna.sh on rdna_extras + #vllm-rdna Oct 11 |
vllm/flash-next-serve.md cyankiwi Flash-Next AWQ incoherent | Community | #vllm-rdna Oct 11 — prefer wtdcode AWQ-W4A16 + primitive-ai PLE |
vllm/recipes.md TP vs PP llama.cpp mapping | Community | #vllm-rdna Oct 8 — PP≈layer split, TP≈tensor split; can combine |
troubleshooting/general.md unused V620 fan pads | Community | #general Oct 7 — 4-pad footprint; do not use as PWM (100% / no curve) |
vllm/quantization.md MTP draft_sample_method | Community | #vllm-rdna Oct 8 — probabilistic when temperature > 0 |
reference/env-vars.md PLE_OFFLOAD_PREFAULT | Community / Needs verify | #vllm-rdna Oct 8 — overlay/sidecar name; ~25% slower off; not org extras HEAD |
choose-a-stack.md / meta/resources.md Strata HIP | Community / Needs verify | #general Oct 7–8 + public Niko1221/Strata. 2× V620 0.1.39+#835/#849 PP jump; 3-card behind vLLM. No serve recipe |
choose-a-stack.md GLM-5.3-Flash not 1-card | Community / Needs verify | #general Oct 25 — 1× V620 + RAM offload poor fit; Maya ~200/13 stale; public 320B/18B active. 8× recipe already on recipes.md |
choose-a-stack.md / meta/resources.md Strata 0.1.49.2 DeepSeek engine | Community | #strata Oct 25 — signed feed has no gfx1030 HIP DeepSeek engine (gfx1200/gfx1201 + CUDA) |
llama-cpp/rdna2-serving.md froggeric Qwen Jinja | Needs verify | #vllm-rdna Oct 8 + public froggeric/Qwen-Fixed-Chat-Templates; #general Oct 9 tool calls |
vllm/recipes.md 3× MoE HIP overlay | Community | #vllm-rdna Sep 17–18 — public temp repo |
vllm/recipes.md DeepSeek-V4 Flash | Needs verify | #vllm-rdna Sep 17 — not Hub |
setup/hardware.md no NVIDIA+V620 TP | Community | #general Sep 17 — mixed prefill collapsed |
vllm/recipes.md 4× PIECEWISE Flash-Next serve | Community | #vllm-rdna Sep 17 — host venv, not Hub |
troubleshooting/vllm.md native KV RAM offload #24 | Fork-source / Needs verify | #vllm-rdna Sep 26–27 + merged vllm-rdna#24 (27 Sep); Sep 15 ~1 t/s is the broken baseline |
troubleshooting/vllm.md mixed prefill+decode / #26 / 30632b2 / #36 | Community / Fork-source | #vllm-rdna Sep 27–29 static flags; #36 merged 5 Oct (opt-in dynamic). Sep 29 unset flags for max PP + resident MoE PP drop |
tuning/p2p.md 5-slot PCIe switch ATX Printables | Community | #other Sep 30 — public model 1860633; mechanical mount only |
vllm/recipes.md GLM-5.3-Flash 8× local 0.30 fork | Community / Needs verify | #vllm-rdna Sep 30 — wtdcode AWQ; org #2 unverified |
vllm/recipes.md 2× fp16 27B MTP / Swift 1.5 27B | Community / Needs verify | #vllm-rdna Oct 6 — not Flash-Next Swift |
vllm/quantization.md EXL3 mul1 GPU-run on HEAD | Fork-source / Needs verify | rdna_extras 30 Sep–1 Oct + #vllm-rdna Sep 30 |
troubleshooting/vllm.md TORCHINDUCTOR_CACHE_DIR | Fork-source | EXL3 74315f4 — VLLM_DISABLE_COMPILE_CACHE does not clear it |
troubleshooting/vllm.md GLM vision MIOpen per-size compile | Community | #vllm-rdna Sep 30 — conv-as-matmul workaround |
llama-cpp/rdna2-serving.md LocalAI AD-4.27 YAML | Community | #llamacpp Sep 30 — 2×; context 229376 |
llama-cpp/rdna2-speculative.md Swift GSQ-RCO GGUF | Community | #llamacpp Sep 30 — ~400/40 on 2× MTP; Oct 2 IQ3_XXS ~800→650 / ~35→20 |
llama-cpp/rdna2-serving.md Swift IQ3_XXS llama-server | Community | #llamacpp Oct 2 — 2×; paths generalized |
vllm/quantization.md EXL3 mul1-only + W4A8 in HEAD | Community / Needs verify | #vllm-rdna Oct 1–2 — 3inst untested; Oct 1 W4A8 not a speed win; Oct 9 0.31-line kernel more competitive (Needs verify) |
vllm/serve-scripts.md TunableOp 4-card / 8× local rows | Community | #vllm-rdna Oct 1 — 783-row set is 4-card 7.14; other rocBLAS needs local tune |
setup/hardware.md ComfyUI / image-video bf16 | Community | #general Sep 28 — no native BF16; HIP emulates; prefer fp16/int8 |
troubleshooting/vllm.md vllm#57160 pinned CPU KV | Needs verify | #vllm-rdna Sep 20 — mainline; #24 is the fork follow-through |
troubleshooting/general.md 120 mm Makerworld ducts / 80 mm 7k | Community | #general / #other Sep 27–28 |
vllm/recipes.md 3× PP3 + MTP VRAM squeeze | Needs verify | #vllm-rdna Sep 15 — local patches |
setup/hardware.md V620 vs 32 GB MI50 more PP less TG | Community | #general Sep 15 — first-pass A/B |
setup/host-firmware.md GpuMMIOFix every-boot remap | Needs verify | #motherboard Sep 15–16 — suggested for WS-Z270 ReBAR |
troubleshooting/vllm.md 128k PP cliff / batched-tokens 4096 | Community | #vllm-rdna Sep 11 — Intel AutoRound draft |
troubleshooting/vllm.md shm_broadcast / Triton vs RCCL | Community | #vllm-rdna Sep 7 — wait + cache; stay on 7.14 |
troubleshooting/llama-cpp.md DFlash2 / sidecar / concurrent | Community | #llamacpp Sep 2026 |
troubleshooting/llama-cpp.md MTP LCP position desync | Community | #llamacpp Sep 10 — ctx_dft / M-RoPE X < Y |
troubleshooting/general.md V620 thermals / graphene pads | Community | #general Sep 2026 — mixed repaste reports |
vllm/overview.md MoE sweet spot / Flash-Next needs 4 cards | Opinion | #general Sep 2026 workload consensus |
tuning/power.md 8× @ 180 W ≈ 1440 W + HELA 2050 | Community | #forum Sep 2026 build notes |
tuning/power.md 1600 W for 5× stock 250 W; 1200 W tight for 4× | Community | #general Sep 22–23 — 0.7 A blowers OK at 180 W; ~86 °C at 250 W |
vllm/recipes.md 3× overlay unmaintained / KV dump loops | Community | #general Sep 23 — cap ~3 agents on long ctx; ~45 t/s / ~1100 PP on one 3-card host |
tuning/power.md 180 W token-cost economics | Community | #llamacpp vs stock 250 W |
tuning/power.md 6.1 power1_cap write without toolbox | Community / Needs verify | #general 17 Oct — Debian 12.12 / kernel 6.1 accepted 180 W; power1_cap_min stayed 0; temps down. Not a 120 W floor unlock |
tuning/power.md 6.7+ sysfs power-limit ignore | Community | #general 17 Oct + r/linux_gaming share; maintainer toolbox still works on 7.x |
tuning/p2p.md SlimSAS / passive riser notes | Community | #general cabling |
tuning/p2p.md external Xpander / narrow uplink | Community | #general Sep 2026 — long-ctx collapse |
tuning/p2p.md layer vs tensor split explainer | Community | #benchmarks Sep 2026 |
setup/installing-rocm.md avoid mid-7.2.x (e.g. 7.2.4) | Community | Same RCCL pin as 7.2.1+; prefer 7.2.0 or 7.14.0 |
setup/hardware.md W6800 BIOS on V620 → 54 CU | Community | #general Sep 2026 PSA — stay on stock V620 VBIOS |
setup/host-firmware.md Dell Precision MMIO High / mmiohsize | Community | #motherboard / #general Sep 12–14 2026 — dump your own UEFI; 0x03 vs 0x04 |
setup/host-firmware.md T7820 4× V620 + PEX880xx POSTed after SR-IOV off | Needs verify | Single-host #motherboard Sep 14 2026 — board-specific hidden vars |
setup/host-firmware.md CMOS loss re-enables SR-IOV / disables ReBAR | Community | #general Sep 23 — MMIO / missing GPUs until BIOS restored |
setup/host-firmware.md 256 GB MMIO window for 4× V620 | Community | #motherboard — 64 GB too small; no known 128 GB option |
tuning/p2p.md 4-slot vs 5-slot PLX card width | Community | #general Sep 12 2026 |
tuning/p2p.md 5 GPUs → TP=4 + 1 standalone | Community | #general Sep 11 2026 |
troubleshooting/llama-cpp.md lemonade-sdk M-RoPE A/B | Needs verify | #llamacpp Sep 13 — one host; not the RDNA2 fork |
troubleshooting/general.md blower vs unducted 120 mm | Community | #general Sep 13 2026 |
troubleshooting/general.md 9733 / Thingiverse 7296707 + PWM hub | Community | #general Oct 4–6 — 9733 loud with pulse PWM or Molex-at-100%; EFH-08E12W-JP01 + Arctic ACFAN00351A + CoolerControl; SUNON PF97331B1 + SilverStone CPF04 quieter path; Molex-for-four Needs verify |
setup/host-firmware.md H12D POST loop / SR-IOV + ReBAR + CSM | Needs verify | #general Oct 6 — codes 95, DE, AD, DF, 36, 05, 37; then POSTed. Single-host |
meta/resources.md TensorFold ROCm #389 | Needs verify | #tensorfold Oct 4–6 + public ashhart/TensorFold#389 (draft --backend rocm). RDNA2 is FP16 v_dot2, not WMMA. Community: not faster than vLLM. Oct 6: Python engine frozen; ROCm path moving to Zig. No wiki serve recipe |
setup/host-firmware.md
| Statement | Status | Verify how |
|---|---|---|
Dell Precision MMIO High / mmiohsize 0x03 or 0x04 | Community | #motherboard / #general Sep 12–14 — dump your own UEFI |
| T7820 4× V620 + PEX880xx POSTed after SR-IOV off | Needs verify | Single-host #motherboard Sep 14 — board-specific |
| CMOS / BIOS loss re-enables SR-IOV / disables ReBAR | Community | #general Sep 23 — fewer GPUs / MMIO errors until settings restored |
| 256 GB MMIO window for 4× V620 | Community | #motherboard — 64 GB too small |
| GpuMMIOFix OS BAR remap | Needs verify | #motherboard Sep 15–16 — typically every boot |
HP Z4 G4 32-bit MIMO + ReBAR + pci=realloc=off | Needs verify | #motherboard Sep 16 — Xeon W-2133; Linux reallocates 64 GB VRAM |
| HP Z6 G4 blower PWM + slot-5 PSP kdb | Needs verify | #motherboard 18–23 Oct — factory reset unstuck fans; second V620 in slot 5 unresolved. 29 Oct: slots 2+5 x16 / slot 4 x8; hidden BIOS guess |
| H12D V620 POST loop; SR-IOV off + Above 4G + CSM off + ReBAR on | Needs verify | #general Oct 6 — one host; menu-level, not Dell hidden vars |
Checklist before production
docker pulllatest-extrasimage; confirm fork commit in build metadata.- Grep logs for
Using RDNA2W4A16LinearKernel. - Try CUDA graphs before
--enforce-eager. - One matched A/B on your hardware.
- Update this page when you confirm or refute a claim.
See Contributing and Wiki structure.
Contributing
This is a community wiki for the gfx1030 (RDNA2 / Navi 21) GPU ecosystem. Contributions of all sizes are welcome — fixing a typo, correcting an out-of-date command, or adding a whole new guide.
Live discussion happens on the gfx1030 club Discord:
https://discord.gg/mESex2aBp. Propose wiki fixes there (#wiki) or
open a GitHub PR — both are fine. See Useful resources.
A daily Cursor Automation (when enabled) reads Discord and opens ready PRs titled
wiki: discord digest YYYY-MM-DD. Repo automerge lands them after checks; the
agent still must pass the privacy table before opening. Setup lives in the repo at
.cursor/automations/daily-discord-wiki.md (not loaded by Cursor automatically —
activate once at cursor.com/automations/new).
Two ways to contribute
1. Directly on GitHub (no command line)
- Open the page you want to edit on GitHub and click the edit (pencil) button, or use the “Suggest an edit” link on the mdBook page. You’ll be prompted to fork the repo — do so.
- Make your changes, keeping the markdown clean (see style below).
- Commit with a descriptive message.
- Open a pull request targeting the
masterbranch.
2. Locally with mdBook (lets you preview)
git clone https://github.com/blivioniag/gfx1030-wiki.git
cd gfx1030-wiki
# Install mdBook (prebuilt binary, no Rust required)
mkdir -p "$HOME/.local/bin"
MDBOOK_VERSION=v0.5.4
curl -sL "https://github.com/rust-lang/mdBook/releases/download/${MDBOOK_VERSION}/mdbook-${MDBOOK_VERSION}-x86_64-unknown-linux-gnu.tar.gz" \
| tar -xz -C "$HOME/.local/bin"
export PATH="$HOME/.local/bin:$PATH"
mdbook serve # live preview at http://localhost:3000
Adding a new page
- Read Wiki structure — pick the right folder and naming convention.
- Create a markdown file under
src/<section>/, e.g.src/vllm/my-topic.md. - Add a link in
src/SUMMARY.mdand the sectionoverview.mdif one exists. - Run
mdbook buildto confirm it renders and there are no broken links. - Update Verification status for benchmarks or community claims.
Markdown style
- Use ATX headings (
#,##, …) and start each page with a single#title. - Wrap shell commands in fenced code blocks with a language hint (
```sh). - Prefer relative links between wiki pages (e.g.
../vllm/overview.md) so they work locally and deployed. - Keep lines readable; hard-wrapping around ~100 columns is fine but not required.
Accuracy
RDNA2 tooling moves quickly. When you add a command, note the ROCm / library version you tested it with if it might matter, and prefer linking to official docs over pasting version-specific numbers that will age.
For pages sourced from Discord or fork release notes, add or update entries in Verification status so readers know what is solid, fork-source, community-reported, or needs verify. Mark unconfirmed throughput claims as community-reported rather than presenting them as wiki-tested facts.
Privacy (Discord → wiki)
This wiki is public on GitHub Pages. When turning Discord messages into docs:
| Do | Don’t |
|---|---|
| Summarize operational facts (env vars, topology, bench numbers) | Paste message URLs, message IDs, or @mentions |
Attribute with channel names (#vllm-rdna) or “community report” | Copy Discord usernames, display names, real names, or avatars |
Use /path/to/model, ./build/bin/…, -hf org/model | Copy someone’s home directory, hostnames, Linux usernames, or internal IPs |
| Link public repos (GitHub, Hugging Face, lunnova.dev) | Commit bot tokens, guild IDs, or channel IDs |
| Generalize hardware (“Ice Lake 4× V620 host”, “server board X”) | Quote forum thread titles that include a member’s name |
| Cite motherboard / CPU product models when they help topology advice | Paste PCI BDFs (0000:1a:00.0), serials, MAC addresses, or geotags |
Public GitHub / Hugging Face org or repo names are fine to link (they are already public attribution). Prefer “community report” / “fork README” over naming Discord people even when the same handle appears on GitHub.
Never commit: DISCORD_BOT_TOKEN, DISCORD_GUILD_ID, .env files, or screenshots of private
channels. Cloud Agents should set token + guild ID in Secrets only (see repo README.md).
Automated Discord digest PRs
When the daily digest automation is active, expect occasional ready-for-review PRs
that only touch src/ (and SUMMARY.md if a page was added). They are meant to
automerge after CI; still watch for:
- Transcripts,
@mentions, message links, and personal host/path leaks (close/revert). - Unconfirmed tok/s and one-off anecdotes that should stay in Verification status as Community / Needs verify.
- Empty calendar days should produce no PR; do not “fill” the wiki from stale chat.
The agent instructions are .cursor/skills/discord-wiki-digest/SKILL.md. You can
still ask a Cloud Agent for an on-demand pass; it should follow the same skill.
Deployment
Merges to master are built and published to GitHub Pages automatically by the
.github/workflows/mdbook.yml workflow — no manual deploy step is needed.
Useful Resources
Curated links for gfx1030 / RDNA2 work. Grouped by type — not everything here is “official” or wiki-maintained; see Verification status for claim audits on guides that reference these projects.
Community Discord
Primary hangout for V620 / gfx1030 inference work. Wiki pages often cite channel names
(#vllm-rdna, #llamacpp, #general, #benchmarks, #lmcache) — that is where the claim came from.
| Server | gfx1030 club |
| Invite | https://discord.gg/mESex2aBp |
Official documentation
- ROCm documentation
- ROCm install on Linux
- System requirements & supported GPUs
- GPU architecture specs (Navi 21 = gfx1030)
- ROCm Device Support Wishlist — community-tracked support matrix on the official ROCm repo
Docker images
Prebuilt images for RDNA (gfx1030 through RDNA4). See Running vLLM for run commands and Building images for how they are produced.
| Image | Purpose |
|---|---|
blivioniag/rocm-rdna | ROCm + PyTorch base for RDNA cards |
blivioniag/vllm-rdna | vLLM serving images (upstream and -extras / rdna_extras lineage) |
Tags are listed on Docker Hub and in Running (Docker). Re-pull before debugging — tags are refreshed in place when fixes land.
Upstream projects
Stock projects this wiki builds on or tracks. Use these when you want upstream behavior or to compare against forks.
- vLLM — upstream serving engine
- llama.cpp — GGUF inference (HIP/ROCm and Vulkan)
- vLLM PR #52391 — RDNA gfx1030 platform detection (upstream CI enablement for consumer Radeon)
- TheRock: RDNA2 (gfx103X) support — ROCm/TheRock gfx1030 enablement work
Community projects
Forks, recipes, and tooling maintained outside (or alongside) upstream. Often where gfx1030-specific performance work happens first.
| Project | What it is |
|---|---|
blivioniag/v620_toolbox | V620 power cap + PCIe P2P — powertuning/ (Fedora), ubuntu_powertuning/ (Ubuntu 26.04); see Power tuning |
Tamalero/amd-v620-soft-unlock | V620 OverDrive soft unlock in passthrough VMs (QEMU romfile= pptable patch; no flash, keeps 72 CUs) — Power tuning |
opengfx1030/vllm-rdna-docker | Docker bake for rocm-rdna / vllm-rdna — moved here #vllm-rdna Sep 14 2026; Hub tags still blivioniag/* — Building images |
BlivionIaG/vllm-rdna-docker | Historical bake repo (pre-move) |
opengfx1030/vllm-rdna @ rdna_extras | Official vLLM extras fork — RDNA HIP kernels + Flash-Next cherry-picks (Sep 14–15); PRs/issues here — fork landscape |
BlivionIaG/hippihx | HIP kernel op zoo (gfx1030 / gfx1100 / gfx900 tile contracts) — #hippihx Sep 16: intended to keep rdna_extras thin; not a published vLLM image yet |
ashhart/TensorFold #389 | Draft ROCm backend (--backend rocm) for MLX affine checkpoints (Qwen3.5 / 3.8 dense, Qwen3.6-35B-A3B). RDNA2 is FP16 v_dot2, not WMMA. Earlier community work: BlivionIaG/TensorFold#1. #tensorfold (Oct 4): not faster than vLLM yet. #tensorfold (Oct 6): the Python engine was frozen; the ROCm path is being rewritten in Zig. No wiki serve recipe. Author PR has a V620 / W7800 matrix — Needs verify. |
BlivionIaG/vllm-rdna-qa | Maintainer QA / landing playbook for opengfx1030/vllm-rdna (#vllm-rdna Sep 17) — not a second kernel wiki |
alanoo81/flashnext-v620-pp3 | Temporary 3× V620 PP3 overlay (leapdragon image + org MoE HIP) — #vllm-rdna Sep 17–18; #general Sep 23 unmaintained (KV-pool dump loops at high concurrency) — recipe |
yiminyuan/vllm @ gfx1030/v0.28.0 | Community DeepSeek-V4 Flash gfx1030 tree — #vllm-rdna Sep 17; weights; Needs verify |
leapdragon/vllm-rdna2-qwen | Older Flash-Next container / docs/rdna2 — prefer org rdna_extras / Hub v0.31.0-extras for day-to-day; tree still receives occasional commits (last push 11 Oct 2026) — ROCR idle-CPU fix |
blivioniag/vllm @ rdna2_extras | Historical — predecessor of opengfx1030/vllm-rdna; public repo 404 as of Oct 2026. Current Hub extras bakes clone the org repo; only older v0.26 / v0.27.1-extras* bake targets still name this clone |
leapdragon/vllm-rdna2-recipe | Community recipe book + GHCR presets (27B/122B; parts pile; concurrent MTP PRs) — wiki recipes |
opengfx1030/vllm-rdna2-recipe | Org mirror of the recipe book (#vllm-rdna) |
edwinbrowwn/llama.cpp-rdna2 | RDNA2/V620 llama.cpp fork — see overview |
Niko1221/Strata | Separate HIP engine (not llama.cpp / vLLM). gfx1030 notes in docs/AMD_HIP.md. Opt-in STRATA_HIP_PROMPT_F16=1 (PR #835) runs 16-bit prompt GEMMs FP16 I/O on gfx103x. #general Oct 7–8: 2× V620 0.1.39 + #835/#849 ~doubled PP vs 0.1.38; 0.1.40.2 similar with the env on. 3-card: prefill still behind vLLM; decode collapsed with concurrency. #strata (25 Oct): 0.1.49.2 signed DeepSeek-engine feed has no gfx1030 HIP package (HIP build lists gfx1200/gfx1201; CUDA packages are a different arch). #vllm-rdna (28 Oct): easier onboarding than vLLM; more interesting below 4 cards / when experts spill. No wiki serve recipe. |
BlivionIaG/hi2 | Quantizer for rdna_hint_flex (variable INT2/INT4/INT8 rows). #vllm-rdna / #hi2 (27 Oct): intended middle ground vs EXL3 (quality) and AWQ (speed). Public repo only — no vLLM recipe / Hub bake. |
GeorgeMA-Strong/llm-context-bench | Reproducible long-context PP/TG benches (real prompts) — used by #benchmarks |
vllm-project/vmon | Upstream vLLM author monitor for prefill/decode viz — #vllm-rdna Oct 13; not wiki-validated on gfx1030 |
LMCache/LMCache | KV cache layer (RAM/SSD/remote) — #lmcache WIP; use lmcache/standalone (CPU) + connector. Official kernels CDNA-only; hybrid Qwen needs HMA the connector lacks — troubleshooting |
2kiss/flash-attention-rdna2 | Independent RDNA2 FlashAttention kernel — #vllm-rdna Sep 22–24: stale; org target remains in-tree fa_rdna2 (currently disabled after #17) — fork |
intentee/paddler | LLM load balancer / multi-instance router — discussed for multi-agent llama.cpp; not wiki-validated |
sebastianmechno-sys/vllm-rocm-windows-rdna2 | Unofficial Windows 11 + ROCm 7.x vLLM for RX 6000 — not wiki-validated |
skyne98/wiki-gfx906 | Sibling wiki for gfx906 (Vega 20 / MI50) |
Tools & write-ups
- Unsloth: Qwen3.8-Flash-Next / MTP llama.cpp —
public MTP build notes (
#llamacpp/#generalSep 16–17). froggeric/Qwen-Fixed-Chat-Templates— drop-in Jinja for official Qwen chat templates (#vllm-rdnaOct 8; also usable with llama.cpp--chat-template-file). Community: fewer empty-think / KV-invalidation stalls.#general(Oct 9): tool calls holding up (OG Qwen3.8 + Open WebUI). Needs verify.- Disabling ECC on Radeon Pro GPUs (lunnova.dev) —
amdgpu.ras_enable=0+ two reboots; pinned in#vllm-rdna. See Disabling ECC. rocminfo,rocm-smi,amd-smi,clinfo— GPU visibility, topology, and P2P checks. See Environment variables.- UEFITool / ReBARUEFI — locate hidden MMIO High / ReBAR / SR-IOV setup vars. See Host firmware.
- Precision 7920 MMIO GPU Unlock Guide — circulating T5820/T7820/T7920 write-up; dump your own UEFI, do not copy another host’s offsets.
- GpuMMIOFix — OS-side PCI BAR remap above 4 GB
(
#motherboardSep 15–16). Community: typically reload each boot; Needs verify on V620 hosts — Host firmware.
Know a gfx1030 resource that belongs here? Contribute a link and say which section it fits (official / Docker / upstream / community).
Wiki structure
How this mdBook is organized — for editors adding or moving pages.
Directory layout
src/
intro.md # Landing page (WIP banner)
SUMMARY.md # Sidebar navigation — edit this when adding pages
choose-a-stack.md # llama.cpp vs vLLM, what fits on a V620
setup/ # Hardware and ROCm install (getting-started first)
getting-started.md
hardware.md
installing-rocm.md
hsa-override.md
host-firmware.md # MMIO High / SR-IOV / large-BAR POST (only if the host will not POST)
tuning/ # V620-specific host tuning
power.md
ecc.md # Optional Pro-card ECC disable (~2 GB)
p2p.md
vllm/ # vLLM serving on RDNA
overview.md # Section hub — start here
onboarding.md # Simple V620 happy path (Docker + fork launcher)
running.md # Images, docker run, quick start
recipes.md # Hub -extras and recipe-container presets
flash-next.md # Flash-Next status, card counts, AutoRound
flash-next-serve.md # Flash-Next serve lines (FULL_AND_PIECEWISE, #17, PP3)
configuration.md # Env vars, CUDA graphs, compose
quantization.md # GPTQ/AWQ, KV, MTP, INT4
fork.md # rdna_extras kernels + chronicle
fork-progress.md # Hub vs HEAD vs backlog snapshot
host-venv.md # Host uv venv (ROCm 7.2.0 / 7.14.0)
serve-scripts.md # tools/rdna/serve_rdna.sh recipes (fork checkout)
images.md # Building Docker images
llama-cpp/ # llama.cpp and RDNA2 fork
overview.md # Section hub (points at choose-a-stack.md)
building.md # Stock llama.cpp build
rdna2-overview.md # Fork intro, build, requirements
rdna2-benchmarks.md # Author-reported numbers
rdna2-speculative.md # DFlash2, MTP, ngram
rdna2-serving.md # Launch, Docker, limits
reference/ # Lookup tables
env-vars.md # Environment variable cheat-sheet
verification.md # What's verified vs community-reported
troubleshooting/ # Problem → fix, by stack
index.md # Hub
general.md
vllm.md
vllm-flash-next.md
llama-cpp.md
meta/ # Wiki maintenance
resources.md # External links
contributing.md
structure.md # This page
Conventions
| Rule | Example |
|---|---|
| One topic per file — split when a page exceeds ~200 lines or mixes concerns | vllm/configuration.md vs vllm/quantization.md |
Section overview.md — first page in each major folder links to sub-pages | vllm/overview.md, llama-cpp/overview.md |
| kebab-case filenames | getting-started.md, not getting_started.md |
Relative links — use ../ to cross folders | From vllm/running.md to setup: ../setup/hsa-override.md |
| WIP banner — on pages with Discord/community claims | See vllm/overview.md |
Verification row — add/update in reference/verification.md for new benchmarks | Status: solid / fork-source / community / needs verify |
Adding a new page
- Pick the folder (or create one if it’s a new major topic).
- Create
src/<folder>/<topic>.mdwith a#title and optional WIP banner. - Add an entry to
src/SUMMARY.mdunder the right section. - Link from the section
overview.mdif one exists. - Add verification rows if the page contains benchmarks or unconfirmed claims.
- Run
mdbook build— fix broken links before merging.
Splitting an existing page
- Move shared intro to
overview.mdor trim the original. - Create focused sub-pages; link between them at the bottom (“Next steps”).
- Update
SUMMARY.mdto nest sub-pages under the section. - Grep for old filename links:
rg 'old-name\.md' src/ - Update
reference/verification.mdsection headers to match new paths.
What goes where?
| Content type | Location |
|---|---|
| Install ROCm, hardware list | setup/ |
| BIOS / MMIO High / SR-IOV so 4× V620 POSTs | setup/host-firmware.md |
| Power cap, P2P enablement, Pro ECC | tuning/ |
docker run, compose, env vars for vLLM | vllm/ |
| First V620 vLLM serve (Docker or fork) | vllm/onboarding.md |
| Which image / model / card-count recipe | vllm/recipes.md (Flash-Next serve lines: vllm/flash-next-serve.md; MonoKernel: #flash-next-monokernel) |
Fork tools/rdna/serve_rdna.sh recipes | vllm/serve-scripts.md |
| llama.cpp vs vLLM | choose-a-stack.md |
| Kernel source, fork branches | vllm/fork.md |
| Hub vs HEAD vs backlog progress | vllm/fork-progress.md |
| Docker image build (vllm-rdna-docker) | vllm/images.md |
| Stock llama.cpp cmake build | llama-cpp/building.md |
| Fork benchmarks, DFlash2, TP serve | llama-cpp/rdna2-*.md |
| Env var tables | reference/env-vars.md |
| Claim audit / WIP status | reference/verification.md |
| Error messages and fixes | troubleshooting/ (Flash-Next symptoms: troubleshooting/vllm-flash-next.md) |
| External links (official / Docker / upstream / community) | meta/resources.md |