Exo

把几台 Mac 连成集群,跑单机装不下的大模型开源

关于 Exo

exo 是 Exo Labs 维护的本地推理集群软件:把几台 Mac 用雷电线或局域网连起来,自动发现设备、切分模型,对外提供兼容 OpenAI、Claude 和 Ollama 的接口。现在的 exo 是 2025 年底重写的 1.x 版,2025-12-18 起以 Apache-2.0 发布,此前的旧版是 GPL-3.0,已归档。实际受支持的只有 Apple 芯片的 Mac;Linux 只能用 CPU 跑,手机不在支持之列。最新正式版 v1.0.71 发布于 2026-04-23,截至 2026-10-25 星标 48,036。它的 API 没有任何鉴权并监听所有网卡,维护者明确说这是设计如此。

Exo 界面截图

它是什么

exo 是一个把多台设备组成推理集群的开源软件。每台机器运行一个 exo 进程,进程之间自动发现彼此,再根据各自的内存、算力和连线情况,把一个大模型拆开分到几台机器上运行。对使用者来说,整个集群就像一台机器:浏览器打开 localhost:52415 能看到控制面板,程序可以按 OpenAI Chat Completions、OpenAI Responses、Claude Messages 或 Ollama 的格式调用它。

现在的 exo 是 1.x 版,推理后端只有苹果的 MLX,机器之间的通信用 MLX distributed;在装有 macOS 26.2 并带雷电 5 接口的 Mac 上,还能用 RDMA 直连。主体代码是 Python(要求 3.13),另有一部分 Rust 绑定,控制面板是网页前端,macOS 应用用 Swift 写成。仓库简介只有一句“Run frontier AI locally”(在本地运行前沿 AI)。

维护方是 Exo Labs。公司官网的问答写明,Exo Labs 是 exo 和 local.ai 背后的公司;仓库的许可证文件把版权方写作 Exo Technologies Ltd。VentureBeat 2024-11-14 的报道称公司成立于 2024 年 3 月,联合创始人是 Alex Cheema 和 Mohamed Baioumy。

截至 2026-10-25,GitHub 上星标 48,036、分叉 3,580,有 GitHub 账号的贡献者 98 个;未关闭的 issue 210 个、PR 213 个。主分支最后一次提交 bc412e2 在 2026-10-14 04:11 (UTC+8)。

这是有意为之,exo 的 API 不做鉴权。如果要对外暴露,请把 exo 放在反向代理后面,自己加上鉴权。

exo 维护团队成员在 issue #1833 中的回复(英文原文的中文译述)

核心能力

自动发现与组网。同一网络里运行 exo 的机器会自动找到彼此,不需要手写节点列表。这一项正式版和主分支不一样。最新正式版 v1.0.71(2026-04-23)的组网层是 libp2p,它的 README 第 230 行和第 303 行写明,要把自己的集群和同一网络里别人的集群隔开,就设置 EXO_LIBP2P_NAMESPACE,macOS 应用里在高级设置中填写。主分支在 2026-06-03 23:31 (UTC+8) 的提交 09f9ea3 把组网层换成了 zenoh,变量改名为 EXO_ZENOH_NAMESPACE,但这个变量此后只被写进日志,并没有起作用。2026-10-12 14:54 (UTC+8) 的提交 b1afa48 在说明里写道:换到 zenoh 以后,macOS 应用的命名空间设置被静默忽略,同一网络里版本相同的节点会全部并进一个集群。也就是说,从 2026-06-03 到 2026-10-12,按主分支源码运行的集群无法用这个变量隔离。该提交修好了这个问题,并把旧变量名保留为已弃用的备用名。zenoh 和该修复都还没有进入任何正式版。

按拓扑切分模型。README 说 exo 会根据实时的设备拓扑决定怎么切分模型,考虑每台机器的资源和每条连线的延迟与带宽。除了把不同层放到不同机器上,1.x 还支持张量并行,把同一层拆开算;README 给出的加速是 2 台最多 1.8 倍、4 台最多 3.2 倍。

雷电 5 上的 RDMA。macOS 26.2 加入了经雷电 5 的 RDMA,Jeff Geerling 的文章称这是 exo 1.0 的主打功能。README 称机器间延迟可降低 99%;Jeff Geerling 2025-12-18 的测试文章给出的数字是从约 300 微秒降到 50 微秒以下。该文用 4 台 M3 Ultra Mac Studio 测试,Qwen3 235B 在整个集群上约每秒 32 个词元,Kimi K2 Thinking 约每秒 30 个词元。

