contenox
Browse docs/

Local NVIDIA Llama Backend Facts

Scope: contenox product-path sanity benchmark on the local Linux NVIDIA laptop GPU.

Test host:

  • GPU: NVIDIA GeForce RTX 3060 Laptop GPU, 6,144 MiB VRAM
  • Driver: 580.167.08
  • Runtime path: contenox -> modeld -> llama.cpp direct runtime -> CUDA
  • contenox: v0.32.8
  • Packaged modeld: v0.32.5
  • llama.cpp commit: ee3a5a10adf9e83722d1914dddc56a0623ececaf
  • Model: qwen2.5-1.5b GGUF, model.gguf size 1,117,320,736 bytes
  • Original benchmark artifact root: .bench/codex-20260701-nvidia-qwen25-product-141259
  • Fixed auto-context artifact root: .bench/codex-20260701-nvidia-qwen25-fixed-autocontext-142239
  • Warm-reuse artifact root: .bench/codex-20260701-nvidia-qwen25-warm-reuse-143147

Validated Facts

AreaFactRuntime stance
CUDA pathmodeld loaded libggml-cuda.so, detected the RTX 3060 Laptop GPU, and llama.cpp offloaded 29/29 layers to CUDA0.These rows are GPU rows, not accidental CPU rows.
Model directoryPointing a llama backend at the full local model directory caused unrelated GGUF catalog work before inference.Benchmark rows use an isolated model directory containing only qwen2.5-1.5b.
Token accountingllama product-path output reports inputTokens:0, outputTokens:0, and trace rows omit tokens=A+B=C.Completion counts below are derived from publish_step_chunk start events. Fix llama token accounting before using trace tokens as canonical.
Context autodetectThe source-fixed CLI opens omitted llama profile context from modeld’s detected capacity. The 11.6k-class prompt opened num_ctx=32704 with no CONTENOX_LLAMA_CTX.This is the expected product behavior.
Original regressionThe packaged v0.32.8 CLI opened the same omitted-profile model at num_ctx=8192 while model list advertised CTX=32768.Fixed in runtime/modelrepo/llama: omitted profile context stays unset until modeld Describe resolves capacity.
Model listModel list advertised CTX=32768; the fixed runtime session opened num_ctx=32704 after modeld’s 64-token safety margin.Benchmark rows must record session-open physical context, not only model-list context.
Session reuseThe modeld llama session reuses resident stable-prefix KV by token LCP. In a same-session check, turn B reused all 9,350 stable-prefix tokens and prefilled 0 stable tokens.Warm agentic-turn viability must be measured separately from cold contenox run wall time.
CLI process boundarycontenox run is stateless. contenox chat persists history but builds/stops an engine per CLI process; the llama warm cache is process-local.Repeated one-shot CLI calls do not prove warm-session behavior. Benchmark long-lived surfaces separately.

Results

Workload: contenox run --chain scripts/contenox-bench-no-tools-chain.json, no tool schemas, --max-tokens 64, isolated llama model directory.

Prompt labels reuse the OpenVINO benchmark tiers, but the model is not identical: qwen2.5-1.5b GGUF is a comparable small-model local CUDA cell, not the tinyllama-1.1b-chat-v1.0-int4-ov OpenVINO model.

prompt labelassembled tokensCLI contextphysical num_ctxresultwalltrace taskcompletione2e ratetrace rateGPU layersrun directory
3742874,0968,192success3.76 s1.70 s64 tok17.02 tok/s37.73 tok/s29/29.bench/codex-20260701-nvidia-qwen25-product-141259/default-00374
2,9001,7954,0968,192success3.07 s1.29 s64 tok20.84 tok/s49.60 tok/s29/29.bench/codex-20260701-nvidia-qwen25-product-141259/default-02900
11,600 packaged CLI6,98816,3848,192context reject2.43 s0.64 sn/an/an/a29/29.bench/codex-20260701-nvidia-qwen25-product-141259/default-11600
11,600 source-fixed CLI6,98816,38432,704success5.29 s3.22 s64 tok12.11 tok/s19.91 tok/s29/29.bench/codex-20260701-nvidia-qwen25-fixed-autocontext-142239

Warm Session Reuse Check

Workload: direct modeld session contract on the same packaged llama backend and same Qwen2.5 GGUF. The stable prefix was the 11,600-label benchmark prompt file, held constant across turns; only a small suffix changed. This isolates the backend reuse primitive from CLI process startup and task-chain overhead.

rowstable prefix tokensreused prefix tokensprefilled prefix tokensdropped tokenssuffix tokensopenensure prefixprefill suffixdecode 16 tokturn wall
cold same-session turn A9,35009,3500170.76 s1.77 s0.06 s0.13 s1.97 s
warm same-session turn B9,3509,35003316n/a0.03 s0.01 s0.13 s0.18 s
cold new-session turn B9,35009,3500160.56 s1.73 s0.04 s0.15 s1.91 s

Interpretation:

  • The backend primitive works: same-session turn B avoided recomputing the full stable prefix and only replaced the volatile suffix/generated tail.
  • The previous contenox run rows measured a necessary cold/stateless case, not the agentic hot loop.
  • A useful agentic benchmark must report prefix reuse counters, suffix prefill, TTFT, decode rate, and whether the caller stayed in one runtime process.
  • Long-context input is useful only if the chain/runtime places reusable context in the stable prefix. Large user-turn payloads remain volatile by design.

Comparison To Windows OpenVINO Rows

tierWindows Intel Arc OpenVINO TinyLlamaLinux RTX 3060 llama/Qwen2.5Read
374300 assembled, 6.88 s wall, 9.45 tok/s e2e287 assembled, 3.76 s wall, 17.02 tok/s e2eLocal NVIDIA CUDA path is faster for this small tier.
2,9001,907 assembled, 9.97 s wall, 6.42 tok/s e2e1,795 assembled, 3.07 s wall, 20.84 tok/s e2eLocal NVIDIA CUDA path is much faster in this comparable tier.
11,600Runtime rejects TinyLlama because the certified model ceiling is 2,048.Source-fixed CLI autodetects physical 32,704 and succeeds at 5.29 s wall.NVIDIA row proves this model/hardware can handle this prompt when the llama provider honors modeld capacity.

These rows are single-run sanity checks, not certified p50/p90/p95 data. The telemetry, suite-split, isolation, and repeat-round requirements they imply are owned by the backend parity contract and the benchmark integrity blueprint.

Esc to close