How to run Muse-Glimmer NVFP4 on 2× RTX 5060 Ti 16 GB

Retrieval is flawless: 30/30 to the full 131,072-token window, the measured set’s only clean curve, and where flint (sliding-window by design) lost it past 60 %. three clean stops, but every run shipped its code as prose — the compile-and-test gate is 0/3 as-filed, 1/3 after mechanical salvage. The earlier q=0 spiral was a smaller-window artifact. Long-context retrieval and review with a harness that forces fenced output; not drop-in agentic coding until the format is fixed.

Evaluated by Grok 4.6/high · Written by Ornith-1.5-35B-A3B

Results

LoadWallPPTGPredFinishQuality
21.6 s 113.4 s 1224 74.9 8569 stop 4/5

Medians of three runs (wall 104.9 / 113.4 / 117.2 s); per-run quality 3 / 2 / 2. PP is run-1 cold — runs 2 and 3 prefix-cached the identical prompt (prompt_n=5) and are excluded. DFlash2 acceptance 30.5 / 31.9 / 29.6 %. Delivered-pipeline gate 0/3 as-filed (fences required), 1/3 after mechanical salvage; run 1 is the only passing pipeline.

Needle retrieval

Window
131072
Depth
13,107 → 131,008 (every 10 % of the slot)
Result
hit
pp/tg
30/30, no cliff; pp 2,395→1,789 · tg 63-95
Anchor
tesseract-1c7d3f-vault

Quality of result