预填充与解码分开。Exo Labs 博客 2025-10-15 的文章演示了一种组合:用 NVIDIA DGX Spark 做算力密集的预填充,再把键值缓存逐层传给内存带宽更高的 Mac Studio 做解码。文中 Llama-3.1 8B、8,192 个词元提示的测试里,组合方案总耗时 2.32 秒,单用 M3 Ultra 是 6.42 秒,提速 2.8 倍。这项演示依赖 Linux 上的 CUDA,而公开版本在 Linux 上只支持 CPU。

接口兼容。四种接口格式让现有客户端几乎不用改就能接入;自定义模型可以从 Hugging Face 拉取。离线运行可设 EXO_OFFLINE,只用本地已有的模型。

适合谁 / 不适合谁

适合:

  • 手上已经有两台以上较新的 Apple 芯片 Mac、想跑单机内存放不下的大模型的个人或小团队。
  • 有雷电 5 机器、愿意折腾恢复模式和线缆、想要多机提速的人。
  • 需要在内网给 Claude Code、Cursor 一类工具提供本地模型接口的开发者,前提是自己能管好网络边界。
  • 研究分布式推理、想读一份可运行代码的工程师。

不适合:

  • 只有 NVIDIA 显卡或 Windows 电脑的用户:公开版本在 Linux 上只用 CPU,Windows 尚无计划内的近期支持。
  • 想把旧手机、平板凑进集群的人:那是 2024 年旧版的卖点,1.x 不支持。
  • 需要多用户鉴权、审计日志的团队:API 没有登录或令牌,维护者建议自己加反向代理。
  • 需要稳定发布节奏的生产环境:最新正式版是 2026-04-23 的 v1.0.71,到 2026-10-25 还没有新版本。

和同类比

和 llama.cpp 的 RPC 模式比。llama.cpp 同样能把模型分到多台机器上,方式是把不同层交给远端的 ggml-rpc-server,支持 CUDA、Metal、CPU 混搭。它自己的说明写明这一功能仍是概念验证,“脆弱且不安全”,不要在开放网络上运行。Jeff Geerling 2025-12-18 的文章说,llama.cpp 的 RPC 把各层分摊到节点上,“可扩展但低效”,在多数测试里随节点增加反而变慢;不过测 DeepSeek V3.1 时,llama.cpp 在两个节点上也有小幅提速,作者自己也觉得意外。同一篇文章里,exo 在 Qwen3 235B 测试中随节点增加变快,而且在 Geerling 比较的 llama.cpp 和 exo 两者中,当时只有 exo 支持 RDMA。作者测的是预发布软件,文中专门有一节“稳定性问题”,原话是它们“表现很好……前提是能正常运行”。llama.cpp 以 MIT 许可证免费发布,截至 2026-10-25 星标 132,278。

和 distributed-llama 比。这个项目同样主打“把家里的设备连成集群”,用张量并行,经以太网同步,支持 Linux、macOS 和 Windows,对 ARM 与 x86 的 CPU 做了优化,另有实验性的 Vulkan 支持。它以 MIT 许可证免费发布,截至 2026-10-25 星标 3,114。硬件覆盖面比 exo 宽,模型列表比 exo 窄,需要先转换成自己的格式。

和 GPUStack 比。GPUStack 面向 GPU 服务器集群,调度 vLLM、SGLang 等推理引擎,偏向机房运维。它以 Apache-2.0 免费发布,截至 2026-10-25 星标 5,886。

价格依据:llama.cpp、distributed-llama、GPUStack 和 exo 都按各自仓库标注的开源许可证免费使用,成本主要在硬件。exo 的差别是利用 Mac 的统一内存和雷电 5 的 RDMA,代价是几乎只能在 Mac 上用。

上手路径

官方提供 macOS 应用。从 GitHub Releases 下载 v1.0.71 的 dmg(约 413 MB),或用 Homebrew 安装 exo 这个 cask。以下步骤来自正式版 v1.0.71 的 README。应用在后台运行,首次启动会弹窗说明要安装系统服务,用户可以点“Not Now”暂不安装;点安装并输入管理员密码后,会装上一个名为 io.exo.networksetup 的系统级 LaunchDaemon。它在加载时运行一次,之后每 1,786 秒再运行一次,每次都会创建并切换到名为 exo 的网络位置,关闭雷电网桥,并用 PlistBuddy 从系统网络配置里删掉 bridge0,以防网络环路。所以用户手动打开的雷电网桥,会在下一次运行时被重新关掉。卸载时在仓库目录里执行 sudo ./app/EXO/uninstall-exo.sh,脚本会停掉这个守护进程,并切回“自动”网络位置。

