你在编辑器里用一个小模型做快速补全,聊天窗口里用一个大模型。每次工具切换到另一个模型,Mac就先把前一个卸载,再加载下一个,你只能干等。Off Grid AI Desktop 的做法是:让多个聊天模型同时留在内存里,请求点名哪个模型,就直接发给已经加载好的那个,中间不发生换出。

保存之前,界面上的内存条会先告诉你这套组合放不放得下。

需要准备什么

  • 一台 Apple 芯片的 Mac(M1 或更新)。Mac 版安装包只面向 Apple 芯片构建。
  • Off Grid AI Desktop 0.0.55 或更新版本。Keep loaded 功能就在当前稳定版 0.0.55 里。
  • 在应用的 Models 界面里已经下载了两个或更多聊天模型,文本模型和视觉模型都算。
  • 统一内存足够装下你选的这套模型。应用会替你算账,规则见下文。
  • 不需要账号,也不需要付费。Keep loaded 属于网关功能,包含在免费应用里。

你的 Mac 能装下多少

在 Apple 芯片上,GPU 和 CPU 共用同一个内存池。macOS 允许 GPU 使用其中大约四分之三,所以应用按 Mac 内存的 75% 来规划。从这个额度里再扣掉 1 GB 的安全余量,以及应用自带聊天模型已经占用的部分。

每个被保留的模型都需要自己的模型文件、视觉文件(如果有)、一份上下文缓存和一小块工作缓冲。每个保留模型都以 16,384 token 的上下文运行。如果这套组合在缓存全精度下放不下,规划器会依次尝试 q8_0、q4_0 的缓存,用第一个能放下的方案。这些都不需要你手动设置。

第一步:打开 Keep loaded

打开 Off Grid AI Desktop,点击侧边栏的 Gateway,向下滚动到 Keep loaded 区域,位置在 Clients 之下、API keys 之上。你会看到所有已下载聊天模型的列表,每个前面有一个复选框。如果一个都没下载,这个区域会显示“Download a chat model to keep it loaded.”。你添加的远程服务器上的模型不会出现在这个列表里,这里只列本机上的模型。

第二步:勾选模型,读内存条

勾选你想同时保留的模型,比如给编辑器用一个 4B 模型,聊天用一个 9B 模型。勾选过程中,每个模型名字旁边会显示它将占用的内存,单位是 GB。

列表下方有一条 GPU 内存条,显示总量与预算的对比,例如 18.4 / 23.0 GB。组合太大时它会变红。在 Mac 上,这条才是关键的那条。界面上还会出现一条 RAM 条,在 Apple 芯片上它基本停在接近零的位置,因为模型本来就待在共享内存里。内存条旁边还会显示这套组合占用的 CPU 线程数:每个模型平均分到核心数,每个最多 8 个,这样多个模型不会在 CPU 上互相抢。

如果组合太大,会出现一行红字:“These models do not fit in memory together. Remove one or pick smaller ones.”。取消勾选一个,或者把大模型换成小模型,内存条会立刻更新。

第三步:保存

点击 Keep loaded。这个按钮只在你改动勾选之后出现,组合放不下时它保持禁用。

应用会为这套组合启动一个 llama.cpp 模型路由,并逐个加载模型。每个模型显示一个状态标记:先是 loading,然后变成 loaded。如果某个模型加载失败,它的标记会显示 failed,列表下方一行红字给出原因。

到这里就结束了,这套组合已经保存。下次应用启动时,它会自动重新加载同样的模型。想停止保留某个模型,取消勾选再点一次 Keep loaded。全部取消勾选并保存,就能把内存完全释放出来。

第四步:按名字调用保留的模型

网关在 http://127.0.0.1:7878/v1 上提供 OpenAI API。要访问某个保留模型,把它的 id 填进 model 字段。

先从模型列表里拿到 id:

curl http://127.0.0.1:7878/v1/models

每个保留模型都在这个列表里,带 "context_length": 16384,也就是它运行时的窗口大小。在任何兼容 OpenAI 的客户端里用这个 id:

from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:7878/v1", api_key="YOUR_API_KEY")
resp = client.chat.completions.create(
model="THE_MODEL_ID_FROM_V1_MODELS",
messages=[{"role": "user", "content": "Rename this variable to something clearer."}],
)
print(resp.choices[0].message.content)

如果你在 API keys 里开启了“需要 API key”,就按普通网关请求的方式带上密钥。请求里写 local、或者完全不写 model,仍然走应用自带的聊天模型,和以前一样。请求里写一个已下载但没有保留的模型,行为也和以前一样。

GET /v1/gateway/status 会在 kept_models 下列出当前保留的这套模型,脚本需要检查加载了什么时可以用它。

llama.cpp 更新时

Off Grid AI Desktop 更新引擎不需要发布新版本。新的 llama.cpp 到来时,你保留的模型不会在回答中途重启。界面会弹出一张卡片:“Engine update ready for kept models”,带一个 Restart models 按钮。等你不在等回复的时候再点它。

如果路由自己停了,应用会以 5 秒间隔最多重启 3 次。之后它保持停止,并在列表下方显示原因,直到你改动这套组合。

它做不到什么

  • 它不会让单个模型变快。在 Mac 上,每个保留模型共享同一块 GPU 和内存带宽,两个模型同时回答时,各自都比单独跑一个慢。
  • 每个保留模型一次只回答一个请求。发给同一个模型的第二个请求要等第一个结束。不同的保留模型之间可以并行回答。
  • 它不会提高上下文窗口。保留模型以 16,384 token 运行,即使你的聊天设置用了更大的值。
  • 它不允许你超额占用内存。如果这套组合放不进 Mac 内存的 75%,应用就不会启动它,也没有强制启动的选项。
  • 它服务的是通过网关进来的请求。应用内的聊天窗口仍然使用它自己的聊天模型。

常见问题

Mac 上能同时跑两个 LLM 吗?可以。在 Gateway > Keep loaded 下把两个都勾上,点 Keep loaded。只要 GPU 内存条还在预算之内,两个模型都留在内存里,按名字响应请求。

我的 Mac 能保留多少个本地模型?取决于模型大小和你的内存。应用按统一内存的约 75% 规划,再减去 1 GB 和已加载的聊天模型,所以一台 32 GB 的 Mac 大约有 23 GB 留给保留模型。保存之前,内存条会告诉你结果。

这和 Ollama 把模型留在内存里是一回事吗?效果相同:模型常驻,没有加载等待。Off Grid AI Desktop 还会在加载任何东西之前,先按你的 Mac 算好这套组合的尺寸,放不下的组合不会启动。

保留模型会让 Mac 变慢吗?它们占住的内存其他应用就用不了。组合接近预算时,视频剪辑这类吃内存的应用空间会更少。取消勾选并保存,就能把内存还回去。

Keep loaded 免费吗?免费。网关和 Keep loaded 都属于 Mac 上免费的 Off Grid AI Desktop 应用,不需要账号。