Performance benchmarks
Frame-time impact, tokens per second, image generation speed and memory usage. Methodology and reproducible scripts included.
GPU Sharing Impact
This is the benchmark no other inference tool can show, because no other inference tool shares the GPU with a game renderer. The measurements below come from the Atelico Compute Graphics Scheduler (CGS), which schedules inference and rendering on a single shared hardware context instead of letting the OS context-switch between them. The chart compares two scenes (Sponza and San Miguel at 4K) rendered five ways: game alone, the three CGS scheduling modes (PrioritizeGraphics, Balance, PrioritizeCompute), and an Other baseline where our engine runs in a separate process and contends with the game for the GPU, simulating what any other inference solution looks like without CGS.
About the scenes. Both are canonical computer-graphics test scenes from Morgan McGuire's archive: Sponza is the ~280K-triangle Renaissance atrium that's been the standard GPU benchmark since the early 2000s, light enough to render at hundreds of FPS so any inference-induced frame-time impact is easy to spot. San Miguel is a much heavier ~10M-triangle Mexican courtyard restaurant scene (Guillermo M. Leal Llaguno) that runs at ~120 FPS on an RTX 5080, stressing the GPU enough that any extra scheduling overhead shows up immediately.
| Scene | Game only | Atelico CGSPrioritizeGraphics | Atelico CGSBalance | Atelico CGSPrioritizeCompute | Otherseparate context |
|---|---|---|---|---|---|
| Sponza 4K RTX 5080 | 6211 fps 1% low 1984 | 5952 fps 1% low 1894 | 6061 fps 1% low 1946 | 4854 fps 1% low 1667 | 531 fps 1% low 365 |
| San Miguel 4K RTX 5080 | 123 fps 1% low 108 | 122 fps 1% low 108 | 121 fps 1% low 108 | 115 fps 1% low 59 | 3 fps 1% low 2 |
Same hardware (RTX 5080), same scenes, same Llama 3.2 3B inference workload during render. Atelico's three CGS scheduling modes (PrioritizeGraphics, Balance, PrioritizeCompute) keep the game at native FPS; without CGS (right-most column), the WDDM driver context-switches between graphics and inference and the game collapses to single-digit FPS on the heavy scene.
LLM Decode Throughput vs Other Inference Engines
Methodology. Decode tokens per second on the same hardware and prompt, using the industry-standard pure-decode protocol so every column on the table measures the same quantity.
- Protocol: BOS-only prompt, 128 generated tokens, median of 5 runs, deterministic sampling. Every column reports decode-loop time only (forward passes plus sampling, no prefill, no HTTP). Time-to-first-token and prefill rate live in separate sections of this page.
- Tool equivalence: Atelico's
bench_minimal, llama.cpp'sllama-bench -p 0 -n 128(tg128), MLX-LM's CLI, vLLM's tg128, and Ollama's server-sideeval_count / eval_durationall measure the same quantity, so the numbers compare like-for-like. - Table layout: one section per architecture; rows are model variants, columns are serving engines.
- Default format: all numbers are GGUF Q4_K_M unless a different format is noted next to the model name (e.g. Bonsai 1.7B (1-bit MLX), Qwen3 0.6B (Q8_K_M), where all engines were benched on the same weights for apples-to-apples).
- Missing cells: engines that don't run on a backend are dropped from that table entirely (vLLM is CUDA-only).
- Variance, ties, and winners: run-to-run variance on M1 Max is ±2–3% due to thermals, so deltas under 5% should be read as ties. In each row, the cell with the highest rounded tok/s (and any other cell that displays the same rounded value) is rendered in bold to mark the winner.
- vLLM at batch=1: the single-user real-time scenario this page targets is vLLM's weakest mode by design. vLLM is built for high-throughput batched server deployments, whereas in-game local inference is one player, one request at a time, which is exactly the regime Atelico is built for and where vLLM gives up most of its throughput.
LLaMA 3.x
| Model | Atelico AI Engine | llama.cpp | Ollama |
|---|---|---|---|
| LLaMA 3.2 1B | 258 tok/s | 194 tok/s | 167 tok/s |
| LLaMA 3.2 3B | 118 tok/s | 77 tok/s | 78 tok/s |
| LLaMA 3.1 8B | 62 tok/s | 30 tok/s | 30 tok/s |
| Model | Atelico AI Engine | llama.cpp | Ollama | vLLM |
|---|---|---|---|---|
| LLaMA 3.2 1B | 614 tok/s | 539 tok/s | 603 tok/s | 182 tok/s |
| LLaMA 3.2 3B | 281 tok/s | 252 tok/s | 267 tok/s | 102 tok/s |
| LLaMA 3.1 8B | 160 tok/s | 139 tok/s | 147 tok/s | 51 tok/s |
Qwen 3 / 3.5
| Model | Atelico AI Engine | llama.cpp | Ollama |
|---|---|---|---|
| Qwen3 0.6B (Q8_K_M) | 253 tok/s | 151 tok/s | 192 tok/s |
| Qwen3.5 0.8B | 167 tok/s | 154 tok/s | 71 tok/s |
| Qwen3.5 2B | 119 tok/s | 98 tok/s | 69 tok/s |
| Qwen3.5 4B | 65 tok/s | 42 tok/s | 31 tok/s |
| Qwen3.5 9B | 48 tok/s | 27 tok/s | 24 tok/s |
| Model | Atelico AI Engine | llama.cpp | Ollama | vLLM |
|---|---|---|---|---|
| Qwen3 0.6B (Q8_K_M) | 497 tok/s | 435 tok/s | 434 tok/s | n/a |
| Qwen3.5 0.8B | 435 tok/s | 393 tok/s | 308 tok/s | n/a |
| Qwen3.5 2B | 323 tok/s | 298 tok/s | 223 tok/s | n/a |
| Qwen3.5 4B | 187 tok/s | 166 tok/s | 140 tok/s | n/a |
| Qwen3.5 9B | 124 tok/s | 117 tok/s | 100 tok/s | n/a |
Gemma 4
| Model | Atelico AI Engine | llama.cpp | Ollama |
|---|---|---|---|
| Gemma4 E2B | 90 tok/s | 83 tok/s | 67 tok/s |
| Gemma4 26B-A4B | 50 tok/s | 48 tok/s | 43 tok/s |
| Model | Atelico AI Engine | llama.cpp | Ollama | vLLM |
|---|---|---|---|---|
| Gemma4 E2B | 263 tok/s | 186 tok/s | 4 tok/s | n/a |
| Gemma4 26B-A4B | 132 tok/s | 130 tok/s | 111 tok/s | n/a |
Nemotron
| Model | Atelico AI Engine | llama.cpp | Ollama |
|---|---|---|---|
| Nemotron-H 4B | 79 tok/s | 45 tok/s | 48 tok/s |
| Nemotron-3 Elastic 12B | 59 tok/s | n/a | n/a |
| Model | Atelico AI Engine | llama.cpp | Ollama | vLLM |
|---|---|---|---|---|
| Nemotron-H 4B | 225 tok/s | 200 tok/s | 210 tok/s | n/a |
| Nemotron-3 Elastic 12B | 220 tok/s | n/a | n/a | n/a |
SmolLM 3
| Model | Atelico AI Engine | llama.cpp | Ollama |
|---|---|---|---|
| SmolLM3 3B | 98 tok/s | 76 tok/s | 92 tok/s |
| Model | Atelico AI Engine | llama.cpp | Ollama | vLLM |
|---|---|---|---|---|
| SmolLM3 3B | 266 tok/s | 242 tok/s | 256 tok/s | 54 tok/s |
Bonsai (1-bit)
| Model | Atelico AI Engine | llama.cpp | Ollama |
|---|---|---|---|
| Bonsai 1.7B (1-bit MLX) | 283 tok/s | n/a | n/a |
| Bonsai 8B (1-bit MLX) | 114 tok/s | n/a | n/a |
| Model | Atelico AI Engine | llama.cpp | Ollama | vLLM |
|---|---|---|---|---|
| Bonsai 1.7B (1-bit MLX) | 202 tok/s | n/a | n/a | n/a |
| Bonsai 8B (1-bit MLX) | 61 tok/s | n/a | n/a | n/a |
Prefix Cache Speed-up
Multi-turn conversations reuse the prompt prefix from one turn to the next. The engine's automatic token-replay prefix cache turns time-to-first-token from a function of the full conversation length into a function of just the new user message: when the beginning of the prompt is byte-identical to a previous request, the engine replays the cached KV state for that prefix instead of recomputing it.
Methodology. Mean time-to-first-token across 5 turns of a character-dialogue RAG pipeline (Qwen 3 0.6B Q8_K_M) at three prefix sizes (~100, ~1,000, ~2,000 tokens). Cold = no cache, the engine re-prefills the persona every turn. Warm = the persona is reused from the previous turn, so only the changing tail is prefilled.
How this scales. The win grows with the cached prefix length: marginal at ~100 tokens (constant per-request overhead from sampling, schema compilation and JSON-mode setup dominates both bars), multi-x from ~1,000 tokens onward, and saturates as the changing tail becomes a smaller and smaller fraction of total prefill time. NVIDIA ratios are smaller than Apple Silicon's at the same size because the RTX 3090 prefills so quickly in absolute terms that the constant per-request overhead is a bigger fraction of warm TTFT.
Text-to-Speech
Two engines: Kokoro (high-quality neural, 54 voices) and Atelico TTS (lightweight, instant voice cloning). Both run entirely on device. Realtime factor: how much faster than wall-clock the audio is synthesized; 18× means one second of speech in ~56 ms, comfortably under a single 60 FPS frame.
Speech-to-Text (Whisper)
Realtime factor (higher is better) across the small English-only variants (tiny.en / base.en / small.en) and the three full multilingual top-of-line models (distil-large-v3, large-v3-turbo, large-v3). Pick the size that fits your accuracy and latency budget; every size runs locally with no cloud hop.
What this means for a player. Realtime factor is the inverse of how long the engine takes to transcribe one second of audio, so the rough latency between the player finishing an utterance and the transcribed text being available in the game is ~1,000 / RTF ms per second of speech. A 1-second voice command transcribed at 30× resolves in ~33 ms (under one frame at 30 FPS); the same command at 100× resolves in ~10 ms. The big multilingual models still run locally in real time on consumer hardware: even Whisper large-v3 on M1 Max comes in under half a second per second of audio.
Audio-to-Face
From a usage perspective: Audio-to-Face turns each chunk of spoken audio (TTS output, recorded VO, or live mic) into the 52 ARKit blendshape weights that drive a character's face. The cold first-frame latency is the delay from the first audio sample arriving to the first set of blendshape weights leaving the engine on a fresh load. Warm first-frame latency is the same delay after the model is hot in memory (what the player actually experiences for every line beyond the first). The steady-state per-frame cost is what the rest of the dialogue then pays per frame for as long as the character keeps talking.
Image Generation
Atelico IG generates a 512×512 image in about a second on an M1 Max and well under half a second on an RTX 3090, at output quality close to FLUX.2 [pro]. It is small enough to fit in the unified memory budget of every consumer device we ship to, including phones; the cloud-served FLUX.2 [pro] is a 32B-parameter model that does not.
For context, the chart also shows two cloud baselines from Replicate measured end-to-end (queue + inference + network): FLUX schnell at ~0.8 s and FLUX.2 [pro] at ~10.8 s, both at 1024×1024.
Model Sizes
Different sizes hit different deployment targets. Mobile devices (iOS / Android) typically have 4–8 GB of usable RAM after the OS and the rest of the game; current-generation consoles share ~12 GB across game and AI; PCs span the full range from 8 GB integrated to 24 GB+ discrete VRAM. Pick a model that leaves room for everything else your game is doing. All sizes are GGUF Q4_K_M unless a different format is noted next to the model name (e.g. Bonsai 1.7B (1-bit MLX)). Memory consumption below is an estimate for greedy decode at the default 4 K-token context; longer contexts grow the KV cache roughly linearly.
| Model | Parameters | Size on disk | Memory consumption (est.) |
|---|---|---|---|
| Bonsai 1.7B (1-bit MLX) | 1.7B | ~250 MB | ~400 MB |
| Qwen3 0.6B | 0.6B | ~400 MB | ~700 MB |
| Qwen3.5 0.8B | 0.8B | ~500 MB | ~900 MB |
| LLaMA 3.2 1B | 1B | ~700 MB | ~1.2 GB |
| Bonsai 8B (1-bit MLX) | 8B | ~1.15 GB | ~1.5 GB |
| Qwen3.5 2B | 2B | ~1.2 GB | ~1.7 GB |
| Gemma 4 E2B | 2B (effective) | ~1.5 GB | ~2 GB |
| SmolLM 3 | 3B | ~1.8 GB | ~2.4 GB |
| LLaMA 3.2 3B | 3B | ~1.8 GB | ~2.5 GB |
| Nemotron-H 4B | 4B | ~2.4 GB | ~3 GB |
| Qwen3.5 4B | 4B | ~2.4 GB | ~3 GB |
| LLaMA 3.1 8B | 8B | ~4.6 GB | ~5.5 GB |
| Qwen3.5 9B | 9B | ~5.5 GB | ~6.5 GB |
| Nemotron-3 Elastic 12B | 12B | ~7.5 GB | ~9.6 GB |
| Gemma 4 26B-A4B | 26B (4B active) | ~14 GB | ~18 GB |
| Kokoro 82M | 82M | ~165 MB | ~250 MB |
| Atelico TTS | 100M | ~220 MB | ~350 MB |
| Whisper tiny | 39M | ~32 MB | ~80 MB |
| Whisper base | 74M | ~58 MB | ~140 MB |
| Whisper small | 244M | ~166 MB | ~400 MB |
| Whisper medium | 769M | ~514 MB | ~1.1 GB |
| Whisper large-v3 | 1.55B | ~1.05 GB | ~2 GB |
| Whisper large-v3-turbo | 809M | ~547 MB | ~1.1 GB |
| Atelico Audio2Face | ~40M | ~150 MB | ~250 MB |
| Atelico IG | 0.7B | ~1.8 GB | ~2.5 GB |
Rough deployment guide: the top of the table (under ~2 GB) fits mobile and integrated-graphics laptops; the middle (~2–6 GB) is the sweet spot for current consoles and mainstream PCs; the bottom (~9 GB and up) targets discrete-GPU PCs with 12 GB+ VRAM. The 1-bit Bonsai family is unusually memory-light for its parameter count and is the cheapest way to ship a multi-billion-param LLM in a mobile build.