系统要求在不同地方写法不一:README 和 Exo Labs 官网问答都写应用需要 macOS Tahoe 26.2 或更新;Homebrew 页面写 macOS 15 以上、仅限 arm64;应用自动更新源里写最低 15.1。RDMA 需要 macOS 26.2。

从源码运行。按 v1.0.71 的 README,macOS 上需要 uv、Node、Rust 和 Xcode 的 Metal 工具链,克隆仓库、构建控制面板后执行 uv run exo;装了 Nix 的,在克隆下来的仓库目录里执行 nix run .#exo。Linux 上同样从源码构建后执行 uv run exo,只用 CPU。主分支 2026-10-14 的 README 改成先用 uv sync --extra mlx-cpu 安装 CPU 后端,并提示 NVIDIA 用户改用 mlx-cuda13 或 mlx-cuda12;这些选项名来自 2026-05-13 的提交 4466cd5,v1.0.71 的 pyproject.toml 里对应的选项叫 cuda12 和 cuda13。按源码运行时,隔离集群的变量在正式版是 EXO_LIBP2P_NAMESPACE,在主分支是 EXO_ZENOH_NAMESPACE。

按 README,开启 RDMA 需要关机后长按电源键 10 秒进入启动选项,在恢复模式的终端里运行 rdma_ctl enable,再重启。README 列出的注意事项:参与 RDMA 的每台机器都要和其他所有机器直连;线缆要支持雷电 5;Mac Studio 上紧挨网口的那个雷电 5 口不能用;所有机器的 macOS 版本要完全一致,连测试版号也要相同。

接入工具。控制面板和 API 都在 52415 端口,OpenAI 或 Ollama 客户端把地址改到这个端口即可接入。

定价与许可证

软件免费。exo 以 Apache-2.0 发布,个人和商业使用都不收费,代码里没有许可证密钥或激活检查。Exo Labs 官网有“EXO for Business”入口,企业版需联系销售询价:填写询价表单或写信到 sales@exolabs.net。公司融资:VentureBeat 2024-11-14 报道称已获私人投资者投资。

真正的成本在硬件。Jeff Geerling 2025-12-18 的文章给出所用配置的价格:512 GB 统一内存、32 核 CPU 的 M3 Ultra Mac Studio 每台 11,699 美元,256 GB 的每台 8,099 美元,两种各两台,原文称整套“略低于 4 万美元”;这些机器由苹果借出。价格依据是该文所列的单台售价,未含线缆和机架。

许可证历史。主仓库最早的许可证文件由 Alex Cheema 在 2024-07-17 05:06 (UTC+8) 的提交 bde1e53(“add license”)加入,是 GPL-3.0 全文。2025-12-17 23:31 (UTC+8) 的提交 0fcee70(“prep repo for v1”)删除了旧代码和这份许可证,旧代码转到已归档的 ex-exo 仓库,该仓库仍是 GPL-3.0。新的 1.x 代码来自另一条独立的提交历史,最早一笔是 2025-06-15 的提交,与旧代码没有共同祖先;它在 2025-12-18 21:46 (UTC+8) 合并进主分支。Jake Hillion 在 2025-12-18 22:35 (UTC+8) 的提交 57d3813(“re-add LICENSE”)加入 Apache-2.0 全文;2025-12-19 04:24 (UTC+8) 的提交 9e2bdee 把版权行补成“Copyright 2025 Exo Technologies Ltd”。按提交时间计,主分支在 2025-12-17 23:31 (UTC+8) 到 2025-12-18 22:35 (UTC+8) 之间没有许可证文件。GitHub 识别的仓库许可证为 Apache-2.0。

依赖层面:1.x 依赖 transformers、torch、MLX 等第三方包,各自许可证不同,pyproject.toml 没有汇总。

风险与局限

API 没有鉴权。代码把 API 绑定在 0.0.0.0,即所有网卡;没有登录、令牌或密钥检查;跨域设置允许任意来源并允许携带凭据。CVE-2026-50759 针对的就是这一点:攻击者先用 GET /state 列出所有模型实例,再用 DELETE /instance/{id} 逐个删除,使集群上的推理中断。利用前提是攻击者能连到某台机器的 52415 端口,比如处在同一局域网,或者端口被转发到了公网;不需要账号,也不需要用户操作。这条记录由 MITRE 分配,记录日期 2026-07-21,描述写的是 1.0.69;记录里的 CVSS 3.1 评分 7.5(高)来自 CISA-ADP,MITRE 和 NVD 都没有给分。报告者在 2026-04-02 16:26 (UTC+8) 提交了 issue #1833;当天 22:20 (UTC+8),维护团队成员回复说这是有意为之,exo 的 API 就是不鉴权的,要对外暴露请放在反向代理后面自己加鉴权,并以“不计划处理”关闭。2026-10-25 主分支的代码仍是这样,因此 1.0.71 和主分支同样适用。同样无需鉴权的还有添加自定义模型、开始下载、删除下载等接口。

