Loading...

Meta's Muse Glimmer: An Agentic AI Model

Meta open-weighted a 30B agentic model that runs on one 24 GB consumer GPU, an RTX 4090 or a 32 GB Mac, at its full 131,072 token context. Four architectural decisions got it there. In this post we'll build up from what an agentic model actually has to do. Then we'll go through Glimmer's attention layout, its channel-scoped output, its XML tool calls, and the block diffusion drafter that makes it fast. We'll finish with what runs on your hardware, and a lab you can point at your own Glimmer server.

On 10 August 2026 Meta released Muse Glimmer, a 30B open-weight agentic model under Apache 2.0 that runs on one 24 GB consumer GPU. Four architectural decisions got it there, starting with an attention layout that turns a 104 GB KV cache into 1.7 GB. This post builds them up from first principles, traces one request through the whole system, and ends with a runnable lab you can point at your own Glimmer server.

Introduction

On 10 August 2026 Meta open-weighted Muse Glimmer, a 30 billion parameter agentic model under Apache 2.0. Open-weighted means the trained parameters are published for anyone to download and run, which is not the same as publishing the training data or the code. Those 30 billion parameters are normally stored at 16 bits each, which comes to 58 GB, more than any consumer graphics card holds. Meta also ships the model quantized, meaning each parameter is squeezed into 4 bits instead of 16. That version is 16.8 GB, and it fits on a single 24 GB GPU such as an RTX 4090, or on a Mac with 32 GB of unified memory.

Many 30B models fit on a 24 GB GPU. Glimmer is unusual because it still fits after hours of tool use, the workload that normally blows a local model's memory budget. Every tool result is appended to the context, so the cost climbs for as long as the session runs. Fitting that into 24 GB took four architectural decisions, and this post takes them in order.

Everything here is checked against the model card, the GGUF repository, Meta's research blog, the vLLM recipe and the DFlash paper. Where something is our reading of the architecture rather than a claim Meta makes, we say so.

What Muse Glimmer is

You will see two names, and they are not the same model. Muse Spark is Meta's larger model, and Glimmer was distilled from it. Distilled means Glimmer was trained to copy Spark, so Spark is the teacher and Glimmer is the student. Spark's weights have never been released, so you cannot run it. Muse Glimmer is the 30B student, and it is what this post is about. It inherits what Spark learned and does not exceed it. Comparing it with the big hosted models compares a student with other companies' teachers.

PropertyValue
Parameters~29.6B language model, plus a ~1.8B vision encoder in a separate file
Layers52, in a repeating [local, local, local, global] pattern
Attention32 query heads, 2 key-value heads, head dimension 128
Feed-forwardSwiGLU, intermediate width 19,968
Vocabulary202,048 tokens
Context131,072 tokens. A llama.cpp override runs it at 262,144, which Meta has not validated
ModalitiesText and image in, text out. Video as frames, no audio
Knowledge cutoff4 January 2026
LicenseApache 2.0, commercial use allowed

It is a dense model, so every parameter runs for every token. That is a deliberate choice against the mixture-of-experts designs common at this size. It costs efficiency and buys predictable memory use, which is what you want when the goal is a fixed 24 GB budget. The feed-forward block is SwiGLU. It sends the input down two paths and multiplies them together, so one path is a volume control on the other. Parts of the signal get turned up, parts get turned down, and what survives carries on to the next layer.

The problem it solves

A chat model reads a question and writes an answer. An agentic model reads a task, calls a tool, reads what came back, decides it needs another tool, and keeps going until it is done. That loop changes what the model has to be good at.

Each of those pushes against a fixed memory budget, and the growing context pushes hardest. Glimmer answers with four decisions, one per pressure. Share the key-value heads to cut the cost per token. Let most layers forget to stop that cost growing. Separate the channels for a reliable loop, and guess in blocks to kill the latency. A section each.

Why this is hard

A transformer stores a key and a value for every token it has seen, in every layer, or it would recompute the whole conversation for each new token. That storage is the KV cache, and its size per token per layer is

Take a conventional transformer of Glimmer's shape, where each of the 32 query heads gets its own key-value pair, at a 131,072 token context.

