Summary
Over the past three weeks (April 9–25), mobius merged 50 PRs from 5 contributors (plus 2 bots). The headline additions are Gemma 4 multimodal support (text + vision + audio with MoE), significant improvements to CUDA/GPU execution provider compatibility, and a push to bring L1–L3 test coverage above 95% .
🧠 New Model Support
Gemma 4 (any-to-any multimodal) — Full text, vision, and audio support with Mixture-of-Experts routing and KV-cache sharing (feat: add Gemma 4 support (text, vision, audio, MoE) #137 , feat: add input_features_mask to Gemma4 audio encoder #207 ) Investigation coordinated improvements in onnxruntime, genai and ort extentions
NemotronH — Added MoE layer support for Nemotron-3 30B/120B hybrid architectures (Add MoE layer support for NemotronH (Nemotron-3 30B/120B) #188 )
Pixtral / Ministral3 — Vision-language model support with dynamic vision encoding, FP8 dequantization, and multi-head attention (Add Pixtral/Ministral3 VLM support: dynamic vision, FP8 dequant, PatchMerger fix, MHA #130 )
Mamba2 — Reimplemented using the new LinearAttention component for cleaner architecture (Use LinearAttention to implement Mamba2 and other cleanup #163 )
Qwen3.5-MoE — Fixed weight preprocessing to correctly strip language_model prefix and drop unsupported keys (fix: Qwen3.5-MoE preprocess_weights strips language_model prefix and drops mtp/visual keys #195 )
⚡ CUDA / GPU Inference
�� ORT GenAI Integration
Gemma 4 end-to-end export — Fixed genai_config generation including decoder path, vision inputs, image_processor.json, processor_config.json, and spatial_merge_size (fix: Gemma4 genai config - vision inputs, decoder input_ids, processor #199 , fix: genai config gaps - decoder path, image_processor.json, spatial_merge_size #204 , Add Gemma4 image_processor.json generation with onnxruntime-extension… #209 )
Chat template propagation — Export now copies chat_template.jinja to the ORT GenAI output folder (fix: copy chat_template.jinja to ORT GenAI export folder #198 )
Config-mode fixes — Corrected model_type and token ID propagation when using --config mode, plus tokenizer copy (fix: --config mode model_type and token ID propagation #152 , fix: genai_config defaults and tokenizer copy for --config mode #153 )
Tied weight deduplication — Shared tied weights are now emitted as a single ONNX initializer instead of duplicated copies, reducing model size (fix: share tied weights as single ONNX initializer instead of copying #154 )
✅ Quality & Testing
L1–L3 coverage at 95%+ — Fixed L4/L5 test failures and expanded coverage with golden data and seq2seq generation tests (Fix L4/L5 test failures and improve L1-L3 coverage to 95%+ #178 , Expand L4/L5 test coverage: golden data, seq2seq generation, ci_skip_reason #183 )
GPU CI overhaul — Split L4 and L5 GPU workflows, extracted reusable workflow templates, wired affected-model detection to skip unchanged models, and added MOBIUS_TEST_DEVICE for CUDA (ci: Split L5 GPU workflows from L4 #164 , CI: Fix GPU workflow dependencies and increase timeouts #179 , ci: add MOBIUS_TEST_DEVICE environment variable for CUDA in workflows #180 , CI: Narrow affected-models detection by resolving __init__.py re-exports #182 , CI: Extract L4/L5 GPU jobs into reusable workflows and wire detect-affected #185 )
Smart change detection — CI now resolves __init__.py re-exports to accurately detect which models changed, avoiding unnecessary GPU test runs (ci: Fix model change detection script and registry parsing logic #169 , CI: Narrow affected-models detection by resolving __init__.py re-exports #182 )
Codecov integration — Added coverage upload to all CI pipelines (ci: add codecov upload step to all CI pipelines #135 )
Bug fix: silent NoPE-model corruption — Made RoPE config nullable so models without positional embeddings are no longer silently corrupted (Make RoPE config nullable to fix silent NoPE-model corruption #177 )
Cross-platform — Fixed Windows PermissionError in test_patch_merger (Fix Windows PermissionError in test_patch_merger #160 )
🛠️ Developer Experience & Code Quality
CLI docs consolidation — Merged scattered CLI documentation into a single cli_reference.md and clarified --ep vs --optimize flags (docs: clarify --ep vs --optimize in getting-started guide #201 , docs: consolidate CLI documentation into cli_reference.md #203 )
Agent skills restructuring — Moved skills to .agents/skills/, applied progressive disclosure, and added proven Gemma 4 patterns (docs: update skills with proven Gemma 4 patterns (MoE, Any-to-Any, KV sharing) #140 , Restructure skills: move to .agents/skills/, apply progressive disclosure, merge overlapping skills #181 )
Quality checklist — Added a definition-of-done checklist for new model additions covering L1–L5 testing, ORT GenAI validation, and code review (Add quality checklist (definition of done) for new model additions #139 )
onnxscript 0.7.0 adoption — Refactored ir.Function builders to use the new build_function API (Refactor ir.Function builders to use build_function from onnxscript 0.7.0 #189 )
Cleaner ops — Replaced op.Constant(value_float=...) with Python float literals for dtype-safe auto-casting (Replace op.Constant(value_float=...) with Python float literals, use autocast #166 ), replaced FusedMatMul with standard Transpose+MatMul (refactor: replace FusedMatMul with Transpose+MatMul, add initializer-folding passes #129 )
Sphinx docs timestamps — Pages now show accurate git-based creation and last-update dates (Add git-based page creation and last-update timestamps to Sphinx docs #145 , Fix docs pages showing identical created/updated dates #149 )
Justin's notes:
Olive pass support: using mobius to acquire an onnx model as an Olive pass
🔭 What's Next
Open source release
E2E Olive recipes : Expand e2e Olive recipes for a batch of models.
Expanding GPU validation — Continue broadening L4/L5 GPU test coverage across more model families
Additional multimodal architectures — Audio-to-audio, TTS, etc.
Support generating models from Olive quantized PyTorch weights (gptq etc.).-
Quantization support — Improve MXFP4/INT4 weight handling across more architectures / from gguf models
ORT GenAI runtime parity — Close remaining gaps in config generation for newer models
Performance testing by integrating with ep cert testing infra
Summary
Over the past three weeks (April 9–25), mobius merged 50 PRs from 5 contributors (plus 2 bots). The headline additions are Gemma 4 multimodal support (text + vision + audio with MoE), significant improvements to CUDA/GPU execution provider compatibility, and a push to bring L1–L3 test coverage above 95%.
🧠 New Model Support
LinearAttentioncomponent for cleaner architecture (Use LinearAttention to implement Mamba2 and other cleanup #163)language_modelprefix and drop unsupported keys (fix: Qwen3.5-MoE preprocess_weights strips language_model prefix and drops mtp/visual keys #195)⚡ CUDA / GPU Inference
com.microsoft.GroupQueryAttentiondirectly from theAttentioncomponent when the target execution provider supports it, including sliding-window attention for Gemma 4 (feat: emit GroupQueryAttention directly in Attention when EP supports it #134, Emit com.microsoft.GroupQueryAttention for Gemma4 with sliding window #190)�� ORT GenAI Integration
image_processor.json,processor_config.json, andspatial_merge_size(fix: Gemma4 genai config - vision inputs, decoder input_ids, processor #199, fix: genai config gaps - decoder path, image_processor.json, spatial_merge_size #204, Add Gemma4 image_processor.json generation with onnxruntime-extension… #209)chat_template.jinjato the ORT GenAI output folder (fix: copy chat_template.jinja to ORT GenAI export folder #198)model_typeand token ID propagation when using--configmode, plus tokenizer copy (fix: --config mode model_type and token ID propagation #152, fix: genai_config defaults and tokenizer copy for --config mode #153)✅ Quality & Testing
MOBIUS_TEST_DEVICEfor CUDA (ci: Split L5 GPU workflows from L4 #164, CI: Fix GPU workflow dependencies and increase timeouts #179, ci: add MOBIUS_TEST_DEVICE environment variable for CUDA in workflows #180, CI: Narrow affected-models detection by resolving __init__.py re-exports #182, CI: Extract L4/L5 GPU jobs into reusable workflows and wire detect-affected #185)__init__.pyre-exports to accurately detect which models changed, avoiding unnecessary GPU test runs (ci: Fix model change detection script and registry parsing logic #169, CI: Narrow affected-models detection by resolving __init__.py re-exports #182)PermissionErrorintest_patch_merger(Fix Windows PermissionError in test_patch_merger #160)🛠️ Developer Experience & Code Quality
cli_reference.mdand clarified--epvs--optimizeflags (docs: clarify --ep vs --optimize in getting-started guide #201, docs: consolidate CLI documentation into cli_reference.md #203).agents/skills/, applied progressive disclosure, and added proven Gemma 4 patterns (docs: update skills with proven Gemma 4 patterns (MoE, Any-to-Any, KV sharing) #140, Restructure skills: move to .agents/skills/, apply progressive disclosure, merge overlapping skills #181)ir.Functionbuilders to use the newbuild_functionAPI (Refactor ir.Function builders to use build_function from onnxscript 0.7.0 #189)op.Constant(value_float=...)with Python float literals for dtype-safe auto-casting (Replace op.Constant(value_float=...) with Python float literals, use autocast #166), replacedFusedMatMulwith standardTranspose+MatMul(refactor: replace FusedMatMul with Transpose+MatMul, add initializer-folding passes #129)Justin's notes:
🔭 What's Next