Adversarial review before code 4/5 fifteen explicit gap → resolution lines — units, :infinity vs integer TTL, eviction cadence, return shapes; the most disciplined review among the models measured on this box.
Public API present (put/get/delete/stats) 5/5 full start_link/1,2, put/3,4, get/2, delete/2, stats/1 with docs.
TTL + periodic eviction + named instances + hit/miss stats 4/5 real GenServer, registry-addressed instances, timer rescheduling, hit/miss counters — behaviour verified in run 1’s passing tests.
Idiomatic OTP / would it compile? 3/5 run 1 compiles clean; runs 2-3 fail start_link/2 defaults conflict ( [] head vs 1-arity clause) at :16/:11 — a systematic clause trap.
Tests shipped, not promised 2/5 six real tests every run; but no elixir fences in runs 1-2 (run 3 untyped ```), so an automated extractor ships nothing — run 1 passes 6/6 in 4.1 s only after manual rescue.
Finish reason + thinking tax 5/5 clean stop ×3; tightest output among the models measured on this box (7.8-8.8 k tokens vs LFM 20 k, flint 31 k).

Scale: 5 strong · 4 capable · 3 mixed · 2 weak · 1 broken.

Prompt

This run used v5 (The benchmarking prompt) — It answers a single Elixir-specific question, so YMMV.

Elixir code smells 3

  • content-wide:— — output contract as a pattern: three runs, three different fence failures — the chat template does not reliably emit ```elixir blocks (the finding is the template, not the code).
  • run2.ex:16 — duplicate defaults: def start_link(name, opts []) beside def start_link(opts) — the classic Elixir clause collision (run 2).
  • run1.md:— — run 1 interleaves a stray single-backtick where an opening fence should be.

Defects 3

  • content-wide — zero fences; salvageable top-level defmappe…end blocks (module PASS, tests 6/6 PASS (4.1 s, incl. real TTL eviction timing) — run 1)
  • run2.ex — start_link/2 defaults conflict with start_link/1 (module compile FAIL — run 2)
  • run3.ex — same start_link/2 defaults conflict, module TTLKVStore (module compile FAIL — run 3)

Host

QuantNVFP4
Hardware2× RTX 5060 Ti 16 GB (PCIe 5.0 x8/x8), Ryzen 9700X, 16 GB DDR5-6000
Splitlayer-split — the architecture cannot tensor-split
Runtimellama-server 0.7.0-dev (d05706b4f), CUDA
HarnessGrok Build 1.0.50 (c58f321264ba)
Tested2026-10-31
Weightshuggingface.co/FreedomAISVR/Muse-Glimmer-30B-NVFP4-GGUF

Reproduce

Two 16 GB cards. This is a 27.8B dense weight in NVFP4 (same lineage as flint-nvfp4) that cannot run tensor-split, so the run is served --split-mode layer. DFlash2 speculative decoding: --spec-draft-n-max 11; acceptance 30.5 / 31.9 / 29.6 % across the three runs — the line above is the effective config. No --mmproj (text-only serve; the vision tower lives in the model GGUF). --host/--port omitted. The answer cap was 130,000 tokens; needle answers were capped at 512 tokens — the first attempt at a 48-token cap starved the content channel behind the reasoning stream, and those rows are archived, not measured.
llama-server \
  -m muse-glimmer-30b-nvfp4.gguf \
  --ctx-size 131072 \
  --parallel 1 \
  -b 2048 \
  -ub 512 \
  -t 6 \
  -tb 6 \
  -ngl 999 \
  -ctk q8_0 \
  -ctv q8_0 \
  --kv-offload \
  --cache-ram 0 \
  --no-cache-idle-slots \
  --load-mode mmap \
  --no-context-shift \
  -fa on \
  --jinja \
  --reasoning on \
  --reasoning-preserve \
  --cont-batching \
  --spec-type draft-dflash \
  --spec-draft-n-max 11 \
  -md Muse-Glimmer-30B-DFlash2-Q4_K_M.gguf \
  --spec-draft-ngl 99 \
  --split-mode layer \
  --temp 0.7 \
  --top_p 0.95 \
  --top_k 20 \
  --min-p 0.0 \
  --presence_penalty 0.0

Warning: this is a temporary briefing, written by an LLM and not yet evaluated or rewritten by a human to get rid of the signature AI-slop writing style. It’s published as a draft despite its shortcomings, so that you can find out how to run it and what to expect in terms of pp and tg on this hardware, as well as what to expect in terms of coding performance on this benchmark, grosso modo.

Three v5 runs on Muse-Glimmer NVFP4 — a 27.8B dense weight with the vision tower baked into the GGUF. It runs at its full 131,072-token native window, layer-split across two RTX 5060 Ti 16 GB cards, with DFlash2 speculative decoding on top. The earlier Oct-28 run scored this model q=0, a spiral of empty content, on the old 65,536 window — the window itself was the cap there. On the real 131k slot the answer is different: three clean stops at ~7-9 k tokens each, ~110 s, and the q=0 spiral was a smaller-window artifact.

The needle ladder is where this model earns its keep. Same anchor planted at every tenth of the window, three repeats per depth, fresh nonce per request so no step inherited a warm cache:

depth hit pp (median) tg (median)
10% (13,107) 3/3 2,395 93.1
20% (26,214) 3/3 2,352 82.2
30% (39,322) 3/3 2,282 86.4
40% (52,429) 3/3 2,194 85.9
50% (65,536) 3/3 2,118 87.9
60% (78,643) 3/3 2,049 93.3
70% (91,750) 3/3 1,977 79.1
80% (104,858) 3/3 1,911 95.5
90% (117,965) 3/3 1,843 62.8
100% (131,008) 3/3 1,789 64.4

30/30, no cliff. Prefill decays a smooth ~25 % from 2,395 to 1,789; decode holds 63-95 throughout. The full-window steps run to the 512-token answer cap only because the model rambles after it finds the marker — the marker is present every time. At the depth where flint, sliding-window by design, lost retrieval past 60 %, Muse keeps fetching from the last third.

Then the catch: every run shipped its code as prose. The v5 contract asks for two ```elixir fences; runs 1 and 2 emitted bare code (run 1 even had a stray single-backtick where an opening fence should be), and run 3 used untyped ``` without a language tag. An automated extractor reads nothing — it takes a person peeling the fenced blocks off by hand to get a pipeline that compiles. For an agent that means the deliverable only reaches the pipeline when a harness forces the fences.

The record: three clean stops, but the gate is 0/3 as-filed — runs 2 and 3 hit the same classic Elixir trap, def start_link/2 (opts \ []) colliding with start_link/1 at :16/:11. Run 1’s code, once the fences were hand-peeled, compiles and passes its six tests in 4 s including real TTL eviction timing — the only passing pipeline in the measured series. The review pass was the strongest part of the batch: fifteen explicit gap → resolution lines, the most disciplined of the run.

Representative output

Run 1 shipped the largest, best-formed delivery of the batch (11.3 k chars). Trimmed to the public API and the timer-driven eviction handler — the only run whose pipeline compiled and passed its six tests:

defmodule TTLKV.Store do
  def start_link(opts \ []) do
    name = Keyword.get(opts, :name)
    GenServer.start_link(__MODULE__, opts, name: name)
  end

  def start_link(name, opts) when is_atom(name) do
    GenServer.start_link(__MODULE__, opts, name: name)
  end

  def put(name, key, value) do
    GenServer.call(name, {:put, key, value})
  end

  def put(name, key, value, ttl) do
    GenServer.call(name, {:put, key, value, ttl})
  end

  def get(name, key) do
    GenServer.call(name, {:get, key})
  end

  def delete(name, key) do
    GenServer.call(name, {:delete, key})
  end

  def stats(name) do
    GenServer.call(name, :stats)
  end

  def handle_info(:evict, state) do
    now = System.monotonic_time(:millisecond)
    new_entries =
      state.entries
      |> Enum.filter(fn {_k, %{expires_at: exp}} -> now <= exp end)
      |> Map.new()
    Process.send_after(self(), :evict, state.eviction_interval_ms)
    {:noreply, %{state | entries: new_entries}}
  end
end

Route: long-context retrieval and review with a harness that forces fenced output. Not drop-in agentic coding until the format is fixed, or the template is re-packed. The window is the whole 131k — that part is settled; the fence habit is the thing to watch.

Have something worth building?

A paragraph about what you are working on is enough to start.

Say hello