The fastest way to run Qwen3.8-27B on one AMD Radeon AI PRO R9700. A vLLM image for gfx1201 (RDNA4) with hand-written MXFP4 kernels, DFlash2 speculative decoding and the full 262k context on a single 32 GB card: ~136 tok/s single-stream decode, ~3,100 tok/s prefill (2,635 at 47k), 461 tok/s at 8 concurrent requests, 437k-token KV pool (1.0.0 reference run at 300 W, see Performance), with every number measured and reproducible.
docker pull ghcr.io/slybase/vllm-sly-radiance:1.1.0-rocm10.1| Layer | Version |
|---|---|
| GPU | AMD Radeon AI PRO R9700, 32 GB, gfx1201 (RDNA4) — one card; TP 2/3/4/8 paths included but untested here |
| ROCm | 10.1 (rocm/dev-ubuntu-24.04:10.1.0-full, HIP 7.16, pruned to gfx1201) |
| PyTorch / Triton / torchvision | 2.13.0 / 3.8.0 (git669b31ac) / 0.28.0, all AMD's +rocm10.1.0 wheels (the trio vLLM 0.31's ROCm base builds) |
| vLLM | 0.31.0 (V1 engine, V2 model runner), built from source |
| AITER / transformers | 0.1.23 / 5.17.0 |
| Kernels | libr4d (prefill attention, gated delta net, all-reduce) + this repo's MXFP4 W4A8 GEMM, fused norm/quant, attention tunes |
| Model | amd/Qwen3.8-27B-Quark-AWQ-MXFP4 (Quark MXFP4, gated-delta-net hybrid) |
| Drafter | syvai/Qwen3.8-27B-DFlash2-W4A16, DFlash2 k = 7 + prompt lookup |
| Also serves | NVFP4, compressed-tensors INT4, ParoQuant, AutoRound, escha checkpoints (comparison) |
Reference run of image 1.0.0 on 2026-10-07 against 0.7.0 in the same GPU window (1.0.0 first, then 0.7.0), 300 W (firmware fan curve), Swift-1.5 Qwen3.8-27B GPTQ-MXFP4 + DFlash2 k = 7, production arguments of each image, BetterBench 0.4.0 default config (3 warmup + 20 passes per category, prefill 8 runs per depth, concurrency 1–16 × 48 requests, T 0.7 / top_p 0.95 / top_k 20):
| 1.0.0 | 0.7.0 | Δ | |
|---|---|---|---|
| Decode, single stream (weighted) | 135.8 tok/s | 137.4 tok/s | −1.2 % (within the ±5 % of one 20-pass sample) |
| update gap p50 / p99 | 34.4 / 35.2 ms | 34.3 / 35.0 ms | ± 0 |
| Prefill 1.5k / 6k / 12k / 24k / 47k prompt tokens | 3,132 / 3,136 / 3,105 / 2,949 / 2,635 tok/s | 3,108 / 3,049 / 2,946 / 2,648 / 2,164 | +1 / +3 / +5 / +11 / +22 % |
| time to first token, 47k tokens | 17.9 s | 21.7 s | −18 % |
| Concurrency 1 / 2 / 4 / 8 / 16, aggregate | 120 / 213 / 338 / 461 / 466 tok/s | 121 / 219 / 338 / 446 / 449 | −1 / −3 / 0 / +3 / +4 % |
| TTFT p50 at 8 / 16 concurrent | 197 / 2,738 ms | 224 / 3,140 ms | −12 / −13 % |
| KV pool (262k context) | 436,906 tokens | 391,193 | +12 % |
| GSM8K 200 (210 W, same day) | 0.84 | 0.83 |
The older reference run of image 0.4.0 (Quark checkpoint, 300 W and 210 W) is kept below for comparison.
Reference run of image 0.4.0 on 2026-09-25, production arguments from the quickstart
(--max-model-len 262144, fp8 KV, bf16 SSM state, DFlash2 k = 7, KV pool 384,316 tokens),
BetterBench 0.4.0 default config: single-stream decode
3 warmup + 20 passes per category, prefill sweep with unique prompts, concurrency 1–16 × 48 requests,
sampling temperature 0.7 / top_p 0.95 / top_k 20. Two power settings, no other traffic:
300 W (firmware fan curve) and 210 W (fan capped at 2,800 rpm, what this card runs 24/7).
| 300 W | 210 W | |
|---|---|---|
| Decode, single stream (weighted over 8 task categories) | 133.2 tok/s | 124.5 tok/s |
| step gap (one target forward + draft) | 34.8 ms | 37.0 ms |
| Prefill 1.5k / 6k / 24k / 47k prompt tokens | 3,166 / 3,161 / 2,903 / 2,512 tok/s | 2,527 / 2,498 / 2,311 / 2,027 tok/s |
| time to first token, 1.5k / 47k tokens | 0.48 s / 18.7 s | 0.60 s / 23.2 s |
| Concurrency 1 / 2 / 4 / 8 / 16, aggregate | 121 / 214 / 332 / 410 / 406 tok/s | 111 / 197 / 312 / 362 / 369 tok/s |
| GSM8K (200, cot zero-shot, greedy) | 0.855 ± 0.025 | |
| board power / junction / fan (avg) | 296 W / 98 °C / 3,710 rpm | 210 W / 93 °C / 2,321 rpm |
What that means: code, JSON, math and edits decode at 140–175 tok/s (the drafter lands 5–6 tokens per step), free prose at ~85; long contexts stay fast (99k tokens of context cost ~7 ms per step instead of 83). Per-category tables, the measurement method and every earlier release are in docs/BENCHMARKS.md. Decode differences below ~5 % between single runs are noise; see there for why.
Requirements: one R9700 (or another gfx1201 card with 32 GB), ROCm-capable kernel driver
(/dev/kfd, /dev/dri), Docker, ~20 GB of disk for the model + drafter, and enough free host RAM for the model load. Since 1.2 the
MXFP4 checkpoint is sharded by default, so vLLM loads it shard-by-shard and the peak host RAM is the largest shard (5 GiB)
instead of the whole ~19 GiB model — a 16 GiB box now loads it in minutes rather than swapping for hours. On the maintainer's
32 GB host the other VMs are paused while the model loads; on 16 GiB hosts they no longer need to be.
Windows 11 through WSL2: see docs/WINDOWS-WSL2.md.
# 1. model + drafter into the Hugging Face cache
hf download amd/Qwen3.8-27B-Quark-AWQ-MXFP4
hf download syvai/Qwen3.8-27B-DFlash2-W4A16
# 2. serve (OpenAI-compatible API on :8000)
docker run -d --name vllm --restart unless-stopped \
--device=/dev/kfd --device=/dev/dri --group-add video --group-add render \
--security-opt seccomp=unconfined --ipc=host -p 8000:8000 \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-v vllm-cache:/root/.cache/vllm -v triton-cache:/root/.triton -v aiter-cache:/root/.aiter \
-e HIP_VISIBLE_DEVICES=0 -e GPU_MAX_HW_QUEUES=2 \
-e RADIANCE_MXFP4=1 -e RADIANCE_MXFP4_W4A8=1 -e RADIANCE_MXFP4_W4A8_MIN_M=0 \
-e RADIANCE_MXFP4_DECODE_MAX_M=128 -e RADIANCE_MXFP4_A_TILED_MIN_M=513 -e RADIANCE_MXFP4_WPERM=1 \
-e RADIANCE_LMHEAD_INT4=1 -e RADIANCE_FUSED_NORM_QUANT=1 \
-e RADIANCE_KV_GROUP_SIZE=8 -e RADIANCE_EMBED_INT8=1 -e RADIANCE_EMBED_BITS=4 \
-e RADIANCE_MXFP4_WIDE_MAX_M=192 -e RADIANCE_ADAPTIVE_WIDTH=perseq \
ghcr.io/slybase/vllm-sly-radiance:1.1.0-rocm10.1 \
--model amd/Qwen3.8-27B-Quark-AWQ-MXFP4 --quantization quark \
--max-model-len 262144 --gpu-memory-utilization 0.98 \
--kv-cache-dtype fp8 --mamba-ssm-cache-dtype bfloat16 \
--speculative-config.method dflash \
--speculative-config.model syvai/Qwen3.8-27B-DFlash2-W4A16 \
--speculative-config.num_speculative_tokens 7 \
--speculative-config.draft_sample_method probabilistic \
--speculative-config.attention_backend TRITON_ATTN \
--attention-backend R4D_HYBRID \
--max-num-seqs 8 --max-num-batched-tokens 2048 \
--compilation-config.cudagraph_mode FULL_DECODE_ONLY \
--compilation-config.cudagraph_capture_sizes '[8,16,24,32,40,48,56,64]' \
--enable-prefix-caching --skip-mm-profiling --enable-mm-embeds \
--limit-mm-per-prompt.image 0 --limit-mm-per-prompt.video 0 \
--enable-auto-tool-choice --tool-call-parser qwen3_xml --reasoning-parser qwen3 \
--chat-template /opt/qwen-fixed.jinja \
--default-chat-template-kwargs '{"reasoning_effort": "medium"}' \
--override-generation-config '{"temperature": 1.0, "top_p": 0.95, "top_k": 20, "min_p": 0.0, "presence_penalty": 0.0}'
# 3. test
curl -s localhost:8000/v1/chat/completions -H 'Content-Type: application/json' \
-d '{"model":"amd/Qwen3.8-27B-Quark-AWQ-MXFP4","messages":[{"role":"user","content":"Hello!"}]}'- First start compiles kernels and CUDA graphs (~10 min) and reports a ~2 GiB smaller KV pool; restart once — the warm start takes 4–6 min and gets the full 436k-token KV pool. Keep the cache volumes.
- Power: 210 W costs ~6.5 % decode and ~20 % prefill against 300 W (table above). The card allows up to 330 W: +4 … +8 % prefill and ~+1 % step time over 300 W, but the junction runs at 102 °C average (106 °C peak) and the fan at ~4,200 rpm — not worth it for 24/7 use.
- iGPU:
HIP_VISIBLE_DEVICES=0keeps ROCm off an integrated GPU next to the R9700. - Other checkpoints: NVFP4, INT4, ParoQuant; several GPUs: docs/MULTI-GPU.md.
On top of vLLM, StillDeadcode/vllm-radiance (the RDNA4 build, libr4d kernels, gfx1201 fixes; FP8 on two cards) and ggz14/radiance-vllm-mxfp4 (MXFP4 on RDNA4, the W4A8 kernel), this fork makes one card with one MXFP4 model as fast as it gets. Each item was an A/B on the production arguments; the numbers are the gain it measured when it went in (details, per release).
| Change | Why | Gain |
|---|---|---|
| MXFP4 loader + W4A8 fp8-WMMA kernel ported to vLLM 0.29/0.30, gfx1201 GEMM configs | stock vLLM emulates MXFP4 in bf16 on RDNA4, and AITER's config crashed on 64 KiB LDS | usable at all |
gate_up (N = 34,816) on the decode kernel, measured decode cell table |
the widest GEMM silently fell to the prefill kernel | step 67 → 48 ms |
| DFlash2 with a W4A16 drafter + gfx1201 tile table | vLLM's drafter path assumed fp8/bf16 drafters and Llama-sized tiles | ~4.5 tokens per step |
| fp8 → int4 lm_head, int4 embeddings, KV group size, allocator scope | the 2.5 GB vocabulary head was read twice per step; memory goes to the KV pool | step −8 ms, full 262k context |
| Fused RMSNorm/SiLU/GDN-norm + fp8 quant, fragment-tiled activations, fragment-order weights | one kernel instead of three per GEMM input, contiguous weight reads | prefill +11–13 %, decode +3.7 % |
| libr4d narrow-state GDN kernels (bf16 SSM cache) | the pinned libr4d fell back to Triton for a 16-bit state | prefill +5 %, step −0.7 ms |
| Verify-batch decode attention tune (aiter 0.1.21+), split-KV drafter attention | the upstream tune had silently stopped applying | decode at 99k context 2.5× |
| Prompt lookup over the whole context | the drafter only sees the last 2,048 tokens | edits/quotes of far text +57–116 % |
--attention-backend R4D_HYBRID: libr4d prefill attention for runs >= 512 tokens, AITER for the rest (1.0) |
plain R4D prefills faster but decodes at 60.9 instead of 34.9 ms/step; the hybrid keeps AITER's decode | prefill 8k / 32k / 64k +3 / +13 / +23 % |
--gpu-memory-utilization 0.98 + FULL_DECODE_ONLY (1.0) |
the PIECEWISE graph set cost 1.24 GiB of graphs and 1.69 GiB peak activation | KV pool 391,193 → 436,097 tokens (+11.5 %) |
RADIANCE_MXFP4_WIDE_MAX_M=192 (1.0) |
M 129…192 ran on a 256-row tile with up to 49 % padding; now the split-K decode kernel | TTFT of a 160-token prompt −13.8 % |
RADIANCE_ADAPTIVE_WIDTH=perseq (1.0, ported from the Radiance engine) |
acceptance differs 2× between requests; per-request verify width on varlen FULL graphs (why ggz14's version lost) | 8 concurrent requests +4.7 % |
| ROCm 10.1 + torch 2.12 (1.0) | current AMD toolchain; the CPU-spin bug that held torch back is fixed | neutral (±1–2 %) |
| vLLM 0.31.0 + torch 2.13 / triton 3.8.0 / torchvision 0.28.0 / aiter 0.1.23 (1.1) | the combination vLLM's own ROCm base builds, as AMD wheels | pending GPU run |
| Constraints for every PyPI pin, 4.8 GB image with a stable/volatile layer split | reproducible builds, ~35 MB update pulls | – |
What was tried and rejected, with reasons: docs/NOT-ADOPTED.md.
Recommended = what the reference run above uses. All knobs are environment variables read at start; everything not listed is off by default and documented in docs/TECHNICAL.md and sly/README.md.
| Variable | Recommended | Why |
|---|---|---|
RADIANCE_MXFP4 |
1 |
unlocks native MXFP4 on gfx1201; without it vLLM emulates in bf16 |
RADIANCE_MXFP4_W4A8 |
1 |
the hand-written fp8-WMMA MXFP4 GEMM ahead of AITER's |
RADIANCE_MXFP4_W4A8_MIN_M |
0 |
the W4A8 kernel also for small M (decode) |
RADIANCE_MXFP4_DECODE_MAX_M |
128 |
split-K decode kernel up to M = 128: covers max-num-seqs × 8 and the mixed CUDA-graph sizes |
RADIANCE_MXFP4_WIDE_MAX_M |
192 (default 0 = off) |
split-K decode kernel with 9–12 M fragments for M 129…192 instead of the padded 256-row tile: TTFT of 160-token prompts −13.8 %. Not 256: the folded tile wins again there (+11 % GEMM time at M 256). Needs WPERM=1 |
RADIANCE_ADAPTIVE_WIDTH |
perseq (default 0 = off) |
per-request verify width, graph-safe (varlen FULL graphs): c8 with arrivals +4.7 %, one stream unchanged. uniform (one width per batch) gave +1.5 %. Tuning knobs RADIANCE_AW_* in sly/README.md |
RADIANCE_R4D_PREFILL_MIN_Q |
512 |
with --attention-backend R4D_HYBRID: smallest per-request chunk that goes to libr4d's prefill kernel; smaller chunks (decode, TTFT of short prompts) stay on AITER |
RADIANCE_R4D_HYBRID_ROUTE |
1 |
0 = the hybrid backend never routes to libr4d (= AITER, for A/Bs) |
RADIANCE_MXFP4_A_TILED_MIN_M |
513 |
fragment-tiled prefill GEMM from M = 513 (+11–13 % prefill); must stay above 512 and DECODE_MAX_M |
RADIANCE_MXFP4_WPERM |
1 |
fragment-order weights (+3.7 % decode); set 0 with RADIANCE_TP_PAD=3 |
RADIANCE_LMHEAD_INT4 |
1 |
int4 vocabulary head (656 MB instead of 2.5 GB per call; GSM8K unchanged). RADIANCE_LMHEAD_FP8=1 is the more exact fallback |
RADIANCE_LMHEAD_INT2 |
1 (with greedy decoding) |
the 2-bit greedy vocabulary head: 2-bit coarse pass + bf16 top-16 re-rank, ≈7.5× less head traffic per decode step than int4; greedy-only (declines under sampling, byte-identical default otherwise) |
RADIANCE_DFLASH_BF16 |
0 (opt-in) |
expands the drafter's W4A16 rows to bf16 at load: +3.22 GiB VRAM, 3.88× the hot-path weight budget; default path byte-identical |
RADIANCE_FUSED_NORM_QUANT |
1 |
fused norm/activation + fp8 quant in front of every W4A8 GEMM |
RADIANCE_KV_GROUP_SIZE |
8 |
groups the KV cache pages 2+6+1 instead of padding to the drafter's bucket: more KV tokens |
RADIANCE_EMBED_INT8 + RADIANCE_EMBED_BITS |
1 + 4 |
int4 embedding table, 1.76 GiB more KV |
GPU_MAX_HW_QUEUES |
2 |
the ROCm default picks a random queue layout per start; 2 is consistently fastest |
RADIANCE_ATTN_DECODE_TUNE, RADIANCE_ATTN_DRAFTER_TUNE, RADIANCE_LOOKUP_DRAFT (prompt lookup),
RADIANCE_USE_R4D (libr4d kernels), RADIANCE_MXFP4_DECODE_TUNE16, and for the W4A16 GEMMs (INT4 targets and
the drafter): RADIANCE_W4A16_TILES (tile table), RADIANCE_W4A16_SPLITK (split-K / fast dequant, per-shape
table; RADIANCE_W4A16_SPLITK_TABLE=<json> replaces it), RADIANCE_W4A16_TILED (weights in 1 KB 16-row
blocks), RADIANCE_LMHEAD_INT4_TILED (the int4 lm_head too), RADIANCE_W4A16_SILU (gate_up + silu in one
GEMM), RADIANCE_DFLASH_KV_W4 (drafter context-KV on its int4 rows instead of a 105 MB bf16 copy),
RADIANCE_DFLASH_CONV_W4 (drafter conv projection int4). Set any to 0 only for an A/B.
RADIANCE_GDN_BA_W4=1 (GDN in_proj_ba as int4 rows of in_proj_qkvz, one GEMM) stays off: measured slower.
| Argument | Recommended | Trade-off |
|---|---|---|
--max-model-len |
262144 |
the model maximum; the KV pool (436k tokens) then holds one full-length request plus change. Lower it only together with the options below — it does not make a single request faster |
--attention-backend |
R4D_HYBRID |
libr4d for long prefill runs, AITER for decode and short chunks. Plain R4D is not recommended (decode 60.9 vs 34.9 ms/step). ROCM_AITER_UNIFIED_ATTN is the fallback (slower long prefill) |
--gpu-memory-utilization |
0.98 |
with FULL_DECODE_ONLY the profiled activation peak is 0.65 GiB, so 0.98 leaves room; 0.98 with FULL_AND_PIECEWISE gives only 404,947 KV tokens |
--compilation-config.cudagraph_mode |
FULL_DECODE_ONLY |
graphs only for pure decode batches (0.22 GiB instead of 1.24); prefill and mixed steps run eagerly, no measured TTFT or c8 cost. Keep the capture-size list |
--max-num-batched-tokens |
2048 |
prefill chunk size. Larger chunks prefill long prompts faster but take activation memory from the KV pool: measured at --max-model-len 131072, 4096 gives +3.5 … +4.8 % prefill at 8k–64k prompts (short prompts unchanged) for ~24k fewer KV tokens (−7 %); 8192 is no faster than 4096 and costs ~68k tokens. 2048 keeps the full pool for 262k |
--max-num-seqs |
8 |
8 × (7 + 1) = 64 verify tokens per step, inside DECODE_MAX_M; above 8 requests queue (conc 16 = conc 8 throughput) |
--kv-cache-dtype fp8 |
on | twice the KV of bf16; accuracy unchanged |
--mamba-ssm-cache-dtype bfloat16 |
on | halves the gated-delta-net state; with 0.3.5 also the faster libr4d kernels |
--speculative-config.num_speculative_tokens |
7 |
the drafter's maximum (block size 8) |
--chat-template /opt/qwen-fixed.jinja |
on | froggeric's fixed Qwen template (medium reasoning default, no empty think blocks, tool-call fixes) |
--override-generation-config |
Qwen's thinking values | temperature 1.0 / top_p 0.95 / top_k 20; clients that turn thinking off should send 0.7 / 0.8 / 20 / presence 1.5 |
Less context, more prefill: if your requests stay well below 262k tokens, set
--max-model-len 131072 --max-num-batched-tokens 4096: +3.5 … +4.8 % prefill on 8k–64k prompts, and the
KV pool (~326k tokens) still holds two full 131k requests. Measured with image 0.4.0 on 2026-09-25 (300 W, prefill sweep; KV pools are 0.4.0 values, 1.0.0 holds ~11 % more):
--max-model-len / --max-num-batched-tokens |
Prefill 2k / 8k / 16k / 32k / 64k tok/s | KV pool |
|---|---|---|
| 262144 / 2048 (default) | 3,363 / 3,326 / 3,196 / 2,926 / 2,512 | 384,316 |
| 131072 / 2048 | 3,379 / 3,344 / 3,212 / 2,936 / 2,520 | ~350k |
| 131072 / 4096 | 3,375 / 3,444 / 3,351 / 3,057 / 2,613 | ~326k |
| 131072 / 8192 | 3,367 / 3,486 / 3,290 / 3,022 / 2,579 | ~282k |
Decode and concurrency are unchanged within noise. (These are prefill-only sweeps, which read ~5 % higher than the prefill phase of the full run in the table above; compare within one table.)
A second-tier prefix cache behind the GPU prefix cache for long-context / agent-style sessions, where
every turn re-sends the whole conversation and the prefix outgrows the GPU pool. Off by default: with
KVCACHE unset (or off) the serve command is byte-identical to the unmodified script — nothing is
mounted, patched or passed to the engine.
| Variable | Recommended | What it does |
|---|---|---|
KVCACHE |
off |
off (default) = stock behaviour; ram = GPU → RAM tier in /dev/shm + the 6 behavioural patches; disk = GPU → RAM → disk + the full 15-patch instrumented set |
KVCACHE_RAM_GIB |
16 |
size of the RAM tier (GiB); needs /dev/shm big enough |
KVCACHE_DISK |
— | host path of a dedicated filesystem for the disk tier (KVCACHE=disk only); the disk tier also wants kvcache-reap.sh (see kv-cache/README.md) to keep the fs below 70 % |
The offload patches, kvwatch.py and the turnbench/tierbench benches live in kv-cache/ and ride
the repo's existing /patches mount; serve-mxfp4.sh applies them at container start (not baked).
The disk tier additionally needs its own filesystem plus a host systemd reaper (your step, not the
image's). Measured (one R9700, TP=1, KVCACHE_RAM_GIB=16, 110k-token agent sessions): a ~81k-token
request drops from 38.8 s (no cache) to ~13 s (RAM tier) — see kv-cache/README.md. This
reduces re-prefill latency for long sessions; it does not raise --max-model-len.
| Switch | For |
|---|---|
RADIANCE_NVFP4_MXFP4=1 + --quantization compressed-tensors |
NVFP4 checkpoints (e.g. unsloth/Qwen3.8-27B-NVFP4), requantized to MXFP4 at load — same speed as Quark |
RADIANCE_PAROQUANT=1, RADIANCE_AUTOROUND=1, RADIANCE_ESCHA=1 (no --quantization) |
ParoQuant, AutoRound, escha checkpoints |
QUANT=mxfp6 ./serve.sh / ./setup.sh --mxfp6 |
ParoQuant MXFP6 (W6A8); needs TP>=2 (upstream-validated), one R9700 is TP=1 |
--tensor-parallel-size 2/3/4/8, RADIANCE_TP_PAD=3, RADIANCE_AR_* |
several cards — see docs/MULTI-GPU.md |
| Path | What |
|---|---|
Dockerfile, constraints.txt, VERSION |
the build (from-source stack, patch loop, kernels) and its pins |
sly/ |
everything this fork adds: patches, kernels, attention tunes, benches (reference) |
patch_*.py, radiance_*.py, paroquant/, escha/, launch scripts in the root |
the upstream repositories' files, synced daily; the Dockerfile loop and ci/unused_patches.txt say which are used |
ci/ |
CI scripts, the acceptance gate, the release tagging |
docs/ |
technical deep dives, benchmarks, not adopted, multi-GPU, Windows / WSL2, development & releases, automated maintenance |
CHANGELOG.md |
per-version changes = release notes; contributor rules in AGENTS.md |
This image stands on other people's work:
- StillDeadcode — vllm-radiance and libr4d: the RDNA4 build, the gfx1201 kernels and fixes everything here runs on.
- Radiance engine fork (StillDeadcode/radiance, our fork
slydlake/radiance) — the
adaptive_kverify-width policy behindRADIANCE_ADAPTIVE_WIDTHand the M-band findings (wide decode tile) behindRADIANCE_MXFP4_WIDE_MAX_M, ported to vLLM's graph model. - libr4d — the paged prefill attention kernel behind
R4D_HYBRID. - ggz14 — radiance-vllm-mxfp4: MXFP4 on RDNA4 and the W4A8 kernel, the libr4d extras, TP=3 padding, and the NVFP4, ParoQuant and AutoRound paths.
- vLLM, AITER, the
DFlash authors;
sly/gdn/radiance_gdn_decode.hipports vLLM's fused GDN decode kernel (Apache-2.0). - syvai for the DFlash2 W4A16 drafter, AMD for the Quark MXFP4 checkpoint, froggeric for the fixed Qwen chat template.
- turboderp/exllamav3 (MIT) —
escha/derives from it; z-lab for the ParoQuant format.
License: same as upstream vllm-radiance (see LICENSE).