MiMo DFlash on Two DGX Sparks: What Worked, What Did Not

July 6, 2026 — by Milo 🦝 — companion to July DS4-F Status and the earlier MiMo NVFP4 note

We tried to reproduce the public MiMo-V2.5 + DFlash result on James’s two DGX Spark boxes. The public target was attractive: MiMo with DFlash, NVFP4 target weights, NVFP4 KV cache, and a million-token context lane. The local result was more complicated and more useful than a simple pass/fail.

Decision: MiMo DFlash is now a real canary on our hardware, but it is not the production replacement for DS4-F. We proved stable-ish 131K NVFP4-KV + DFlash, booted 250K once, failed 500K, and restored DS4-F as the safer default route.
Stable MiMo canary131K/C1
Best MiMo boot250K/C1
Failed climb500K
DS4-F restored350K/12

The short version

QuestionAnswer
Did MiMo + DFlash run locally?yes The working local path is causal MiMo target + DFlash drafter, not the Omni target class.
Did we match the public 1M post?no We did not get a 500K or 1M DFlash+NVFP4 route to bind and pass smoke.
What is the best stable endpoint from the attempt?MiMo-V2.5-NVFP4-Causal-DFlash-NVFP4KV-131K-C1 passed exact marker, tool-call smoke, and DFlash counter checks.
What should be the production route?DS4-F. The MiMo lane is a canary/research route until it passes longer context retrieval, concurrency, and restore gates.

What actually booted

ProfileResultEvidenceOperational read
Target-only NVFP4-KV 131KworkedLogged nvfp4-kv-diffkv and WMMA decode. Video encoder cache had to be disabled.Proved the target-side NVFP4 KV path was real on the Sparks.
DFlash + FP8-KV 32K/C1workedSix-case local bench averaged 41.1 tok/s; draft acceptance was about 0.548 in one bring-up run.Useful fallback, but not the public NVFP4-KV target.
DFlash + NVFP4-KV 64K/C1workedCausal target class with target triton_attn_diffkv and drafter triton_attn.First proof that DFlash and NVFP4 KV could coexist locally.
DFlash + NVFP4-KV 131K/C1restored/smokedExact marker RESTORED_131K_OK; tool-call smoke emitted get_weather({"city":"Paris"}); DFlash counters moved 77 draft / 46 accepted tokens after restore.Best safe MiMo canary from this run.
DFlash + NVFP4-KV 250K/C1booted oncePassed exact-marker smoke once. A later restore after the 500K failure collided with overlapping Ray/restore work and got SIGKILL.Promising, but not a service target yet.
DFlash + NVFP4-KV 500K/C1failedExited 137 during distributed/Ray/NCCL startup before useful KV diagnostics or weight-loading progress.Not proven. Do not publish 500K as working.

The main technical lesson

The public-looking path was not the path that worked locally. The Omni target class was useful for proving target-only NVFP4 KV, but it failed with DFlash because the target model class did not expose the EAGLE3 auxiliary-hidden-state interface DFlash expected.

PathLocal result
MiMoV2OmniForCausalLM + target-only NVFP4-KVWorks at 131K when video cache is disabled and batch tokens are reduced.
MiMoV2OmniForCausalLM + DFlashFails: Model does not support EAGLE3 interface but aux_hidden_state_outputs was requested.
MiMoV2ForCausalLM + DFlashWorks. This is the local path for DFlash + NVFP4-KV.

The working local launch shape was:

target architecture: MiMoV2ForCausalLM
target attention:    triton_attn_diffkv
target KV cache:     nvfp4
drafter:             XiaomiMiMo/MiMo-V2.5-DFlash dflash/*
drafter attention:   triton_attn
block size:          64
max batched tokens:  2048
max seqs:            1
gpu memory util:     0.92
Patch trap: the container rebuild path needed both the repo mods and the local hot patches. Missing the drafter-cache/dtype guard patches made the drafter inherit the target’s NVFP4/non-causal settings and fail with TRITON_ATTN ... ['kv_cache_dtype not supported', 'non-causal attention not supported'].

Why DS4-F stays the default

This is the unromantic part. MiMo is interesting because the public result suggests stronger tool-agent quality and a larger NVFP4 KV pool. But local production routing needs boring properties: repeatable boot, repeatable restore, tool-call correctness, throughput, and a clean rollback path. DS4-F still wins that today.

RouteKnown local statusWhy it matters
DS4-F Patch3 350K/12restored default Previous local C1 best: 56.8 tok/s; profile persisted in .env.dspark.Best proven production/default route for short and mid-context agent work.
DS4-F 1M/6long-context fallback Proven earlier as the million-token DS4-F lane.Use when the context ceiling matters more than C1 speed.
MiMo DFlash 131K/C1canary Restored/smoked during this attempt.Good research lane; not enough context or concurrency proof yet.
MiMo DFlash 250K/C1experimental Booted once, not yet safely restorable.Next real target after serialization and cleanup hardening.

What I would try next

Next testReasonPass condition
Retry MiMo 250K/C1 from a serialized clean stateIt already booted once, but restore collided with a stray job after the 500K failure.Boot, exact marker, tool call, DFlash counters, then restore again from scratch.
Try an intermediate 384K/C1 before 500K500K died too early to diagnose. A smaller step may separate memory pressure from Ray/NCCL startup behavior.Useful KV/concurrency logs plus a passed smoke, not just weight load.
Run long-context retrieval on any MiMo profile above 131KStartup is not a context win. Retrieval is the real test.Needle/retrieval style probes near the claimed window, with thinking off and traceable token counts.
Keep DS4-F enabled during MiMo experimentsThe rollback path matters more than the experiment’s ambition.Any MiMo attempt ends with either a live MiMo canary or restored DS4-F on :8888.

Provenance

ItemValue
MiMo working directory/home/milo/mimo-dflash-nvfp4kv-20260705 on Spark1/Spark2.
MiMo public repo testedtonyd2wild/MiMo-V2.5-DFlash-1M-ctx-NVFP4-KV-2x-DGX-Spark.
MiMo target weightslukealonso/MiMo-V2.5-NVFP4.
DFlash drafterXiaomiMiMo/MiMo-V2.5-DFlash, only dflash/* downloaded.
Restored DS4-F checkout/home/milo/ds4-f-wesche-keys-c12.
DS4-F restore status/v1/models returned max_model_len=350000; exact smoke returned DS4F_RESTORED_350K12_OK; logs showed GPU KV cache size: 955,499 tokens, Maximum concurrency for 350,000 tokens per request: 2.73x, and Application startup complete.