Skip to content

Add full Jamba GGUF MoE support - #613

Merged
justinchuby merged 3 commits into
mainfrom
justinchuby-complete-jamba-gguf
Aug 25, 2026
Merged

Add full Jamba GGUF MoE support#613
justinchuby merged 3 commits into
mainfrom
justinchuby-complete-jamba-gguf

Conversation

@justinchuby

Copy link
Copy Markdown
Member

Summary

  • implement exact Jamba mixed attention/Mamba-1 execution with multi-token prefill, decode, heterogeneous KV/conv/recurrent state threading, batch reorder, and snapshot replay
  • add exact dense/routed-MoE scheduling, float32 full-softmax top-k routing without selected-weight renormalization, no-RoPE attention, fused and stacked expert preprocessing, and tied-head handling
  • import dense and MoE Jamba GGUFs with strict suffix-aware tensor closure and logical shape validation; preserve compatible attention/dense/expert MatMul quantization while dequantizing Mamba/state-sensitive roles
  • keep released generic ORT GenAI packaging deferred to Represent heterogeneous state and auxiliary graph topology in runtime packages #605 because its cache schema cannot represent heterogeneous state slots
  • update generated support documentation from dense-only to the evidence-backed routed-MoE subset

Validation

  • python -m pytest src/mobius/integrations/gguf/ -q --tb=short — 2608 passed
  • python -m pytest tests/build_graph_test.py tests/synthetic_parity_test.py src/mobius/integrations/gguf/_config_mapping_test.py src/mobius/integrations/gguf/_builder_test.py -k 'jamba' -q --tb=short — 34 passed
  • python -m pytest tests/build_graph_test.py tests/cli_test.py src/ -q -k 'not phi4mm and not apply_weights_unknown and not glm_moe_dsa' --tb=short -n auto — 7096 passed, 52 skipped
  • initialized lintrunner and formatted/linted all changed Python files
  • generated GGUF support documentation is current
  • two independent reviews completed; all high-confidence findings fixed

The unfiltered broad suite still has the existing glm_moe_dsa symbolic-shape inference/checker failure (2 tests), reproduced independently and unrelated to these Jamba paths.

Upstream evidence

Audited llama.cpp at 8d9af256337d1a501250f9bbf4c0859a654bddd6 and current Transformers Jamba. ai21labs/Jamba-tiny-dev at ed303361004ac875426a61675edecf8e9d976882 is the smallest suitable public real-weight follow-up candidate (~637 MB), but this PR makes no real-checkpoint or runtime-generation support claim without that separate evidence.

Stacked on #612 (justinchuby-plamo2-gguf).

@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown

Performance Comparison

Comparing 773c965f188ad8

Model Metric Baseline Current Delta
bert (feature-extraction) model_size_bytes 359 KB 359 KB +0.0%
bert (feature-extraction) num_nodes 68 68 +0.0%
falcon model_size_bytes 364 KB 364 KB +0.0%
falcon num_nodes 66 66 +0.0%
gemma2 model_size_bytes 428 KB 428 KB +0.0%
gemma2 num_nodes 105 105 +0.0%
gpt2 model_size_bytes 388 KB 388 KB +0.0%
gpt2 num_nodes 54 54 +0.0%
llama model_size_bytes 425 KB 425 KB +0.0%
llama num_nodes 60 60 +0.0%
llama (static-cache) model_size_bytes 425 KB 425 KB +0.0%
llama (static-cache) num_nodes 56 56 +0.0%
mamba (ssm-text-generation) model_size_bytes 296 KB 296 KB +0.0%
mamba (ssm-text-generation) num_nodes 94 94 +0.0%
phi3 model_size_bytes 421 KB 421 KB +0.0%
phi3 num_nodes 58 58 +0.0%
phi3 (static-cache) model_size_bytes 421 KB 421 KB +0.0%
phi3 (static-cache) num_nodes 54 54 +0.0%
qwen2 model_size_bytes 425 KB 425 KB +0.0%
qwen2 num_nodes 60 60 +0.0%
qwen2 (static-cache) model_size_bytes 425 KB 425 KB +0.0%
qwen2 (static-cache) num_nodes 56 56 +0.0%
qwen3_5_moe (hybrid-text-generation) model_size_bytes 506 KB 506 KB +0.0%
qwen3_5_moe (hybrid-text-generation) num_nodes 265 265 +0.0%
qwen3_5_text (hybrid-text-generation) model_size_bytes 458 KB 458 KB +0.0%
qwen3_5_text (hybrid-text-generation) num_nodes 127 127 +0.0%
qwen3_5_vl (hybrid-qwen-vl) model_size_bytes 977 KB 977 KB +0.0%
qwen3_5_vl (hybrid-qwen-vl) num_nodes 429 429 +0.0%
t5 (seq2seq) model_size_bytes 836 KB 836 KB +0.0%
t5 (seq2seq) num_nodes 176 176 +0.0%
whisper (speech-to-text) model_size_bytes 1008 KB 1008 KB +0.0%
whisper (speech-to-text) num_nodes 128 128 +0.0%

