Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
207b92a
feat(model): add Muse Glimmer support
yaoyu-33 Aug 10, 2026
2e3b8f3
docs(model): pin Muse Glimmer verification commit
yaoyu-33 Aug 10, 2026
95bc222
refactor(model): migrate Muse Glimmer to HybridModel
yaoyu-33 Aug 11, 2026
6cef8df
docs(model): pin Muse Glimmer HybridModel verification commit
yaoyu-33 Aug 11, 2026
01ba983
fix(conversion): support builder-backed model checkpoints
yaoyu-33 Aug 11, 2026
8418673
fix(inference): load builder-backed VLM checkpoints
yaoyu-33 Aug 11, 2026
37df4b0
fix(checkpoint): identify Muse TP norm replicas
yaoyu-33 Aug 11, 2026
0bbd420
fix(checkpoint): restore persisted builder values
yaoyu-33 Aug 11, 2026
a34fb67
fix(checkpoint): skip disabled RNG capture
yaoyu-33 Aug 11, 2026
b031e34
fix(conversion): save CPU checkpoints without CUDA
yaoyu-33 Aug 11, 2026
e322510
fix(checkpoint): finalize CPU saves on Gloo
yaoyu-33 Aug 11, 2026
8b096c9
docs(model): verify Muse Glimmer model workflows
yaoyu-33 Aug 11, 2026
220621a
feat(recipe): add Muse Glimmer training verification configs
yaoyu-33 Aug 12, 2026
ec67e11
fix(recipe): keep Muse training on HybridModel config
yaoyu-33 Aug 12, 2026
22ddbf0
feat(model): add Muse Glimmer training collator
yaoyu-33 Aug 12, 2026
18b42fc
fix(recipe): fit Muse Glimmer training on H100
yaoyu-33 Aug 12, 2026
a30dcb4
fix(recipe): increase Muse pipeline memory headroom
yaoyu-33 Aug 12, 2026
a1ce18b
fix(model): honor Muse transformer backend
yaoyu-33 Aug 12, 2026
927e1b1
fix(recipe): add Muse pipeline workspace headroom
yaoyu-33 Aug 12, 2026
8b0d06b
fix(model): recompute Muse vision layers during training
yaoyu-33 Aug 12, 2026
5df3d61
fix(recipe): bound Muse training image tokens
yaoyu-33 Aug 12, 2026
a0e1b3e
perf(recipe): bound Muse verification images
yaoyu-33 Aug 12, 2026
f34ec26
fix(recipe): retain Muse vision recompute
yaoyu-33 Aug 12, 2026
44c76b9
perf(recipe): pack Muse pretraining sequences
yaoyu-33 Aug 12, 2026
cb029f1
perf(recipe): add Muse decoder benchmark
yaoyu-33 Aug 12, 2026
58f9aa3
perf(recipe): fold Muse decoder benchmark
yaoyu-33 Aug 12, 2026
768e758
perf(recipe): fit Muse folded microbatch
yaoyu-33 Aug 12, 2026
5857c4d
fix(model): count full Muse transformer layers
yaoyu-33 Aug 12, 2026
b5b9290
fix(recipe): use supported Muse context parallelism
yaoyu-33 Aug 12, 2026
fc302ad
perf(recipe): use Muse context parallelism
yaoyu-33 Aug 12, 2026
196b8b2
perf(recipe): overlap Muse tensor parallelism
yaoyu-33 Aug 12, 2026
e773fd0
fix(checkpoint): read HybridModel parallelism
yaoyu-33 Aug 12, 2026
891147e
docs(model): verify Muse Glimmer LoRA
yaoyu-33 Aug 12, 2026
7d5037e
perf(recipe): canonicalize Muse Glimmer benchmark
yaoyu-33 Aug 12, 2026
a9ec3a0
feat(recipe): add reproducible Muse pretrain
yaoyu-33 Aug 12, 2026
1d20faf
perf(recipe): add Muse Glimmer FP8 benchmark
yaoyu-33 Aug 12, 2026
fc4cbf9
perf(recipe): raise Muse FP8 microbatch
yaoyu-33 Aug 12, 2026
01c9249
perf(model): use native Muse decoder norms
yaoyu-33 Aug 12, 2026
1fbf963
perf(recipe): tune Muse Glimmer FP8 layout
yaoyu-33 Aug 12, 2026
e9da92f
docs(model): record Muse performance evidence
yaoyu-33 Aug 12, 2026
a1122c6
fix(model): stabilize Muse checkpoint and inference verification
yaoyu-33 Aug 12, 2026
0576788
docs(model): verify Muse modeling workflows
yaoyu-33 Aug 12, 2026
edb31e8
fix(model): honor Muse embedding sharing contract
yaoyu-33 Aug 12, 2026
3c8a0e5
feat(model): verify packed Muse long-context SFT
yaoyu-33 Aug 12, 2026
da607ce
fix(model): support released Muse tying config
yaoyu-33 Aug 12, 2026
a0a3583
fix(model): select packed Muse CP backend
yaoyu-33 Aug 12, 2026
99dac20
fix(model): satisfy Muse packing batch contract
yaoyu-33 Aug 12, 2026
9149d3f
fix(model): scope Muse packing batch override
yaoyu-33 Aug 12, 2026
1cf21ff
test(model): keep Muse recipe fixture focused
yaoyu-33 Aug 12, 2026
00792ca
fix(training): slice packed CP metadata on pipeline stages
yaoyu-33 Aug 12, 2026
c7026ab
fix(model): stabilize Muse vision attention backward
yaoyu-33 Aug 12, 2026
2bf9bbb
docs(model): finalize Muse Glimmer modeling evidence
yaoyu-33 Aug 12, 2026
3e0b983
chore: merge current main into Muse Glimmer support
yaoyu-33 Aug 12, 2026
c232848
fix(recipe): bound Muse multimodal pretraining batch
yaoyu-33 Aug 12, 2026
32d0ead
fix(recipe): make Muse pretraining resume reproducible
yaoyu-33 Aug 12, 2026
8be93c4
docs(model): verify Muse Glimmer training workflows
yaoyu-33 Aug 12, 2026
0c0a0ad
Merge origin/main into Muse Glimmer HybridModel migration
yaoyu-33 Aug 12, 2026
511124c
docs(model): pin Muse verification provenance
yaoyu-33 Aug 12, 2026
0f4cc26
Merge remote-tracking branch 'origin/main' into codex/pr5479-hybrid-m…
yaoyu-33 Aug 12, 2026
525b82a
docs(models): refresh Muse Glimmer verification evidence
yaoyu-33 Aug 13, 2026
eb4dd2f
refactor(muse-glimmer): use native Transformers config
yaoyu-33 Aug 14, 2026
ceb5305
chore: merge current main into Muse Glimmer support
yaoyu-33 Aug 14, 2026
743d6ad
refactor(models): unify builder config overrides
yaoyu-33 Aug 14, 2026
c64a34d
perf(muse-glimmer): use TE affine norms
yaoyu-33 Aug 14, 2026
9498633
Merge remote-tracking branch 'origin/main' into codex/pr5479-hybrid-m…
yaoyu-33 Aug 14, 2026
bfc486f
Merge remote-tracking branch 'origin/yuya/muse-glimmer-support' into …
yaoyu-33 Aug 14, 2026
923f894
fix(muse-glimmer): decouple TE norms from attention backend
yaoyu-33 Aug 14, 2026
cccdcbc
docs(model): verify Muse Glimmer TE norm parity
yaoyu-33 Aug 14, 2026
9710d94
fix(muse-glimmer): declare recipe environments inline
yaoyu-33 Aug 15, 2026
feed3a5
docs(skill): clarify Transformer Engine API lookup
yaoyu-33 Aug 15, 2026
9a5bfe5
fix(models): support updated Transformers config APIs
yaoyu-33 Aug 15, 2026
181b9e4
chore: merge current main into Muse Glimmer support
yaoyu-33 Aug 17, 2026
a1ee7bf
fix(models): repair Transformers 5.15 compatibility
yaoyu-33 Aug 17, 2026
9f42e8b
chore: merge current main into Muse Glimmer support
yaoyu-33 Aug 17, 2026
fb901bd
refactor(muse-glimmer): use native normalization modules
yaoyu-33 Aug 17, 2026
1c6177b
Merge remote-tracking branch 'origin/yuya/muse-glimmer-support' into …
yaoyu-33 Aug 17, 2026
f1a9bd8
test(muse-glimmer): restore attention backend environment
yaoyu-33 Aug 18, 2026
6633d47
docs(muse-glimmer): explain weightless QK norms
yaoyu-33 Aug 18, 2026
e6b9dc2
Merge remote-tracking branch 'origin/main' into codex/pr5479-hybrid-m…
yaoyu-33 Aug 21, 2026
a80ab57
Merge remote-tracking branch 'origin/main' into codex/pr5479-hybrid-m…
yaoyu-33 Aug 21, 2026
fff3669
Merge remote-tracking branch 'origin/main' into codex/pr5479-hybrid-m…
yaoyu-33 Aug 24, 2026
4719ba0
fix(conversion): preserve legacy model construction paths
yaoyu-33 Aug 24, 2026
fe7a92f
Merge remote-tracking branch 'origin/main' into codex/pr5479-hybrid-m…
yaoyu-33 Aug 24, 2026
a3aafb9
Merge remote-tracking branch 'origin/main' into codex/pr5479-hybrid-m…
yaoyu-33 Aug 25, 2026
ea1fa3d
Merge remote-tracking branch 'origin/main' into codex/pr5479-hybrid-m…
yaoyu-33 Aug 25, 2026
4950254
fix(models): support Transformers 5.15 conversions
yaoyu-33 Aug 25, 2026
9e01822
Merge remote-tracking branch 'origin/main' into codex/pr5479-hybrid-m…
yaoyu-33 Aug 25, 2026
4c59dc7
refactor(recipes): flatten Muse Glimmer configs
yaoyu-33 Aug 25, 2026
4964763
chore: merge main into Muse Glimmer support
yaoyu-33 Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 43 additions & 16 deletions examples/conversion/compare_hf_and_megatron/compare.py
Original file line number Diff line number Diff line change
Expand Up @@ -716,14 +716,26 @@ def _load_megatron_model(args):
),
**_hf_revision_kwargs(args.hf_revision),
)
model_provider = bridge.to_megatron_provider(load_weights=False)
model_provider.tensor_model_parallel_size = tp
model_provider.pipeline_model_parallel_size = pp
model_provider.expert_model_parallel_size = ep
model_provider.expert_tensor_parallel_size = etp
model_provider.pipeline_dtype = torch.bfloat16
model_provider.finalize()
model_provider.initialize_model_parallel(seed=0)
if getattr(bridge._model_bridge, "USE_MODEL_CONFIG_FOR_CONVERSION", False):
model_config = bridge.get_model_config()
transformer = model_config.transformer
transformer.tensor_model_parallel_size = tp
transformer.pipeline_model_parallel_size = pp
transformer.expert_model_parallel_size = ep
transformer.expert_tensor_parallel_size = etp
transformer.pipeline_dtype = torch.bfloat16
transformer.params_dtype = torch.bfloat16
model_config.finalize()
bridge._get_or_initialize_pg_collection(transformer)
else:
model_provider = bridge.to_megatron_provider(load_weights=False)
model_provider.tensor_model_parallel_size = tp
model_provider.pipeline_model_parallel_size = pp
model_provider.expert_model_parallel_size = ep
model_provider.expert_tensor_parallel_size = etp
model_provider.pipeline_dtype = torch.bfloat16
model_provider.finalize()
model_provider.initialize_model_parallel(seed=0)
megatron_model = bridge.load_megatron_model(
args.megatron_model_path,
mp_overrides={
Expand All @@ -744,14 +756,29 @@ def _load_megatron_model(args):
),
**_hf_revision_kwargs(args.hf_revision),
)
model_provider = bridge.to_megatron_provider(load_weights=True)
model_provider.tensor_model_parallel_size = tp
model_provider.pipeline_model_parallel_size = pp
model_provider.expert_model_parallel_size = ep
model_provider.expert_tensor_parallel_size = etp
model_provider.pipeline_dtype = torch.bfloat16
model_provider.finalize()
megatron_model = model_provider.provide_distributed_model(wrap_with_ddp=False)
if getattr(bridge._model_bridge, "USE_MODEL_CONFIG_FOR_CONVERSION", False):
model_config = bridge.get_model_config()
transformer = model_config.transformer
transformer.tensor_model_parallel_size = tp
transformer.pipeline_model_parallel_size = pp
transformer.expert_model_parallel_size = ep
transformer.expert_tensor_parallel_size = etp
transformer.pipeline_dtype = torch.bfloat16
transformer.params_dtype = torch.bfloat16
megatron_model = bridge.get_model(
model_config,
wrap_with_ddp=False,
mixed_precision_wrapper=None,
)
else:
model_provider = bridge.to_megatron_provider(load_weights=True)
model_provider.tensor_model_parallel_size = tp
model_provider.pipeline_model_parallel_size = pp
model_provider.expert_model_parallel_size = ep
model_provider.expert_tensor_parallel_size = etp
model_provider.pipeline_dtype = torch.bfloat16
model_provider.finalize()
megatron_model = model_provider.provide_distributed_model(wrap_with_ddp=False)

# Workaround: disable MTP for inference (causes hangs on NCCL collectives)
for m in megatron_model:
Expand Down
418 changes: 418 additions & 0 deletions examples/model_verification_cards/muse-glimmer-30b/card.yaml

Large diffs are not rendered by default.

55 changes: 55 additions & 0 deletions examples/models/muse_glimmer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Muse Glimmer 30B

[Muse Glimmer 30B](https://huggingface.co/meta-models/Muse-Glimmer-30B) is a dense
vision-language model with a roughly 2B-parameter vision encoder and a 28B-parameter
decoder. Megatron Bridge models the complete checkpoint: the vision tower, adapter,
projection, and text decoder all participate in checkpoint conversion.

## Modeling

Muse Glimmer uses the builder-backed API. `MuseGlimmerBridge` translates the Hugging
Face configuration directly into `MuseGlimmerModelConfig`, and
`MuseGlimmerModelBuilder` constructs `MuseGlimmerModel` as a native Megatron-Core
`HybridModel`; no model provider or `GPTModel` wrapper is involved.

The text decoder uses a native Megatron-Core `HybridStack` whose layer pattern selects
the Muse transformer-layer spec at every depth. It preserves GQA,
tensor/pipeline/context parallelism, 3:1 sliding/full attention, per-layer NoPE,
weightless Q/K RMSNorm, and the full-head sigmoid attention output gate. Muse-specific
residual-branch RMSNorms wrap the attention and MLP outputs without replacing
Megatron-Core's `TransformerLayer` execution path. The embedding norm, final scaled
RMSNorm, output multiplier, and tanh logit soft-cap reproduce the published decoder
math.

The replicated vision path implements the published 50-layer encoder, half-pixel
bilinear learned-position lookup with zero padding, 2-D RoPE, 3:1 window/full attention,
2x2 pixel shuffle, two-layer GELU adapter, text-width projection, and weightless
perception RMSNorm. Its parameters are marked for tensor-parallel gradient averaging.

## Builder-backed configuration

```python
from megatron.bridge import AutoBridge

bridge = AutoBridge.from_hf_pretrained(
"meta-models/Muse-Glimmer-30B",
revision="f84ecc3a0ea984a4c04542a84269e3d065350a6e", # pragma: allowlist secret
)
model_config = bridge.get_model_config()

# Apply deployment-specific parallelism before construction.
model_config.tensor_model_parallel_size = 8
models = bridge.get_model(model_config)
```

The published configuration needs Transformers 5.15 for native Hugging Face model
execution. Megatron Bridge includes only a configuration compatibility class so that
the lazy safetensors import and builder path continue to work with the repository's
currently pinned Transformers release; it does not vendor or execute the Hugging Face
model implementation.

## Verification status

See the [model verification card](../../model_verification_cards/muse-glimmer-30b/card.yaml)
for the pinned source revision and current evidence. The card keeps import, export,
forward correlation, inference, and training claims separate.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ classifiers = [
"Topic :: Utilities",
]
dependencies = [
"transformers>=5.8,<=5.12.1",
"transformers>=5.15,<=5.15.0",
"mistral-common>=1.10.0",
"peft>=0.18.1",
"datasets>=2.20.0",
Expand Down
91 changes: 73 additions & 18 deletions scripts/conversion/gpu_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,33 @@ def _configure_model_provider(
model_provider.use_cpu_initialization = True


def _uses_model_builder(bridge: AutoBridge) -> bool:
"""Return whether the selected bridge supports native builder construction."""
return getattr(bridge._model_bridge, "USE_MODEL_CONFIG_FOR_CONVERSION", False)


def _configure_model_config(
model_config,
*,
tp: int,
pp: int,
ep: int,
etp: int,
dtype: torch.dtype,
use_cpu: bool = False,
) -> None:
"""Apply distributed parallelism and dtype settings to a builder config."""
transformer = model_config.transformer
transformer.tensor_model_parallel_size = tp
transformer.pipeline_model_parallel_size = pp
transformer.expert_model_parallel_size = ep
transformer.expert_tensor_parallel_size = etp
transformer.pipeline_dtype = dtype
transformer.params_dtype = dtype
if use_cpu:
transformer.use_cpu_initialization = True


def _hf_tokenizer_kwargs(bridge: AutoBridge, *, trust_remote_code: bool) -> dict[str, object]:
"""Build tokenizer metadata for a saved Megatron checkpoint."""
tokenizer_kwargs: dict[str, object] = {}
Expand Down Expand Up @@ -320,12 +347,22 @@ def import_checkpoint(
torch_dtype=dtype,
**revision_kwargs,
)
model_provider = bridge.to_megatron_provider(load_weights=True)
_configure_model_provider(model_provider, tp=tp, pp=pp, ep=ep, etp=etp, dtype=dtype)
_maybe_generate_pipeline_layout(bridge, model_provider, pp)
model_provider.finalize()
model_provider.initialize_model_parallel(seed=0, create_gloo_process_groups=False)
megatron_model = model_provider.provide_distributed_model(wrap_with_ddp=False)
if _uses_model_builder(bridge):
model_config = bridge.get_model_config()
_configure_model_config(model_config, tp=tp, pp=pp, ep=ep, etp=etp, dtype=dtype)
_maybe_generate_pipeline_layout(bridge, model_config, pp)
megatron_model = bridge.get_model(
model_config,
wrap_with_ddp=False,
mixed_precision_wrapper=None,
)
else:
model_provider = bridge.to_megatron_provider(load_weights=True)
_configure_model_provider(model_provider, tp=tp, pp=pp, ep=ep, etp=etp, dtype=dtype)
_maybe_generate_pipeline_layout(bridge, model_provider, pp)
model_provider.finalize()
model_provider.initialize_model_parallel(seed=0, create_gloo_process_groups=False)
megatron_model = model_provider.provide_distributed_model(wrap_with_ddp=False)

bridge.save_megatron_model(
megatron_model,
Expand Down Expand Up @@ -410,12 +447,20 @@ def export_checkpoint(
# Preserve the reference wrapper's streaming state source and shard map while
# exporting the checkpoint-derived architecture and vocabulary configuration.
bridge.hf_pretrained.config = checkpoint_config_bridge.hf_pretrained
model_provider = bridge.to_megatron_provider(load_weights=False)
_configure_model_provider(model_provider, tp=tp, pp=pp, ep=ep, etp=etp, dtype=dtype, use_cpu=use_cpu)
_maybe_restore_pipeline_layout(bridge, model_provider, megatron_path, pp)
resolved_pipeline_layout = model_provider.pipeline_model_parallel_layout
model_provider.finalize()
model_provider.initialize_model_parallel(seed=0, create_gloo_process_groups=False)
if _uses_model_builder(bridge):
model_config = bridge.get_model_config()
_configure_model_config(model_config, tp=tp, pp=pp, ep=ep, etp=etp, dtype=dtype, use_cpu=use_cpu)
_maybe_restore_pipeline_layout(bridge, model_config, megatron_path, pp)
resolved_pipeline_layout = model_config.pipeline_model_parallel_layout
model_config.finalize()
bridge._get_or_initialize_pg_collection(model_config.transformer)
else:
model_provider = bridge.to_megatron_provider(load_weights=False)
_configure_model_provider(model_provider, tp=tp, pp=pp, ep=ep, etp=etp, dtype=dtype, use_cpu=use_cpu)
_maybe_restore_pipeline_layout(bridge, model_provider, megatron_path, pp)
resolved_pipeline_layout = model_provider.pipeline_model_parallel_layout
model_provider.finalize()
model_provider.initialize_model_parallel(seed=0, create_gloo_process_groups=False)

model_parallel_overrides: dict[str, object] = {
"tensor_model_parallel_size": tp,
Expand Down Expand Up @@ -484,11 +529,21 @@ def roundtrip_checkpoint(
torch_dtype=dtype,
)

model_provider = bridge.to_megatron_provider(load_weights=True)
_configure_model_provider(model_provider, tp=tp, pp=pp, ep=ep, etp=etp, dtype=dtype)
_maybe_generate_pipeline_layout(bridge, model_provider, pp)
model_provider.finalize()
model_provider.initialize_model_parallel(seed=0, create_gloo_process_groups=False)
megatron_model = model_provider.provide_distributed_model(wrap_with_ddp=False)
if _uses_model_builder(bridge):
model_config = bridge.get_model_config()
_configure_model_config(model_config, tp=tp, pp=pp, ep=ep, etp=etp, dtype=dtype)
_maybe_generate_pipeline_layout(bridge, model_config, pp)
megatron_model = bridge.get_model(
model_config,
wrap_with_ddp=False,
mixed_precision_wrapper=None,
)
else:
model_provider = bridge.to_megatron_provider(load_weights=True)
_configure_model_provider(model_provider, tp=tp, pp=pp, ep=ep, etp=etp, dtype=dtype)
_maybe_generate_pipeline_layout(bridge, model_provider, pp)
model_provider.finalize()
model_provider.initialize_model_parallel(seed=0, create_gloo_process_groups=False)
megatron_model = model_provider.provide_distributed_model(wrap_with_ddp=False)
_verify_roundtrip_weights(bridge, megatron_model)
print_rank_0("GPU round-trip validation complete")
Loading
Loading