视觉缓存键缺少尺寸。CVE-2026-14738 指出,视觉模型的特征缓存只对图像的原始像素字节做 SHA-256,不含宽高,两张像素字节相同但尺寸不同的图片(例如 6×4 与 4×6)会命中同一条缓存,得到按另一张图算出的特征,回答因此出错。利用前提是攻击者能向同一个运行视觉模型的实例发请求,并且构造出与目标图片像素字节完全相同、尺寸不同的图片,难度高。这条记录由 VulDB 分配并评分,受影响范围写作“最高到 1.0.71”,2026-07-05 18:15 (UTC+8) 发布:CVSS 3.1 为 3.7(低);CVSS 4.0 在记录里写作 6.3,NVD 页面对同一来源的 4.0 向量显示为 2.9。修复 PR #2152 于 2026-06-05 11:18 (UTC+8) 提出,截至 2026-10-25 仍未合并,主分支的 _image_cache_key 没有改。

远程代码。README 写“需要 trust_remote_code 的自定义模型必须显式开启(默认关闭)”。代码里,从 Hugging Face 拉来的自定义模型确实默认关闭;但模型卡的这个字段默认开启,仓库 resources/inference_model_cards/ 下的内置模型卡都没有写这个字段,因此全部按开启处理,这些卡对应的是项目自己挑选的模型仓库。常量 TRUST_REMOTE_CODE 也设为开启,旁边的注释写着“应该改成需要主动开启,但 Kimi 需要”。视觉模型加载图像处理器时,前两种方式都失败后的兜底路径(vision.py 第 352 至 353 行)固定传入开启,不看模型卡怎么设。v1.0.71 的代码与此相同(model_cards.py 第 150 行与第 228 行、constants.py 第 16 行、vision.py 第 353 行)。实际含义是:加载模型时,模型仓库里的 Python 代码可能在本机执行。

平台支持比宣传窄。PLATFORMS.md 的一级支持只有 Apple 芯片的 Mac Studio M3 Ultra、Mac mini M4 Pro、MacBook Pro M5 和 M4 Max;Linux 的 CUDA 和 CPU 支持都列在“计划中”,Windows 是“更长远”。主分支的 README 一面写 Linux 目前只用 CPU,一面在安装命令里提示 NVIDIA 用户改用 mlx-cuda13 或 mlx-cuda12,主分支的 pyproject.toml 也确实有这两个选项;v1.0.71 的 README 只写 Linux 用 CPU。

维护节奏。v1.0.71 之后到 2026-10-25 没有新的正式版。主分支在 2026-06-22 21:38 (UTC+8) 之后、2026-10-12 14:54 (UTC+8) 之前只有 2026-08-26 的一个文档提交。2026 年 10 月的提交都在 10-12 到 10-14,作者都是 Alex Cheema。这些改动都还在主分支上。

代码里能看到的数据外发。代码里没有使用统计或崩溃自动上报的组件。macOS 应用菜单里有“Share Bug Report…”,用户点击后才会把日志、事件日志和集群状态上传到 reports.exolabs.net;自动更新通过 Sparkle 读取 assets.exolabs.net 上的更新源。

来龙去脉

2024 年的旧版。主仓库第一个提交由 Alex Cheema 在 2024-06-24 06:28 (UTC+8) 提交。那时的 exo 主打“用家里的日常设备组集群”:2025-10-31 02:59 (UTC+8) 的提交 5f18fae 里,旧 README 仍写着支持 iPhone、iPad、Android、Mac、NVIDIA 显卡和树莓派,推理后端有 tinygrad 和 MLX 两种,许可证是 GPL-3.0。旧版的 alpha 版本现在只以 Git 标签形式保留,截至 2026-10-25,GitHub Releases 页面只列出 16 个 1.x 版本。之后旧代码线几乎停住;同一时期,新代码在另一条独立历史里推进。

重写。新代码从 2025-06-15 起在另一条独立历史里开发,2025-12-18 合并进主分支。合并当天,旧代码移到 ex-exo 归档,许可证从 GPL-3.0 换成 Apache-2.0,macOS 应用和构建流程也一并公开。Jeff Geerling 同日发文,称 exo 1.0 “今天发布”,主打雷电 5 上的 RDMA,测试机器由苹果借出;同文也写道,开发者曾“消失了一段时间”,因此作者对 exo 仍有些信任上的疑虑。正式发布从 2025-12-22 22:17 (UTC+8) 的 v1.0.60-alpha0 开始,v1.0.71 在 2026-04-23 23:04 (UTC+8) 发布。