104 GB, before a single weight is loaded. A 30B model at 4-bit is only about 17 GB of weights, so the cache alone would be six times the model and several times the memory of any consumer GPU. Quantization, meaning storing each weight in fewer bits, shrinks the weights and does nothing for the cache.

This is why parameter count tells you so little about whether a model fits. Two models with identical parameter counts can differ by a factor of sixty in what they need to run a long session.

Decisions 1 and 2, the attention layout

Assume a team of 52 people is reading one long document. If they all memorise the whole thing, that is accurate but expensive. If they all remember just the last page, that is cheap but they lose the plot. Glimmer does neither.

Combine that with grouped-query attention, where 32 query heads share just 2 key-value heads, and the arithmetic changes completely.

1.7 GB against 104. The two decisions together are worth a factor of about 61, and neither changes the parameter count by a single weight. Both had been used before, in the Llama and Mistral lineages. Interleaving them 3 to 1 rather than picking one is the new part.

Why no RoPE on the global layers

Meta states the layout without explaining it, so what follows is the standard reading. RoPE marks a token's position by rotating its query and key vectors. It is reliable over short distances and gets vague past the lengths it was trained on, which is why long-context models drift at the far end. Glimmer keeps it inside the 2,048 token windows, where distances stay short. The global layers carry no position encoding at all, so there is nothing to extrapolate and nothing to break at 131,072 tokens.

Each mechanism is used only where it is good. Local layers handle precise nearby structure with RoPE, global layers handle loose long-range recall without it, instead of one mechanism being stretched over both jobs.

There is a real cost. Anything from 50,000 tokens back reaches the current token through 13 layers instead of 52, so distant recall is weaker than in a full-attention model of the same size. That suits an agent, which needs recent steps in detail and older ones in outline. It hurts if you need an exact quote from deep in a document.

Decision 3, channel-scoped output

Most reasoning models wrap thinking in think tags and treat everything else as the answer. Glimmer tags every message with a recipient instead, so treating it like a think-tag model gets you an empty string back with no clue why.

The recipient drives your loop. self is private reasoning you log and never display, a tool name is a request to run that tool, and user is the answer, the only one that ends the turn.

That wants_tool property is the whole loop condition. A turn with reasoning, a tool call and no final message is the normal shape of a working step.

Where reasoning strength actually gets set

Reasoning strength is Glimmer's one latency knob, with values low, medium, high and xhigh, and Meta recommends high or xhigh for agentic and coding work. The model card says to set it with a Reasoning strength: low line in your system prompt. But your system prompt is not the last thing the model reads. The server runs every request through the chat template, and that template adds its own reasoning-strength line after yours. It says high unless you change it there, and the model follows whichever line comes last. So if you set low and nothing speeds up, this is why.

ATEM, tool calls in XML

Nearly every tool-calling model emits JSON. Glimmer emits this.

That looks like a step backwards until you think about what a model has to do to produce valid JSON. What follows is the standard case for XML-shaped calls rather than a claim Meta makes.

What ATEM gives up is types. Every value arrives as text, so top_k reaches you as the characters 3, not the number 3. Convert it using the tool schema before you run anything, or the number stays a string.

When one of your tools fails, send the error back to the model as text instead of throwing it. A thrown error stops the loop. An error the model can read is just another observation, so it tries something else and the run continues.

Decision 4, guessing several tokens at once

Generating one token means reading all 17 GB of weights out of the GPU memory, doing a small amount of maths with them, and discarding the read. The time goes into moving that data, not into the maths, which is what memory-bound means, and the GPU sits idle while it waits. Speculative decoding puts that idle capacity to work. A small model, the drafter, guesses the next few tokens. The big model, called the target, checks the whole batch in one pass, and you keep the guesses it agrees with. Checking sixteen guesses costs barely more than checking one, because either way the weights are read once.

Speculative decoding is lossless. The big model still decides every token, so the output is identical to what you would have got without it. You are trading idle parallel compute for latency.

Glimmer ships a small model for this job, called DFlash. It comes from a 2026 paper by a group at UC San Diego. Their equation for the average time per token shows where the speed comes from.

