Add Muse-Glimmer-30B on a pinned mainline llama.cpp image - #8
Merged
Conversation
Muse-Glimmer-30B-GGUF is a dense 30B VLM whose architecture landed in mainline llama.cpp on 2026-08-10 (ggml-org/llama.cpp#26841, build b10353). The bonsai image builds PrismML's `prism` fork, whose branch head is 2026-07-31 — ten days older than the architecture — so it cannot load this model at all. Hence a second llama.cpp image rather than a new POOL entry. The two images are not redundant and neither replaces the other: the fork carries the Q2_0_g128 ternary kernels Ternary-Bonsai needs and mainline lacks; mainline carries every architecture merged after the fork diverged. Both share docker/gguf-serve.sh as their entrypoint, so a model moves between them by changing only `image:`. Two entries, because KV turned out to be nearly free on this model (52 layers, num_key_value_heads=2, and a 3:1 sliding/full attention split) — the full native 131072 context costs ~1.82 GiB, so weights, not context, are the constraint: muse-glimmer one 3090, 17gb+vision, 131072 in 1 slot, f16 KV Muse-Glimmer-30B-split both 3090s, dynamic+vision+draft, 131072 in 1 slot, f16 KV Both are ungrouped (new UNGROUPED_GGUF list), so neither generates pairNN co-load pairs: the standby model is not a co-load partner. config.yaml is purely additive — 104 -> 106 models with all pre-existing entries byte-identical and groups unchanged at 45. muse-glimmer is also the on-call standby: ttl 0 (never idle-unload) plus a poller that wakes it once both 3090s have been quiet for an hour. It deliberately does NOT use `persistent: true` — llama-swap defines that as "other groups can never unload this group's members", which would pin the cards and starve every other model. Eviction is already free via the existing exclusive groups, and the wakeup request itself displaces whatever is squatting, so nothing calls the unload API. Also fixes a pre-existing gap: bonsai-image.yml did not trigger on docker/gguf-serve.sh even though Dockerfile.bonsai COPYs it, so a change there would have rebuilt only the mainline image and left the bonsai one silently stale. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why a second llama.cpp image
meta-models/Muse-Glimmer-30B-GGUFis a dense 30B Apache-2.0 VLM. Its architecture landed in mainline llama.cpp on 2026-08-10 (#26841, buildb10353). The bonsai image builds PrismML'sprismfork, whose branch head is 2026-07-31 — ten days older than the architecture — so it cannot load this model at all.The two images are not redundant and neither replaces the other:
Dockerfile.bonsai— the fork'sQ2_0_g128ternary + hybrid-attention kernels, whichTernary-Bonsai-27Bneeds and mainline lacks.Dockerfile.llamacpp(new) — mainline pinned atb10362, carrying every architecture merged after the fork diverged.Both share
docker/gguf-serve.shas their entrypoint, so a model moves between them by changing onlyimage:. Pinned to a build tag rather than a rolling one, same policy asvllm/vllm-openai:v0.26.0.Sizing
KV turned out to be unusually cheap here — 52 layers,
num_key_value_heads: 2,head_dim: 128, and a 3:1 sliding/full attention split (39 sliding layers windowed at 2048, 13 full). Full layers cost 13 KiB/token, sliding layers a flat 78 MiB, so the entire native 131072 context costs ~1.82 GiB. Weights, not context, are the constraint:muse-glimmer17gb+ mmprojMuse-Glimmer-30B-split-sm layerdynamic+ mmproj + dflashBoth run
-np 1, which is also marginally cheaper than parallel slots: llama.cpp gives each slot its own sliding window, so parallelism multiplies the 78 MiB while leaving the full-layer cost fixed.Neither is in
POOL(newUNGROUPED_GGUFlist), so neither generatespairNNpairs — the standby model is not a co-load partner.On-call standby
muse-glimmerstays resident when the box is idle, without ever blocking another model:ttl: 0— never idle-unload.exclusive: truegroups already evict it on any other request. Free, no change.oncall-wakeupcompose service wakes it once both 3090s sit under 5% for an hour, matching GPUs by UUID (indices reorder across reboots; the A2000 must never count).Drive-by fix
bonsai-image.ymldid not trigger ondocker/gguf-serve.shdespiteDockerfile.bonsaicopying it — a change there would have rebuilt only the mainline image and left the bonsai one silently stale.Verification
Config-side, checked locally:
config.yamlis purely additive: 104 → 106 models, all 104 pre-existing entries byte-identical, groups unchanged at 45.sh -n.gguf-serve.shemits a byte-identical command line, soqwythos-v2/fablevibesare unaffected./metricson v247 and correctly ignores the A2000.Everything requiring GPUs is unverified and listed in
TODO.md. The thinnest number ismuse-glimmer's ~2.1 GiB headroom, which assumes llama.cpp allocates the sliding-window layers windowed rather than full; if it allocates full, KV jumps to ~6.5 GiB and it OOMs. Fallback ladder is documented.Before this works on the host
llamacpp-mainlineGHCR package does not exist yet (workflows only run onmain), then make it public./v1/modelsgoing 104 → 106 confirms pickup.🤖 Generated with Claude Code