exo日常设备在家中运行您自己的 AI 集群

exo-explore/exo:使用日常设备📱💻 🖥️⌚在家中运行您自己的 AI 集群

EXO 根据当前的网络拓扑和可用设备资源对模型进行最佳拆分。这使您能够运行比在任何单个设备上运行更大的模型。

先决条件

  • Python>=3.12.0 是必需的,因为以前版本中的 asyncio 存在问题
  • 对于支持 NVIDIA GPU 的 Linux(仅限 Linux,如果不使用 Linux 或 NVIDIA,请跳过):
    • NVIDIA 驱动程序 - 使用nvidia-smi
    • CUDA 工具包 - 从 NVIDIA CUDA 指南安装,使用nvcc --version
    • cuDNN 库 - 从 NVIDIA cuDNN 页面下载,按照以下步骤验证安装

确保nvidia-smi,nvcc,cuDNN配置正确,缺一不可。

  • 运行 exo 的唯一要求是所有设备上都有足够的内存,以便将整个模型放入内存中。例如,如果您运行的是 llama 3.1 8B (fp16),则所有设备都需要 16GB 内存。以下任何配置都可以工作,因为它们的内存总数超过 16GB:
    • 2 个 8GB M3 MacBook Air
    • 1 x 16GB NVIDIA RTX 4070 Ti 笔记本电脑
    • 2 个 Raspberry Pi 400,每个 4GB RAM(在 CPU 上运行)+ 1 个 8GB Mac Mini
  • EXO 旨在在具有异构功能的设备上运行。例如,您可以让一些设备配备强大的 GPU,而其他设备则配备集成 GPU 甚至 CPU。添加功能较差的设备会减慢单个推理延迟,但会增加集群的整体吞吐量。

从docker开始

从最简基础镜像nanozoo/python3.12开始

docker pull nanozoo/python3.12:3.12--d46ab4d

启动临时容器

1
2
3
4
docker run -it --name exo_builder_temp \
python:3.12 \
bash

  • -it: 启动一个交互式(i)终端(t)。
  • --name exo_builder_temp: 给这个临时容器一个易于识别的名称。
  • python:3.12: 使用我们指定的基础镜像。
  • bash: 启动容器后直接进入 Bash shell。

配置exo

进入容器,安装必要的系统工具

1
2
3
4
5
6
7
8
9
apt-get update
apt-get install -y --no-install-recommends \
git \
build-essential \
cmake \
ca-certificates \
libffi-dev \
libssl-dev \
libgl1

清理 apt 缓存,减小最终镜像大小

1
rm -rf /var/lib/apt/lists/*

创建工作目录

1
2
mkdir -p /exo
cd /exo

克隆 EXO 仓库

1
2
git clone https://github.com/exo-explore/exo.git
cd exo

安装 EXO 及其 Python 依赖,--no-cache-dir 用于避免在容器内部创建不必要的pip缓存

1
pip install -e . --no-cache-dir

退出容器

exit

提交容器状态为镜像

1
2
3
4
5
docker commit \
-c 'WORKDIR /app/exo' \
-c 'CMD ["exo"]' \
exo_builder_temp \
exo:20250827
1
HF_ENDPOINT=https://hf-mirror.com exo

可以在启动命令前添加环境变量访问hf镜像站

创建macvlan网络

1
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 macnet

docker network create 命令创建了一个新的 Docker 网络,使用了 macvlan 驱动。macvlan 网络允许您将容器连接到物理网络,就像它们是网络上的独立主机一样。您为这个网络指定了以下参数:

  • -d macvlan:指定网络驱动为 macvlan
  • --subnet=192.168.1.0/24:指定网络的子网掩码为 192.168.1.0/24
  • --gateway=192.168.1.1:指定网络的网关地址为 192.168.1.1
  • -o parent=eth0:指定父接口为 eth0,这是混杂模式下配置的物理网络接口。
  • macnet:是新创建的 Docker 网络的名称。
  • 确保您选择的子网地址没有被路由器、交换机或其他网络设备使用。如果网关地址已被占用,容器将无法正常通信。

使用ifconfig查看网络设备

查看子网下设备避免冲突,sudo arp-scan -I enp4s0 --localnet

启动容器

1
2
3
4
5
6
7
8
# 运行带有 macvlan 网络、GPU 支持和 tinygrad CUDA 环境变量的 EXO 容器
docker run -it \
--name exo-node-1 \
--ip 192.168.124.56 \
--network macnet \
--gpus all \
-e CUDA=1 \
exo:20250827