2026 年下半年。2026-06-03 主分支换了组网层,之后进入长时间空档,换层导致的命名空间失效到 2026-10-12 才修好。10-12 到 10-14 集中提交了一批改动,包括控制面板和 macOS 应用的使用体验修补、网络、节点发现和选主相关的修复,以及命令行的小改动,都还没有发布成正式版。公司方面,官网把重点放在 DGX Spark 与 Mac Studio 组合和企业服务上,博客 2026-09-15 的新文章讨论的是跨慢速网络的训练。

我们的判断

在“用几台 Mac 跑单机放不下的模型”这件事上,在 llama.cpp RPC、distributed-llama、GPUStack 这几个开源方案中,exo 同时具备自动组网、按拓扑切分、张量并行和雷电 5 的 RDMA;在 Jeff Geerling 2025-12-18 比较的 llama.cpp 和 exo 两者中,只有 exo 支持 RDMA。同一测试中 exo 节点越多越快,llama.cpp 的 RPC 方式在多数测试里随节点增加变慢。但那是一位作者在预发布软件上的测试,文中也记下了稳定性问题。软件以 Apache-2.0 免费发布,钱主要花在硬件上。

它的限制:第一,平台几乎只有 Apple 芯片的 Mac,旧版宣传的手机、安卓和 NVIDIA 支持在 1.x 里都不存在,Linux 只能用 CPU。第二,API 不鉴权、监听所有网卡、允许任意跨域来源,维护者明确不打算改;视觉缓存的问题有现成修复,PR 截至 2026-10-25 仍未合并。第三,最新正式版是 2026-04-23 的 v1.0.71,之后到 2026-10-25 没有新版本;主分支此后换了组网层,又集中修了一批问题,这些改动都不在正式版里,而 10 月的提交集中在三天、出自一人。

维护者的说法是,要对外暴露 API,应放在带鉴权的反向代理后面自己加鉴权;llama.cpp 和 distributed-llama 也支持 Mac 以外的硬件。

亮点

Exo 把几台 Apple 芯片的 Mac 连成一个 AI 集群,跑任何一台都装不下的模型。装了 exo 的机器会在网络里互相发现,它再根据每台机器的内存和机器之间的链路,实时决定怎么切分模型:可以按层切分,也可以用张量并行,README 写的是两台设备最多提速 1.8 倍、四台 3.2 倍。机器之间用雷电 5 连接时,它走 RDMA,项目称设备间延迟因此降低 99%。推理由 MLX 完成,集群对外提供 OpenAI、Claude 和 Ollama 兼容接口,还自带一个控制面板。

Alex Cheema 在 2024 年开始做它,想把人们手里已有的几台机器的内存合起来用。2025 年 12 月发布的 1.x 是一次重写:主体用 Python 写在 MLX 之上,另有 Rust 组件、Swift 写的 macOS 应用和 Svelte 写的控制面板,现在由 Exo Labs 维护。

它把单台 Mac 放不下的模型分到几台 Apple 芯片 Mac 上运行,按每台机器的内存切分,并提供兼容 OpenAI、Claude 和 Ollama 的 API。

资料来源

官方

  1. GitHub - exo-explore/exo: Run frontier AI locally.GitHub · 访问于 2026 年 10 月 25 日
  2. exo/README.md at bc412e2230f395e652c23426a5eb88dfa515769b · exo-explore/exoGitHub · 访问于 2026 年 10 月 25 日
  3. exo/PLATFORMS.md at bc412e2230f395e652c23426a5eb88dfa515769b · exo-explore/exoGitHub · 访问于 2026 年 10 月 25 日
  4. exo/pyproject.toml at bc412e2230f395e652c23426a5eb88dfa515769b · exo-explore/exoGitHub · 访问于 2026 年 10 月 25 日
  5. exo/LICENSE at bc412e2230f395e652c23426a5eb88dfa515769b · exo-explore/exoGitHub · 访问于 2026 年 10 月 25 日
  6. add license · exo-explore/exo@bde1e53GitHub · 访问于 2026 年 10 月 25 日
  7. prep repo for v1 · exo-explore/exo@0fcee70GitHub · 访问于 2026 年 10 月 25 日
  8. re-add LICENSE · exo-explore/exo@57d3813GitHub · 访问于 2026 年 10 月 25 日

动态与深度阅读