exo README

The project's README from github.com/exo-explore/exo. As one markdown file: README.md.

exo logo

exo: Run frontier AI locally. Maintained by exo labs.

Discord X License: Apache-2.0


exo connects all your devices into an AI cluster. Not only does exo enable running models larger than would fit on a single device, but with day-0 support for RDMA over Thunderbolt, makes models run faster as you add more devices.

Features

Dashboard

exo includes a built-in dashboard for managing your cluster and chatting with models.

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)

Benchmarks

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


Quick Start

Devices running exo automatically discover each other, without needing any manual configuration. Each device provides an API and a dashboard for interacting with your cluster (runs at http://localhost:52415).

There are two ways to run exo:

Run from Source (macOS)

If you have Nix installed, you can skip most of the steps below and run exo directly:

nix run .#exo

Note: To accept the Cachix binary cache (and avoid the Xcode Metal ToolChain), add to /etc/nix/nix.conf:

trusted-users = root    (or your username)
experimental-features = nix-command flakes

Then restart the Nix daemon: sudo launchctl kickstart -k system/org.nixos.nix-daemon

Prerequisites:

Clone the repo, build the dashboard, install the dependencies, and run exo:

# Clone exo
git clone https://github.com/exo-explore/exo

# Build dashboard
cd exo/dashboard && npm install && npm run build && cd ..

# Install Python dependencies, including the MLX backend
uv sync --extra mlx

# Run exo
uv run exo

This starts the exo dashboard and API at http://localhost:52415/

Please view the section on RDMA to enable this feature on MacOS >=26.2!

Run from Source (Linux)

Prerequisites:

Installation methods:

Option 1: Using system package manager (Ubuntu/Debian example):

# Install Node.js and npm
sudo apt update
sudo apt install nodejs npm

# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install Rust (using rustup)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup toolchain install nightly

Option 2: Using Homebrew on Linux (if preferred):

# Install Homebrew on Linux
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Install dependencies
brew install uv node

# Install Rust (using rustup)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup toolchain install nightly

Note: The macmon package is macOS-only and not required for Linux.

Clone the repo, build the dashboard, install the dependencies, and run exo:

# Clone exo
git clone https://github.com/exo-explore/exo

# Build dashboard
cd exo/dashboard && npm install && npm run build && cd ..

# Install Python dependencies with the MLX backend for your hardware
# (NVIDIA: --extra mlx-cuda13 or --extra mlx-cuda12)
uv sync --extra mlx-cpu

# Run exo
uv run exo

This starts the exo dashboard and API at http://localhost:52415/

Important note for Linux users: Currently, exo runs on CPU on Linux. GPU support for Linux platforms is under development. If you'd like to see support for your specific Linux hardware, please search for existing feature requests or create a new one.

Configuration Options:

File Locations (Linux):

exo follows the XDG Base Directory Specification on Linux:

You can override these locations by setting the corresponding XDG environment variables.

macOS App

exo ships a macOS app that runs in the background on your Mac.

exo macOS App - running on a MacBook

The macOS app requires macOS Tahoe 26.2 or later.

Download the latest build here: EXO-latest.dmg.

You can also install the latest build with Homebrew:

brew install --cask exo

The app will ask for permission to modify system settings and install a new Network profile. Improvements to this are being worked on.

Custom Namespace for Cluster Isolation:

The macOS app includes a custom namespace feature that allows you to isolate your exo cluster from others on the same network. This is configured through the EXO_LIBP2P_NAMESPACE setting:

The namespace is logged on startup for debugging purposes.

Uninstalling the macOS App

The recommended way to uninstall is through the app itself: click the menu bar icon → Advanced → Uninstall. This cleanly removes all system components.

If you've already deleted the app, you can run the standalone uninstaller script:

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

This removes:

Note: You'll need to manually remove EXO from Login Items in System Settings → General → Login Items.


Enabling RDMA on macOS

RDMA is a new capability added to macOS 26.2. It works on any Mac with Thunderbolt 5 (M4 Pro Mac Mini, M4 Max Mac Studio, M4 Max MacBook Pro, M3 Ultra Mac Studio).

Please refer to the caveats for immediate troubleshooting.

To enable RDMA on macOS, follow these steps:

  1. Shut down your Mac.
  2. Hold down the power button for 10 seconds until the boot menu appears.
  3. Select "Options" to enter Recovery mode.
  4. When the Recovery UI appears, open the Terminal from the Utilities menu.
  5. In the Terminal, type:
    rdma_ctl enable
    
    and press Enter.
  6. Reboot your Mac.

After that, RDMA will be enabled in macOS and exo will take care of the rest.

Important Caveats

  1. Devices that wish to be part of an RDMA cluster must be connected to all other devices in the cluster.
  2. The cables must support TB5.
  3. On a Mac Studio, you cannot use the Thunderbolt 5 port next to the Ethernet port.
  4. If running from source, please use the script found at tmp/set_rdma_network_config.sh, which will disable Thunderbolt Bridge and set dhcp on each RDMA port.
  5. RDMA ports may be unable to discover each other on different versions of MacOS. Please ensure that OS versions match exactly (even beta version numbers) on all devices.

Environment Variables

exo supports several environment variables for configuration:

Variable Description Default
EXO_DEFAULT_MODELS_DIR Default directory for model downloads and caches. Always first in the writable dirs list. ~/.local/share/exo/models (Linux) or ~/.exo/models (macOS)
EXO_MODELS_DIRS Colon-separated additional writable directories for model downloads. Checked in order after the default; first with enough free space is used. None
EXO_MODELS_READ_ONLY_DIRS Colon-separated read-only directories to search for pre-downloaded models (e.g., NFS mounts, shared storage). Models here cannot be deleted. None
EXO_OFFLINE Run without internet connection (uses only local models) false
EXO_ENABLE_IMAGE_MODELS Enable image model support false
EXO_LIBP2P_NAMESPACE Custom namespace for cluster isolation None
EXO_FAST_SYNCH Control MLX_METAL_FAST_SYNCH behavior (for JACCL backend) Auto
EXO_TRACING_ENABLED Enable distributed tracing for performance analysis false

Example usage:

# Use pre-downloaded models from NFS mount (read-only)
EXO_MODELS_READ_ONLY_DIRS=/mnt/nfs/models:/opt/ai-models uv run exo

# Download models to an external SSD (falls back to default dir if full)
EXO_MODELS_DIRS=/Volumes/ExternalSSD/exo-models uv run exo

# Run in offline mode
EXO_OFFLINE=true uv run exo

# Enable image models
EXO_ENABLE_IMAGE_MODELS=true uv run exo

# Use custom namespace for cluster isolation
EXO_LIBP2P_NAMESPACE=my-dev-cluster uv run exo

Using the API

exo provides multiple API-compatible interfaces for maximum compatibility with existing tools:

If you prefer to interact with exo via the API, here is an example creating an instance of a small model (mlx-community/Llama-3.2-1B-Instruct-4bit), sending a chat completions request and deleting the instance.


1. Preview instance placements

The /instance/previews endpoint will preview all valid placements for your model.

curl "http://localhost:52415/instance/previews?model_id=llama-3.2-1b"

Sample response:

{
  "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...
  ]
}

This will return all valid placements for this model. Pick a placement that you like. To pick the first one, pipe into jq:

curl "http://localhost:52415/instance/previews?model_id=llama-3.2-1b" | jq -c '.previews[] | select(.error == null) | .instance' | head -n1

2. Create a model instance

Send a POST to /instance with your desired placement in the instance field (the full payload must match types as in CreateInstanceParams), which you can copy from step 1:

curl -X POST http://localhost:52415/instance \
  -H 'Content-Type: application/json' \
  -d '{
    "instance": {...}
  }'

Sample response:

{
  "message": "Command received.",
  "command_id": "e9d1a8ab-...."
}

This command is asynchronous. Before sending inference requests, wait until the API sees the new instance for this model:

curl -N "http://localhost:52415/instance/await?model_id=mlx-community/Llama-3.2-1B-Instruct-4bit"

The endpoint returns an SSE stream. A successful wait emits a message with "type": "ready" and the matching instance; a timeout emits "type": "timeout". By default it waits indefinitely. Set timeout_seconds to a positive value to bound the wait.


3. Send a chat completion

Now, make a POST to /v1/chat/completions (the same format as OpenAI's 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. Delete the instance

When you're done, delete the instance by its ID (find it via /state or /instance endpoints):

curl -X DELETE http://localhost:52415/instance/YOUR_INSTANCE_ID

Claude Messages API Compatibility

Use the Claude Messages API format with the /v1/messages endpoint:

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 Compatibility

Use the OpenAI Responses API format with the /v1/responses endpoint:

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 Compatibility

exo supports Ollama API endpoints for compatibility with tools like OpenWebUI:

# Ollama chat
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
  }'

