Skip to content

feat(xla): support Molmo sparse additive visual embeddings #870

Description

@inureyes

Parent and dependency

Problem

Molmo v1 does not replace placeholder embeddings like LLaVA. Its processor supplies image_input_idx; negative entries are skipped, and selected projected feature rows are added to the existing OLMo text embeddings at the remaining target positions. The vision path also includes multi-crop patch masks, selected ViT features, attention pooling, and a SwiGLU projector.

Scanning for an image token or replacing embedding rows would implement a different merge while still producing shape-valid inputs.

Goal

Support a pinned Molmo v1 checkpoint end to end on XLA with IREE vision execution, processor-supplied sparse additive merge, OLMo language prefill/decode, CLI, and continuous batching.

Required implementation

  • Reuse/share MolmoProcessor crop, patch, image_masks, and image_input_idx generation. Preserve index order and negative-sentinel semantics in an owned prepared payload.
  • Define static maxima/buckets for crop count, patches per crop, active feature rows, and expanded text length. Validate allocation arithmetic and reject overflow before tensor construction.
  • Emit the Molmo CLIP-style ViT, configured intermediate-layer selection/combination, patch-mask behavior, attention pooling, and SwiGLU projector through StableHLO/IREE with explicit weight-layout checks.
  • Keep mask semantics distinct: image patch coverage controls the vision encoder/pooler, while the language model uses its normal causal mask.
  • Implement sparse additive merge from (feature_row, target_position) pairs. Require target positions to be in range and unique unless the reference explicitly defines repeated accumulation; require feature rows to be in range and preserve their mapping after sentinel removal.
  • Cast projected features once to the post-scale text-embedding dtype, then add rather than replace. Document any OLMo embedding scaling at the feat(xla): add a prefill-from-embeddings StableHLO entry #858 boundary.
  • Include crop/patch config, selected vision layers, pool/projector config, merge mode, and OLMo text architecture in artifact compatibility identity.
  • Integrate filtered loading, capabilities, CLI/server batching, cancellation, and no-media behavior without retaining a duplicate full MLX decoder.

Non-goals

  • Molmo2 token-scanned merge or pooled-patch index contract.
  • Molmo Point coordinate output.
  • General arbitrary sparse writes supplied by API clients.

Validation

  • Pin one Molmo checkpoint/revision and compare processor crops/patches/masks/indices, selected vision states, pooled/projected features, sparse active pairs, merged embeddings, prefill logits/KV, and greedy tokens against MLX and an independent oracle.
  • Cover negative sentinels, non-contiguous target positions, one and multiple crops, masked patches, empty active features, invalid/duplicate indices, capacity overflow, no-image behavior, cancellation, and slot reuse.
  • Add a negative fixture that performs replacement instead of addition and prove the merged-embedding/logit oracle catches it.
  • Run CLI and mixed continuous-batch server tests on a production-relevant IREE target, plus test(xla): validate a LLaVA reference architecture end to end #862 and text-only OLMo gates.

Acceptance criteria

  • Processor-supplied image_input_idx is authoritative; no token scan substitutes for it.
  • Negative sentinels and feature-row/target-position correspondence are preserved exactly.
  • Vision/pooling/projector intermediates and sparse additive merge match both oracles.
  • Deterministic output is token-exact on the pinned fixture.
  • Index/capacity errors fail before native execution and do not affect other slots.
  • No full decoder duplication or silent MLX vision fallback remains.
  • Text-only OLMo behavior remains token-exact.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:inferenceGeneration, sampling, decoding (incl. speculative, DRY)area:modelsModel architectures, weights, loading, metadatapriority:lowLow prioritystatus:blockedBlocked by dependencies or other issuestype:enhancementNew features, capabilities, or significant additions

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions