DualView — one model, two execution views

CIRU DualView campaign card: Q7 decode and Q8 prefill, one model with two execution views.
1,236 tok/smean PP4096 prefill · full model · no MTP
+4.35%prefill vs official Q8_0 · matched protocol
9 samplesthree clean loads · 1,219–1,250 tok/s range

Ornith 35B on Radeon 8060S / gfx1151: full-model PP4096, three clean loads and nine native samples. The 1,236.156 tok/s mean is not an operator microbenchmark and does not use MTP.

Start with the workload

Inference is two very different jobs sharing one model.

A local LLM first reads your prompt, then writes its answer. Those phases touch the same weights, but they ask radically different things from the hardware. Treating them as one workload forces a compromise before inference even begins.

Prefill is the reading phase. Hundreds or thousands of prompt tokens can be processed together, forming large matrix operations. Modern GPUs have specialized INT8 matrix machinery for exactly this kind of wide, regular work. Feeding that machinery the layout it expects can matter more than shaving another fraction of a bit from storage.

Decode is the writing phase. The model usually advances one token at a time, repeatedly walking through its weights. That loop is often constrained by how quickly bytes can move through memory. A compact representation therefore has a different advantage: it reduces traffic on every generated token.

Ordinary quantization chooses one physical representation and asks both phases to live with it. DualView separates the stored identity of the model from the execution view presented to a kernel. The model remains a quality-maximized Q7 representation; the runtime can expose those same weight values as signed INT8 when the prefill kernel benefits from a matrix-native path.

PrefillTurn the prompt into model state.

Wide work, many tokens, matrix throughput matters.

DecodeProduce the next token repeatedly.

Narrow work, repeated weight reads, bandwidth matters.

The central idea

DualView is not two independently quantized copies and it is not a quality trade at the phase boundary. It is one authoritative compact representation with two hardware-facing views.

THE ARCHITECTURE

One source of truth, expressed two ways.

DualView does not swap between two separately trained models. The compact Q7 weights remain authoritative. At prefill, they open into an exact hardware-native compute view; at decode, they stay packed.

1

Store once

A quality-maximized Q7 representation is the model.

2

Choose by phase

The runtime sees prompt work or generation work.

3

Meet the silicon

Each phase reaches the kernel path built for it.

Q7 · DecodeQ8 · Prefill
What is stored

The Q7 block is the source of truth.

Each block carries signed seven-bit weight values plus FP16 scales. Decode can consume that compact representation directly, so the model moves fewer bytes through the bandwidth-sensitive token loop.

Quality does not come from treating every tensor identically. The retained Ornith recipe keeps a Q7 foundation and preserves selected attention and Mamba-output tensors in canonical Q8 where graph-level testing showed that precision mattered.

What prefill sees

The same integer value, widened for the matrix engine.

A signed Q7 value already fits inside signed INT8. Prefill widens each value without changing it and reuses the same scale, creating the physical view expected by native INT8 matrix hardware. The number is unchanged; only its representation in the execution path is wider.

This matters because a smaller file does not automatically produce a faster matrix multiply. Packing density, unpack cost, tiling, register pressure, LDS traffic, and the hardware’s native instruction shapes all decide whether a quant is actually fast.

What the runtime decides

A view is useful only when the workload can repay it.

During prompt processing, the runtime opens the exact signed-Q8 view so wide matrix work reaches the GPU path built for it. Once generation narrows to a token loop, it returns to the compact Q7 view and avoids paying Q8 bandwidth on every step.

Speculative decoding can be layered on top, but it is a separate capability—not the source of the prefill result. The primary 1,236.156 tok/s proof runs the full Ornith model with MTP disabled.

TRY THE PHASE SHIFT

Same model. Different job.

Read the prompt

Open the compute-wide view.

When the model ingests a prompt, the work arrives as large matrix operations. DualView expands the same stored Q7 weight values into an exact signed-INT8 view so the GPU can use its mature Q8 matrix path.

  • Matrix-tiled
  • WMMA accelerated
  • High-throughput prompt processing
NO SECOND QUANTIZATION

Changing the view does not change the model.

A stored Q7 weight value already fits inside signed INT8. DualView widens that value for prefill without changing the number. This is an exact representation change, not another approximation. It cannot restore information lost before Q7, and it does not throw away anything new.

“Lossless” is deliberately narrow here. It means the transition from the stored Q7 value to the INT8 execution value introduces no additional rounding or requantization error. It does not mean Q7 contains the original BF16 weights, nor that every possible kernel schedule is numerically identical.

