Skip to content

feat(vision): add Inkling HMLP image support - #1535

Merged
inureyes merged 3 commits into
mainfrom
feature/issue-1327-inkling-hmlp-vision
Aug 31, 2026
Merged

inureyes merged 3 commits into
mainfrom
feature/issue-1327-inkling-hmlp-vision

Conversation

@inureyes

@inureyes inureyes commented Aug 31, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Add the exact Inkling HMLP scale planner, time-space folding graph, dense and affine-quantized weight loading, and load-time tensor validation.
  • Add the reference 40x40 RGB tiler, optional Lanczos resize semantics, two-slot image duplication, per-image tile counts, and ordered image-placeholder expansion.
  • Integrate an Inkling VLM wrapper and detector into the shared CLI and OpenAI-compatible server image runtime while preserving the text-only loader when visual weights are absent.
  • Document image support and the current real-checkpoint validation limitation.

Review findings

  • Reject malformed visual geometry, projection tensors, RMS-normalization tensors, placeholder cardinality, and text widths outside the MLX shape range before inference.
  • Bound unindexed safetensors header inspection to 128 MiB and inspect only the header when detecting visual weights.
  • Keep video, audio, feature caching, chunked prefill, and tensor-parallel vision execution outside this change.

Validation

  • cargo test --lib inkling --profile test-fast --features metal,accelerate -- --test-threads=1 (40 passed)
  • cargo check --lib --features metal,accelerate
  • cargo clippy -p mlxcel --lib --tests -- -D warnings
  • cargo fmt --all -- --check
  • git diff --check

The public 153.5 GB Inkling-Small affine MLX checkpoint and the roughly 170.7 GB native NVFP4 checkpoint were unavailable on the validation host, so real image-answer quality and checkpoint parity were not claimed. The implementation instead uses deterministic reference tests for HMLP planning, fold order, preprocessing, feature shape, prompt expansion, loading, and detection.

Closes #1327

@inureyes inureyes added status:review Under review type:enhancement New features, capabilities, or significant additions priority:medium Medium priority area:models Model architectures, weights, loading, metadata area:inference Generation, sampling, decoding (incl. speculative, DRY) area:cli Command-line interface / CLI flags modelsize:xlarge 4-bit checkpoint > 100GB; exceeds a 128GB dev box, needs bigger hardware modeltype:vlm Vision-language model arch:moe Sparse mixture-of-experts decoder labels Aug 31, 2026
@inureyes
inureyes merged commit 696fe47 into main Aug 31, 2026
12 checks passed
@inureyes inureyes added status:done Completed and removed status:review Under review labels Aug 31, 2026
@inureyes
inureyes deleted the feature/issue-1327-inkling-hmlp-vision branch August 31, 2026 05:52
@inureyes inureyes self-assigned this Aug 31, 2026
inureyes added a commit that referenced this pull request Aug 31, 2026
## Summary

- add a native B=1 Inkling chained-MTP drafter that reuses the target decoder-layer implementation, target embedding/final norm/LM head, and exact KV plus four-convolution cache snapshots
- capture pre-norm target hidden states, restore the pre-verify target snapshot, and replay the accepted prefix so recurrent convolution and attention state match non-speculative decoding exactly
- detect actual `model.mtp.layers.*` tensors, load only indexed matching or unindexed auxiliary safetensors, register both standalone Inkling and public-checkpoint `InklingVLM` targets across offline, legacy burst, and tick-cooperative server lifecycles, and derive the default verify width as `num_nextn_predict_layers + 2`
- route text-only speculative requests on `InklingVLM` through `vlm.text` while retaining the classic HMLP prepared-embedding prefill path for image requests
- add safe repeatable downloader `--include` globs, clear standalone-head diagnostics, user documentation, deterministic tiny-model parity/rollback and prepared-image-prefill coverage, and source-scanned dispatch coverage
- track English and Korean technical reports under `TECHNICAL_REPORTS/`

## Validation

- `cargo check --lib`
- `cargo test -p mlxcel-core inkling_mtp --lib` (7 passed)
- `cargo test --lib inkling -- --test-threads=1` after reconciling PR #1535 and the InklingVLM hardening (48 passed)
- `cargo test --lib every_mtp_dispatch_site_covers_every_capable_variant`
- `cargo test --lib burst_declined_for_vlm_embeddings`
- `cargo test --lib resolve_draft_block_size_derives_inkling_default_from_the_mtp_layer_count`
- `cargo test --lib isolated_inkling_mtp_download_is_not_a_standalone_model`
- `cargo test --lib include_globs_select_only_safe_allow_list_files`
- `cargo clippy -p mlxcel-core --lib -- -D warnings`
- `cargo clippy --lib -- -D warnings`
- `cargo clippy --lib --tests -- -D warnings`
- `cargo fmt --all -- --check`
- `git diff --check`

The orchestrated focused-validation lane did not run the broad workspace Metal/Accelerate test or all-target clippy commands. The public 153.5 GB Inkling-Small target, 4.46 GB MTP shard, and the 0.6B checkpoint were not present, so real-checkpoint greedy parity, acceptance length, and throughput remain unmeasured; deterministic tiny target and drafter tests cover the same snapshot/replay and chained-forward contracts without making performance claims.

## Review findings

Final correctness and security review fixed three silent integration gaps before submission: the public repository keeps `mtp.safetensors` outside its target-only index; the tick-cooperative scheduler repeats the adapter dispatch separately from the legacy burst; and public checkpoints with vision weights load as `LoadedModel::InklingVLM`, which the initial text-only variant gates omitted. The loader now inspects unindexed auxiliary safetensors without opening indexed target shards, every B=1 lifecycle covers both Inkling variants, the wrapper adapter delegates speculative text decode to `vlm.text`, and the multimodal gate preserves classic HMLP prepared-embedding prefill. User glob filters remain subordinate to the existing safe path/type allow-list, index-selected shard names retain path-traversal validation, and the avoidable raw-pointer concatenate was removed.

Closes #1315
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch:moe Sparse mixture-of-experts decoder area:cli Command-line interface / CLI flags area:inference Generation, sampling, decoding (incl. speculative, DRY) area:models Model architectures, weights, loading, metadata modelsize:xlarge 4-bit checkpoint > 100GB; exceeds a 128GB dev box, needs bigger hardware modeltype:vlm Vision-language model priority:medium Medium priority status:done Completed type:enhancement New features, capabilities, or significant additions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(vision): add the Inkling HMLP vision tower and 40x40 temporal-pair image ingestion

1 participant