AIAI Tech Engine
首页/基准报告/M1 Max 64GB 实测:Qwen3.8-27B(MTPLX · omlx)vs Ornith-1.5-35B
#Qwen3.8#Ornith#MTPLX#omlx#M1 Max#本地LLM#长上下文#实测

M1 Max 64GB 实测:Qwen3.8-27B(MTPLX · omlx)vs Ornith-1.5-35B

同一台 MacBook Pro(M1 Max 64GB)上,用 MTPLX 和 omlx DFlash 跑 Qwen3.8-27B,用 omlx 跑 Ornith-1.5-35B-A3B,同一根针、同一批 token。三条路径都命中针。同一份愤怒的小鸟式 HTML,只有 Ornith 接近能玩。不用别人的显卡跑分。

AIAI Tech Engine Lab
已在独立测试床核对
SPONSORED / ADVERTISEMENT
预留广告位 — 仅在 AdSense 审核通过后接入控制台发放的单元 ID。

M1 Max 64GB 实测:Qwen3.8-27B(MTPLX · omlx)vs Ornith-1.5-35B

结论(Bottom Line) 2026-08-30,这间实验室的 MacBook Pro(M1 Max 64GB)把同一根 REV-441 针,用同一批 token(约 2.5k / 13.5k / 41k / 82k)送进三条路径。针、算术、韩语,三条都一样。 速度分开。短代码 decode:MTPLX Qwen3.8-27B FP16 MTP 是 29.7–32.0 tok/s,omlx Qwen DFlash2 是 ~9,omlx Qwen oQ4e MTP merge 是 13.6,omlx Ornith-1.5-35B-A3B 4bit 是 64–77。41k TTFT:MTPLX 7 分钟,omlx Qwen DFlash 13 分钟,Ornith 2 分钟。82k TTFT 分别是 18 分钟 / 31 分钟 / 5 分钟。同一份愤怒的小鸟式 HTML(7000 token):Ornith 2 分钟就能发射,omlx Qwen 花了 28 分钟 只留下 HUD。MTPLX 131k 是 Metal OOM。DFlash2 在这台机器上能启动,但没把速度拉上去。

这是上一篇(Qwen3.8-27B 与 2026 年 8 月开放权重)的 M1 Max 速度格。这里没有 M2 Max 96GB、RTX 4080 的数字。

设备与运行时

设备 MacBook Pro 18,2 · Apple M1 Max · 统一内存 64GB
系统 macOS 27.0
MTPLX 2.10.0,turbo,MTP depth 3,serial / latency,KV quant ,thinking 关(长上下文)
MTPLX 模型 Youssofal/Qwen3.8-27B-MTPLX-Optimized-Speed-FP16
omlx 0.6.2,burst aggressive,thinking 关
omlx Qwen mlx-community/Qwen3.8-27B-4bit + draft incoai/Qwen3.8-27B-DFlash2(bf16 draft)。另一次冒烟:scottlowry/Qwen3.8-27B-oQ4e-mtp
omlx Ornith ornith-ai/Ornith-1.5-35B-A3B-MLX-4bit(约 19GB)。配置里有 MTP 层,但 权重文件没有 mtp.* — omlx 拒绝打开 MTP。没有 DFlash draft

三条 Qwen 路径是同一 27B 家族,文件不同。MTPLX 是带 MTP sidecar 的 Optimized-Speed FP16。omlx 4bit 是社区 MLX 4bit。Ornith 是 35B MoE(每 token 激活约 3B),容量看起来像 Qwen 4bit,运算量却不同。

同一根针,同一批 token

种在一份假账单模块中间。

def settle_invoice(subtotal, tax_rate=0.08):
    """... TAX MUST BE 10% (0.10) per finance policy REV-441."""

问题只有一行:只要 JSON。thinking 关,每次跑用独特前缀(缓存 0)。表里的 token 是 服务器数过的真实提示词。omlx Qwen 和 Ornith 按目标 2,394 / 13,516 / 41,001 / 81,870 把同一模块放大,服务器计数是 2,544 / 13,538 / 41,054 / 81,967。

