Qwen3.8-27B — NVFP4 prefiller

Prefill and decode do not have to run the same weights. This repo holds the prefill half: NVFP4 transformer blocks that are streamed off the SSD one layer at a time, paired with a resident low-bit GGUF for decode.

The point is that the two phases want different things. Decode is memory-bound and spends its budget on being small. Prefill is compute-bound, so it can afford better weights — as long as they never have to be resident.

Accuracy and time-to-first-token against device weight size

Better prefill weights recover most of what aggressive decode quantization gives up, at no resident-memory cost — and past a few thousand tokens the streaming disappears under compute, so it is not paid for in latency either.

How it works

Prefill and decode paths

Only the transformer stack's linear projections are disaggregated. The embedding, output head, norms and the gated-DeltaNet convolution/state parameters are shared with decode and come from the GGUF.

What it costs

The checkpoint is 12.8 GiB and never becomes resident: it is read through a two-slot ring carved out of the output head's own memory, so the ring itself adds zero device memory. Reads overlap the previous layer's compute.

Per-block read/compute overlap

Variants

One directory of blocks per decode quantization, named for the GGUF it was trained against.

variant decoder it pairs with status
IQ1_S Qwen3.8-27B-UD-IQ1_S.gguf available
IQ1_M Qwen3.8-27B-UD-IQ1_M.gguf available
IQ2_XXS Qwen3.8-27B-UD-IQ2_XXS.gguf available
IQ2_S Qwen3.8-27B-UD-IQ2_S.gguf available

A prefill checkpoint belongs to one decode checkpoint. Pairing the wrong two is silent — the shapes agree and the model still speaks, it is just worse — so the engine selects the variant from the decoder rather than letting you guess.

Running it

Needs a Blackwell consumer GPU — GB10 (sm_121) or RTX 50-series (sm_120). The build picks the right architecture on its own; if you pin one, it must be 120a/121a, because the block-scaled FP4 MMA is architecture-specific PTX and plain 120/121 or the 120f family target fail to assemble.

git clone https://github.com/IST-DASLab/disaggregated-llama.cpp.git llama.cpp && cd llama.cpp
cmake -B build -DGGML_CUDA=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build -j

Both halves come from the Hub, so there is nothing to download by hand. Pass the decoder and this repo; the prefill variant follows from the decoder:

./build/bin/llama-server -ngl 99 \
    -hf unsloth/Qwen3.8-27B-GGUF:IQ1_S \
    --odp-blocks ISTA-DASLab/Qwen3.8-27B-disaggregated-NVFP4-prefill

A local decoder works the same way — swap -hf ... for -m path/to/decoder.gguf.

The log tells you what it picked:

odp: taking variant 'IQ1_S' from the decoder (filename)
odp: prefill variant 'IQ1_S' from ISTA-DASLab/Qwen3.8-27B-disaggregated-NVFP4-prefill (64 parts)

Flags

flag what it does
--odp-blocks <repo> this repo, or <repo>:<VARIANT> to pin one, or a local directory
-ub N micro-batch. Left alone it is raised to 8192 so the checkpoint streams once per batch; lower it to trade time-to-first-token for device memory (2084 MiB at 8192, 521 MiB at 2048)
-cram 0 -ctxcp 0 for benchmarking. The server otherwise splits a prompt to snapshot recurrent state, and ODP re-streams for each split

If your build has no TLS (configure -DLLAMA_OPENSSL=ON if you can), populate the cache out of band and llama.cpp reads it from there:

hf download unsloth/Qwen3.8-27B-GGUF --include 'Qwen3.8-27B-UD-IQ1_S.gguf'
hf download ISTA-DASLab/Qwen3.8-27B-disaggregated-NVFP4-prefill

Format

Each block is a real GGUF holding one layer's projections as GGML_TYPE_NVFP4, so gguf_dump and the viewer above show what is inside. The trained 4-bit values and their E4M3 block scales are copied verbatim from the compressed-tensors export — the conversion is bit-identical, verified over every weight of a projection. NVFP4's per-tensor global scale has no slot in ggml's block layout and needs none: a scalar commutes with the matmul, so it rides in the KV as odp.scale.<name> and is applied to the result.

Files use llama.cpp's split-file convention, which is what lets one repo hold every variant:

Qwen3.8-27B-ODP-IQ1_S-00001-of-00064.gguf ... -00064-of-00064.gguf
Qwen3.8-27B-ODP-IQ1_M-00001-of-00064.gguf ...
Downloads last month
154
GGUF
Model size
24B params
Architecture
odp
Hardware compatibility
Log In to add your hardware

1-bit

2-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for ISTA-DASLab/Qwen3.8-27B-NVFP4-prefiller

Base model

Qwen/Qwen3.8-27B
Quantized
(20)
this model