Same stored values Same scales No extra rounding
QUALITY-MAXIMIZED, NOT BIT-MAXIMIZED

Precision goes where the graph proves it matters.

The retained Ornith recipe keeps the compact Q7 foundation and promotes a small, topology-aware set of attention and Mamba-output tensors to canonical Q8. More bits everywhere was not better. Better placement was.

That selection came from graph-level ablations rather than a generic layer rule. Seventy tensors were retained as Q8 precision islands. The retained artifact reached 1,236.156 tok/s at PP4096 across three independent loads and nine native samples.

The result is best understood as a quality-max recipe with a compact default—not as a promise that seven bits are always optimal. DualView leaves room for different compact formats, scale layouts, and hardware views as those paths are proven.

70selected Q8 tensors
1,236.156PP4096 tok/s mean
9native speed samples
Q7 foundation Q8 precision islands
Measured on Strix Halo · ROCm

1,236 tok/s. The fastest Ornith prefill in our index.

This is full-model PP4096 throughput from the retained quality-max DualView artifact—not an isolated kernel. It is a nine-sample mean across three clean model loads with MTP disabled.

Same prefill workload. Every primary bar uses full-model PP4096 on the same ROCm runner. DualView reaches 1,236.156 tok/s, ahead of the official Q8_0 and Q6_K models under the matched protocol.

Same target-only decode. The decode comparison keeps MTP off for every row. At 64K, the quality-max DualView target reaches 37.05 tok/s while preserving its Q7 decode path, ahead of the tested Unsloth UD-Q5_K_M, UD-Q6_K_XL, and UD-Q8_K_XL targets.

Context changes the number. Throughput falls as context grows, so results from a separate 64K serving curve are not interchangeable with fixed-workload PP4096. Every comparison shown here names its context and execution profile.

Preparing measured charts…
Primary prefill: Ornith 35B, PP4096, batch 2048 / microbatch 512, F16 KV, flash attention, full offload, MTP disabled.
Repeatability: three independent model loads, three native repetitions per load; 1,219.43–1,249.91 tok/s, 1,236.156 tok/s overall mean.
Decode comparison: separate 64K target-only measurements with MTP disabled for DualView and every vanilla control. It is not blended into the PP4096 result.
Storage and residency are different

The file is large. The live footprint is much larger.

The retained quality-max target is 32.64 GB on disk. Once the official Q8 MTP head is integrated, the deployable research artifact is 33.54 GB. That is 12.21% smaller than the 38.20 GB Unsloth UD-Q8_K_XL file, but “smaller than Q8” should not be confused with small.

The target-only runtime measured a 68.20 GB GTT delta. The prototype’s 64K depth-7 MTP run measured 73.08 GB because the runtime materializes a Q8 compute shadow and also carries the speculative head and long-context state. These are live allocation observations, not GGUF file sizes.

This is why Strix Halo and other large UMA systems are especially interesting. A shared memory pool can hold the target, the expanded execution view, the MTP state, and a long-context KV cache without shuttling the model across a discrete PCIe boundary. UMA does not make the memory free; it makes the trade physically possible.

Measured objectSizeWhat it means
Quality-max DualView target32.64 GBRetained Q7/Q8 model artifact
DualView + official Q8 MTP head33.54 GBIntegrated deployable GGUF
Unsloth UD-Q8_K_XL38.20 GBTarget-only comparison artifact
DualView target-only live GTT68.20 GBMeasured runtime delta, MTP off
64K depth-7 MTP live GTT73.08 GBMeasured runtime delta, not disk size
FOR THE CURIOUS

The simple idea underneath the neon.

You do not need the equations to understand DualView. But if you want to inspect the exactness claim, it fits in a few lines.

Open the math and block layout
EXACT VIEW SHIFTq₇ ∈ [−64, 63]
q₈ = sign_extend₇(q₇)
s · q₈ = s · q₇

The integer value and FP16 scale are unchanged. Only the physical representation widens for the compute path.

Q7 BLOCK256 weights
224 B integer values + 16 B scales
= 240 B · 7.5 bpw

Eight FP16 scales serve groups of 32 weights. The compact block remains the decode/storage authority.

IMPORTANT BOUNDARYexact to Q7 ≠ recovery of BF16

DualView adds no new quantization error during conversion. It does not recreate information discarded when Q7 was formed.

CIRU DUALVIEW

The model no longer has to choose one compromise.

Compact when memory bandwidth rules. Compute-wide when matrix engines take over. One quant, engineered around how inference actually happens.

Read the technical whitepaper