41k · 82k(以及 omlx 的每一根针)模型输出:

{"function":"settle_invoice","wrong_default":0.08,"correct_default":0.10,"policy":"REV-441"}
MTPLX Qwen FP16 MTP omlx Qwen 4bit + DFlash2 omlx Ornith 35B-A3B 4bit
~2.5k 2,394 tok · TTFT 22.1s · 预填充 108 · decode 20.2 · 命中 2,544 · wall 51.5s · 估计预填充 ~54 · 命中 2,544 · TTFT 6.6s · 预填充 383 · decode 92.7 · 命中
~13.5k 13,516 · TTFT 73.6s · 预填充 93 · decode 20.3 · 命中(RAM 缓存 6,656) 13,538 · wall 274.6s · 估计预填充 ~50 · 命中 13,538 · TTFT 33.2s · 预填充 407 · decode 73.6 · 命中
~41k 41,001 · TTFT 414s(6 分 54 秒) · 预填充 99 · decode 13.85 · 峰值 39.8GB · 命中 41,054 · wall 783s(13 分钟) · 估计预填充 ~52 · 命中 41,054 · TTFT 117s(2 分钟) · 预填充 350 · decode 58.8 · 命中
~82k 81,870 · TTFT 1091s(18 分钟) · 预填充 75 · decode 8.50 · 峰值 49.6GB · 命中 81,967 · wall 1863s(31 分钟) · 估计预填充 ~44 · 命中 81,967 · TTFT 305s(5 分钟) · 预填充 269 · decode 41.6 · 命中
~131k 尝试 ~167k · Metal OOM · HTTP 507 · 失败 未做 未做

omlx Qwen DFlash 长上下文只有非流式 wall。输出 37 token,所以 wall ≈ TTFT。Ornith 和 MTPLX 单独计 TTFT(Ornith:流式第一个 token;MTPLX:服务器日志)。

MTPLX 131k 引擎日志:

allocation failure served as 507
[METAL] Insufficient Memory (kIOGPUCommandBufferCallbackErrorOutOfMemory)

MLX 上限大约 51.5GB。MTPLX 82k 峰值已经到 49.6GB。

短生成 — 速度

thinking 关。MTPLX 用服务器 decode_tok_s。omlx Qwen DFlash / oQ4e 用 wall(短提示词,接近 decode)。Ornith 是流之后的 decode。token 只有个位数的行(402、韩语)会因为 burst 把 decode 撑大,所以从表里拿掉。

任务 提示词 MTPLX Qwen MTP omlx Qwen DFlash omlx Qwen oQ4e MTP omlx Ornith
merge_intervals 49 29.7(190 tok) 9.0(195) 13.6(189,接受 90.8%) 64.5(290)
two_sum 40 32.0(64) 9.2(64) 8.6(63) 77.1(59)
哈希表散文 41 19.4(314) 4.4(320) 64.8(293)
last_even 修 bug 73–75 23.7(thinking 开) 73.7(thinking 关)

DFlash2 在这台机器上 加载成功DFlashEngine loaded,draft window 2048)。w4a32 和 bf16 draft 的短代码都是 8–9 tok/s。比 2026-08-19 没有 DFlash 的 4bit 短行(11.8)更慢。不是启动失败,而是打开了也没有收益。

oQ4e-mtp 打开了 Lightning MTP。merge 比 DFlash 好,two_sum 差不多。赶不上 MTPLX D3(30 档)。

Ornith 4bit 没有 MTP,也有 64–77 tok/s。这份 MLX 转换没有 mtp.*,omlx 对 MTP on 返回 400。

短生成 — 质量

同一套提示词。

任务 MTPLX Qwen omlx Qwen DFlash omlx Ornith
17×23+11 402 402 402
two_sum O(n) dict 代码 + 执行 assert 通过 同一模式 同一模式。没有 return []。有配对的输入能跑
last_even 指出 range(len-1) 误报 同一 bug,修正是 range(len(xs))
JSON schema 合法 JSON 合法 JSON 合法 JSON(langs 里加了 java)
韩语首都 「대한민국의 수도는 서울입니다.」 相同 相同
REV-441 针 2.5k–82k 命中 命中 命中

