如何把多台设备拼成一台本地 AI 超算:exo 分布式集群实战指南
【免费下载链接】exoRun frontier AI locally.项目地址: https://gitcode.com/GitHub_Trending/exo8/exo
想跑一个参数量超过单台机器内存的大模型,与其把量化精度压到失真,不如换个思路:用 exo 把几台设备连成一套分布式 AI 集群,让模型被自动拆到多台机器上并行推理。exo 是一个主打"本地运行前沿 AI"的分布式计算框架,设备启动后自动互相发现,走 Thunderbolt 上的 RDMA 组网,支持张量并行(Tensor Parallelism)与 Pipeline 两种拆法,同时提供 OpenAI、Claude、Ollama 多套兼容 API 🧩
单机装不下大模型时,该找什么工具?
先把 exo 能带来的几个关键数字摆出来,方便你判断它值不值得折腾:
- 延迟:通过 Thunderbolt 5 上的 RDMA,设备间通信延迟降低 99%;
- 吞吐:张量并行下,2 台设备最高提速 1.8 倍,4 台设备最高提速 3.2 倍;
- 拆分:根据设备拓扑的实时视图(各节点资源 + 每条链路的延迟/带宽)自动决定模型怎么切,不用手动规划;
- 后端:推理基于 Apple 的 MLX,分布式通信走 MLX distributed;
- 接口:一套服务同时兼容 OpenAI Chat Completions、Claude Messages、OpenAI Responses 和 Ollama API,现有客户端基本不用改配置。
换句话说:内存不够就横向加机器,速度不够就再加机器——加机器这件事本身是变快而不是变慢,这正是 RDMA 带来的区别。
先让一台设备跑起来:装好 exo 并启动集群节点
exo 目前支持 macOS(Apple Silicon)和 Linux。macOS 需要 Tahoe 26.2+ 才能用上 RDMA,并且建议装好 Xcode(提供 Metal ToolChain,编译 MLX 用);Linux 侧目前跑在 CPU 上,GPU 支持还在路上。
准备依赖
两个平台都需要uv、node(构建内置 dashboard,Linux 要求 node 18+)和 Rust nightly(构建 Rust 绑定)。macOS 上一般用 Homebrew 一条命令装齐uv node,另外装一个macmon(Apple Silicon 硬件监控用)。
一条命令启动
依赖就绪后,把仓库拉下来、构建 dashboard、启动节点,就是下面这三行:
git clone https://gitcode.com/GitHub_Trending/exo8/exo cd exo/dashboard && npm install && npm run build && cd .. uv run exo启动后,这台设备会在http://localhost:52415同时提供 dashboard 和 API,之后所有交互都从这里进入。macOS 用户也可以不碰命令行:官方提供了一个常驻后台的菜单栏 App(要求 macOS Tahoe 26.2+),通过 Homebrew 的exocask 或官网 dmg 安装,首次运行会请求修改系统设置并安装一个网络配置 profile,属于正常行为。
接入多台设备:自动发现如何组网
🔌 第二台、第三台设备上重复上面三步即可,不需要任何手动配对:跑着 exo 的设备会自动发现彼此并加入同一集群。任意一台的 dashboard 都可以作为整个集群的控制台。
打开 dashboard 后,中央就是集群拓扑视图:
图中是 4 台 Mac Studio 组成的集群,每台标注了内存占用(约 172GB/512GB,34%)、CPU 占用、温度(35~38°C)和功耗(13~15W),虚线代表节点间的通信链路。拓扑是实时的,模型加载到哪个节点、占了多少内存,一目了然。
两个实用细节:
- 同一网络里想跑多个互不干扰的集群,可以设置
EXO_LIBP2P_NAMESPACE做命名空间隔离,避免设备误加入别人的集群; - 某台机器没有 GPU 资源但网络条件好时,用
uv run exo --no-worker以纯协调节点身份加入,只负责组网和调度,不参与推理。
Thunderbolt 5 + RDMA:把集群速度拉满
⚡ RDMA(Remote Direct Memory Access)是 macOS 26.2 新加入的能力,支持它的机型包括 M4 Pro Mac mini、M4 Max Mac Studio / MacBook Pro、M3 Ultra Mac Studio。启用流程只需进一次恢复模式:
- 关机后长按电源键 10 秒,直到启动菜单出现;
- 选"选项"进入恢复模式,从"实用工具"菜单打开终端;
- 输入
rdma_ctl enable回车; - 重启,之后 exo 会自动接管剩余配置。
这张图是 4 台 M3 Ultra Mac Studio 跑 Qwen3-235B(8-bit)的实测对比:单节点时 exo 与 llama.cpp(TCP)接近(19.5 对 20.4 t/s);到 2 节点,exo 反超到 26.2 t/s,而 llama.cpp 掉到 17.2;4 节点时 exo 达到 31.9 t/s,llama.cpp 只剩 15.2——普通 TCP 方案加机器反而更慢,RDMA 方案加机器持续变快,这就是前面那组提速数据(1.8x / 3.2x)的来源。
RDMA 有几条硬约束,不满足就退化回普通网络通信:
- 集群内设备必须两两直连(全互联),不能用交换机中转,线缆必须支持 TB5;
- Mac Studio 上,以太网口旁边那个 Thunderbolt 5 口不能用;
- 所有设备的 macOS 版本必须完全一致(连 beta 版本号都要一样),否则 RDMA 端口可能互相发现不了;
- 从源码运行时,用仓库里
tmp/set_rdma_network_config.sh脚本关掉 Thunderbolt Bridge 并给各 RDMA 口配好 DHCP。
从 Dashboard 到 API:装载模型开始对话
在 dashboard 上启动实例
打开http://localhost:52415,右侧 INSTANCE 面板点 LAUNCH INSTANCE,然后做四个选择:模型、Sharding(Pipeline 或 Tensor)、Instance Type(MLX Ring 或 MLX RDMA)、最小节点数,点启动即可:
界面左侧是聊天区,中间是集群拓扑(各节点内存、温度、功耗实时刷新),右侧 INSTANCES 面板列出了已加载的模型(图中 4×512GB M3 Ultra Mac Studio 同时跑着 DeepSeek v3.1 8-bit 与 Kimi-K2-Thinking 4-bit)以及 LAUNCH INSTANCE 配置项。加载完成后直接在左侧聊天框提问就行。
用 API 管理实例与请求
不想点界面就走 API。推荐顺序是:先用/instance/previews?model_id=...预览模型的所有合法放置方案(返回每种拆分下各节点占多少内存),挑一个后 POST 到/instance创建;创建是异步的,用/instance/await挂住 SSE 流,收到"type": "ready"再发推理请求。
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 AI?"}], "stream": true}'用完后curl -X DELETE http://localhost:52415/instance/<id>释放内存。同一套服务还暴露/v1/messages(Claude 格式)、/v1/responses(OpenAI Responses 格式)和/ollama/api/chat(Ollama 格式,可直接接 OpenWebUI 这类客户端);想跑 HuggingFace 上的自有模型,POST/models/add并传model_id即可,完整字段与响应见 API 文档。
避坑指南:新手最容易问的六个问题
💡 按"踩坑频率"从高到低列一下:
- Linux 为什么慢?当前 Linux 上 exo 跑在 CPU,GPU(CUDA)支持在开发中,Linux 集群目前更适合验证组网和流程,性能预期要放低。
- 模型文件放哪?默认在
~/.exo/models(macOS)或~/.local/share/exo/models(Linux)。想放到高速外置盘,启动时加EXO_MODELS_DIRS=/Volumes/ExternalSSD/exo-models uv run exo;多台机器共享同一份模型可以用EXO_MODELS_READ_ONLY_DIRS指向 NFS 挂载,那里的模型只读不可删。 - 断网能用吗?可以,
EXO_OFFLINE=true只加载本地已有模型,不访问网络。 - RDMA 组网失败?九成是版本或连接问题:OS 版本不一致、没全互联、用了不支持 TB5 的线、或误用了 Mac Studio 网口旁的那个 TB5 口,逐一排查即可。
- 自定义模型加载报错?需要
trust_remote_code的模型默认会被拒绝,出于安全考虑该开关默认关闭,确认信任该模型的远程代码后再显式打开。 - 怎么验证拆分方案快不快?仓库自带 bench/exo_bench.py,节点保持
uv run exo运行,指定模型、prompt 长度和生成长度,它会输出每种放置下的 prompt tps、generation tps 和峰值内存,帮你选最优拆分而不是靠猜。
六台设备、两根 TB5 线、一条uv run exo——这就是把分散的机器变成一台本地 AI 超算的全部成本。剩下的事情交给自动发现和拓扑感知的并行策略,你只需要盯着 dashboard 上那个越来越满的内存条。
【免费下载链接】exoRun frontier AI locally.项目地址: https://gitcode.com/GitHub_Trending/exo8/exo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考