Three configurations.
Three different priorities.
The practical baseline is Unsloth UD-IQ3_XXS in upstream llama.cpp—the implementation retained for API, agent and voice integration. Choose the configuration that matches your workload, rather than copying the highest number from a different engine.
Tested Q3 starting points
Table 1| Priority / configuration | Allocation / actual input | CPU MoE / microbatch | Prefill | Decode |
|---|---|---|---|---|
| Interactive speedC057 · separate retrieval pass | 32,768 / 28,672 | 43 / 8,192 | 1,253.31 | 31.42 |
| Large-context textC053 · separate retrieval pass | 262,144 / 235,929 | 46 / 4,096 | 905.76 | 27.39 |
| Integrated serving profileC096 · retained configuration | 262,144 / 230,100 | 48 / 2,048 | 1,067.78 | 26.56 |
These are version-specific, measured starting points, not a universal optimum. Keep all three Q3 shards together. Replace installation paths and check CPU topology before using the affinity mask. No parameter in these examples changes the published measurements.
Spend your memory budget
where it pays off.
Start with hybrid expert placement.
The CPU99 Q3 control measured 183.07 PP; the CPU43/MTP2 f16 finalist reached median 1,197.90 PP at the same 8,192-token length. Several settings changed, but all-CPU MoE plus a larger hot-expert cache was not the best starting configuration.
--n-cpu-moeis placement, not the number of CPU threads.Use physical-core placement, not every logical CPU automatically.
The tuned Q3 presets use
--threads 14 --threads-batch 14. On this host,--cpu-mask 0xffff --cpu-strict 1selects separate physical cores. Check your own topology; the same numeric mask is not portable to every 16-core CPU.Size the microbatch for peak prefill memory.
The tested settings are u8192 at 32k, u4096 for 256k text and u2048 for integrated serving. A large-slot u8192 trial failed a CUDA check. A model that loads successfully can still run out of working space when processing a deep prompt.
Do not assume compact KV is faster.
At 235,929 input tokens in the matched upstream workload, f16 generated at 26.78 TG versus 16.77 with q8_0. Start from the tested f16 setting; move to smaller KV only for a demonstrated capacity or workload benefit.
Keep MTP flags tied to the correct engine.
The retained upstream profile disables speculation. The historical thecodacus MTP2 finalist needs that pinned fork and its Q8 draft head. ik MTP improved decode but reduced prefill. Their short-context results are not the performance of the retained 256k service.
Reuse history, and distinguish it from fresh prefill.
--cache-reuse 256 --cache-promptis enabled in the Q3 presets. Benchmarks explicitly disable request-prefix reuse. A continuation reusing 48k tokens is not a fresh 48k-input measurement; a new 230k input still took over three minutes to produce the first model event.Budget separately for speech and applications.
CPU48/u2048 is the integration preset, not the CPU46/u4096 text benchmark. Chatterbox runs on GPU; ASR and Chromium stay off it. Validate peak prefill, natural retrieval, tool continuation and speech latency separately rather than treating one tok/s score as a complete agent test.
A single-GPU, hybrid-memory platform.
- GPU
- EVGA GeForce RTX 3090 OC FTW3 Ultra
24,576 MiB VRAM · driver 595.91.07 - Processor
- AMD Ryzen 9 8945HX
16 physical cores / 32 logical CPUs - Memory & storage
- 96 GB nominal RAM · 90.02 GiB MemTotal
Kingston KC3000 4 TB NVMe - System
- Ubuntu 26.04.1 LTS · kernel 7.0.0-34
SM86 build target · Radeon display
NVMe holds the weight files and backing data. RAM supplies active CPU pages, resident experts and file cache. VRAM provides the GPU compute path, selected experts and the engine-specific KV working set. Weight-file size is therefore not a requirement for full simultaneous RAM residency.
Q3 is Unsloth UD-IQ3_XXS (81.96 GB of shards); Q4 is UD-Q4_K_XL (111.33 GB). Strata's native Q4 pack promotes 195 projections to BF16. The pinned implementations are thecodacus, upstream llama.cpp, ik_llama.cpp, OptLlama and Strata.
Actual input, not slot size
235,929 tokens occupy about 90% of a 262,144-token allocation. 260,000 tokens occupy 99.18%. A short prompt in a large slot does not measure performance at depth.
Fresh input, not a cold disk
Fresh means no reused KV prefix. OS file cache was not routinely flushed. Process restarts are not classified as cold-NVMe tests.
The dataset contains 240 synthetic-throughput, 103 retrieval, 56 native-benchmark, two warmup and five functional timing records. Server requests and native sample means are separate experimental units. Repeated-series medians never mix different cases. Long-context observations include n=1 results; the campaign is staged tuning rather than a randomized factorial study.
What ran in each test
| Component | Pinned version / role | Launch & build settings |
|---|---|---|
| Upstream llama.cpp | 8345f333951c661d166b00e6f9362e553768f292Q3 text benchmarks and integrated serving | · · |
| thecodacus/llama.cpp | 27c54b4bbcefadedcec6397477cc2e866c1db716Q3/Q4 expert cache and draft-MTP experiments | |
| ik_llama.cpp | 3d27f5bb6348c4d79edded63b03e9a93efb2f80eIndependent MTP comparison | · |
| OptLlama | 167742d9dfa01306786e7d3cfd31fcb8a8b185dcCache / prefetch / workspace / overlap experiment | · |
| Strata — experiment | v0.1.40.1 sources · engine 0.1.40 Q4 native pack and streamed KV; not used for serving | · · |
CUDA 12.8.1 build environment for llama.cpp, SM86 / Release / native CPU target. Strata uses CUDA 13 libraries. GGUF revision: 38bb39ee97821de2c9009abb7e93950eec396e66. The direct Q3 presets use lazy loading with --load-mode none; do not replace this with the initial Q4 mmap settings and attribute the same performance to it.
Request parameters and benchmark conditions
More expert cache was not the whole answer.
Early Q4 offload used CPU-side MoE, mmap/lazy loading and profiled hot-expert caching. An 8,192-token input measured 135.97 prefill and 18.92 decode tokens/s. A microbatch-1,024 variant improved that to 219.65/19.71, still well below the target.
Q3 screening then explored cache size, thread count, batching and hybrid CPU/GPU placement. Larger cache alone had little effect on prefill. Hybrid placement and the revised processing path produced a substantially better envelope.
Selected Q3 tuning stages
Table 2| Configuration | Prefill | Decode | n |
|---|---|---|---|
| CPU99 controlthecodacus · q8_0 KV · | 183.07 | 26.73 | 3 |
| Cache96 control | 192.70 | 29.88 | 3 |
| Cache80 finalistBatch 8,192 · | 742.57 | 31.15 | 5 |
| Hybrid CPU42 + MTP2 | 1,049.74 | 38.10 | 3 |
| CPU43 + MTP2 · f16 finalist | 1,197.90 | 35.97 | 5 |
Speculation trades off more than decode.
In ik_llama.cpp, MTP1 increased generation from 30.94 to 33.88 tokens/s at 8,192 input tokens, while prefill fell from 1,223.08 to 911.13. The thecodacus f16 finalists reached 35.97 TG with MTP2 versus 34.13 with MTP1. Support and effective behavior are implementation-specific.
OptLlama's combined cache/workspace/prefetch/overlap configuration passed short retrieval at 1,287.75/35.38. Its deep-input trial reached only 197 MiB VRAM headroom and was stopped by the resource guard, with no accepted complete result.
The smaller KV format was slower at depth.
The matched upstream comparison holds CPU MoE 48, batch 8,192, microbatch 4,096, context 262,144 and disabled speculation constant. At 235,929 input tokens, f16 KV generated at 26.78 tokens/s versus 16.77 with q8_0. Prefill was nearly unchanged.
Upstream llama.cpp: f16 versus q8_0 KV
Figure 1Prefill · tokens/s
Decode · tokens/s
decode with f16 at 235,929 tokens.
Compact KV did not imply faster generation.
A second upstream condition, CPU46/u4096, declined from 1,066.83/30.45 at 8,192 tokens to 905.76/27.39 at 235,929: 15.10% lower prefill and 10.03% lower decode. Both lower criteria were missed at depth, despite passing a separate retrieval request.
The earlier thecodacus 256k series declined more sharply, from 665.81/31.80 at 8,192 to 402.45/15.80 at 235,929. That series used different offload and microbatch settings, so it is not an isolated context-allocation comparison with the later upstream result.
Fast decode does not mean an immediate answer.
The integrated Q3/upstream profile uses CPU MoE 48 and microbatch 2,048 to leave audio headroom, while retaining a 262,144-token allocation. Its API path is Nginx → LiteLLM → llama-swap → llama.cpp. It is a different configuration from the CPU46/u4096 throughput experiment.
llama-swap manages backend lifetimes; one physical llama.cpp slot serializes generation. It is not a durable shared queue with ComfyUI. GPU image processing runs in a separate, drained operating mode. These text measurements do not include simultaneous image generation.
Agent, browser and audio: versions, launch commands and configurations
Long-history API and client latency
Table 3| Operation | Input | Elapsed |
|---|---|---|
| Responses: first model eventHeaders at 15.251 s; keepalives are not model output | 230,100 tokens | 216.519 s |
| Responses: completion | 230,100 tokens | 219.514 s |
| Codex: long-history turn | 232,796 tokens | 251.740 s |
| Codex: native compaction | 230,530 tokens | 262.022 s |
| Codex: following tool turn | Same session | 79.845 s |
Speech is a separate latency budget.
Twenty synthetic TTS → ASR cycles measured full-WAV completion at 0.829 s p50 / 2.410 s p95. The first cold trial took 42.304 s during overlap with LLM work. A later cycle produced a valid WAV but failed strict transcription with one incorrect word.
These measure server stages, not the time from the end of human speech to first audible response. Live microphone, listening and interruption quality are outside the benchmark's validated scope.
Tool-use validation
The agent audit exercised 20 of 32 enabled tools, including Chromium, search, files, terminal, canvas, cross-session memory, a 32k subagent and images. An 18-call research task took 413.906 s. It did not establish completion of the separate 100-restaurant research task.
Strata is a comparison,
not the serving recommendation.
The retained system runs Q3/upstream llama.cpp. Strata's Q4 tests demonstrate a different residency strategy and near-full-context speed envelope, but do not validate the same agent, tool, image or speech workload.
Expand the 260k Q4 experiment and memory-limit comparison
Strata separates logical context from resident KV: the allocation was 262,144 tokens, but only 32,768 KV cells per layer were GPU-resident. Automatic expert caching, prefill slot borrowing and native MTP ran with a 62 GiB expert resident budget and an 80 GiB cgroup limit.
The runtime used 15 workers and one host thread. The GPU expert cache held 1,407 slots (4.09 GiB); pinned host KV occupied 3.09 GiB. Each request used thinking HIGH, temperature zero and a 512-token cap without prefix reuse.
Host residency and throughput
Figure 2Prefill · tokens/s
Decode · tokens/s
Three repetitions at near-full context
Table 4| Request | Prefill | Decode | First token | Wall time |
|---|---|---|---|---|
| 1,230.04 | 30.40 | 211.671 s | 228.481 s | |
| 1,224.69 | 30.55 | 212.612 s | 229.330 s | |
| 1,247.39 | 29.29 | 208.745 s | 226.180 s | |
| Median | 1,230.04 | 30.40 | 211.671 s | 228.481 s |
finish=length and no final answer. Two of three exceeded 30 TG. Approximately 211 seconds to first token reflects processing the entire uncached input, not slow streaming after prefill.Memory pressure changes the envelope.
The 48 GiB-limit condition completed one request at 773.13/9.30. Relative to the baseline medians, prefill fell 37.15% and decode 69.40%. Its next repetition was interrupted. The physical host retained 96 GB and system-wide file cache.
Peak active-cgroup memory; bars share an 80 GiB scale. Sampled process VRAM peaked at 11.883 GiB in both conditions; swap peak was zero. NVML sampled approximately every two seconds. The 12 GiB reservation is an allocator mechanism, not a hard driver quota.
These results show promising residency efficiency, but do not establish natural retrieval, vision, tool use or speech quality in Strata. The different weights, packing, KV and speculation also prevent treating the Q4 result as a controlled engine-only improvement over Q3/llama.cpp.
What to take to your own machine.
Use Q3/upstream as the integrated starting point.
CPU43/u8192 at 32k met the lower speed criteria in its measured 28,672-token request. CPU46/u4096 trades speed for 256k text capacity. The retained CPU48/u2048 profile reserves audio headroom. Copy the corresponding complete command, not a mix of flags from different engines.
Tune placement, microbatch and KV before adding complexity.
Hybrid placement was a stronger configuration family than the initial CPU99/cache path. At deep input, matched upstream f16 KV increased generation by 59.72% over q8_0. Smaller representations and larger caches are not automatically faster.
Choose context capacity from the workload.
CPU46/u4096 lost 15.10% prefill and 10.03% decode between 8,192 and 235,929 tokens. A 256k allocation does not guarantee short-prompt speed at depth. Reuse helps a shared prefix, but a completely new long prompt still incurs full prefill.
Treat Strata as a separate experiment.
Its Q4 median of 1,230.04/30.40 at 260,000 fresh tokens is promising, but was capped during reasoning. It is not the retained serving variant and does not establish the same tools, retrieval, images or voice behavior.
Validate completed work, not only token rates.
Q3 natural retrieval, API streaming and tool continuation were checked separately. No configuration demonstrated every target simultaneously; near-full-context 40 TG and live microphone-to-audio latency remain outside the established results.
Scope of inference
This staged campaign does not establish sustained 40 TG near full context, broad natural-task accuracy at 260k, randomized single-factor effects, or a full invariant-configuration context matrix. Clock/thermal controls and isolated physical NVMe I/O are unavailable. Complete raw input fixtures are not distributed, limiting byte-for-byte reproduction. The published timing records and pinned configurations support verification of the reported observations.