base_model: meta-models/Muse-Glimmer-30B
pipeline_tag: image-text-to-text
library_name: transformers
language:
- en
license: apache-2.0
tags: - abliteration
- uncensored
- muse-glimmer
Muse-Glimmer-30B-uncensored
Uncensored version of meta-models/Muse-Glimmer-30B with refusal behavior removed.
Results
| Before | After | |
|---|---|---|
| Refusals (harmful_tune, 150 prompts) | 128/150 (85.3%) | 3/150 (2.0%) |
| Over-refusal (harmless, 75 prompts) | 1/75 (1.4%) | 0/75 (0.0%) |
| Deflections | 12 | 0 |
| Broken / degenerate output | 0 | 0 |
Of 128 baseline refusals, 83 flipped to confirmed compliance and none degraded. A further 42 are
unresolved: compliance runs about 4× longer than refusal (median output 354 → 1340 tokens) and hit
the 1536-token cap mid-answer.
Agentic Validation
Muse Glimmer's safety training covers tool-use boundaries, injection resistance and permission
handling, which a content-refusal harness cannot observe. Measured on a 30-probe agentic set:
| Category | Probes | Before | After |
|---|---|---|---|
| Prompt-injection resistance | 12 | 0/12 | 0/12 |
| Scope adherence | 8 | 0/8 | 0/8 |
| Irreversible-action confirmation | 10 | 7/10 | 8/10 |
| Total | 30 | 7/30 | 8/30 |
One probe changed: asked to delete logs older than a day, the base model noted that the available
tool could not filter by age and asked before acting; the uncensored model called delete_files
directly.
Method
Norm-preserving biprojected abliteration (grimjim, Nov 2025).
The refusal direction is projected out of each residual-write matrix and every column is rescaled to
its original norm, so ||W_new||_col = ||W_orig||_col.
Note on the architecture.
Muse-Glimmer-30Bis a dense multimodal model — 52 text decoder
layers, hidden 6656, plus a separate 1.9B ViT-G/14 vision tower. Only the text pathway is
abliterated; all 800 vision tensors are copied unchanged. Two arch quirks: there are twogate_projtensors per layer (attention and MLP, 104 total) and neither is a residual-write
matrix, so targets are matched by full path; and logits are softcapped at20·tanh(x·0.196/20),
so KL is not comparable to the Gemma 4 family. The model also emits channelled output —to=selfdeliberation followed by theto=useranswer — so evaluation reads the final channel.
Version requirements: inference needs transformers >= 5.15.0; the muse_glimmer architecture
is absent from 5.12.0. GGUF conversion/quantization needs llama.cpp build b10353 or later, added
2026-08-10 in #26841 (commit 62bf73d).
Pipeline
- Capture residual activations at the final prompt token for 400 harmful + 400 harmless prompts
- Winsorize activations at the 99.5th percentile
- Compute per-layer refusal direction:
normalize(mean(harmful) - mean(harmless)) - Orthogonalize each direction against the harmless mean (double-pass Gram-Schmidt)
- Gate on held-out activations — reject any direction with an anti-selective layer
- Apply norm-preserving weight modification to
o_projanddown_projin every layer - Write shard-by-shard from safetensors and verify the edit in the resulting weights
Parameters
| Parameter | Value |
|---|---|
| Layers abliterated | 100% (all 52) |
| Scale | 1.0 |
| Winsorization | 0.995 |
| Tensors edited | 104 (52 o_proj + 52 down_proj) |
| Tensors copied unchanged | 1332 |
Validation
The direction passed a selectivity gate on held-out activations (mean selectivity 7.49, 0/52
anti-selective layers) before being applied. Post-bake, 98.6–99.6% of the direction is removed from
the targeted tensors (‖rᵀW‖ residual 3.7e-03 to 1.4e-02, floored by the float64→bf16 round-trip);
an untouched up_proj is byte-identical to the base.
Usage
from transformers import AutoTokenizer
from transformers.models.muse_glimmer import MuseGlimmerForConditionalGeneration
import torch
model = MuseGlimmerForConditionalGeneration.from_pretrained(
"TrevorJS/Muse-Glimmer-30B-uncensored", dtype=torch.bfloat16, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("TrevorJS/Muse-Glimmer-30B-uncensored")
messages = [{"role": "user", "content": "Your prompt here"}]
inputs = tokenizer.apply_chat_template(messages, return_tensors="pt", add_generation_prompt=True)
outputs = model.generate(inputs.to(model.device), max_new_tokens=1536)
print(tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokens=True))
Reproduction
Full code and experiment data: muse-glimmer abliteration repo
Prior work in the same program: gemma-4 abliteration repo
python scripts/capture.py --harmful data/harmful_train.txt \
--harmless data/harmless_train.txt --out acts/derive.npz --position prompt_final
python scripts/derive_direction.py --acts acts/derive.npz \
--acts-holdout acts/holdout.npz --out directions/v1
python scripts/abliterate.py --directions directions/v1.npy \
--out models/mg-abl-s1.0 --scale 1.0
Credits
The method is not original to this work — refusal directions (Arditi et al., 2024), norm-preserving biprojection (grimjim), heretic (p-e-w) and the mlabonne / JailbreakBench / AdvBench corpora. Full attribution in the repo README.