exo-explore/exo

GitHub: exo-explore/exo

将多台设备自动组建为分布式 AI 推理集群,在本地运行单机无法容纳的前沿大模型。

Stars: 42402 | Forks: 2912

exo logo exo: 在本地运行前沿 AI。由 [exo labs](https://x.com/exolabs) 维护。

Discord X License: Apache-2.0

exo 将你所有的设备连接成一个 AI 集群。exo 不仅能够运行那些单台设备无法容纳的大模型,而且凭借[对 Thunderbolt 上 RDMA 的首发支持](https://x.com/exolabs/status/2001817749744476256?s=20),随着你添加更多设备,模型运行速度会变得更快。 ## 功能特性 - **自动设备发现**:运行 exo 的设备会自动互相发现——无需手动配置。 - **Thunderbolt 上的 RDMA**:exo [首发支持 Thunderbolt 5 上的 RDMA](https://x.com/exolabs/status/2001817749744476256?s=20),可将设备间的延迟降低 99%。 - **拓扑感知自动并行**:exo 基于设备拓扑的实时视图,找出在所有可用设备上拆分模型的最佳方式。它会考虑设备资源以及每个链路之间的网络延迟/带宽。 - **Tensor 并行**:exo 支持模型分片,在 2 台设备上可实现高达 1.8 倍的加速,在 4 台设备上可实现 3.2 倍的加速。 - **MLX 支持**:exo 使用 [MLX](https://github.com/ml-explore/mlx) 作为推理后端,并使用 [MLX distributed](https://ml-explore.github.io/mlx/build/html/usage/distributed.html) 进行分布式通信。 - **多种 API 兼容性**:兼容 OpenAI Chat Completions API、Claude Messages API、OpenAI Responses API 和 Ollama API —— 使用你现有的工具和客户端即可。 - **自定义模型支持**:从 HuggingFace hub 加载自定义模型,以扩展可用模型的范围。 ## 仪表盘 exo 包含一个内置仪表盘,用于管理你的集群并与模型聊天。

exo dashboard - cluster view showing 4 x M3 Ultra Mac Studio with DeepSeek v3.1 and Kimi-K2-Thinking loaded

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

## 基准测试
Qwen3-235B (8-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA Benchmark - Qwen3-235B (8-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA

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

DeepSeek v3.1 671B (8-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA Benchmark - DeepSeek v3.1 671B (8-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA

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

Kimi K2 Thinking (native 4-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA Benchmark - Kimi K2 Thinking (native 4-bit) on 4 × M3 Ultra Mac Studio with Tensor Parallel RDMA

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

## 快速开始 运行 exo 的设备会自动互相发现,无需任何手动配置。每台设备都提供 API 和仪表盘,用于与你的集群交互(运行在 `http://localhost:52415`)。 有两种方式运行 exo: ### 从源码运行 如果你安装了 [Nix](https://nixos.org/),可以跳过下面的大部分步骤,直接运行 exo: ``` nix run .#exo ``` **注意:** 要接受 Cachix 二进制缓存(并避免安装 Xcode Metal ToolChain),请添加到 `/etc/nix/nix.conf`: ``` trusted-users = root (or your username) experimental-features = nix-command flakes ``` 然后重启 Nix daemon:`sudo launchctl kickstart -k system/org.nixos.nix-daemon` **前置条件:** - [Xcode](https://developer.apple.com/xcode/)(提供 MLX 编译所需的 Metal ToolChain) - [brew](https://github.com/Homebrew/brew)(用于 macOS 上的简单软件包管理) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - [uv](https://github.com/astral-sh/uv)(用于 Python 依赖管理) - [macmon](https://github.com/vladkens/macmon)(用于 Apple Silicon 上的硬件监控) - [node](https://github.com/nodejs/node)(用于构建仪表盘) brew install uv macmon node - [rust](https://github.com/rust-lang/rustup)(用于构建 Rust 绑定,目前需要 nightly 版本) 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 # 构建 dashboard cd exo/dashboard && npm install && npm run build && cd .. # 运行 exo uv run exo ``` 这将在 http://localhost:52415/ 启动 exo 仪表盘和 API *请查看关于 RDMA 的章节以在 MacOS >=26.2 上启用此功能!* ### 从源码运行 **前置条件:** - [uv](https://github.com/astral-sh/uv)(用于 Python 依赖管理) - [node](https://github.com/nodejs/node)(用于构建仪表盘)- 版本 18 或更高 - [rust](https://github.com/rust-lang/rustup)(用于构建 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 # 构建 dashboard 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 硬件,请[搜索现有的功能请求](https://github.com/exo-explore/exo/issues)或创建一个新的。 **配置选项:** - `--no-worker`:运行不含 worker 组件的 exo。适用于仅作为协调器的节点,这些节点处理网络和编排,但不执行推理任务。这对于没有足够 GPU 资源但网络连接良好的机器很有用。 uv run exo --no-worker **文件位置:** exo 在 Linux 上遵循 [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html): - **配置文件**:`~/.config/exo/`(或 `$XDG_CONFIG_HOME/exo/`) - **数据文件**:`~/.local/share/exo/`(或 `$XDG_DATA_HOME/exo/`) - **缓存文件**:`~/.cache/exo/`(或 `$XDG_CACHE_HOME/exo/`) - **日志文件**:`~/.cache/exo/exo_log/`(带自动日志轮转) - **自定义模型卡**:`~/.local/share/exo/custom_model_cards/` 你可以通过设置相应的 XDG 环境变量来覆盖这些位置。 ### macOS 应用 exo 提供了一个 macOS 应用程序,可以在你的 Mac 上后台运行。 exo macOS App - running on a MacBook 该 macOS App 需要 macOS Tahoe 26.2 或更高版本。 在此下载最新构建版本:[EXO-latest.dmg](https://assets.exolabs.net/EXO-latest.dmg)。 该应用将请求修改系统设置和安装新网络配置文件的权限。这方面的改进正在进行中。 **用于集群隔离的自定义 Namespace:** macOS App 包含一项自定义 namespace 功能,允许你将 exo 集群与同一网络上的其他集群隔离。这是通过 `EXO_LIBP2P_NAMESPACE` 设置配置的: - **使用场景**: - 在同一网络上运行多个独立的 exo 集群 - 将开发/测试集群与生产集群隔离 - 防止意外加入集群 - **配置**:在 App 的高级设置中访问此设置(或在从源码运行时设置 `EXO_LIBP2P_NAMESPACE` 环境变量) 该 namespace 会在启动时记录以供调试。 #### 卸载 macOS App 推荐的卸载方式是通过 App 本身:点击菜单栏图标 → Advanced → Uninstall。这将干净地移除所有系统组件。 如果你已经删除了 App,可以运行独立的卸载脚本: ``` 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. 选择“Options”进入恢复模式。 4. 当恢复界面出现时,从 Utilities 菜单中打开 Terminal。 5. 在 Terminal 中输入: rdma_ctl enable 并按 Enter。 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. 不同版本的 MacOS 上的 RDMA 端口可能无法互相发现。请确保所有设备上的 OS 版本完全一致(即使是 beta 版本号)。 ## 环境变量 exo 支持多个用于配置的环境变量: | 变量 | 描述 | 默认值 | |----------|-------------|---------| | `EXO_MODELS_PATH` | 搜索预下载模型的路径(以冒号分隔)(例如,在 NFS 挂载或共享存储上) | None | | `EXO_MODELS_DIR` | exo 下载和存储模型的目录 | `~/.local/share/exo/models` (Linux) 或 `~/.exo/models` (macOS) | | `EXO_OFFLINE` | 在无互联网连接下运行(仅使用本地模型) | `false` | | `EXO_ENABLE_IMAGE_MODELS` | 启用图像模型支持 | `false` | | `EXO_LIBP2P_NAMESPACE` | 用于集群隔离的自定义 namespace | None | | `EXO_FAST_SYNCH` | 控制 MLX_METAL_FAST_SYNCH 行为(用于 JACCL 后端) | Auto | | `EXO_TRACING_ENABLED` | 启用分布式追踪以进行性能分析 | `false` | **示例用法:** ``` # 使用来自 NFS 挂载的预下载 models EXO_MODELS_PATH=/mnt/nfs/models:/opt/ai-models uv run exo # 在离线模式下运行 EXO_OFFLINE=true uv run exo # 启用图像模型 EXO_ENABLE_IMAGE_MODELS=true uv run exo # 使用自定义 namespace 进行集群隔离 EXO_LIBP2P_NAMESPACE=my-dev-cluster uv run exo ``` ### 使用 API exo 提供了多种兼容 API 的接口,以最大程度地与现有工具兼容: - **OpenAI Chat Completions API** - 兼容 OpenAI 客户端 - **Claude Messages API** - 兼容 Anthropic 的 Claude 格式 - **OpenAI Responses API** - 兼容 OpenAI 的 Responses 格式 - **Ollama API** - 兼容 Ollama 和 OpenWebUI 等工具 如果你更喜欢通过 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 } // ...possibly more placements... ] } ``` 这将返回此模型的所有有效部署位置。选择一个你喜欢的位置。 要选择第一个,可以通过管道传给 `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` 字段中填入你想要的部署位置(完整的 payload 类型必须与 `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 ``` ### Claude Messages API 兼容性 使用 `/v1/messages` 端点的 Claude Messages API 格式: ``` curl -N -X POST http://localhost:52415/v1/messages \ -H 'Content-Type: application/json' \ -d '{ "model": "mlx-community/Llama-3.2-1B-Instruct-4bit", "messages": [ {"role": "user", "content": "Hello"} ], "max_tokens": 1024, "stream": true }' ``` ### OpenAI Responses API 兼容性 使用 `/v1/responses` 端点的 OpenAI Responses API 格式: ``` curl -N -X POST http://localhost:52415/v1/responses \ -H 'Content-Type: application/json' \ -d '{ "model": "mlx-community/Llama-3.2-1B-Instruct-4bit", "messages": [ {"role": "user", "content": "Hello"} ], "stream": true }' ``` ### Ollama API 兼容性 exo 支持 Ollama API 端点,以兼容 OpenWebUI 等工具: ``` # Ollama 聊天 curl -X POST http://localhost:52415/ollama/api/chat \ -H 'Content-Type: application/json' \ -d '{ "model": "mlx-community/Llama-3.2-1B-Instruct-4bit", "messages": [ {"role": "user", "content": "Hello"} ], "stream": false }' # 列出 models (Ollama 格式) curl http://localhost:52415/ollama/api/tags ``` ### 从 HuggingFace 加载自定义模型 你可以从 HuggingFace hub 添加自定义模型: ``` curl -X POST http://localhost:52415/models/add \ -H 'Content-Type: application/json' \ -d '{ "model_id": "mlx-community/my-custom-model" }' ``` **安全提示:** 配置中需要 `trust_remote_code` 的自定义模型必须显式启用(默认为 false)以确保安全。仅在你信任模型的远程代码执行时才启用此功能。模型从 HuggingFace 获取并作为自定义模型卡本地存储。 **其他有用的 API 端点*:** - 列出所有模型:`curl http://localhost:52415/models` - 仅列出已下载的模型:`curl http://localhost:52415/models?status=downloaded` - 搜索 HuggingFace:`curl "http://localhost:52415/models/search?query=llama&limit=10"` - 查看实例 ID 和部署状态:`curl http://localhost:52415/state` 更多详情,请参阅: - [docs/api.md](docs/api.md) 中的 API 文档。 - [src/exo/master/api.py](src/exo/master/api.py) 中的 API 类型和端点。 ## 性能测试 `exo-bench` 工具用于测量不同部署配置下的模型预填充和 token 生成速度。这有助于你优化模型性能并验证改进效果。 **前置条件:** - 在进行性能测试之前,节点应已通过 `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 ``` **关键参数:** - `--model`:要测试的模型(短 ID 或 HuggingFace ID) - `--pp`:提示词大小提示(逗号分隔的整数) - `--tg`:生成长度(逗号分隔的整数) - `--max-nodes`:将部署限制为 N 个节点(默认值:4) - `--instance-meta`:按 `ring`、`jaccl` 或 `both` 筛选(默认值:both) - `--sharding`:按 `pipeline`、`tensor` 或 `both` 筛选(默认值:both) - `--repeat`:每个配置的重复次数(默认值:1) - `--warmup`:每次部署的预热运行次数(默认值:0) - `--json-out`:结果输出文件(默认值:bench/results.json) **带筛选的示例:** ``` uv run bench/exo_bench.py \ --model Llama-3.2-1B-Instruct-4bit \ --pp 128,512 \ --tg 128 \ --max-nodes 2 \ --sharding tensor \ --repeat 3 \ --json-out my-results.json ``` 该工具输出性能指标,包括每秒提示词 token 数、每秒生成 token 数 以及每种配置的峰值内存使用量。 ## 硬件加速器支持 在 macOS 上,exo 使用 GPU。在 Linux 上,exo 目前运行于 CPU。我们正在努力扩展硬件加速器支持。如果你希望支持新的硬件平台,请[搜索现有的功能请求](https://github.com/exo-explore/exo/issues)并点赞,以便我们了解社区关注哪些硬件。 ## 贡献 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解如何为 exo 做贡献的指南。
标签:AI集群, Apache-2.0, Apex, Apple Silicon, MacOS, MITM代理, MLX, Python, RDMA, Thunderbolt, XML注入, 人工智能, 分布式推理, 分布式计算, 可视化界面, 大模型推理, 开源, 异常处理, 张量并行, 无后门, 本地AI, 机器学习, 模型分片, 流量捕获, 用户模式Hook绕过, 网络拓扑, 设备发现, 资源调度, 边缘计算, 逆向工具, 高性能计算