That says you pay for one round of drafting and one round of verifying, then divide that bill across however many tokens you kept. Tau is the acceptance length, the average number of guesses accepted per cycle.

The best known drafter before DFlash is EAGLE-3, and like every drafter before it, it writes one guess at a time. It predicts the next token, then the one after that, and so on, so sixteen guesses meant sixteen passes through it. Guessing more raises tau, but it raises the drafting bill by just as much, and the two cancel out. That is why earlier methods stall at roughly two to three times faster.

DFlash writes the whole block in one pass instead. It starts with sixteen blank positions and fills them in together, a technique called block diffusion, so drafting sixteen guesses costs about what drafting one costs. Now that extra guesses are nearly free, the drafter can afford to be bigger and think harder. DFlash uses five layers, where EAGLE-3 used one.

One more trick makes the guesses good enough to be worth checking. As the big model works, DFlash takes the half-finished calculations from five of its layers and feeds them into every layer of the drafter. That gives the drafter a head start, because it can see what the big model is already computing instead of guessing from scratch. EAGLE-3 handed the drafter that information once, at the start. DFlash gives it to every layer, and the researchers built both versions to check that this is what makes the difference.

DFlash comes from a paper by Chen, Liang and Liu at UC San Diego, ICML 2026. It is not Meta's work. Glimmer adopts the technique and ships a trained drafter for it, which is a different thing from inventing it.

HardwarePlain decodingWith DFlashSpeedup
RTX 509074.9 tok/s233.4 tok/s3.1x
M5 Max26.6 tok/s50.2 tok/s1.8x
M4 Maxnot statednot stated1.5x

The paper reports over 6 times on smaller models under ideal conditions. Meta measures 3.1 times on a 30B at 4-bit on an RTX 5090, at batch size one under llama.cpp, and that is the number that matters to you. The rest goes on sampling, turning tokens back into text, general runtime overhead, and the fact that rejections arrive in clusters rather than one at a time.

How it was trained

Meta describes three phases, at a high level.

On-policy distillation matters most here. Ordinary distillation trains the student on the teacher's outputs, so it only ever sees situations the teacher would have created. On-policy distillation instead has the teacher grade what the student itself produced, so it learns to recover from its own mistakes. For a model doing a hundred steps in a row, that beats being right first time.

Meta has not published the training data, the token count or the compute budget. Open weights are not open data.

Under the hood, one request end to end

You ask Glimmer, running on your own machine with a documentation-search tool attached, what sliding window it uses on its local layers.

That is the entire agent, no framework. Everything Glimmer-specific sits in the parsing, so swapping in a JSON tool-calling model leaves the loop unchanged.

Quantization and local inference

Glimmer at full precision is 58 GB of weights, which needs a data-center GPU and defeats the point. Think of quantization as rounding. Trained at 16 bits per weight and stored at 4, it keeps roughly one significant figure instead of four. Each weight is slightly wrong, but a transformer averages over billions so the errors mostly cancel. Modern 4-bit formats also work in small blocks with a shared scale and keep the layers that matter most at higher precision, which is what the dynamic in UD-Q4_K_XL means.

BuildSizeMeta's stated degradationFits
bf16 reference58 GBbaselineData-center GPUs
kquant-dynamic19.7 GB0.2% on agentic tasks32 GB
kquant-17gb16.8 GB1.0% on agentic tasks24 GB, so an RTX 4090
UD-Q2_K_XL13 GBnot stated, community build16 GB

The kquant figures are Meta's, and those builds live in the official GGUF repository. The UD- builds are Unsloth's and Meta makes no claim about them.

File size is not the memory you need. Add the KV cache, 1.4 GB for images, 1.6 GB for the drafter, and about a gigabyte of runtime overhead. That gap is where most out-of-memory errors come from. On 24 GB, kquant-17gb fits at full context with both optional files at about 22.5 GB. kquant-dynamic does not.

Running it yourself

