oMLX 0.7.4.dev1
This is a development release. Please report any bugs through GitHub Issues. If you need a stable release, please use oMLX 0.7.3.
oMLX 0.7.4.dev1 lets a second Mac with a fast GPU speed up prefill for a model that only fits on your big Mac, and makes DeepSeek V4.1 and Qwen3.8 Flash-Next faster.
Download: macOS 26 / 27 | macOS 15 Sequoia
Prefill Accelerator
Big MoE models fit on a Mac with lots of memory like an M3 Ultra 512GB, but long prompts prefill slowly there. Pair it with a Mac that has a faster GPU, like an M5 Max, and the fast Mac runs the first layers of each prompt chunk while the big Mac runs the rest, decodes and keeps the KV cache. Decode speed stays the same, and Thunderbolt or 5GbE is enough, no RDMA needed (#5065).
Prefill tok/s on a 64K prompt, M3 Ultra 512GB alone and with an M5 Max as the accelerator.
| Model | M3 Ultra alone | + M5 Max 128GB | + M5 Max 64GB |
|---|---|---|---|
| DeepSeek V4.1 Flash | 1,060 | 3,123 (+195%) | 1,466 (+38%) |
| Qwen3.8 Flash-Next | 1,309 | 3,666 (+180%) | 2,859 (+118%) |
| GLM-5.3 Flash | 540 | 1,388 (+157%) | 740 (+37%) |
| MiniMax M3.1 | 297 | 569 (+92%) | 386 (+30%) |
To set it up, turn on Global Settings > Advanced > Enable Distributed Inference on both Macs, pair them in the Cluster tab and choose Prefill Accelerator, then pick the Mac under Acceleration in the model's settings (guide).
Faster DeepSeek V4.1
Prefill now keeps a bounded buffer pool through the layer loop instead of handing every buffer back to Metal after each layer, which makes it 43-48% faster on an M5 Ultra (@junmo-kim in #5031). On M5, oQ4e builds with MXFP4 experts and MXFP8 dense weights also run INT8 Activation Prefill (#5058), and the first decode on a fresh shader cache no longer waits on hundreds of kernel compiles (@junmo-kim in #5025).
| DeepSeek V4.1 Flash | Change | Hardware |
|---|---|---|
| oQ2e-mtp, 32K prompt | Prefill 2,631 -> 3,779 tok/s (+44%) | M5 Ultra |
| oQ2e-mtp, 256K prompt | Prefill 2,604 -> 3,718 tok/s (+43%) | M5 Ultra |
| oQ4e INT8 Activation Prefill, 16K prompt (8-layer slice) | Prefill time 1,580 -> 1,208 ms (-24%) | M5 Max |
| First 600-token decode, cold shader cache | 12.4 -> 45.8 tok/s (+269%) | M5 Ultra |
Faster Qwen3.8 Flash-Next
FP16 Qwen3.8 Flash-Next checkpoints now run the fused hyper-connection and GDN kernels that only BF16 used before, and their greedy output with Lightning MTP on matches MTP off (#5028 with @qoli). On 128 GB Macs, models like Qwen3.8 Flash-Next, GLM-5.3 and DeepSeek V4.1 keep wide prefill chunks under memory pressure, so back-to-back long prompts stop slowing down (@yohann-bearzi in #4902). Decode after long prompts is also 3-5% faster on M5 Max (@yohann-bearzi in #4901).
| Qwen3.8 Flash-Next | Change | Hardware |
|---|---|---|
| oQ2.5e fp16, MTP off, 32K | Decode 38.9 -> 63.0 tok/s (+62%) | M3 Ultra |
| oQ2.5e fp16, MTP on, 4K | Decode 67.8 -> 89.9 tok/s (+33%) | M3 Ultra |
| oQ2.5e fp16, MTP off, 16K | Decode 25.2 -> 31.1 tok/s (+23%) | M2 Max |
| oQ4e, back-to-back 34.5K prompts | Slowest prompt 90.7 -> 13.1 s (-86%) | M5 Max 128GB |
New Features and Improvements
- Integrations:
omlx launch codex,omlx launch codex_appandomlx launch copilothand the agent every chat model on the server, so/modelswitches between oMLX models without relaunching. Each model keeps its own context window, image support and reasoning effort levels (#5026 with @scaryrawr, @scaryrawr in #5066). - Models: Ming-3.0-tts and Ming-3.0 Tiny load as TTS models with a compiled decode loop and fused DiT kernels. Real-time factor on an M5 Max goes 0.210 -> 0.101 (-52%), and 0.798 -> 0.258 (-68%) for Tiny. Voice clones use the checkpoint's CAM++ speaker embedding, and
/v1/audio/voiceslists the built-in voices (#5029). LFM3 models apply RoPE in one launch (b73ee56 with @alan13367). - Batched decode: 6-row 8-bit layers read their weights once, so Qwen3.8-27B oQ8e with 6 requests goes 62.2 -> 72.4 tok/s (+16%) on an M5 Max (b5c7793 with @yohann-bearzi).
- macOS app: Ask AI can answer with an oMLX server on another Mac, with a Test connection button (@ianderse in #5050). The model library checks Hugging Face models for updates and shows the changed files before updating (@ngutech21 in #5046). German now covers the whole app (@christianschmidt in #5014, #5048), and Japanese and Korean counts use 万 and 만 units like the web console (@LXD-8 in #4980).
- Web UI: German for the admin dashboard (@alexandergreil in #4673), and chat sidebar items are more compact, with rename and delete in a ... menu (ce43187).
- API:
/v1/messagescontinues a trailing assistant message as an Anthropic prefill, likepartialon chat completions (@yanzhaohui1999 in #4995). The first plain-text request after a model load no longer builds the grammar compiler, which saves 0.31-0.37 s (ae659d3 with @LXD-8).
Bug Fixes
- Parallel tool results reach the chat template in the order of the tool calls on
/v1/messagesand/v1/chat/completions, so Qwen no longer pairs a result with the wrong call (@yanzhaohui1999 in #5012, 008987a, #4999). - Cluster: agent conversations reuse the prompt cache across tool turns instead of prefilling the whole conversation again. Cached tokens on the fifth turn of a tool loop go 743 -> 9,266 (#5062, #3062).
- A long VLM prompt is tokenized once and off the event loop, so it no longer stalls other streams. On a 119K-token prompt, response headers arrive in 162 ms instead of 320 ms (@ska2704 in #5057, #5005).
- GLM-5.3 gets earlier reasoning as a
reasoning_contentfield in history, as its chat template expects (3b2c355, #5006). - Model Settings shows the saved
reasoning_effortwhen it opens (debf5f7, #5053). - DeepSeek V4.1 fused decode no longer keeps a small index array for every decode position (0de3b0b).
- A memory refusal says how much oMLX itself uses, so the rest of the gap reads as other apps' memory (e47101f).
- Attachments are accepted by their extension when the browser reports an unusual MIME type, so Firefox can attach
.mdfiles (@HamedShams in #4887, #3844). - Splash: an unreadable directory such as
/usr/local/binwith mode 0700 no longer makes/admin/api/modelsreturn 500 (@begcdn in #5018, #5007). - Web UI: the Claude Code command on the status page masks the API key while the copy button still copies the full command, double-clicking Save sends one request (@billythegod in #5055), and the chat input shows a focus ring only with enhanced readability (e493d10, #5054).
- macOS app: Restart Server from the web dashboard no longer leaves the app without a server (@cgs4github in #5070, #5069), a slow update download keeps going and resumes after a stall instead of stopping after an hour (@HamedShams in #4890, #4199), and the menubar icon redraws only when it changes, so WindowServer no longer logs constraint errors on every stats poll on macOS 26 and 27 (f524399, #5049).
Upgrade Notes
- Source installs: run
make installafter updating. transformers up to 5.21 is allowed (#5004), and ddgs moves to 9.16.1 (#5002). - Prefill Accelerator: both Macs need the same oMLX version (#5065).
- Integrations:
omlx launch codexandomlx launch codex_appneed Codex 0.148 or newer (#5026).omlx launch copilotwrites the oMLX provider into Copilot'sproviders.jsoninstead of environment variables and needs Copilot CLI 1.0.83 or newer (#5066). - Cluster: existing deployments pick up the new prompt cache slot count when they are activated again (#5062).
- DeepSeek V4.1 on M5: oQ4e builds with INT8 Activation Prefill on now take the INT8 path, so greedy output can differ at near-ties (#5058).
- API: a trailing assistant message on
/v1/messagesis now continued instead of starting a new turn (#4995). An attachment with a supported extension is accepted whatever MIME type the client reports, except spreadsheets (#4887).
New Contributors
@alexandergreil in #4673, @christianschmidt in #5014, @begcdn in #5018, @ianderse in #5050, @ska2704 in #5057.


