Follow-up to this morning's field test of oMLX PR #3059 (DeepSeek-V4 hybrid ANE prefill). Fabian pushed two commits within a couple of hours of the reports and asked for a retest, so: same box (M3 Ultra 512 GB), same harness, fresh matrix at the new head.
642.1 vs 599.4 tok/s. Round 1: +6.4%.
Chunking fix (19fdb656) ships in the branch; chunks arrive at 4096.
Was 86. Two new attention-input stacks from the combined dispatch.
19fdb656 “Chunking fix” — engine startup now floors the scheduler's prefill_step_size at the compiled ANE sequence length, exactly the fix from round 1. The docs now name effective_step=4096 / chunk_tokens=4096 as the activation signal and note the ane_full_tiles counter isn't reliable for DeepSeek yet. Ships with 81 lines of new tests.6f848656 — combines wq_a, wkv, compressor, and sparse-indexer projections into one hybrid dispatch (previously only wq_b and the stacked indexer wq_b were offloaded). This is the “offload more projections” part.19fdb656Same protocol as round 1: built-in throughput benchmark (code_python, TG=128, greedy), 16k and 32k prompts, fresh server and wiped SSD cache dir per configuration, PR-default ANE settings. Fresh GPU baselines too, since the combined-dispatch commit touches the model patch.
| Checkpoint | MTP | Prompt | GPU PP | Hybrid PP | Change | Round 1 |
|---|---|---|---|---|---|---|
| 0731-oQ2.5e | Off | 16k | 599.4 | 642.1 | +7.1% | +6.4% |
| 0731-oQ2.5e | Off | 32k | 582.6 | 623.3 | +7.0% | +7.5% |
| 0731 fp8 | Off | 16k | 612.8 | 636.1 | +3.8% | +3.0% |
| 0731 fp8 | Off | 32k | 595.3 | 612.9 | +3.0% | +3.7% |
| 0731 fp8 | On | 16k | 595.2 | 617.0 | +3.7% | +3.4% |
| 0731 fp8 | On | 32k | 577.9 | 599.9 | +3.8% | +3.2% |
Round-1 column is this morning's run at f77c2ba with the equivalent chunk fix applied locally. GPU baselines are statistically unchanged between rounds (within 0.7 tok/s), so the combined dispatch did not regress the plain path.
Eagerly compiled 88 DeepSeek ANE procedures (43 shared experts, 2 attention-input stacks, 43 query projections, 21 with the indexer wq_b stacked in), and every ANE-on config shows effective_step=4096 with full 4096-token chunks. No local edits of any kind this round.onthehub97/omlx @ 19fdb656, custom kernels rebuilt from scratch after the branch update. Production oMLX (brew 0.6.3rc2, :8020) untouched; bench on :8022.Jundot/DeepSeek-V4-Flash-0731-oQ2.5e (public, non-MTP) and deepseek-ai/DeepSeek-V4-Flash-0731 (official fp8). Eight configs attempted; oQ2.5e MTP rows skipped (mtp_compatible: false, its -mtp variant is still gated on HF).Round 3 (profiled, new offloads regress here): oMLX PR #3059 Round 3.
Round 1 (final, read-only): oMLX PR #3059: DeepSeek-V4 ANE Prefill on the M3 Ultra. Sources: PR #3059, Fabian's retest request.