Coverage for transformer_lens/model_bridge/supported_architectures/muse_glimmer.py: 100%
20 statements
« prev ^ index » next coverage.py v7.10.1, created at 2026-10-10 05:10 +0000
« prev ^ index » next coverage.py v7.10.1, created at 2026-10-10 05:10 +0000
1"""Muse Glimmer (MuseGlimmerForConditionalGeneration) architecture adapter."""
3from typing import Any
5import torch
7from transformer_lens.model_bridge.architecture_adapter import ArchitectureAdapter
8from transformer_lens.model_bridge.generalized_components import (
9 AttentionBridge,
10 BlockBridge,
11 EmbeddingBridge,
12 LinearBridge,
13 RotaryEmbeddingBridge,
14 UnembeddingBridge,
15 VisionProjectionBridge,
16)
17from transformer_lens.model_bridge.generalized_components.base import (
18 GeneralizedComponent,
19)
22class MuseGlimmerArchitectureAdapter(ArchitectureAdapter):
23 """Architecture adapter for MuseGlimmerForConditionalGeneration models."""
25 _testing_lm_attr = "model.language_model"
26 _testing_wire_rotary = False
28 # Attention output is gated by sigmoid(gate_proj(ln1_out)); fold-LN rescales only
29 # q/k/v, so the unfolded gate path would change — Gemma 2's sandwich norms alone
30 # fold fine.
31 supports_fold_ln = False
33 def __init__(self, cfg: Any) -> None:
34 super().__init__(cfg)
36 self.cfg.is_multimodal = True
37 self._extract_vision_dims(cfg)
39 self._set_rms_rotary_defaults()
40 self.cfg.attn_implementation = "eager"
41 self.weight_processing_conversions: dict = {}
43 self.component_mapping = {
44 "vision_encoder": GeneralizedComponent(name="model.vision_tower"),
45 # HF runs ``vision_adapter -> vision_projection -> perception_emb_norm`` and
46 # scatters only the last value into the text embeddings, so the projector
47 # bridge wraps the norm: ``hook_out`` is the merged embedding, as in the
48 # other VLM adapters (Gemma 3's norm lives inside its projector module).
49 # ``hook_in`` is then the projection output rather than the vision-tower one.
50 "vision_projector": VisionProjectionBridge(name="model.perception_emb_norm"),
51 "embed": EmbeddingBridge(name="model.language_model.embed_tokens"),
52 "rotary_emb": RotaryEmbeddingBridge(name="model.language_model.rotary_emb"),
53 "blocks": BlockBridge(
54 name="model.language_model.layers",
55 submodules={
56 "ln1": GeneralizedComponent(name="input_layernorm"),
57 "ln1_post": GeneralizedComponent(name="post_attention_layernorm"),
58 "ln2": GeneralizedComponent(name="pre_feedforward_layernorm"),
59 "ln2_post": GeneralizedComponent(name="post_feedforward_layernorm"),
60 "attn": AttentionBridge(
61 name="self_attn",
62 config=self.cfg,
63 submodules={
64 "q": LinearBridge(name="q_proj"),
65 "k": LinearBridge(name="k_proj"),
66 "v": LinearBridge(name="v_proj"),
67 "o": LinearBridge(name="o_proj"),
68 "gate": LinearBridge(name="gate_proj"),
69 },
70 maintain_native_attention=True,
71 requires_attention_mask=True,
72 ),
73 "mlp": self._gated_mlp(),
74 },
75 ),
76 "ln_final": GeneralizedComponent(name="model.language_model.norm"),
77 "unembed": UnembeddingBridge(name="lm_head", config=self.cfg),
78 }
80 def apply_output_logits_transform(self, logits: torch.Tensor) -> torch.Tensor:
81 multiplier = float(getattr(self.cfg, "output_multiplier", 1.0))
82 return super().apply_output_logits_transform(logits * multiplier)