History and roadmap

TileInfer was built in milestones, each a working engine that the next one sped up or extended. This page shows where it stands, how it got there, and what comes next. The measurements behind every step, including the ideas that did not pan out, are in the Results by feature.

Where it stands

As of 2026-11-01, milestones M0–M7 are done and M8 (performance) is in progress. On the RTX 4080 SUPER, in BFloat16, with decode measured after 1,023 cached positions:

Qwen3-0.6BQwen3-4B
Decode409 tok/s (73 % of the bandwidth roofline)79 tok/s (88 %)
Decode with INT8 weights542 tok/s139 tok/s
Prefill, 512-token prompt58k tok/s11.4k tok/s (91 TFLOP/s)
Speculative decoding (DFlash)—1.8× to 3.2× on open prompts, 8.5× on a code edit

Models: Llama 3, Mistral, Qwen3 and Apertus (Apertus 1.5 8B runs on 16 GB with INT8 weights, at 80 tok/s).

Milestones

MilestoneDoneOutcome
M0Environment2026-10-26Julia 1.13, CUDA.jl and cuTile.jl on the 4080 SUPER; cuTile launches capture into CUDA graphs; a launch costs ~5 µs
M1Models from the hub2026-10-26pull, safetensors loading without transposes, own BPE tokenizer matching Hugging Face tokenizers, Qwen3 chat template
M2Reference model2026-10-26the whole model on broadcasts and cuBLAS; Float32 logits match transformers to ~1e-4
M3Paged KV cache and chat2026-10-26block manager, paged reference attention, multi-turn chat with prefix reuse
M4cuTile kernels2026-10-27norm, RoPE, KV write, SwiGLU, embedding, GEMV, GEMM; the decode GEMV at 68–93 % of the roofline (1.0–1.3× cuBLAS)
M5Paged flash-attention2026-10-27prefill and split-KV decode kernels: attention 42× (prefill) and 73× (decode) faster than the reference
M6CUDA graphs2026-10-27allocation-free steps with inputs on the device, replayed from graphs
M7Speculative decoding2026-10-30exact verification for greedy and sampled decoding; n-gram, draft-model and DFlash proposers
M8Performancein progressfusions, device sampling, INT8 weights and KV cache, tuned tiles (below)

Qwen3-0.6B along the way:

StageDecodePrefill (512 tokens)What changed
M326 tok/s6.7k tok/sreference ops: cuBLAS and broadcasts
M429 tok/s9.5k tok/scuTile kernels, but the reference attention still dominates
M5263 tok/s32k tok/spaged flash-attention
M6348 tok/s43k tok/sstatic buffers, decode replayed from a CUDA graph
M8 so far395–410 tok/s58k tok/sfused kernels, sampling inside the graph, host one step behind the GPU, tuned GEMM tiles

Each stage moved the bottleneck: M4's kernels were hidden behind the reference attention (~6k GPU allocations per token), M5 left the step bound by launching ~540 kernels from the host, and after M6 the step was bound by the GPU itself, where only fewer, better kernels help.

M8 so far

DateChangeGain
2026-10-27Fusions: q/k norm + RoPE + KV write, residual add + RMSNorm, SwiGLU in the GEMV; pinned async uploads; pipelined decode0.6B decode 348 → 405 tok/s
2026-10-29Top-k/top-p sampling on the device, inside the graphsampled decoding as fast as greedy
2026-10-29GEMM tiles chosen per shape; two blocks per SM on large gridswithin 2 % of the best tile, 1.06× cuBLAS on average
2026-10-31Weight-only INT8 linear layersdecode 1.32× (0.6B), 1.77× (4B); Apertus 1.5 8B fits on 16 GB
2026-10-3116-token verify steps on the split-KV decode kernels+8–10 % for DFlash at 2k-token contexts
2026-10-31INT8 KV cache with smoothed keys; INT8 attention without spills4B decode at 32k positions 1.19×
2026-10-31INT8 GEMM tiles and occupancy of their ownINT8 prefill 0.89× → 0.97× BF16, 1.5× BF16 at 64 tokens
2026-10-31DFlash drafts handed to the verify step on the device+1.2 %
2026-11-01EAGLE-3 proposer removedDFlash beat it on every prompt

The M8 target is 80 % of the decode bandwidth roofline: met on Qwen3-4B (88 %), not on Qwen3-0.6B (73 %), where per-kernel overheads weigh more.

Next

Chosen for what each teaches and lets us demonstrate, not only for raw speed.

ItemWhy
Chunked prefilla step's buffers are sized for the whole prompt (a 32k-token prompt on Qwen3-4B needs ~1.3 GB for one activation alone); fixed-size chunks bound that memory
Prefill attention for long promptsat 4k–16k tokens attention catches up with the GEMMs; GQA packing in the prefill kernel and heaviest causal blocks first are the candidates (see Attention kernels)
INT8 GEMM without register conversionINT8 prefill is still a few percent behind BF16 because weight tiles are converted in registers; a prepacked layout (as Marlin does) would hide it
512-token GEMMs at cuBLAS speedthey run at 0.87–0.92× cuBLAS, ~5 ms of a 45 ms Qwen3-4B prefill
Adaptive k, tree verificationchoose the number of drafts per step from measured acceptance; verify several candidate branches at once (see Speculative decoding)

Later, once the single-sequence engine is done: several sequences in flight (continuous batching), prefix caching across sequences and cache sizing from free memory (see KV cache), CPU scheduling overlapped with GPU execution, and compiling every kernel a model needs at load time.

Tried and not kept

IdeaWhy it was dropped
EAGLE-3 draftinglevel with the 0.6B draft model, and DFlash beat it on every prompt
Attention combine fused into the split kernelslower than a separate combine
Int8 tensor cores for QKᵀ in INT8 attentionas fast as converting to BF16, but quantizing the queries undid the accuracy that key smoothing gained
Split-K GEMM for verify stepsdid not beat the per-shape GEMM tiles at 2–64 tokens
latency hints on loadsno measurable effect on any GEMM, GEMV or attention kernel
Sampled drafts by defaultmixed results with Qwen3's sampling settings; kept as an option
INT4 or group-wise weight quantizationnot tried: ~1.5× faster decode than INT8, but little to learn beyond what INT8 showed

Open questions

  • Several KV pages per load. Tile IR ≥ 13.3 can gather several pages in one load through sparse views. The attention kernels use one runtime-indexed load per page; the alternative is not measured yet.