Engineering story · Inference Fabric

Engines for the card you have

One calibrated FP8 checkpoint, a dozen inference engines sized to two consumer Blackwell GPUs, and the benchmarks that decided what the tiers would be

7B dense model in FP8TensorRT-LLM built from sourceTwo NVIDIA Blackwell GPUs
One checkpoint · FP8 weights and cache · tiers per card
Each engine carries its own contract
12engines from one quantized checkpoint
  • 7.5 GBengine footprint on disk, every tier
  • 3.5 sengine load time
  • +56%throughput at a 70 percent shared prefix on the larger card
  • 6lines changed in the vendor model graph

A built inference engine is a commitment to one GPU, one precision and one set of limits. It will load on that card and refuse any other, it holds exactly the batch and token budget it was built for, and it carries the key-value cache layout it was given. The fleet that reached 163,000 tokens per second in From 44K to 163K tokens per second ran on engines I built this way, a dozen of them from one checkpoint, each sized to the card in front of me.

One checkpoint, many engines

The model is a 7-billion-parameter dense instruction model. I quantize it once: FP8 weights and an FP8 key-value cache, calibrated, with the output head left in high precision. Every engine is then built from that one checkpoint, so the engines differ only in their limits and cache layout. They share paged key-value memory and FP8 context attention. The base image they run in was built from source for consumer Blackwell only, and the model graph in it carries one small change of mine, described below.

Tier by token budget, then by batch

Sweeps established that tokens per step, the number of tokens the engine processes in one forward pass, is the dominant lever on these cards. So tiers double the token budget and scale the batch alongside until the next tier runs out of memory. On the larger card, with 32 GB of memory, the tiers climb to 4,096 sequences and 524,288 tokens per step. On the smaller card, with 16 GB, they stop at 1,536 sequences and 98,304 tokens, with a halved variant at 49,152 kept for headroom.

One sweep on the 32 GB card · tokens per second by tier
Tier 116,847 Tier 230,129 Tier 335,842 Tier 440,156 Tier 543,680 Tier 6did not fit
Each tier doubles the token budget per step and scales the batch alongside.

Most tiers cap each sequence at 1,024 input tokens and 128 output tokens, which keeps every sequence's cache small and the number of slots large. Separate long-sequence tiers accept 3,840 input tokens with larger cache blocks, for the prompts that need them.

The contract travels with the engine

routing model id
tokenizer ids
target GPU
batch, token, input and sequence limits
cache block size
GPU memory share for the cache
host-side cache size
heartbeat
warm-queue target
extraction capability

The broker and the provisioner read it, and the runtime refuses to load an engine without one. A node is configured by the engine it loads, which is what lets One call to a GPU anywhere start a consumer anywhere with an engine path and nothing else.

Caching measured on the real prompt structure

My workload shares long prefixes across prompts, so I measured what block reuse was worth at the geometry I actually run: batch 768, a 98,304-token engine, 128 tokens in and 128 out.

32 GB card · tokens per second
No shared prefix21,729Half shared30,50370% shared33,899
16 GB card · tokens per second
No shared prefix21,552Half shared27,09770% shared29,840
The same run's startup log: 7.2 GB of weights, 10.3 GiB of paged cache for 168,448 tokens, 11.4 GiB still free.

Those numbers are why the broker groups batches by prefix.

Ideas tested and dropped

Several plausible ideas were benchmarked and rejected.

Host-memory KV cache
6.8% slower
Custom CUDA graphs
under 1%
slowerFP8faster

Also dropped: 4-bit weight-only for bulk work, slower than FP8; two executors per card, each loading its own 7.2 GB of weights. The hybrid recurrent-attention model could not be built into an engine and went to ActiveKV.

Six lines in the vendor graph

For hidden-state extraction I needed the representation after the final normalisation and before the output head. The only change I carry in the vendor tree marks that tensor as an extra engine output, so every decoder model built from the tree exposes it without altering the inference path, and the runtime validates its shape at load. From there the extraction engines strip the model down: 128-token inputs, one generated token, then no key-value cache and no generation at all, at batches up to 8,192 sequences and a million tokens per forward pass. The workload those engines serve is in The workload that shaped the platform.

What this demonstrates

Treating an inference engine as an engineered artifact with a target, a precision, a set of limits and a contract, choosing those limits by measurement, and publishing the ideas that lost alongside the ones that won.