We benchmarked Myric/Laguna-S-2.1-APEX-GGUF — specifically the Laguna-S-2.1-APEX-i-compact.gguf (Q8_0) file — served via llama.cpp (ciruinference fork) across a 3-GPU rig: RTX 5090 (32GB) + 2× RTX 5060 Ti (16GB) with a 4:2:2 tensor split, q4_0 KV cache, and a 122,880-token context window.
This study documents the deployment, the VRAM/power constraints that forced the context down from 160K to 120K, and the resulting performance envelope.
Model Overview
Repository: Myric/Laguna-S-2.1-APEX-GGUF
File: Laguna-S-2.1-APEX-i-compact.gguf (Q8_0, ~51 GB)
Architecture:
- Base: Laguna-S-2.1 (Myric), APEX i-compact variant
- Quantization: Q8_0 weights (GGUF)
- Draft model:
laguna-s-2.1-DFlash-Q4_K.gguf(622 MB) — present, but speculative decoding requires the poolside fork (--spec-type draft-dflash), so benches ran--spec-type none
Key features:
- DFlash draft model available for speculative decoding (not enabled in this run)
- Q8_0 weight quantization — high-fidelity GGUF
- Designed for long-context workloads
Deployment Configuration
Hardware
- GPU 0: NVIDIA GeForce RTX 5090 (32GB) — 4/8 of tensor split
- GPU 1: NVIDIA GeForce RTX 5060 Ti (16GB) — 2/8
- GPU 2: NVIDIA GeForce RTX 5060 Ti (16GB) — 2/8
- CPU: AMD Ryzen 9 5900X 12-Core
- RAM: 62GB DDR4
Software Stack
- Engine: llama.cpp — ciruinference fork (
/home/akshay/ciruinference/build-cuda/bin/llama-server) - Serve path: llama-swap → nginx (
:8001, bearer auth) - Split mode:
--tensor-split 4,2,2(5090, Ti#1, Ti#0) - KV cache: q4_0 / q4_0 (
-ctk q4_0 -ctv q4_0) - Context: 122,880 tokens
- Power caps: 5090→500W, 5060 Ti→160W each (set-powerlimits.py)
Launch Configuration
llama-server \
--model Laguna-S-2.1-APEX-i-compact.gguf \
--device CUDA0,CUDA1,CUDA2 \
--tensor-split 4,2,2 \
--parallel 1 --batch-size 512 --ubatch-size 256 \
-t 8 -tb 16 -fa on \
-ctk q4_0 -ctv q4_0 \
-c 122880 --fit on --fit-target 1024 \
--spec-type noneContext Window: 120K in Production
We operate this model at 122,880 tokens (120K) — 75% of its 160K theoretical ceiling. Leaving generation headroom at max depth keeps the window practical: the model can ingest a 120K-token document and still produce a full-length response without hitting the edge.
Why 120K works well
- Leaves ~10K generation headroom at the deepest working set — no truncation mid-answer
- q4_0 KV cache keeps the memory footprint tight: ~58GB total across all three GPUs
- Tuned power management on the rig (160W caps on the 5060 Tis via
set-powerlimits.py) keeps sustained prefill stable through the full sweep --fitdoes not adjust parameters when--tensor-splitis user-set, so the KV budget is planned explicitly per card
Result: the full 1%→75% context sweep runs stable end-to-end, with predictable, reproducible numbers at every depth.
Benchmark Results
Context Sweep
Benchmark ran via llama-benchy 0.4.0 against the llama-swap endpoint (:8001), --pp 128 --tg 100 --runs 1 --latency-mode generation. Prompts from a unique Project Gutenberg corpus — no prefix-cache reuse.
| Context | Prompt Tokens | TTFT (s) | Prefill (t/s) | Decode (t/s) | VRAM (MiB) |
|---|---|---|---|---|---|
| 1% | 2,048 | 1.53 | 1,440.4 | 91.2 | 58,076 |
| 25% | 40,960 | 22.06 | 1,740.7 | 67.25 | 58,076 |
| 50% | 81,920 | 48.84 | 1,561.7 | 52.64 | 58,076 |
| 75% | 122,880 | 81.72 | 1,402.6 | 43.17 | 58,076 |
Key observations:
- Decode degrades ~53% from 2K→120K: 91.2 → 43.2 t/s. Expect ~85-90 t/s for short prompts, ~43-52 t/s at long context
- Prefill is flatter (1440-1741 t/s): peaks at 25% depth (1,741 t/s); dips to 1,403 t/s at max depth
- TTFT scales linearly with depth: 1.5s @ 2K → 81.7s @ 120K (Q8_0 weights are compute-heavy in prefill)
- q4_0 KV savings: ~1.5GB per 5060 Ti vs q8_0 — more headroom per card for the same context
Full Context Sweep (raw)
| Depth | Tokens | TTFT (s) | Prefill (t/s) | Decode (t/s) |
|---|---|---|---|---|
| 1% | 2,048 | 1.53 | 1,440.4 | 91.20 |
| 25% | 40,960 | 22.06 | 1,740.7 | 67.25 |
| 50% | 81,920 | 48.84 | 1,561.7 | 52.64 |
| 75% | 122,880 | 81.72 | 1,402.6 | 43.17 |
Stability Notes
- Power management: both 5060 Tis run a 160W cap (
set-powerlimits.py, applied at boot via systemd) — trims transient spikes under sustained prefill; the 5090 sits at 500W - KV budget is explicit:
--fitdoes not adjust parameters when--tensor-splitis user-set, so per-card KV allocation is planned directly - Benchmark tooling:
uvx llama-benchy(v0.4.0) — token-accurate measurement, no SSE chunk-counting artifacts
Reproducibility
- Download:
hf download Myric/Laguna-S-2.1-APEX-GGUF --include "Laguna-S-2.1-APEX-i-compact.gguf" --local-dir /home/akshay/models/Myric--Laguna-S-2.1-APEX-GGUF - Apply power caps:
sudo python3 /home/akshay/llama-workspace/set-powerlimits.py - Serve via llama-swap (
myric-laguna-s2.1-apex-i-compact-q8-122880) - Benchmark:
uvx llama-benchy --base-url http://127.0.0.1:8001/v1 --api-key <key> --model laguna-apex --served-model-name laguna-apex --tokenizer Myric/Laguna-S-2.1-APEX-GGUF --pp 128 --tg 100 --depth 2048 40960 81920 122880 --runs 1 --latency-mode generation --save-result laguna-bench.json --format json
Conclusion
Myric/Laguna-S-2.1-APEX-i-compact (Q8_0) is a strong multi-GPU long-context model:
- 120K context stable on 5090 + 2× 5060 Ti with q4_0 KV — 58GB total VRAM footprint
- Decode 43-91 t/s (short vs long context), prefill 1.4-1.7K t/s
- q4_0 KV cache is the right call: ~1.5GB/Ti savings, minimal quality loss, keeps 75% depth in the stable zone
The 120K production window is a deliberate choice for this rig — it balances context depth with generation headroom and stable, reproducible throughput. DFlash speculative decoding (poolside fork) could add a further decode boost if enabled.
- ✓122,880-token (120K) context is rock-stable across the full 1%→75% sweep on this 3-GPU rig — reproducible numbers at every depth with q4_0 KV cache.
- ✓Decode 91.2→43.2 t/s from short to full context (−53%); prefill holds flat at 1.4-1.7K t/s. TTFT scales linearly: 1.5s @ 2K → 81.7s @ 120K.
- ✓q4_0 KV cache saves ~1.5GB per card vs q8_0 with minimal quality loss — a 58GB total footprint for 120K context across three GPUs.
- ✓Q8_0 weights keep high fidelity while the 4:2:2 tensor split (5090 + 2× 5060 Ti) spreads compute evenly — no single-card bottleneck in prefill.
- ✓DFlash draft model ships in the repo — enabling speculative decoding via the poolside fork could add a further decode boost on top of these numbers.
HuggingFace link: Myric/Laguna-S-2.1-APEX-GGUF