exo 将你所有的设备连接成一个 AI 集群。它不仅支持运行超出单设备内存容量的大型模型,还通过 对 Thunderbolt 的 RDMA 提供 Day-0 支持,使得模型在添加更多设备时运行得更快。
exo 包含一个内置仪表盘,用于管理集群并与模型对话。
4 × 512GB M3 Ultra Mac Studio 运行 DeepSeek v3.1 (8-bit) 和 Kimi-K2-Thinking (4-bit)
来源: Jeff Geerling: 15 TB VRAM on Mac Studio – RDMA over Thunderbolt 5
来源: Jeff Geerling: 15 TB VRAM on Mac Studio – RDMA over Thunderbolt 5
来源: Jeff Geerling: 15 TB VRAM on Mac Studio – RDMA over Thunderbolt 5
运行 exo 的设备会自动发现彼此,无需任何手动配置。每个设备都提供一个 API 和一个仪表盘用于与集群交互(运行在 http://localhost:52415)。
有两种方式运行 exo:
如果你已安装 Nix,可以跳过下面大部分步骤,直接运行 exo:
nix run .#exo
注意: 要接受 Cachix 二进制缓存(并避免 Xcode Metal ToolChain),请在 /etc/nix/nix.conf 中添加:
trusted-users = root (或你的用户名)
experimental-features = nix-command flakes
然后重启 Nix 守护进程:sudo launchctl kickstart -k system/org.nixos.nix-daemon
先决条件:
- Xcode(提供 MLX 编译所需的 Metal ToolChain)
- brew(用于 macOS 上的简单包管理)
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- uv(用于 Python 依赖管理)
- macmon(用于 Apple Silicon 上的硬件监控)
- node(用于构建仪表盘)
bash
brew install uv macmon node
- rust(用于构建 Rust 绑定,目前需要 nightly 版本)
bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup toolchain install nightly
克隆仓库,构建仪表盘,然后运行 exo:
# 克隆 exo
git clone https://github.com/exo-explore/exo
# 构建仪表盘
cd exo/dashboard && npm install && npm run build && cd ..
# 运行 exo
uv run exo
这将在 http://localhost:52415/ 启动 exo 仪表盘和 API。
请查看关于 RDMA 的部分,以在 MacOS >=26.2 上启用此功能!
先决条件:
安装方法:
选项 1:使用系统包管理器(Ubuntu/Debian 示例):
# 安装 Node.js 和 npm
sudo apt update
sudo apt install nodejs npm
# 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# 安装 Rust(使用 rustup)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup toolchain install nightly
选项 2:在 Linux 上使用 Homebrew(如果偏好):
# 在 Linux 上安装 Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装依赖
brew install uv node
# 安装 Rust(使用 rustup)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup toolchain install nightly
注意: macmon 包仅适用于 macOS,Linux 不需要。
克隆仓库,构建仪表盘,然后运行 exo:
# 克隆 exo
git clone https://github.com/exo-explore/exo
# 构建仪表盘
cd exo/dashboard && npm install && npm run build && cd ..
# 运行 exo
uv run exo
这将在 http://localhost:52415/ 启动 exo 仪表盘和 API。
给 Linux 用户的重要提示: 目前,exo 在 Linux 上运行在 CPU 上。对 Linux 平台的 GPU 支持正在开发中。如果你希望看到对你特定 Linux 硬件的支持,请 搜索现有的功能请求 或创建一个新的。
配置选项:
--no-worker:运行 exo 时不包含工作组件。适用于仅作为协调器的节点,这些节点处理网络和编排但不执行推理任务。这对于没有足够 GPU 资源但网络连接良好的机器很有帮助。bash
uv run exo --no-worker
文件位置 (Linux):
exo 在 Linux 上遵循 XDG 基本目录规范:
~/.config/exo/(或 $XDG_CONFIG_HOME/exo/)~/.local/share/exo/(或 $XDG_DATA_HOME/exo/)~/.cache/exo/(或 $XDG_CACHE_HOME/exo/)你可以通过设置相应的 XDG 环境变量来覆盖这些位置。
exo 提供了一个在 Mac 后台运行的 macOS 应用程序。

macOS 应用程序需要 macOS Tahoe 26.2 或更高版本。
在此下载最新版本:EXO-latest.dmg。
该应用程序将请求修改系统设置和安装新网络配置文件的权限。我们正在改进此过程。
用于集群隔离的自定义命名空间:
macOS 应用程序包含一个自定义命名空间功能,允许你将 exo 集群与同一网络上的其他集群隔离。这是通过 EXO_LIBP2P_NAMESPACE 设置配置的:
防止意外加入集群
配置:在应用程序的“高级”设置中访问此设置(或在从源码运行时设置 EXO_LIBP2P_NAMESPACE 环境变量)
命名空间在启动时会记录,以便调试。
推荐通过应用程序本身卸载:点击菜单栏图标 → 高级 → 卸载。这将干净地移除所有系统组件。
如果你已经删除了应用程序,可以运行独立的卸载脚本:
sudo ./app/EXO/uninstall-exo.sh
这将移除:
- 网络设置 LaunchDaemon
- 网络配置脚本
- 日志文件
- "exo" 网络位置
注意: 你需要手动在系统设置 → 通用 → 登录项中移除 EXO。
RDMA 是 macOS 26.2 新增的功能。它适用于任何配备 Thunderbolt 5 的 Mac(M4 Pro Mac Mini、M4 Max Mac Studio、M4 Max MacBook Pro、M3 Ultra Mac Studio)。
请参考注意事项以进行即时故障排除。
要在 macOS 上启用 RDMA,请按照以下步骤操作:
rdma_ctl enable之后,RDMA 将在 macOS 中启用,exo 会处理其余的事情。
重要注意事项
tmp/set_rdma_network_config.sh 中的脚本,该脚本将禁用 Thunderbolt Bridge 并在每个 RDMA 端口上设置 dhcp。如果你更喜欢通过 API 与 exo 交互,这里有一个示例,创建一个小型模型 (mlx-community/Llama-3.2-1B-Instruct-4bit) 的实例,发送聊天补全请求并删除该实例。
1. 预览实例放置
/instance/previews 端点将预览模型的所有有效放置方案。
curl "http://localhost:52415/instance/previews?model_id=llama-3.2-1b"
示例响应:
{
"previews": [
{
"model_id": "mlx-community/Llama-3.2-1B-Instruct-4bit",
"sharding": "Pipeline",
"instance_meta": "MlxRing",
"instance": {...},
"memory_delta_by_node": {"local": 729808896},
"error": null
}
// ...可能还有更多放置方案...
]
}
这将返回此模型的所有有效放置方案。选择一个你喜欢的方案。
要选择第一个,可以通过 jq 管道处理:
curl "http://localhost:52415/instance/previews?model_id=llama-3.2-1b" | jq -c '.previews[] | select(.error == null) | .instance' | head -n1
2. 创建模型实例
向 /instance 发送 POST 请求,在 instance 字段中包含你期望的放置方案(完整负载必须匹配 CreateInstanceParams 中的类型),你可以从步骤 1 中复制:
curl -X POST http://localhost:52415/instance \
-H 'Content-Type: application/json' \
-d '{
"instance": {...}
}'
示例响应:
{
"message": "Command received.",
"command_id": "e9d1a8ab-...."
}
3. 发送聊天补全
现在,向 /v1/chat/completions 发送 POST 请求(格式与 OpenAI 的 API 相同):
curl -N -X POST http://localhost:52415/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "mlx-community/Llama-3.2-1B-Instruct-4bit",
"messages": [
{"role": "user", "content": "What is Llama 3.2 1B?"}
],
"stream": true
}'
4. 删除实例
完成后,通过其 ID 删除实例(可通过 /state 或 /instance 端点查找):
curl -X DELETE http://localhost:52415/instance/YOUR_INSTANCE_ID
其他有用的 API 端点:
curl http://localhost:52415/modelscurl http://localhost:52415/state更多详细信息,请参阅:
exo-bench 工具测量不同放置配置下模型的预填充和令牌生成速度。这有助于你优化模型性能并验证改进。
先决条件:
- 在基准测试之前,节点应已运行 uv run exo
- 该工具使用 /bench/chat/completions 端点
基本用法:
uv run bench/exo_bench.py \
--model Llama-3.2-1B-Instruct-4bit \
--pp 128,256,512 \
--tg 128,256
**关键