# List models (Ollama format)
curl http://localhost:52415/ollama/api/tags

Custom Model Loading from HuggingFace

You can add custom models from the HuggingFace hub:

curl -X POST http://localhost:52415/models/add \
  -H 'Content-Type: application/json' \
  -d '{
    "model_id": "mlx-community/my-custom-model"
  }'

Security Note:

Custom models requiring trust_remote_code in their configuration must be explicitly enabled (default is false) for security. Only enable this if you trust the model's remote code execution. Models are fetched from HuggingFace and stored locally as custom model cards.

Other useful API endpoints:*

For further details, see:


Benchmarking

The exo-bench tool measures model prefill and token generation speed across different placement configurations. This helps you optimize model performance and validate improvements.

Prerequisites:

exo (exo-explore/exo)

Searching Database…

47.9K ·GitHub
Что это такое?exo объединяет несколько ваших устройств (Mac и компьютеры на Linux) в один ИИ-кластер, чтобы вы могли запускать большие ИИ-модели, которые не помещаются ни на одной машине, объединяя их память и вычислительные ресурсы.
Нужно ли мне несколько компьютеров, чтобы это было полезно, или можно обойтись одним?exo работает и на одном устройстве, но его главная задача — объединять несколько машин в один кластер через автоматическое обнаружение устройств, чтобы модели, которые не помещаются на одном Mac, можно было разделить между многими машинами с помощью тензорного параллелизма и RDMA.
Как запустить exo?На macOS или Linux клонируйте репозиторий, соберите дашборд, установите зависимости через uv и запустите exo. Пользователи macOS могут также просто установить готовое приложение .dmg или получить его через Homebrew.
Что нужно установить перед сборкой exo из исходников?Нужны uv для Python-зависимостей, node для дашборда и ночная (nightly) сборка набора инструментов Rust для привязок Rust; на macOS дополнительно требуются Xcode (для Metal/MLX), Homebrew и собственный форк macmon от проекта для мониторинга оборудования.
Использует ли exo мою видеокарту на Linux?Нет: на Linux exo пока выполняет инференс только на процессоре, поддержка GPU для Linux ещё в разработке. Быстрый путь на базе MLX с ускорением через RDMA — это возможность macOS на Apple Silicon.
Работает ли быстрое сетевое соединение кластера на любом Mac?RDMA через Thunderbolt требует macOS 26.2+ и конкретного оборудования Thunderbolt 5, например Mac Mini на M4 Pro, Mac Studio или MacBook Pro на M4 Max, Mac Studio на M3 Ultra; более старые Mac и порты без Thunderbolt 5 такого ускорения не получат.
Какие существующие ИИ-инструменты можно подключить к exo?exo предоставляет API-эндпоинты OpenAI Chat Completions, OpenAI Responses, Claude Messages и эндпоинты, совместимые с Ollama, поэтому существующие клиенты и инструменты, например OpenWebUI, работают с ним без изменений.
Можно ли запускать модели, которых нет во встроенном наборе exo?Да, можно загружать собственные модели прямо с хаба HuggingFace, и exo будет хранить их локально как пользовательские карточки моделей; модели, требующие trust_remote_code, нужно явно разрешить из соображений безопасности.
Что на самом деле делает встроенный дашборд?Он даёт наглядный способ управлять кластером устройств и общаться с запущенными моделями; с его помощью люди собирали конфигурации вроде четырёх Mac Studio с DeepSeek V3.1 или Kimi-K2-Thinking.
Насколько реально быстрее работает кластер из нескольких устройств?exo сообщает об ускорении до 1,8 раза на 2 устройствах и в 3,2 раза на 4 устройствах с тензорным параллелизмом, а RDMA через Thunderbolt 5 сокращает задержку между устройствами примерно на 99 процентов.
What are similar projects?omlx, slotstream, mlx-serve, airllm, dflash, unsloth, petals, deltafin
Size
40.1 MB
Stars
47.9K
Age
2y
Commits · 90 Days