No performance regressions.

@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown

🏗️ Architecture Diff

Comparing 773c965f188ad8

Model Sub-model Changes Status
bert (feature-extraction) model 0
falcon model 0
gemma2 model 0
gemma4 (gemma4) decoder 0
gemma4 (gemma4) embedding 0
gemma4 (gemma4) vision_encoder 0
gemma4_text model 0
gpt2 model 0
llama model 0
llama (static-cache) model 0
mamba (ssm-text-generation) model 0
phi3 model 0
phi3 (static-cache) model 0
qwen model 0
qwen (static-cache) model 0
qwen2 model 0
qwen2 (static-cache) model 0
qwen2_moe model 0
qwen2_moe (static-cache) model 0
qwen3 model 0
qwen3 (static-cache) model 0
qwen3_5_moe (hybrid-text-generation) model 0
qwen3_5_text (hybrid-text-generation) model 0
qwen3_5_vl (hybrid-qwen-vl) decoder 0
qwen3_5_vl (hybrid-qwen-vl) embedding 0
qwen3_5_vl (hybrid-qwen-vl) vision_encoder 0
qwen3_moe model 0
qwen3_moe (static-cache) model 0
qwen3_next (hybrid-text-generation) model 0
t5 (seq2seq) decoder 0
t5 (seq2seq) encoder 0
whisper (speech-to-text) decoder 0
whisper (speech-to-text) encoder 0

No architecture changes detected.


Legend: ⚪ No change · 🔵 Minor (attrs/inits) · 🟡 Moderate (nodes added/removed) · 🔴 Major (interface changed)

