@yibie:strata-mlx 更新:・被其他请求中断的长对话不再重新读取。对于一个 10,000 token 的对话,下一轮输出首字符的时间从 19.7 秒降至 0.26 秒(M4 Max,需要添加 --conversation-cache-mib)
摘要
strata-mlx 更新:中断的长对话不再重读,10K token 会话的首字符输出时间从 19.7 秒降至 0.26 秒(M4 Max),并优化了 32 GB Mac 的内存管理,避免 swap。该项目是运行 Qwen3.8-Flash-Next 等 125B MoE 模型的 Apple Silicon MLX 推理引擎,吞吐量显著优于 llama.cpp 和 LM Studio。
查看缓存全文
缓存时间: 2026/10/12 17:30
strata-mlx 更新:・被其他请求打断的长对话不再重复读取。对于 10,000 token 的对话,下一轮输出首个字符的时间从 19.7 秒降至 0.26 秒(M4 Max,需要添加 --conversation-cache-mib)・基于用户在 32 GB Mac 上的真实测试,默认为 macOS 保留更多内存,不再触发交换(paging)・M5 上的 float32 恢复为精确计算我仍需要更多不同配置的 Mac 设备进行测试。欢迎下载试用,并向我提交 Issues。http://github.com/yibie/strata-mlx
yibie/strata-mlx
来源:https://github.com/yibie/strata-mlx
strata-mlx
Qwen3.8-Flash-Next on Apple Silicon:一个 MLX 引擎,读取 Strata(https://github.com/Niko1221/Strata)使用的 GGUF 文件,并使用 Strata 的行协议(line protocol)通信,因此 Strata 的服务器和网页可以驱动它。
这是一个独立的、非官方项目。它与 Strata 及其作者无关,后者已表示 macOS 不在 Strata 本身的范围内。这是实验性的,仅在一台机器上运行过。
它是什么
Strata 通过将大部分专家权重保留在主机内存中,在一块 12 GB 显卡上运行一个 125B 参数的混合专家模型。而具有统一内存的 Mac 不需要那一半的技巧。本引擎承接另一半:
- 文件原封不动。 GSQ-RCO GGUF 文件加载时不改变任何一个权重。专家保留在文件自身的块中,共九种块类型,Metal 内核直接从这些块进行矩阵乘法。28.8 GB 的 n-gram 表保留在磁盘上。
- 草稿与验证。 模型自带的草稿头(draft head)猜测下一个 token,模型本体进行一遍验证。最终写入的每个 token 都由模型决定。
- 提示词(Prompt)。 分块读取,专家在 Apple 的着色器矩阵乘积中一块一块地处理。一次对话只读取一遍:后续追问只读取新增部分,新对话从与上一次共享的系统提示词之后开始,并且对话可以保存和恢复。加上
--conversation-cache-mib后,被其他请求打断的对话会被暂存到内存中再取回,而不需要重新读取。 - 长对话,实测上下文达 128K token。
- 内存占用小于模型体积。 装不下的专家权重在 token 需要时从 SSD 读取,而 MLX 通常会以两倍大小持有的密集张量仍以文件块形式保留,为专家权重留出更多空间。
- Strata 的行协议,通过 stdin 和 stdout 通信(
strata_mlx/serve.py)。
实测数据
M4 Max,128 GB,macOS 27,MLX 0.32.3。贪心解码。所有数字均来自这一台机器,该机器在持续负载下会变慢,请将其视为范围值。两个模型文件分别为 Q2_0(66.4 GB)和 IQ3_S(83.6 GB)。回答的生成速度比 llama.cpp 或 LM Studio 快 1.6 至 2.9 倍,长提示词的读取速度快 4% 至 36%。
生成回答,在四个 256 token 的提示词上的 token/秒(越高越好):
| 引擎 | Q2_0 | IQ3_S |
|---|---|---|
| strata-mlx(本项目) | 68-111 | 65-95 |
| strata-mlx,关闭草稿头 | 44-67 | 43-56 |
llama.cpp llama-server 0.4.1 | 38-39 | 35-36 |
| LM Studio 0.4.25(llama.cpp 运行时) | 43 | 40 |
读取提示词,1,180 token,token/秒(越高越好):
| 引擎 | Q2_0 | IQ3_S |
|---|---|---|
| strata-mlx(本项目) | 570-578 | 510-517 |
| strata-mlx,关闭草稿头 | 595-612 | 504-515 |
llama.cpp llama-server 0.4.1 | 494-495 | 488-489 |
| LM Studio 0.4.25(llama.cpp 运行时) | 426-446 | 421-424 |
关闭草稿头后,引擎仍会在答案重复对话中较早出现的内容时复制之前的猜测;完全不做猜测、每次只处理一个 token 的速度为 46-48 tok/s(Q2_0)和 41-43(IQ3_S)。
这两张表未能体现的两件事,均记录在 ISSUES.md 中:几十个 token 的短提示词读取速度比 llama.cpp 慢(首个 token 约 0.6 秒对 0.3 秒);此外本引擎的读取速度数据取自比其他引擎更晚的会话。Ollama 0.35.1 无法加载任何一个文件。
在默认的 16 位浮点精度下,大约每 250 个 token 中有一个不是精确模型会选出的,出现在两个候选几乎持平的位置;开启和关闭草稿头时都是如此。--dtype float32 输出精确模型选择的 token(已在八个回答上验证),但速度更慢。
在 M5 上,MLX 默认情况下 float32 矩阵乘法的精度仅与 float16 相当,因此 --dtype float32 和测试会关闭该优化(MLX_ENABLE_TF32=0);开启该设置后测试在 M5 上通过,且模型尚未在该模式下运行过 float32(issue 5(https://github.com/yibie/strata-mlx/issues/5))。
在部分专家保留在内存、其余存于 SSD 的情况下(在同一台机器上限制内存以模拟较小内存的机器),仅 Q2_0:内存中保留 3.3 GB 专家权重时,回答速度为 11-12 tok/s;保留 11.9 GB 时为 18-27;保留 20.5 GB 时为 23-38。1,180 token 的提示词读取速度为 107-145 tok/s,因为提示词的一个分块需要从磁盘读取 26 至 30 GB 的专家权重(issue 4(https://github.com/yibie/strata-mlx/issues/4))。
以上数据是引擎为 macOS 保留 4.2 GB 内存时,16 GB、24 GB 和 32 GB 机器分别能保留的专家权重量。一台真实的 32 GB Mac(MacBook Air M5)在保留 20.5 GB 时发生交换,回答速度为 6-19 tok/s;保留 16 GB 时为 23-29(issue 6(https://github.com/yibie/strata-mlx/issues/6))。
因此引擎现在为 macOS 保留 7.9 GB 内存,这样 32 GB 机器可以保留 16 GB 专家权重,上述三个数字尚未在此设置下重新测量。
完整记录(包括尝试过但无效的方案)见 ROADMAP.md(英文,按时间顺序)和 docs/OPTIMIZATION_RECORD.md(中文,按主题组织)。
哪种 Mac
--check 不加载任何内容,只显示一台 Mac 在每个文件上的运行情况。在下载任何文件之前即可使用,也可用于非运行设备的 Mac:
./strata-mlx --check # 本机 Mac
./strata-mlx --check --machine-memory 48 # 48 GB 内存的 Mac
./strata-mlx --check --native # 磁盘上的文件,根据其自身头部信息
与引擎启动时使用的相同算法:
| Mac 内存 | Q2_0(磁盘上 66 GB) | IQ3_S(磁盘上 84 GB) |
|---|---|---|
| 16 GB | 太小 | 太小 |
| 24 GB | 22% 专家权重在内存中 | 10% 专家权重在内存中 |
| 32 GB | 48% 专家权重在内存中 | 27% 专家权重在内存中 |
| 36 GB | 60% 专家权重在内存中 | 36% 专家权重在内存中 |
| 48 GB | 98% 专家权重在内存中 | 61% 专家权重在内存中 |
| 64 GB | 全部 | 95% 专家权重在内存中 |
| 96 GB 及以上 | 全部 | 全部 |
“全部”(Whole)对应实测数据中的速度路径,测试设备为 M4 Max;其他芯片尚未测试。当只有部分专家权重在内存中时,其余部分在 token 需要时从 SSD 读取,即上文提到的慢速路径。IQ3_S 完全未以这种方式运行过。
这张表是算法推算,不是测试结果:作者运行过本引擎的唯一一台 Mac 内存为 128 GB。引擎为 macOS 及其他程序保留 7.9 GB,且不计算对话本身的内存,约 36,000 token 约需 1 GB。该数字来自目前唯一有报告的小内存 Mac——32 GB 的 MacBook Air M5:当为 macOS 保留 4.2 GB 时发生交换;按现在表格中的设置,几乎未发生交换,速度约为两倍(issue 6(https://github.com/yibie/strata-mlx/issues/6))。
其他内存大小尚不清楚:16 GB 的 Mac 可能需要比这里更少的保留量,可以用 --expert-memory GB 手动设置专家权重的份额。
运行
需要一台 Apple Silicon Mac、Python 3.12 或 3.13 以及 uv。仅在 macOS 27 上测试过;提示词内核使用 Metal 4 的 Metal Performance Primitives。
git clone https://github.com/yibie/strata-mlx && cd strata-mlx
uv sync
uv run pytest # 256 个测试,无需模型文件
模型文件,Q2_0 约 66 GB:从 ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF(https://huggingface.co/ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF)下载同一大小的两个分片,放在同一文件夹中。Q2_0 和 IQ3_S 已测试过;其他大小在加载器中有路径但未测试。
草稿头不在这些文件中。其 31 个张量、4.9 GB,通过范围请求(range request)从原始检查点中获取,无需下载完整的 360 GB,每个张量都经过 SHA-256 校验。该脚本是 Strata 自带的,在此处未做修改,位于 tools 目录中(与 Strata 中相同):
python tools/mtp_fetch.py fetch --out ~/.cache/strata-mlx/mtp # 可断点续传
没有草稿头引擎也能运行,速度即上文“关闭草稿头“的数值。
./strata-mlx --serve --native --mtp ~/.cache/strata-mlx/mtp
之后进程使用 Strata 的行协议通信:打印 INFO ... 和 READY,接收 GEN ,,... 并以 T 行和 DONE 行作为回答。提示词是 token id;分词、聊天模板和 HTTP API 由 Strata 的服务器负责。Strata 的 serve/server.py(0.1.40)在未做修改的情况下驱动了本引擎,将配置中的 exe 设为 strata-mlx 脚本,将上述选项放入 args;Strata 的 setup.py 无法在 macOS 上运行,因此该配置是手动编写的。
选项:--spec 1(关闭草稿头),--dtype float32,--max-context N,--expert-memory GB(在内存中保留多少专家权重;默认情况下若机器能装下模型则全部保留),--machine-memory GiB(按该大小的机器运行),--guess-rows off,--expert-profile off,--conversation-cache-mib MiB(将被其他请求打断的对话暂存在该大小的内存中;默认关闭,在无法完整装下模型的 Mac 上该内存从专家权重份额中扣除)。
bench/ 中的基准测试使用 llama.cpp 的 llama-tokenize 进行分词,bench/compare_servers.py 会在安装了 llama-server 和 LM Studio 的 lms 时自动启动它们。
尚未支持
图片输入、多对话并行解码,以及 Q2_0 和 IQ3_S 以外的文件格式。对话缓存使用 16 位浮点(128K token 时为 3.9 GB)。本项目尚未在内存小于 128 GB 的 Mac 上运行过。
许可证
MIT,详见 LICENSE。下文提到的项目各有自己的许可证;从 Strata 取用的唯一文件 tools/mtp_fetch.py 属于 Strata,保留 Strata 的 MIT 许可证,位于该文件旁边。
致谢
- Strata(MIT):本项目遵循的设计、行协议、采样器顺序、查找式草稿器(lookup drafter)的思路、对话中保留哪些检查点以及如何暂存对话——所有这些在此处为 MLX 全部重写;以及其获取草稿头的脚本,原样包含。
- llama.cpp 和 ggml(MIT):GGUF 格式和块类型,此处的内核按照其解包逻辑实现;码本(codebook)表在运行时来自其
gguf包。 - MLX 和 mlx-lm(MIT),以及 mlx-lm 中移植本模型的 pull request 1788,本引擎在此基础上构建并固定依赖。
- ISTA-DASLab 提供 GSQ-RCO 文件,Qwen 提供模型。模型权重有自己的许可证,不属于本仓库。
yibie(@yibie): 公开我最近的项目:strata-mlx
Strata 非常棒:它能在一块 12 GB 的显卡上跑 125B 参数的混合专家模型 Qwen3.8-Flash-Next。但它的作者说过,macOS 不在支持范围内。
我还是想让它跑在 Mac 上。
所以我花了一天半,写了 strata-mlx。它是一个非官方的 MLX 引擎,借鉴 strata 的设计,直接读 Strata
相似文章
@yibie: 这几天更新了 strata-mlx:1. 在低内存 Mac 上推理速度更快,但代价是多占用了一些内存……
strata-mlx 更新:在低内存 Mac 上提升推理速度但增加内存占用,新增 --check 性能预检命令,并评估了专家预测预取方案的收益(仅 1.35x 上限,未实施)。
@yibie:宣布我最近的项目:strata-mlx。Strata 太棒了:它可以运行拥有 1250 亿参数的混合专家模型 Qwen……
yibie 发布了 strata-mlx,这是一款面向 Mac 的非官方 MLX 推理引擎,可从 Strata 的 GGUF 文件运行 125B MoE 模型 Qwen3.8-Flash-Next,生成速度达到 llama.cpp 的 1.7–2.9 倍,并支持内存较小的 Mac 将专家卸载到 SSD。
@yibie:结果两天前,有用户建议 Strata 开发者期待添加……的支持
用户 yibie 发文吐槽 Strata 开发者态度,称对方在被请求添加 strata-mlx 支持两天后就以"mac 一天就能支持"为由拒绝,随后附上 Strata 项目 README——该开源工具可在 12GB 以上显存的普通游戏 PC 上运行 1250 亿参数的 Qwen3.8-Flash-Next 模型。
在 64GB Mac 上以 41–52 tok/s 运行 95.5 GiB 的 Qwen3.8-Flash-Next(比 llama.cpp 快 1.76 倍):Slipstream 发布,130k 上下文扩展,以及 Swift 变体
作者发布 Slipstream——一款针对 Apple Silicon 的 C++ Metal 推理引擎,支持原生 SSD 专家流式加载与投机草稿解码,可在 64GB Mac 上以 41–52 tok/s 运行 95.5 GiB 的 Qwen3.8-Flash-Next 模型,比 llama.cpp 快 1.76 倍,且 130k 长上下文下速度不衰减。
@jundotkim: oMLX 0.3.9rc1 发布。亮点:- 低内存Mac保持稳定,不再被系统杀死 - DFlash 升级至…
oMLX 0.3.9rc1,一个为Apple Silicon Mac优化的LLM推理服务器,增加了低内存稳定性、分块预填充、多任务管理聊天等功能。