报告日期:2025 年(基于公开 GitHub 仓库最新状态) 研究对象:
- EXO:https://github.com/exo-explore/exo (Exo Labs)
- DNet:https://github.com/firstbatchxyz/dnet (firstbatchxyz)
两个项目都旨在解决单台 Mac Mini 内存不足以运行超大模型的问题,通过多台 Mac Mini 互联,利用 Apple Silicon 的统一内存(UMA)和 Thunderbolt 高带宽特性,实现跨设备模型分片(model sharding)和分布式推理。
核心价值:
- 本地隐私、无云成本
- 利用 Thunderbolt 5 / RDMA 实现低延迟互联
- 支持模型大小远超单机内存(甚至超过集群总内存)
- EXO:更通用、用户友好,强调自动发现 + Tensor Parallelism + 速度提升,适合快速搭建异构集群。
- DNet:更专注 Apple Silicon 极致优化,强调“无硬 OOM”(通过磁盘流式 + 计算/IO 重叠)和智能 MILP 求解器,适合极大规模或长上下文场景。
EXO 采用 Coordinator + Peer-to-Peer Workers 混合模式:
- Coordinator / Master Node:负责 API 服务、设备发现、拓扑计算、模型放置决策。
- Worker Nodes:每台 Mac 运行 shard,执行实际计算。
- 通信主要依赖 MLX Distributed(mlx.distributed)提供的 ring-based collectives(all-reduce、all-gather)。
- 零配置:设备启动后自动通过 mDNS / 局域网发现彼此。
- 实时 profiling:采集每台设备的 FLOPs、内存带宽、Thunderbolt 延迟/带宽。
- 动态生成 sharding plan(支持 Pipeline / Tensor 两种策略)。
-
Tensor Parallelism(张量并行)(主力加速手段)
- 将线性层(Linear)的权重矩阵按列/行切分到多台设备。
- 利用 MLX 的
shard_linear/shard_inplace实现。 - 实测数据(官方及社区):
- 2 台设备:~1.8×
- 4 台设备:~3.2×
- 依赖低延迟 RDMA 通信,否则通信开销会抵消加速收益。
-
Pipeline Parallelism(流水线并行)
- 按层切分模型,不同设备负责不同层。
- 适合内存容量扩展(模型 > 单机内存)。
- macOS 26.2+ 支持 RDMA。
- 延迟降低可达 99%。
- 这是 EXO 在多 M4 Pro Mac Mini 集群上取得优秀性能的关键。
- 首选后端:MLX(Apple 官方框架)
- 使用
mlx.distributed管理多 rank 进程组和通信原语。 - 环境变量调优:
EXO_FAST_SYNCH等 Metal 同步行为。 - 支持从 Hugging Face 加载自定义模型并自动量化。
- OpenAI Chat Completions 兼容
- Claude / Ollama 风格端点
- 内置 Dashboard(Web UI)用于集群可视化管理
基于 GitHub 仓库结构(最新 main 分支):
exo/
├── src/exo/
│ ├── master/ # Coordinator 逻辑
│ │ ├── api.py # FastAPI / OpenAI 兼容端点
│ │ ├── topology.py # 拓扑发现与 sharding plan 生成
│ │ └── placement.py # 模型放置决策(Tensor/Pipeline)
│ ├── inference/
│ │ ├── mlx/ # MLX 后端
│ │ │ ├── sharded_inference_engine.py # 核心分片推理引擎
│ │ │ └── distributed.py # MLX Distributed 封装
│ │ └── ...
│ ├── networking/
│ │ └── rdma.py # Thunderbolt RDMA 支持
│ └── ...
├── exo/ # Python 入口与 CLI
├── dashboard/ # 前端可视化(Node.js / React)
└── README.md
核心文件亮点:
sharded_inference_engine.py:实现权重切分、KV cache 管理、跨设备前向传播。topology.py:包含MlxRing元数据和预览接口(/instance/previews)。- 通信层大量使用 MLX 的分布式原语,避免手动实现 NCCL-like 逻辑。
- 每台 Mac 启动
exo(或 macOS App)。 - Coordinator 自动发现 workers。
- 用户通过 API 指定模型 → 系统生成多个 sharding preview。
- 选择 preview 后 POST
/instance触发加载。 - 推理请求到达 Coordinator → 按拓扑分发 → 各 shard 执行对应计算 → 聚合结果返回。
DNet 采用更清晰的 API Node + Shard Nodes 架构:
- dnet-api:中央协调器,负责发现、调用 distilp 求解器、准备拓扑、下发加载指令、提供 OpenAI API。
- dnet-shard:每台设备运行,暴露 gRPC(高性能层间通信)+ HTTP。
- 模型加载后形成 pipelined-ring 执行拓扑。
- 独立仓库:https://github.com/firstbatchxyz/distilp
- 本质是一个 MILP(Mixed-Integer Linear Programming) 求解器,名为 HALDA(Heterogeneous Assignment for Layer Distribution and Allocation)。
- 输入:
- 设备 profile(FLOPs、内存带宽、磁盘速度、Thunderbolt 延迟)
- 模型 profile(每层 compute cost、memory footprint、KV cache 大小)
- 输出:最优的 pipeline stage 数量 k、每台设备负责的层范围、ring 顺序。
- 目标函数:最小化端到端 latency,同时满足内存和通信约束。
这是 DNet 能运行“超总内存”模型的关键:
- 模型层在设备间形成环形流水线。
- 当前设备计算第 i 层时,后续设备可异步从磁盘/网络加载第 i+1 层。
- 大量使用 compute / I/O overlap + Apple UMA 的快速层交换。
- 灵感来源于 PRIMA.CPP 等项目。
- 无需静态配置,API 节点自动发现 shards。
/v1/prepare_topology→ 调用 distilp → 返回最优分配方案。/v1/load_model→ 按方案加载。- 即使模型 > 集群总 RAM,也能通过磁盘流式加载继续运行(性能会下降但不会 OOM)。
- gRPC 用于 shard 间高性能控制与数据传输。
- MLX 作为当前唯一后端(未来计划支持 NVIDIA/AMD)。
- 计划中的特性:Long-context 支持、Tensor Parallelism。
dnet/
├── dnet-api/ # 中央 API 服务(Python/FastAPI)
│ ├── main.py
│ ├── topology.py # 发现 + distilp 调用
│ └── openai_compat.py # OpenAI 兼容层
├── dnet-shard/ # 每设备 shard 服务
│ ├── shard.py # MLX 模型加载与执行
│ └── grpc_server.py # gRPC 接口
├── distilp/ # 求解器(子模块或独立仓库)
│ ├── halda_solver.py # MILP 建模与求解
│ └── profiler.py # 设备/模型 profiling
├── dnet-tui/ # Rust TUI 客户端(可选)
└── README.md
核心亮点:
distilp/halda_solver.py:MILP 建模(变量包括 layer assignment、stage count、device ordering)。shard.py:实现 pipelined-ring 的前向传播循环 + 磁盘流式加载逻辑。- gRPC 定义了高效的层间激活传递协议。
- 每台 Mac 启动
dnet-shard(指定端口)。 - 一台 Mac 启动
dnet-api。 - 调用
/v1/prepare_topology?model=...→ distilp 求解 → 返回 topology。 - 调用
/v1/load_model加载。 - 通过 OpenAI 兼容端点推理,请求在 pipelined-ring 中流动。
| 维度 | EXO | DNet | 胜出方(场景) |
|---|---|---|---|
| 并行策略 | Tensor Parallelism(主力)+ Pipeline | Pipelined-Ring(主力)+ 计划 Tensor | EXO(速度),DNet(容量) |
| 超大模型支持 | 较好(Pipeline) | 极佳(磁盘流式 + compute/IO overlap) | DNet |
| 智能调度 | 拓扑感知自动分片 | distilp(MILP 求解器) | DNet(异构集群) |
| 通信 | MLX Distributed + RDMA | gRPC + MLX | EXO(低延迟) |
| 易用性 | macOS App + Dashboard | TUI + API | EXO |
| 成熟度 | 较高(v1.0+) | Alpha(v0.0.1) | EXO |
| 长上下文 | 支持 | 规划中 | EXO(当前) |
| 异构设备支持 | 优秀 | 优秀(profile 驱动) | 平手 |
- MLX Distributed 的 ring 集体通信封装非常成熟,可直接复用。
/instance/previews接口设计优雅,让用户在多个 sharding 方案中选择。
- distilp 的 MILP 建模思路非常先进,适合复杂异构环境。
- Pipelined-ring + 磁盘流式加载是突破内存天花板的实用方案。
- 两者都高度依赖 Thunderbolt 5 + macOS 新版本,Wi-Fi/以太网场景性能衰减严重。
- 缺乏完善的容错与动态重平衡机制(节点掉线后恢复困难)。
- 监控与可观测性(Prometheus + Grafana)尚不完善。
EXO 和 DNet 都是当前最前沿的本地 Apple Silicon 分布式推理项目,它们从不同角度解决了“多 Mac Mini 跑大模型”的难题:
- EXO 更像“BitTorrent for LLMs” + 高速 Tensor Parallel 加速器,适合追求性能和易用性的用户。
- DNet 更像“生产级 Apple Silicon 集群操作系统”,在内存效率和智能调度上更激进。
两者都证明了:利用 Thunderbolt + UMA + MLX,可以在消费级硬件上实现原本只有数据中心才能做到的分布式推理。
报告撰写工具:基于公开 GitHub 仓库 README、代码结构、社区讨论及技术博客综合分析。
建议后续行动:克隆两个仓库,重点阅读 sharded_inference_engine.py(EXO)和 distilp/halda_solver.py(DNet),结合真实 M4 Mac Mini 集群进行 benchmark 验证。