OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  代码  ›  Exo — 分布式 GPU 推理框架

Exo — 分布式 GPU 推理框架

 
  omniai ·  2026-03-03 00:02:27 · 1 次点击  · 0 条评论  
exo logo exo:在本地运行前沿 AI 模型。由 [exo labs](https://x.com/exolabs) 维护。

Discord X License: Apache-2.0


exo 将你所有的设备连接成一个 AI 集群。它不仅支持运行超出单设备内存容量的大型模型,还通过 对 Thunderbolt 的 RDMA 提供 Day-0 支持,使得模型在添加更多设备时运行得更快。

特性

  • 自动设备发现:运行 exo 的设备会自动发现彼此,无需手动配置。
  • 基于 Thunderbolt 的 RDMA:exo 内置了对 Thunderbolt 5 的 RDMA 支持,可将设备间的延迟降低 99%。
  • 拓扑感知的自动并行:exo 根据设备拓扑的实时视图,找出在所有可用设备上分割模型的最佳方式。它会考虑设备资源以及每个链路间的网络延迟/带宽。
  • 张量并行:exo 支持模型分片,在 2 台设备上可实现高达 1.8 倍的加速,在 4 台设备上可实现高达 3.2 倍的加速。
  • MLX 支持:exo 使用 MLX 作为推理后端,并使用 MLX distributed 进行分布式通信。

仪表盘

exo 包含一个内置仪表盘,用于管理集群并与模型对话。

exo 仪表盘 - 集群视图,显示 4 台 M3 Ultra Mac Studio,加载了 DeepSeek v3.1 和 Kimi-K2-Thinking

4 × 512GB M3 Ultra Mac Studio 运行 DeepSeek v3.1 (8-bit) 和 Kimi-K2-Thinking (4-bit)

基准测试

Qwen3-235B (8-bit) 在 4 × M3 Ultra Mac Studio 上使用张量并行 RDMA 基准测试 - Qwen3-235B (8-bit) 在 4 × M3 Ultra Mac Studio 上使用张量并行 RDMA

来源: Jeff Geerling: 15 TB VRAM on Mac Studio – RDMA over Thunderbolt 5

DeepSeek v3.1 671B (8-bit) 在 4 × M3 Ultra Mac Studio 上使用张量并行 RDMA 基准测试 - DeepSeek v3.1 671B (8-bit) 在 4 × M3 Ultra Mac Studio 上使用张量并行 RDMA

来源: Jeff Geerling: 15 TB VRAM on Mac Studio – RDMA over Thunderbolt 5

Kimi K2 Thinking (原生 4-bit) 在 4 × M3 Ultra Mac Studio 上使用张量并行 RDMA 基准测试 - Kimi K2 Thinking (原生 4-bit) 在 4 × M3 Ultra Mac Studio 上使用张量并行 RDMA

来源: Jeff Geerling: 15 TB VRAM on Mac Studio – RDMA over Thunderbolt 5


快速开始

运行 exo 的设备会自动发现彼此,无需任何手动配置。每个设备都提供一个 API 和一个仪表盘用于与集群交互(运行在 http://localhost:52415)。

有两种方式运行 exo:

从源码运行 (macOS)

如果你已安装 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 上启用此功能!

从源码运行 (Linux)

先决条件:

  • uv(用于 Python 依赖管理)
  • node(用于构建仪表盘)- 版本 18 或更高
  • rust(用于构建 Rust 绑定,目前需要 nightly 版本)

安装方法:

选项 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 环境变量来覆盖这些位置。

macOS 应用程序

exo 提供了一个在 Mac 后台运行的 macOS 应用程序。

exo macOS 应用程序 - 在 MacBook 上运行

macOS 应用程序需要 macOS Tahoe 26.2 或更高版本。

在此下载最新版本:EXO-latest.dmg

该应用程序将请求修改系统设置和安装新网络配置文件的权限。我们正在改进此过程。

用于集群隔离的自定义命名空间:

macOS 应用程序包含一个自定义命名空间功能,允许你将 exo 集群与同一网络上的其他集群隔离。这是通过 EXO_LIBP2P_NAMESPACE 设置配置的:

  • 使用场景
  • 在同一网络上运行多个独立的 exo 集群
  • 将开发/测试集群与生产集群隔离
  • 防止意外加入集群

  • 配置:在应用程序的“高级”设置中访问此设置(或在从源码运行时设置 EXO_LIBP2P_NAMESPACE 环境变量)

命名空间在启动时会记录,以便调试。

卸载 macOS 应用程序

推荐通过应用程序本身卸载:点击菜单栏图标 → 高级 → 卸载。这将干净地移除所有系统组件。

如果你已经删除了应用程序,可以运行独立的卸载脚本:

sudo ./app/EXO/uninstall-exo.sh

这将移除:
- 网络设置 LaunchDaemon
- 网络配置脚本
- 日志文件
- "exo" 网络位置

注意: 你需要手动在系统设置 → 通用 → 登录项中移除 EXO。


在 macOS 上启用 RDMA

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,请按照以下步骤操作:

  1. 关闭你的 Mac。
  2. 按住电源按钮 10 秒钟,直到出现启动菜单。
  3. 选择“选项”进入恢复模式。
  4. 当恢复界面出现时,从“实用工具”菜单中打开终端。
  5. 在终端中,输入:
    rdma_ctl enable
    然后按回车键。
  6. 重新启动你的 Mac。

之后,RDMA 将在 macOS 中启用,exo 会处理其余的事情。

重要注意事项

  1. 希望成为 RDMA 集群一部分的设备必须连接到集群中的所有其他设备。
  2. 线缆必须支持 TB5。
  3. 在 Mac Studio 上,你不能使用以太网端口旁边的 Thunderbolt 5 端口。
  4. 如果从源码运行,请使用 tmp/set_rdma_network_config.sh 中的脚本,该脚本将禁用 Thunderbolt Bridge 并在每个 RDMA 端口上设置 dhcp。
  5. RDMA 端口可能无法在不同版本的 MacOS 上发现彼此。请确保所有设备上的操作系统版本完全匹配(即使是 beta 版本号)。

使用 API

如果你更喜欢通过 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/models
  • 检查实例 ID 和部署状态:curl 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

**关键

1 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor