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

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

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

Verdict: dead end for now. 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.

How to reopen

  1. Rebase the wrapper onto a MiMo-qualified vLLM (eugr nightly that carries MiMo + b12x, or a new lab rev with upstream's MiMo/b12x reconciliation — the upstream PR #46104 lineage) and retry the same recipe. The two patches (eagle3-inner + mxfp8-optional) stay valid until that vLLM ships the equivalents; then delete them.
  2. If the new stack boots, run the same long-context slope sweep used for sglang (~/.cache/sm121/bench/slope-28x: 77.6 → 23.5 t/s d0→256K) and the serial quality bench (anchor: sglang 168/184, 91/100).
  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.