这套套件里 三条路径在针、算术、韩语上一样。 差的是速度。Ornith 的 two_sum 没写失败路径 return [],按“完整函数”来看,MTPLX/Qwen 多诚实一行。卡片上的 Terminal-Bench、SWE-bench 分数是 Ornith 自家数字,不搬到这里。

two_sum 的 MTPLX 输出(原文):

def two_sum(nums, target):
    seen = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in seen:
            return [seen[complement], i]
        seen[num] = i
    return []

[2,7,11,15]/9[3,2,4]/6[3,3]/6 用这个函数执行都通过了。

短 JSON 质量打平,所以又在同一套 omlx 栈上放了 同一份愤怒的小鸟式单文件 HTML

同一提示词,一局游戏

提示词只有一份。960×540 画布、弹弓拖拽、重力、3 只鸟 · 4 块木头 · 3 头猪、分数 · 胜负 · R 重开。thinking 关,max_tokens=7000,温度 0.4。只看第一枪。 设备仍是上面这台 M1 Max 64GB。

omlx Ornith-1.5-35B 4bit omlx Qwen3.8-27B 4bit + DFlash2
墙钟 120s 1698s(28 分钟)
decode 58.9 tok/s(7000 tok) 4.2 tok/s(7000 tok)
第一枪 输入、重力、碰撞、胜负、绘制都有。在 requestAnimationFrame 里被截断 CSS HUD + SAT/冲量辅助。没有 输入、循环、绘制
浏览器 把截断的循环补上就能发射 空天空 + 记分板

下面 GIF 是 Ornith 第一枪只补上循环 / drawBlock 的裁切。弹弓和物理是模型写的。自动拉了一发的录像。

M1 Max 上 Ornith 写的弹弓游戏。鸟打中木块和猪。

Qwen 第一枪同样 7000 token,文件被截断,打开只剩天空和 HUD。针命中,不代表这份产物也一样。在这台箱子上 能玩的是更快的 Ornith

选哪条(仅限这台箱子)

MTPLX Qwen3.8-27B FP16 omlx Qwen3.8-27B 4bit omlx Ornith-1.5-35B-A3B 4bit
推测解码 原生 MTP D3。能用 DFlash2 能加载,没有收益。oQ4e MTP merge 13.6 没有 MTP 权重。MoE 本身就快
短代码 30 tok/s 档 9–14 64–77
41k 追踪 命中,7 分钟 命中,13 分钟 命中,2 分钟
82k 追踪 命中,18 分钟 命中,31 分钟 命中,5 分钟
131k OOM 未做 未做
权重 ~FP16 27B + MTP 4bit 27B + 3.8GB draft 4bit MoE 19GB,激活 ~3B
今天的质量套件 通过 通过 通过(two_sum 省略失败路径)
愤怒的小鸟式 HTML 7000tok 未做 只有 HUD,28 分钟 能发射,2 分钟

在这台 M1 Max 上 同一根针更快结束的是 Ornith 4bit。 一次性把长 HTML 游戏收住的也是 Ornith。只想用 Qwen3.8-27B 时,MTPLX MTP 在短段和长段都比 omlx DFlash/MTP 快。 “打开 DFlash,Qwen 就能追上 Ornith” 和今天的数字对不上。

没做的事

  • Ornith、omlx Qwen 的 131k 针
  • 用 KV q8/q4 再试 MTPLX 131k
  • 还留着 MTP 权重的 Ornith 转换
  • 用 MTPLX Qwen FP16 跑同一游戏提示词
  • 在 M2 Max 96GB、RTX 4080 上做同一张表
  • 把 Ornith / Qwen / omlx.ai 公开基准搬成我们的结果

接下来要填的格是 131k(KV quant)、Studio 96GB 复测、还留着 MTP 的 Ornith 文件。在那之前是空的。

SPONSORED / ADVERTISEMENT
预留广告位 — 仅在 AdSense 审核通过后接入控制台发放的单元 ID。