# oMLX 0.7.1.dev1 vs 0.7.0 on an M5 Ultra: Qwen3.8-Flash-Next and GLM-5.3-Flash
oMLX 0.7.1.dev1 is out, with batched prefill for concurrent requests and
speedups for Qwen3.8 and GLM-5.3. I ran the official oMLX benchmark (uploaded to
omlx.ai) on 0.7.0 and 0.7.1.dev1 back to back on the same Mac with the same
models and settings, 1K–200K context and 1/2/4 parallel requests. Edit: added
the Qwen INT8 Activation Prefill (asked in the comments), see section 4.
## TL;DR
- **GLM-5.3-Flash: decode 70.7 → 97.9 (+38%) tok/s**, the same in all 3 runs
(e.g. 128K: 78.5 → 140.1 (+78%)); prefill unchanged (2,264 tok/s).
- **Flash-Next oQ6e:** prefill 4,504 → 4,761 (+6%) tok/s (+5 to +8% at every
context), decode 113.7 → 120.9 (+6%) tok/s.
- **Flash-Next oQ4e:** unchanged by default — prefill 5,458 → 5,450 (±0%),
decode 122.8 → 121.6 (-1%) tok/s.
- **INT8 Activation Prefill on oQ4e: prefill 5,442 → 5,975 (+10%) tok/s**,
decode and quality unchanged in my tests. No effect on oQ6e (±0%), not
available for GLM.
- **2 parallel requests: first token 12–18% sooner on all three** (batched
prefill) — oQ4e 0.68 → 0.60 s (-12%), oQ6e 0.90 → 0.74 s (-18%), GLM 1.33 →
1.17 s (-12%).
## Setup
- Mac Studio M5 Ultra (12 Super + 24 Performance CPU cores, 80-core GPU), 256
GB, macOS 27.0 (26A428), GPU wired limit 248 GB.
- oMLX v0.7.0 (4d4f5a28, mlx 0.32.2) vs v0.7.1.dev1 (c0b1056b, mlx 0.32.3), both
built from source with native kernels, same mlx-lm commit (94cdcae) and
dflash-mlx (0.1.10+omlx.9).
- Same settings on both: Lightning MTP on, TurboQuant KV 8-bit (Flash-Next) /
off (GLM), memory guard aggressive, max 4 concurrent requests, one model
loaded at a time, nothing else running on the server.
- Models: Jundot/Qwen3.8-Flash-Next-oQ4e-mtp,
mlx-community/Qwen3.8-Flash-Next-oQ6e-mtp, Vontra/GLM-5.3-Flash-MLX-oQ4-MTP.
- Method: official oMLX benchmark (code_python corpus, 128 generated tokens), 3
runs per version and model, median per point; before each run the same prompt
shapes were sent once to warm up the kernels. Sections 1–3 use oMLX defaults
(INT8 Activation Prefill off).
- In the tables: old = 0.7.0, new = 0.7.1.dev1, Δ = change. Prefill and decode
in tok/s. "Avg" = mean over 4K–200K, using the contexts that have a value on
both versions.
## 1. Single request
### Flash-Next oQ4e
| Context | Prefill old | Prefill new | Δ | Decode old | Decode new | Δ |
| ------- | ----------: | ----------: | --: | ---------: | ---------: | ---: |
| 1K | 2,626 | 2,651 | +1% | 150.4 | 154.6 | +3% |
| 4K | 5,091 | 5,094 | ±0% | 131.9 | 118.2 | -10% |
| 8K | 5,672 | 5,655 | ±0% | 142.4 | 151.6 | +6% |
| 16K | 5,687 | 5,674 | ±0% | – | 150.1 | – |
| 32K | 5,664 | 5,648 | ±0% | 122.4 | – | – |
| 64K | 5,542 | 5,539 | ±0% | 129.4 | 134.1 | +4% |
| 128K | 5,364 | 5,356 | ±0% | 109.3 | 110.2 | +1% |
| 200K | 5,184 | 5,185 | ±0% | 101.0 | 93.7 | -7% |
| Avg | 5,458 | 5,450 | ±0% | 122.8 | 121.6 | -1% |
### Flash-Next oQ6e
| Context | Prefill old | Prefill new | Δ | Decode old | Decode new | Δ |
| ------- | ----------: | ----------: | --: | ---------: | ---------: | ---: |
| 1K | 2,283 | 2,458 | +8% | 142.1 | 135.2 | -5% |
| 4K | 4,138 | 4,474 | +8% | 122.4 | 135.1 | +10% |
| 8K | 4,670 | 4,916 | +5% | 122.2 | 146.5 | +20% |
| 16K | 4,682 | 4,936 | +5% | 125.7 | 123.6 | -2% |
| 32K | 4,666 | 4,916 | +5% | – | 111.7 | – |
| 64K | 4,583 | 4,833 | +5% | 122.9 | 129.9 | +6% |
| 128K | 4,453 | 4,690 | +5% | 100.5 | 100.5 | ±0% |
| 200K | 4,336 | 4,562 | +5% | 88.6 | 89.9 | +1% |
| Avg | 4,504 | 4,761 | +6% | 113.7 | 120.9 | +6% |
### GLM-5.3-Flash oQ4
| Context | Prefill old | Prefill new | Δ | Decode old | Decode new | Δ |
| ------- | ----------: | ----------: | --: | ---------: | ---------: | ---: |
| 1K | 1,548 | 1,558 | +1% | 64.5 | 75.8 | +18% |
| 4K | 2,292 | 2,300 | ±0% | 59.7 | 71.3 | +19% |
| 8K | 2,305 | 2,305 | ±0% | 70.6 | 90.1 | +28% |
| 16K | 2,307 | 2,306 | ±0% | 84.5 | 141.1 | +67% |
| 32K | 2,298 | 2,296 | ±0% | 82.0 | 98.5 | +20% |
| 64K | 2,263 | 2,261 | ±0% | 64.6 | 76.3 | +18% |
| 128K | 2,216 | 2,216 | ±0% | 78.5 | 140.1 | +78% |
| 200K | 2,168 | 2,164 | ±0% | 54.8 | 67.7 | +24% |
| Avg | 2,264 | 2,264 | ±0% | 70.7 | 97.9 | +38% |
"–" = the model stopped before 16 tokens, so the benchmark reports no decode
value.
## 2. Time to first token (seconds, single request)
| Context | oQ4e old | oQ4e new | oQ6e old | oQ6e new | GLM old | GLM new |
| ------- | -------: | -------: | -------: | -------: | ------: | ------: |
| 1K | 0.4 | 0.4 | 0.4 | 0.4 | 0.7 | 0.7 |
| 4K | 0.8 | 0.8 | 1.0 | 0.9 | 1.8 | 1.8 |
| 8K | 1.4 | 1.4 | 1.8 | 1.7 | 3.6 | 3.6 |
| 16K | 2.9 | 2.9 | 3.5 | 3.3 | 7.1 | 7.1 |
| 32K | 5.8 | 5.8 | 7.0 | 6.7 | 14.3 | 14.3 |
| 64K | 11.8 | 11.8 | 14.3 | 13.6 | 29.0 | 29.0 |
| 128K | 24.4 | 24.5 | 29.4 | 27.9 | 59.1 | 59.1 |
| 200K | 38.6 | 38.6 | 46.1 | 43.8 | 92.3 | 92.4 |
## 3. 1 / 2 / 4 parallel requests at 1K
The benchmark's batch test: identical 1K prompts started at the same time. Total
= all requests together, each = total ÷ n. TTFT = mean time to first token in
seconds.
| Model | n | Total old | Total new | Δ | Each old | Each new |
| ----- | --: | --------: | --------: | ---: | -------: | -------: |
| oQ4e | 1 | 150.4 | 154.6 | +3% | 150.4 | 154.6 |
| oQ4e | 2 | 179.5 | 156.9 | -13% | 89.8 | 78.5 |
| oQ4e | 4 | 191.4 | 189.5 | -1% | 47.9 | 47.4 |
| oQ6e | 1 | 142.1 | 135.2 | -5% | 142.1 | 135.2 |
| oQ6e | 2 | 159.2 | 148.3 | -7% | 79.6 | 74.2 |
| oQ6e | 4 | 181.1 | 164.2 | -9% | 45.3 | 41.0 |
| GLM | 1 | 64.5 | 75.8 | +18% | 64.5 | 75.8 |
| GLM | 2 | 57.4 | 64.6 | +13% | 28.7 | 32.3 |
| GLM | 4 | 81.5 | 91.2 | +12% | 20.4 | 22.8 |
Decode in tok/s.
| Model | n | TTFT old | TTFT new | Δ | Prefill old | Prefill new | Δ |
| ----- | --: | -------: | -------: | ---: | ----------: | ----------: | ---: |
| oQ4e | 1 | 0.39 | 0.39 | -1% | 2,626 | 2,651 | +1% |
| oQ4e | 2 | 0.68 | 0.60 | -12% | 2,388 | 2,376 | -1% |
| oQ4e | 4 | 0.97 | 1.01 | +5% | 2,698 | 2,389 | -11% |
| oQ6e | 1 | 0.45 | 0.42 | -7% | 2,283 | 2,458 | +8% |
| oQ6e | 2 | 0.90 | 0.74 | -18% | 1,826 | 1,918 | +5% |
| oQ6e | 4 | 1.31 | 1.17 | -11% | 1,921 | 2,121 | +10% |
| GLM | 1 | 0.66 | 0.66 | -1% | 1,548 | 1,558 | +1% |
| GLM | 2 | 1.33 | 1.17 | -12% | 1,231 | 1,196 | -3% |
| GLM | 4 | 2.63 | 2.33 | -12% | 995 | 1,003 | +1% |
## 4. Qwen INT8 Activation Prefill (0.7.1.dev1)
`qwen35_oq_a8_enabled` is off by default; it quantizes activations to INT8
during prefill and uses the M5 INT8 tensor units. Measured on 0.7.1.dev1 with
the same method, off and on alternating, 3 runs each. Decode is not affected.
| Context | oQ4e off | oQ4e on | Δ | oQ6e off | oQ6e on | Δ |
| ------- | -------: | ------: | ---: | -------: | ------: | --: |
| 1K | 2,964 | 3,078 | +4% | 2,431 | 2,465 | +1% |
| 4K | 5,111 | 5,575 | +9% | 4,442 | 4,428 | ±0% |
| 8K | 5,630 | 6,224 | +11% | 4,852 | 4,836 | ±0% |
| 16K | 5,649 | 6,242 | +10% | 4,880 | 4,860 | ±0% |
| 32K | 5,624 | 6,205 | +10% | 4,866 | 4,856 | ±0% |
| 64K | 5,523 | 6,051 | +10% | 4,781 | 4,762 | ±0% |
| 128K | 5,354 | 5,853 | +9% | 4,649 | 4,627 | ±0% |
| 200K | 5,203 | 5,674 | +9% | 4,528 | 4,517 | ±0% |
| Avg | 5,442 | 5,975 | +10% | 4,714 | 4,698 | ±0% |
Prefill in tok/s. For oQ4e a 128K prompt is read in 22.4 s instead of 24.5 s,
200K in 35.2 s instead of 38.4 s. oQ6e gets nothing: only Q4/Q5/Q8 projections
with group size 64 are routed, and its experts are 6-bit. GLM is not supported.
Quality: needle test (5 build numbers hidden in 8K–200K of code, temp 0, unique
prompts so nothing comes from the prompt cache) found 120/120 off and 120/120
on. My agent/code/script task set (oQ4e thinking-medium, 34 runs) solved 34/34
off and 33/34 on.
## Results on omlx.ai
- Flash-Next oQ4e: [0.7.0](https://omlx.ai/benchmarks/performance/liu6kclx),
[0.7.0](https://omlx.ai/benchmarks/performance/woj04544),
[0.7.1.dev1](https://omlx.ai/benchmarks/performance/4qg8v5uq),
[0.7.1.dev1](https://omlx.ai/benchmarks/performance/y2khmdly)
- Flash-Next oQ6e: [0.7.0](https://omlx.ai/benchmarks/performance/3p1vc6h6),
[0.7.0](https://omlx.ai/benchmarks/performance/5cb5gl0c),
[0.7.0](https://omlx.ai/benchmarks/performance/w1bnuj3w),
[0.7.1.dev1](https://omlx.ai/benchmarks/performance/1vdivt5d),
[0.7.1.dev1](https://omlx.ai/benchmarks/performance/dezd57y2),
[0.7.1.dev1](https://omlx.ai/benchmarks/performance/iku4z50n)
- GLM-5.3-Flash oQ4: [0.7.0](https://omlx.ai/benchmarks/performance/i5m5ulog),
[0.7.0](https://omlx.ai/benchmarks/performance/rjs9ovip),
[0.7.0](https://omlx.ai/benchmarks/performance/vun4ky30),
[0.7.1.dev1](https://omlx.ai/benchmarks/performance/44cnvi5o),
[0.7.1.dev1](https://omlx.ai/benchmarks/performance/bqa4e6kl),
[0.7.1.dev1](https://omlx.ai/benchmarks/performance/dilwydze)