硬體
- 主機
- Mac mini(Mac16,11)
- SoC
- Apple M4 Pro
- CPU/GPU
- 12 核/16 核
- 記憶體
- 64 GB 統一記憶體
Performance & accuracy report ·
以 4B、9B、27B 三組配對模型比較原生 MLX、llama.cpp + GGUF 與三種 MLX+GGUF 轉換策略。 報告如實列出生成速度、固定 100 題結果、Fast GGUF 容量與程序 RAM,不納入載入效率。
Test environment
15 組配置在同一台主機串行執行;同一時間只啟動一個模型 Runtime。
測試前以 uptime、ps 與系統 CPU 取樣確認沒有其他 mlx-server/llama-server;CPU idle 維持
80.5%~83.8%,系統未回報溫控或效能限制。27B llama.cpp + GGUF 的波動結果在相同條件下重測,正式吞吐採三次中位數。
Actual product parameters
Group 完全由模式與來源 tensor metadata 自動決定,不依模型名稱,也不需手動指定。
| 模式 | 參數 | 主要權重 | 定位 |
|---|---|---|---|
| 原生MLX檔案未轉換 | 原生 checkpoint | Affine 4-bit/group 64 | 速度與品質基準 |
| llama.cpp + GGUF | llama.cpp 原生 GGUF | 直接使用來源 GGUF 量化 | GGUF Runtime 對照 |
| MLX + Fast GGUF Mode 1 | mode1 + controls | K-Quant 沿用來源 4-bit block;其他張量 group 64 | 均衡.預設 |
| MLX + Fast GGUF Mode 2 | mode2 + controls | 低位元來源重新量化為 INT8/group 64 | 較高精度 |
| MLX + Fast GGUF Mode 3 | mode3 + controls | 低位元來源重新量化為 INT4/group 32 | 最快 |
Mode 1 沿用的 K-Quant tensor 由來源格式保留 32 元素 sub-block;Mode 2 自動使用 group 64,Mode 3 固定使用 group 32。 三種模式均使用相同 recurrent controls,且各自建立獨立 Fast GGUF。
Steady-state generation
每組先暖機一次,再取三次 128-token 回覆的 Runtime 生成速度中位數。
| 模型 | 模式 | 中位 tok/s | 端到端 tok/s | 比較基準 (MLX) | 比較 llama.cpp + GGUF |
|---|---|---|---|---|---|
| Qwen 3.5 4B | 原生MLX檔案未轉換 | 81.609 | 74.953 | – | 1.43× |
| llama.cpp + GGUF | 57.164 | 56.126 | 70.0% | – | |
| MLX + Fast GGUF Mode 1 | 71.376 | 66.355 | 87.5% | 1.25× | |
| MLX + Fast GGUF Mode 2 | 71.301 | 66.303 | 87.4% | 1.25× | |
| MLX + Fast GGUF Mode 3 | 75.137 | 69.575 | 92.1% | 1.31× | |
| Ornith 1.5 9B | 原生MLX檔案未轉換 | 48.438 | 44.358 | – | 1.39× |
| llama.cpp + GGUF | 34.963 | 34.270 | 72.2% | – | |
| MLX + Fast GGUF Mode 1 | 37.279 | 34.806 | 77.0% | 1.07× | |
| MLX + Fast GGUF Mode 2 | 27.335 | 25.926 | 56.4% | 0.78× | |
| MLX + Fast GGUF Mode 3 | 43.177 | 39.935 | 89.1% | 1.23× | |
| Qwen 3.8 27B | 原生MLX檔案未轉換 | 15.088 | 13.844 | – | 1.48× |
| llama.cpp + GGUF | 10.184 | 9.978 | 67.5% | – | |
| MLX + Fast GGUF Mode 1 | 9.142 | 8.647 | 60.6% | 0.90× | |
| MLX + Fast GGUF Mode 2 | 8.343 | 7.924 | 55.3% | 0.82× | |
| MLX + Fast GGUF Mode 3 | 13.482 | 12.480 | 89.4% | 1.32× |
「中位 tok/s」是 Runtime 回報的三次生成速度中位數;「端到端 tok/s」依請求開始到回覆完成的實際經過時間換算,包含 API、排程與資料處理開銷。
Fixed-set quality evaluation
MMLU 固定 100 題;每個模型的五種模式使用完全相同題目。
| 模型 | 模式 | 原樣結果 | 排除截斷 | 共同未截斷題組 | 無法解析 |
|---|---|---|---|---|---|
| Qwen 3.5 4B | 原生MLX檔案未轉換 | 68/100 | 68/100 | 66/98 | 0 |
| llama.cpp + GGUF | 73/100 | 73/100 | 71/98 | 0 | |
| MLX + Fast GGUF Mode 1 | 72/100 | 72/100 | 70/98 | 0 | |
| MLX + Fast GGUF Mode 2 | 72/100 | 72/100 | 70/98 | 0 | |
| MLX + Fast GGUF Mode 3 | 70/100 | 70/98 | 70/98 | 1 | |
| Ornith 1.5 9B | 原生MLX檔案未轉換 | 79/100 | 78/99 | 78/99 | 0 |
| llama.cpp + GGUF | 78/100 | 78/100 | 77/99 | 0 | |
| MLX + Fast GGUF Mode 1 | 78/100 | 78/100 | 77/99 | 0 | |
| MLX + Fast GGUF Mode 2 | 78/100 | 78/100 | 77/99 | 0 | |
| MLX + Fast GGUF Mode 3 | 77/100 | 77/100 | 76/99 | 0 | |
| Qwen 3.8 27B | 原生MLX檔案未轉換 | 89/100 | 89/100 | 89/100 | 0 |
| llama.cpp + GGUF | 87/100 | 87/100 | 87/100 | 0 | |
| MLX + Fast GGUF Mode 1 | 87/100 | 87/100 | 87/100 | 1 | |
| MLX + Fast GGUF Mode 2 | 88/100 | 88/100 | 88/100 | 1 | |
| MLX + Fast GGUF Mode 3 | 82/100 | 82/100 | 82/100 | 4 |
所有 finish_reason=length 均視為截斷並排除分母,即使截斷前已出現可解析選項也不計分;
模型自行停止卻未作答仍算錯。本輪 1,500 次問答共有 3 次截斷,排除截斷後共 1,497 次可評分。
「共同未截斷題組」只比較同一模型下五種模式都未截斷的題目。
Storage & memory
磁碟分開列出原始模型與 Fast GGUF;RAM 每 200 ms 取樣,列出程序生命週期峰值與生成期間平均值。
| 模型 | 模式 | 原始模型 | Fast GGUF | RAM 峰值 | RAM 平均 | 觀察 |
|---|---|---|---|---|---|---|
| Qwen 3.5 4B | 原生MLX檔案未轉換 | 2.851 GiB | – | 2.394 GiB | 2.393 GiB | 無 Fast GGUF |
| llama.cpp + GGUF | 2.406 GiB | – | 3.058 GiB | 3.017 GiB | 直接執行來源 GGUF | |
| MLX + Fast GGUF Mode 1 | 2.406 GiB | 2.539 GiB | 0.769 GiB | 0.681 GiB | RAM 最低 | |
| MLX + Fast GGUF Mode 2 | 2.406 GiB | 2.539 GiB | 0.782 GiB | 0.688 GiB | Mode 1 接近 | |
| MLX + Fast GGUF Mode 3 | 2.406 GiB | 2.293 GiB | 1.241 GiB | 1.064 GiB | Fast GGUF 最小、速度最高 | |
| Ornith 1.5 9B | 原生MLX檔案未轉換 | 4.711 GiB | – | 4.882 GiB | 4.881 GiB | 無 Fast GGUF |
| llama.cpp + GGUF | 5.383 GiB | – | 5.850 GiB | 5.809 GiB | 直接執行來源 GGUF | |
| MLX + Fast GGUF Mode 1 | 5.383 GiB | 5.759 GiB | 1.752 GiB | 1.750 GiB | 各方面表現均衡 | |
| MLX + Fast GGUF Mode 2 | 5.383 GiB | 8.682 GiB | 1.254 GiB | 1.253 GiB | RAM 最低、Fast GGUF 最大 | |
| MLX + Fast GGUF Mode 3 | 5.383 GiB | 4.871 GiB | 2.055 GiB | 2.020 GiB | Fast GGUF 最小、速度最高 | |
| Qwen 3.8 27B | 原生MLX檔案未轉換 | 14.977 GiB | – | 14.291 GiB | 14.291 GiB | 無 Fast GGUF |
| llama.cpp + GGUF | 15.334 GiB | – | 16.377 GiB | 16.260 GiB | 直接執行來源 GGUF | |
| MLX + Fast GGUF Mode 1 | 15.334 GiB | 22.708 GiB | 5.844 GiB | 5.400 GiB | 來源 4-bit block 與其他張量混用 | |
| MLX + Fast GGUF Mode 2 | 15.334 GiB | 25.972 GiB | 5.216 GiB | 4.102 GiB | RAM 平均最低、Fast GGUF 最大 | |
| MLX + Fast GGUF Mode 3 | 15.334 GiB | 14.603 GiB | 6.377 GiB | 4.323 GiB | Fast GGUF 最小、速度最高 |
使用 MMap 技術降低 RAM 用量,原生 MLX 目前尚未支援。表中為程序 RSS,因此不等於邏輯權重總量或整台主機的統一記憶體使用量。
Experimental follow-up
本輪三種 Fast GGUF 模式均使用相同的 recurrent controls 設定,避免額外變因。
MLX + Fast GGUF Mode 1、Mode 2 與 Mode 3 均傳入 --gguf-recurrent-promotion controls;
本節只記錄測試條件,不把 recurrent promotion 的效果和三種儲存策略混為同一項比較。
Methodology
/v1/chat/completionsfinish_reason=length 均排除--mmap;原生MLX檔案未轉換模式未傳入策略量測彙總:gguf-strategy-results.csv · 精度彙總:accuracy-summary.csv · 每題結果:accuracy-results.csv · 速度與資源原始彙總:benchmark-results.csv · 重現腳本:run-benchmark.sh、 run-accuracy-benchmark.sh
Result notes
五種模式排除截斷後為 68.0%~73.0%;原生 MLX 為 81.609 tok/s,三種 Fast GGUF 為 71.301~75.137 tok/s。
五種模式排除截斷後為 77.0%~78.8%;原生 MLX 為 48.438 tok/s,三種 Fast GGUF 為 27.335~43.177 tok/s。
五種模式排除截斷後為 82.0%~89.0%;原生 MLX 為 15.088 tok/s,三種 Fast GGUF 為 8.343~13.482 tok/s。
三組模型的速度、精確度、Fast GGUF 與 RAM 分布並不相同;結果只代表本次模型、Runtime 與測試條件,其他架構、量化格式或 checkpoint 需另行量測。