Runtime support is unusually broad for a launch-day model. GGUF, the single file carrying weights, tokenizer and chat template together, is read by llama.cpp, Ollama and LM Studio, and is the only route exposing the DFlash drafter directly. Unsloth and TorchTitan handle fine-tuning, meaning continuing training on your own data. vLLM and SGLang serve at scale with paged attention and continuous batching. ExecuTorch and MLX target edge devices and Apple silicon, where unified memory means the RAM figure is also the usable VRAM figure.

ollama run hf.co/meta-models/Muse-Glimmer-30B-GGUF is the one-line version, and it hides the drafter and the vision projector, so you get neither speculative decoding nor image input. vLLM needs both parsers together, since they key off the same framing and the reasoning parser is what keeps special tokens alive.

Use temperature 1.0, top-p 0.95 and top-k 64, which Meta, Unsloth and the vLLM recipe all publish. Greedy decoding is a bad idea here, because a reasoning model's output length varies even at a fixed seed, so temperature 0 buys no reproducibility and costs quality.

The lab, and five experiments

The companion project muse-glimmer-lab turns each decision into something you can run and change.

ExperimentWhat it shows
01_hello.pyThe raw generation is three messages with three recipients
02_reasoning_strength.pyReasoning tokens against answer tokens, all four settings. Watch the ratio
03_tool_loop.pyA full loop over three tools, stopping only on a message to the user
04_kv_memory.pySwitches GQA and the sliding window off one at a time
05_dflash_sim.pySweeps block size for both drafter styles, from equation 1

Experiments 4 and 5 are the two that need no server, being arithmetic over the published architecture and the paper's latency equation. Experiment 4 pays for the whole lab, and every number comes from the model card, so glimmer/config.py is the architecture. Set kv_heads to 8 and watch the cache quadruple.

Experiment 5 predicts 5.7x where Meta measures 3.1x, and the script says so rather than hiding it. It assumes rejections are independent when they cluster, and ignores runtime overhead. Read it for the shape of the argument.

How it performs

Meta's own figures, so read them as you would any vendor's. It does publish the results where Glimmer loses.

BenchmarkMeasuresGlimmerGemma4-31BQwen3.6-27B
MCP AtlasTool orchestration75.554.262.5
DeepSearch QAMulti-step research74.6n/pn/p
SWE-Bench VerifiedReal issue fixes76.0n/pn/p
AIME 2026Competition maths94.7n/pn/p
OSWorld-VerifiedComputer use65.9n/p75.6

Glimmer leads by a wide margin on tool orchestration and multi-step research, which is what it was post-trained for, and trails Qwen3.6-27B on computer use and TerminalBench. Tuned hard for one shape of agentic work does not mean better at every shape of it. SWE-Bench Verified and Pro are different benchmarks, so its 76.0 and 51.2 are not in conflict.

Against the alternatives

AspectConventional 30B open modelHosted frontier modelMuse Glimmer
KV cache at 131kTens of GB, often more than the weightsNot your problem, not your control1.7 GB
Tool callsJSONJSONATEM XML, no escaping, no types
DecodingPlain, or an autoregressive drafterUndisclosedBlock diffusion drafter, 16 tokens a pass
Main limitationRuns out of memory on long sessionsYou cannot see or change itWeaker fine-grained recall at long range

On the Siren AgentDojo evaluation Meta reports a 28.4% attack success rate alongside 94.2 utility. Prompt injection means text the model reads, such as a web page or a file, carrying instructions that hijack what it does next. A model that follows instructions well follows the wrong ones well, and running locally moves the trust boundary rather than removing it.

Limitations

The failure mode to design against is the quiet one. A run that drifts because the model half-remembers a tool result from 40 steps ago produces a confident answer with no error anywhere in the trace. Step limits and checkpoints catch that. Watching for exceptions does not.

What to remember

Two ideas here outlast this model. The first is that architecture is a memory budget rather than a parameter count. The same 30 billion parameters need 104 GB of cache in one layout and 1.7 GB in another. The second is that diffusion has found a job it wins at. It was never better than autoregressive generation at writing text, so DFlash uses it only for guessing and leaves the deciding to the model that checks every token.

What to learn next

Sources

When two of these disagree, the model card wins. Every number in the companion lab has a comment saying where it came from.