@justinchuby
justinchuby force-pushed the justinchuby-plamo2-gguf branch from 64aa8fb to 7743ca4 Compare August 25, 2026 17:31
Base automatically changed from justinchuby-plamo2-gguf to main August 25, 2026 17:32
@justinchuby
justinchuby requested a review from a team August 25, 2026 17:32
justinchuby and others added 3 commits August 25, 2026 10:56
Implement exact mixed Mamba and attention execution with routed MoE schedules, strict GGUF tensor validation, compatible quantization preservation, and heterogeneous state handling. Add numerical parity, state-threading, expert-ordering, package round-trip, and failure-path coverage while keeping generic runtime packaging deferred.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Justin Chu <justinchuby@users.noreply.github.com>
Route Jamba Mamba projections through explicit float dequantization under the new fail-closed quantized loader while retaining MatMulNBits for attention, dense FFN, and routed expert projections. Update the pinned architecture verdict to match the reviewed policy.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Justin Chu <justinchuby@users.noreply.github.com>
Validate each Jamba Mamba ssm_a tensor before graph construction so non-finite or non-negative values cannot produce invalid A_log initializers. Cover the failure path in the synthetic GGUF importer test.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Justin Chu <justinchuby@users.noreply.github.com>
@justinchuby
justinchuby force-pushed the justinchuby-complete-jamba-gguf branch from d34bcd4 to f188ad8 Compare August 25, 2026 18:02
Copilot AI lite review requested due to automatic review settings August 25, 2026 18:02
@justinchuby
justinchuby merged commit 18b617a into main Aug 25, 2026
15 of 24 checks passed
@justinchuby
justinchuby deleted the justinchuby-complete-jamba-gguf branch August 25, 2026 18:08

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds end-to-end Jamba GGUF support spanning hybrid Mamba-1 + attention execution, routed-MoE routing/weight handling, and strict GGUF import validation, while explicitly deferring generic ORT GenAI packaging until heterogeneous-state metadata/schema work (#605).

Changes:

  • Implement Jamba hybrid graph behavior (multi-token prefill, heterogeneous conv/SSM + KV state threading, padding masking) and Jamba-specific MoE routing behavior.
  • Extend GGUF config/tensor mapping + builder to support routed experts (strict closure + shape validation) and selectively preserve/dequantize quantized MatMul roles.
  • Expand unit/integration-style tests and update generated GGUF support documentation to reflect the routed-MoE subset and new validation guarantees.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tests/synthetic_parity_test.py Exercises multi-token prefill in synthetic parity runs.
tests/build_graph_test.py Adds Jamba schedule/routing/state ABI assertions and fused-expert preprocessing tests.
src/mobius/tasks/_causal_lm.py Annotates Jamba packages with runtime deferral metadata for heterogeneous state.
src/mobius/tasks/_cache_utils.py Registers additional com.microsoft function bodies needed for Mamba-1 hybrid graphs.
src/mobius/models/jamba.py Implements Jamba hybrid layers, router semantics, state threading, and tied/quantized head handling.
src/mobius/integrations/gguf/_tensor_mapping.py Adds GGUF→HF tensor stems for routed expert tensors.
src/mobius/integrations/gguf/_config_mapping.py Derives exact routed-MoE schedule/fields from GGUF metadata + tensor presence.
src/mobius/integrations/gguf/_config_mapping_test.py Validates routed schedule derivation and updates Jamba dense config fixtures.
src/mobius/integrations/gguf/_builder.py Enforces Jamba tensor closure + shape checks and supports mixed quantized import policies.
src/mobius/integrations/gguf/_builder_test.py Adds tiny Jamba GGUF writer + tests for reorder/replay, expert ordering, and quantized role preservation.
src/mobius/integrations/gguf/_arch_registry.py Updates Jamba architecture spec reason text and quantized-import verdict.
src/mobius/integrations/gguf/_arch_registry_test.py Includes Jamba in importable architectures and adjusts quantized-verdict coverage expectations.
src/mobius/components/_ssm.py Extends Jamba selective scan path to multi-token execution via LinearAttention recurrence.
src/mobius/_configs/_base.py Updates JambaConfig schedule derivation, adds expert layer indices, and normalizes HF-derived defaults.
docs/api/build_from_gguf.md Updates generated support table + narrative to reflect routed-MoE Jamba support and deferred runtime packaging.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +407 to +411
if config.model_type == "jamba":
model.metadata_props["mobius.runtime_support"] = (
"Deferred: heterogeneous attention KV and Mamba recurrent state "
"discovery is tracked by https://github.com/onnxruntime/mobius#605"
)
Comment on lines 414 to 418
layer_types = getattr(config, "layer_types", None) or []
has_deltanet = "linear_attention" in layer_types
has_lightning = "lightning_attention" in layer_types
has_mamba = "mamba" in layer_types
has_mamba2 = "mamba2" in layer_types or isinstance(config, FalconH1Config)
Comment on lines +4855 to +4857
assert model.metadata_props["mobius.runtime_support"].endswith(
"onnxruntime/mobius#605"
)
justinchuby added a commit that referenced this pull request Aug 25, 2026
## Summary

- add exact `nemotron_h_moe` GGUF backbone import with mixed
Mamba2/attention/dense/MoE schedule reconstruction
- preserve sigmoid correction-bias routing, ReLU-squared stacked
experts, shared experts, and optional latent projections with strict
tensor closure
- require explicit dequantization for quantized sources and fail closed
on unsupported sidecars, MTP blocks, static cache, and generic task
overrides
- add Transformers parity, expert-order, float/Q4 import, ORT
mixed-state decode, package round-trip, malformed-input, registry, and
documentation coverage

## Validation

- `python -m pytest src/mobius/integrations/gguf -q --tb=short` — 2623
passed
- `python -m pytest tests/build_graph_test.py
tests/synthetic_parity_test.py -k nemotron_h -q --tb=short` — 11 passed,
6 skipped
- changed-file Ruff check and format check — passed
- two independent reviews completed; all findings fixed

The broad non-integration suite reached 7135 passing tests and exposed
two unrelated existing `glm_moe_dsa` shape-inference/checker failures.

Stacked on #613 (`justinchuby-complete-jamba-gguf`). ORT GenAI packaging
remains deferred to #605 because the released runtime schema does not
represent heterogeneous KV/convolution/recurrent state slots. Released
30B-A3B GGUFs also remain rejected before graph construction because
they append an unsupported combined attention+MoE MTP block.

---------

Signed-off-by: Justin Chu <justinchuby@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
justinchuby added a commit that referenced this pull request Aug 25, 2026
## Summary

- clean up still-valid typing, documentation, test robustness,
error-message,
  maintainability, and performance findings left by the GGUF PR stack
- preserve the behavioral fixes merged in #625-#632
- hash reused multi-GB GGUF sources once, at the final pre-publication
integrity
  gate, while retaining cheap identity checks around staging

Exact base: `2db9d33debdc254d879a51b14434c9a81c230f4f`

Exact head: `4541ed2bc9d2ab4227484510b4a85b2d9113eb25`

## Reconstructed original 17-item low-priority tranche

The persisted audit retained only the totals, so this list was
reconstructed
from the live threads and current source. All but the already-fixed #596
comment are addressed in this PR.

| PR | Comment | Disposition |
|---|---:|---|
| #550 | 3837144656 | Implemented: correct tuple return annotation |
| #552 | 3837389183 | Implemented: multichannel waveform shape docs |
| #559 | 3837716261 | Implemented: name-based cache assertions |
| #573 | 3854308350 | Implemented: one final GGUF hash, with integrity
regression coverage |
| #574 | 3854345521 | Implemented: `TensorRole \| None` typing |
| #574 | 3854345597 | Implemented: removed obsolete verdict filtering |
| #577 | 3854472859 | Implemented: documented SSM sequence length |
| #578 | 3843112613 | Implemented: documented F64 passthrough |
| #579 | 3854518332 | Implemented: generalized fused-projection error |
| #580 | 3854576300 | Implemented: removed brittle node counts |
| #583 | 3854681386 | Implemented: documented conditional draft outputs
|
| #587 | 3854816872 | Implemented: corrected MTP output contract docs |
| #596 | 3846110059 | Already fixed on base: unambiguous GQA bias
comment |
| #600 | 3855174281 | Implemented: metadata-count-only MTP error |
| #607 | 3855776048 | Implemented: stable route-field assertions |
| #607 | 3855776086 | Implemented: public tensor iterator |
| #609 | 3856486136 | Implemented: fail-closed LM-head comment |

## Current unresolved-thread disposition

This covers all 48 Copilot threads returned by the reproducible
#600-#630
query. The one human #623 thread is excluded.

| PR | Comment | Current-main disposition and evidence |
|---|---:|---|
| #600 | 3855174177 | Already fixed by #629: package cycle and
reserved-sidecar validation |
| #600 | 3855174238 | Already fixed by #629: explicit MTP sidecar
naming/loading |
| #600 | 3855174281 | Implemented here: error no longer invents an
observed block count |
| #602 | 3848155961 | Outside exact stack; already fixed: top-level
`expert_dtype` is classified before early return |
| #602 | 3848155983 | Outside exact stack; still-valid behavioral
block-quant validation, unchanged |
| #602 | 3848156000 | Outside exact stack; still-valid truncated-read
behavioral finding, unchanged |
| #602 | 3848156022 | Outside exact stack; still-valid descriptor
byte/dtype validation, unchanged |
| #602 | 3848156040 | Outside exact stack; still-valid expert-bank
payload validation, unchanged |
| #603 | 3855249765 | Already fixed by #630: runtime preflight preserves
shard sets |
| #603 | 3855249840 | Already fixed by #630: success output follows
durable runtime publication |
| #604 | 3855343082 | Implemented here: graph-only MTP persistence
distinguished from runtime rejection |
| #604 | 3855343131 | Already fixed by #630: runtime success messages
are atomic |
| #607 | 3855776001 | Implemented here: missing generation golden skips
before provenance read |
| #607 | 3855776048 | Implemented here: only stable route fields are
asserted |
| #607 | 3855776086 | Implemented here: tensor count uses
`tensor_items_raw()` |
| #608 | 3856079371 | Still-valid behavioral cache-symlink containment
finding; unchanged |
| #608 | 3856079415 | Still-valid behavioral lowercase-digest validation
finding; unchanged |
| #609 | 3856486136 | Implemented here: comment matches value-preserving
policy |
| #610 | 3855541683 | Already fixed by #628: Falcon bias precedence is
explicit |
| #610 | 3855541761 | Already fixed by #628: CTRL tiny config exercises
projection biases |
| #611 | 3856595840 | Implemented here: runtime test resolves the
distribution providing the module |
| #612 | 3855677383 | Already fixed by #625: supported-version
endianness detection |
| #612 | 3855677427 | Implemented here: shared `INT64_MAX` sentinel |
| #612 | 3855677460 | Implemented here: shared PLaMo2 width inference |
| #612 | 3855677486 | Implemented here: accepted PLaMo2 activation
spellings are explicit |
| #613 | 3855845678 | Implemented here: canonical issue URL |
| #613 | 3855845757 | Implemented here: Mamba-1 function-registration
docs |
| #613 | 3855845806 | Implemented here: test expects the canonical issue
URL |
| #614 | 3855988545 | Implemented here: removed stale Nemotron-H
divergence comments |
| #614 | 3855988597 | Already fixed by #628: zero-head geometry raises
actionable `ValueError` |
| #615 | 3856082290 | Already fixed by #626: dense GraniteHybrid bias
closure |
| #618 | 3856729330 | Implemented here: required routes filter ORT GenAI
evidence |
| #618 | 3856729409 | Implemented here: env-selected runtime version is
authoritative |
| #618 | 3856729490 | Stale/N/A: PR-description-only matrix claim;
repository workflow claims one pinned version |
| #618 | 3856729563 | Implemented here: schema tail restored to normal
indentation |
| #619 | 3856342484 | Already fixed on base: Kimi Linear uses
`/issues/605` |
| #619 | 3856342532 | Already fixed by #628: config rejects convolution
kernels below 2 |
| #619 | 3856342580 | Already fixed by #628: GGUF contract rejects
convolution kernels below 2 |
| #620 | 3855717041 | Already fixed by #627: tied LM-head-only
checkpoints are retained |
| #621 | 3856722324 | Already fixed by #628: Kimi-K3 required metadata
is complete |
| #623 | 3855931210 | N/A to current main: comment belongs to open,
unmerged #623 |
| #623 | 3855939302 | N/A to current main: comment belongs to open,
unmerged #623 |
| #623 | 3855939358 | N/A to current main: comment belongs to open,
unmerged #623 |
| #623 | 3855939394 | N/A to current main: comment belongs to open,
unmerged #623 |
| #624 | 3856777152 | Implemented here: runtime compatibility reuses the
emitted model type |
| #625 | 3857049733 | Implemented here: unsupported header reports both
endian candidates |
| #629 | 3857313182 | Newer post-audit behavioral sidecar-symlink
cleanup finding; unchanged |
| #629 | 3857313251 | Newer post-audit cross-platform path-safety
finding; unchanged |

## Validation

- affected GGUF/package/ORT GenAI/model/schema tests: 1,040 passed
- broad non-integration suite: 7,851 passed, 56 skipped, 1 subtest
passed
- generated GGUF docs checks: 7 passed
- initialized `lintrunner`; full lint/format passed
- GPT-5.6 Sol medium review: one integrity finding fixed; re-review
found no significant issues

Signed-off-by: Justin Chu <justinchuby@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants