Skip to main content

1. Model Introduction

Muse Spark Open is an 816 B omni MoE model (42 B active) released in BF16. miles trains its 62-layer language model natively in Megatron. Key highlights:
  • Hybrid attention: 46 sliding-window layers (window 2048, RoPE) and 16 full-attention layers with no positional encoding; 128 query heads, 16 KV heads, head dim 64.
  • MoE in every layer: 256 routed experts, top-8, no shared experts.
  • Gated residuals: a learned per-channel gate mixes the residual stream and each post-normalized sublayer output.
  • Scaled embeddings and logits: embeddings RMS-normalized and scaled, logits scaled and soft-capped at 20.
  • Frozen towers: the vision and audio towers stay in the checkpoint but are not trained.

2. Supported Variants

3. Environment Setup

3.1 Image and storage

Run it on every node — 8 × 8 H200 or 4 × 8 B300, on InfiniBand. --model-dir, --data-dir and --output-dir need shared storage; --offload-train-disk-dir needs node-local NVMe with about 1.2 TB free for the streamed Adam state, 2.5 TB on B300.

3.2 Download + torch_dist conversion

The launcher’s prepare step downloads the checkpoint and the dataset, then converts the checkpoint on all nodes into <model-dir>/Muse-Spark-Open-816B-A42B_torch_dist (about 1.6 TB), skipping a finished conversion. With --vlm it prepares hiyouga/geometry3k instead of zhuzilin/dapo-math-17k.

3.3 SGLang

The image carries the sglang-miles-muse-spark-open branch, which serves the omni checkpoint natively. Math reasoning is validated on H200 and B300, image-grounded math on H200 only; B200 is untested.

4. Launch

4.1 Quick start

Start one Ray cluster across the nodes, then launch from node 0:
scripts/run_muse_spark_32xb300.py is the same recipe on 4 × 8 B300 and takes the same options. The log-prob column assumes R3 (--use-rollout-routing-replay, on in this recipe), which replays the rollout’s expert choices so routing noise cannot widen the gap. Reward starts at 0.65–0.75 and reaches 0.8–0.95 within 10 steps on math reasoning; every engine holds bit-identical weights after each sync.

4.2 Save and export

--save-interval N saves the weights, without optimizer state, to <output-dir>/<run-id>/checkpoints, and the launcher converts the last save into a Hugging Face checkpoint at <output-dir>/<run-id>/hf. Each save and each conversion takes about 1.6 TB. Save directories count steps from 0, so iter_0000009 below is the save after step 10:

5. Recipe Configuration

5.1 Parallelism

--sequence-parallel, THD packing (--use-dynamic-batch-size) and full recomputation are on.

5.2 Algorithm

GRPO with --eps-clip 0.2 --eps-clip-high 0.28, no KL or entropy term, per-token loss, and R3 (--use-rollout-routing-replay). Each step samples 32 prompts × 16 responses of up to 4096 tokens (8192-token context) at temperature 1. --rm-type math rewards a matching final \boxed{} answer, and --reasoning-effort defaults to xhigh.

5.3 Rollout & SGLang

Rollout runs on 4 colocated engines, up to 64 concurrent requests each on H200 and 128 on B300:

5.4 Optimizer

Adam at --lr 1e-6, constant, with weight decay 0.1 and no gradient clipping. The FP32 main weights and moments do not fit the GPUs, so they stream through node-local NVMe:
--optimizer muon switches to Muon (dist_muon), which keeps its state and the FP32 main weights in chunked CPU memory (--chunked-optimizer-state-offload --chunked-muon-master-weights). Megatron cannot save that state, so a Muon run also needs --no-load-optim --no-save-optim.

5.5 Image-grounded math (--vlm)

--vlm trains on Geometry3K. The vision tower stays frozen on the first pipeline stage, outside the optimizer and the checkpoints, and the weight sync re-sends it after every update. --eval-interval N scores the Geometry3K test split (601 problems, 4 samples each) and requires --vlm.

6. Pairs Well With