Token 自由、Mac 抓紧上车:2.1 万 Star 的 oMLX,把 KV 缓存留 RAM 下沉 SSD
项目地址: github.com/jundot/omlx
长对话、代码库问答、Agent 工具调用容易卡在同一个问题:上下文稍微变一点,前面整段历史又得重新预填充一遍,模型像再次失忆。2.1 万 Star 的 oMLX 把重点放在这上面:在 Apple Silicon 上提供本地推理服务,常用 KV 缓存留在 RAM,内存紧张时下沉到 SSD;相同前缀下次命中可以复用,服务重启后也不用从零计算。
它还带连续批处理、多模型管理,以及 OpenAI/Anthropic 兼容接口。官方管理面板展示总内存、热缓存和持久化 SSD 冷缓存的分层控制。
服务端会自动发现模型目录里的 LLM、VLM、嵌入模型和重排序模型,在本机暴露 http://localhost:8000/v1。现有 OpenAI 兼容客户端可以直接接;同时实现了 Anthropic 的 /v1/messages,管理台内置 Codex、Claude Code、OpenCode、OpenClaw 等集成入口。
| 能力 | 机制 | 对实际工作流的意义 |
|---|---|---|
| 分层 KV 缓存 | 高频块在 RAM,挤出后以 safetensors 落到 SSD | 相同前缀再次出现时,少做重复预填充 |
| 连续批处理 | 通过 BatchGenerator 处理并发请求,可设置最大并发 | 多个 Agent/客户端不必完全排队 |
| 多模型调度 | LRU 驱逐、手动加载、固定常用模型、模型级 TTL | 常用小模型常驻,重模型按需腾挪 |
| 双 API 兼容 | OpenAI 与 Anthropic 接口,支持流式、嵌入、重排序 | 少改客户端配置,就能把请求指向本地 |
它的定位比“一个聊天窗口”更靠近本地模型基础设施。菜单栏原生 SwiftUI 应用和 /admin 面板只是入口;真正决定体验的是 EnginePool、内存限制、调度器和缓存栈。
同一基础模型可以保存多套命名配置,并以 <模型>:<配置> 的形式暴露给 API 客户端。它们共用同一引擎,不额外加载一份权重。代码助手偏保守、日常问答偏发散这类需求,可以直接切配置,不必为每套参数重复占内存。
为什么长上下文会“失忆”?答案在 KV 缓存
大模型读过的上下文会形成 KV 缓存。只要下一次请求沿用前面的内容,这些中间计算结果就有复用价值。许多本地服务只把它留在内存里:内存一紧,缓存被挤掉;服务重启,缓存也跟着清空。
oMLX 采用块级缓存、前缀共享和 Copy-on-Write:热块留在 RAM,热层满了就写回 SSD。命中相同前缀时,它先尝试从本地缓存恢复,而不是让模型重新通读一遍历史。
注意关键词是“命中相同前缀”,不是把任何变化过的对话都神奇加速。
这也解释了 oMLX 为什么专门提到 Claude Code:小上下文模型可以借助上下文缩放让自动压缩在合适时机触发,SSE keep-alive 则减少长预填充阶段的读超时。对反复修改同一代码库、反复携带同一系统提示的工作流,这比单次跑分更贴近日常体验。
它能提速什么,不能替你解决什么
缓存与批处理很香,但不是把 Mac 变成无限显存机器。把边界说清,比把速度吹满更重要。
| 场景 | oMLX 可能帮上忙 | 仍然绕不过的事实 |
|---|---|---|
| 重复前缀、长对话 | 命中 KV 后可避免重复预填充 | 首次请求或前缀变化大,仍需要计算 |
| 多个本地模型 | LRU、TTL、固定模型帮助腾内存 | 模型权重本身仍占统一内存,装不下就是装不下 |
| 高并发请求 | 连续批处理可提高资源利用 | 合适的并发数取决于模型、内存与任务,必须实测 |
| 多台 Mac 跑大模型 | 支持跨 Mac 分片推理 | 这是实验性、源码构建预览功能,需要额外硬件与网络验证 |
项目提供进程级内存限制,默认会为系统预留约 8GB,避免服务把整台 Mac 顶到系统级 OOM。这个保护很实用,但不是容量魔法:模型权重、KV 缓存和并发请求仍共用统一内存,部署前要先按真实模型尺寸给自己留余量。
另一个容易踩坑的点是原生自定义内核。对部分模型家族,普通源码安装不会构建这些内核,会走更慢的通用路径;构建还需要完整 Xcode,而不只是 Command Line Tools。因此“能启动”不等于“跑在最佳路径”,要用项目自带基准面板和自己的任务数据测。
适合谁:Apple Silicon 用户,不是所有本地模型玩家
oMLX 面向 macOS 15+ 的 Apple Silicon(M1–M5)与 MLX 格式模型;文本、视觉、OCR、嵌入和重排序都在支持范围里。最轻的上手方式是下载官方 .dmg;偏终端的用户可用 Homebrew:
brew tap jundot/omlx https://github.com/jundot/omlx
brew install jundot/omlx/omlx
omlx start
源码安装要谨慎:仓库中文 README 仍写 Python 3.10+,但当前 pyproject.toml 的硬约束是 Python 3.11 到 3.13。准备从源码部署时,应以依赖文件为准。Intel Mac、旧版 macOS、非 MLX 格式模型,或只偶尔开一次短对话的用户,都不一定需要这套完整服务层。
把缓存、批处理、调度和 API 兼容放在一起看,它做的是把本地推理从“下载一个模型试试”推到“可长期服务、可观测、可缓存、可换模型”的工程问题。