BUG-2026-09-28-vllm-mimo-dflash-parked.md 4.2 KB

MiMo-V2.6-Flash-MOPD on vLLM+r39 — the 2026-09-28 experiment (PARKED → RESOLVED)

UPDATE 2026-09-28 ~19:30, 4 hours later — RESOLVED by the ecosystem, not by us. The four walls below were exactly the gap between our r39 pin (last merge 2026-09-17) and local-inference-lab/vllm@dev/karmic-kraken (2026-09-22 series: MiMo aux loading, block-outermost KV layouts for mixed page sizes, b12x non-causal attention, eagle3 language-model unwrap — plus lazy mxfp8 guards). The lane now runs eugr/spark-vllm-b12x:latest (the arm64 nightly CI-built from that branch, v0.1.dev21546+g502d6cb5a) with the lab's own serve-mimo26-flash.sh flag set mirrored (b12x linear/moe, block 128, BF16 KV). Boot reached the wire first try: KV pool 8.57M tokens, DFlash graphs captured on B12X, API serving mimo-v2.6-flash. Our wrapper image (docker-images/mimo26-spark-vllm) and its two patches are RETIRED — upstream shipped the equivalents; delete the dir when the lane stabilizes.

Lane: recipes/mimo26-flash-mopd-4x-vllm + image docker-images/mimo26-spark-vllm (thin FROM wrapper on jovian-judgement:r39-glm53, two anchor patches) — historical, kept for the record.

Verdict for r39: dead end. Every layer of the vLLM DFlash path had to be forced onto a fork that was qualified for GLM-5.3, not MiMo, and each boot revealed one more incompatibility. None were ours to fix cleanly:

  1. EAGLE3 hook vs Omni wrapper — MiMo-V2.6 resolves to MiMoV2OmniForCausalLM (mm wrapper); set_eagle3_aux_hidden_state_layers isinstance-checks the OUTER class and raises. Fixable (and fixed) with a language-model fallback patch; the protocol's own method unwraps the same way. Patched, works: "Eagle3 interface resolved on MiMoV2FlashForCausalLM inside MiMoV2OmniForCausalLM", aux layers (1,12,24,36,48) taken from the draft config.
  2. B12X rejects non-causal attention — DFlash's block-diffusion draft runs non-causal; b12x in r39 declares it unsupported. Workaround: draft on TRITON_ATTN (target keeps B12X). Works, draft loads (2.7 GB, mask embedding loaded).
  3. ModelOptMxFp8LinearMethod ImportError — qwen3_dflash.py hard-imports a class r39's modelopt doesn't ship (fork predates it). Patched to a None-tolerant getattr (bf16 draft unaffected).
  4. KV-layout wall (fatal): during cudagraph-memory profiling, validate_kv_cache_layout refuses: "KV cache layout LBNHC cannot express this model's mixed page sizes ([131072, 163840]); set VLLM_KV_CACHE_LAYOUT=BLHNC". The hint is env-only, but BLHNC is a backend-declared-layout question — b12x in r39 declares LBNHC only. This is the architecture mismatch the whole experiment kept routing around: the MiMo hybrid stack (SWA-128 + 9 GA layers, different page sizes per group) needs a vLLM/b12x generation qualified for it; r39 is not.

External intel (2026-09-28)

  • local-inference-lab/lil-catalog MiMo DFlash entry: "implemented; runtime qualification unverified" — they never ran it either.
  • madeby561/vllm mimo-v26-flash-b12x-20260923-rc4: MiMo RL + b12x + FP8 KV + DFlash-7, with adaptive verification — but linux/amd64 only (RTX 6000 Pro). Not runnable here; its compose is a good flag corpus (enable_adaptive_verification, kv_cache_dtype: fp8 for target+draft, --max-num-scheduled-tokens 2048, prefill-compute-share, BLHNC-class layouts would all apply if a Spark-native equivalent appears).
  • eugr/spark-vllm-b12x publishes arm64 nightlies daily (latest 2026-09-28) — first candidate when someone asks whether MiMo landed there.

Status now (2026-09-28 late)

  1. DONE: lane switched to eugr/spark-vllm-b12x:latest nightly; boot is clean. Wrapper image + patches retired (upstream equivalents shipped).
  2. Open: serial quality bench (vllm-kk-nightly, seed 42 hardmode+perf, conc 1,2, tokenizer /tmp/mimo-tok) vs sglang anchor 168/184 (91/100); then the d0→256K slope sweep (sglang: 77.6 → 23.5 t/s) to see whether b12x split-KV fixes the GA long-context cliff.
  3. sglang 4x (mimo26-flash-mopd-4x) is the production lane in the meantime; the FROZEN_KV_MTP experiment is the next sglang-side lever for the long-context cliff.