多机协同AI大模型集群软件exo:体验github日榜第一名的魅力!

exo是一个实验性软件,它可以将多种设备统一成一个强大的GPU,支持广泛模型,并具有动态模型分区、自动设备发现等功能‌。

exo的主要特点包括:

  • 广泛模型支持‌:exo支持不同的模型,如LLaMA(包括MLX和tinygrad)、Mistral、LlaVA、Qwen和Deepseek等‌。
  • 动态模型分区‌:根据当前网络拓扑和可用设备资源,exo可以最优地拆分模型。这使得用户能够在任何单一设备上运行比原本能够运行的更大的模型‌。
  • 自动设备发现‌:exo会自动使用最佳方法发现其他设备,无需手动配置‌1。
  • ChatGPT兼容API‌:exo提供了一个与ChatGPT兼容的API,用于运行模型。只需在应用程序中进行一行更改,即可使用exo在自己的硬件上运行模型‌。
  • 设备平等性‌:与其他分布式推理框架不同,exo不使用主从架构。相反,exo设备通过p2p连接。只要设备在网络中的某个位置连接,就可以用于运行模型‌。

这才是真正多机协同处理AI集群软件啊,我们也来实践一下吧! 

源代码:https://github.com/exo-explore/exo

安装前准备工作

如果是非Intel的Mac,那么可以使用全系列模型,如果是Intel的Mac或普通X86 pc,那么只能使用Llama模型。 整个组网系统里,只要有一台Mac M芯片的机器,就能使用全系列模型,比如DeepSeek模型。

整个调试工作比较复杂,可以参考这里:尝试在exo集群下使用deepseek模型:第一步,调通llama-CSDN博客

下载源代码

使用git clone下载exo的源代码

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

安装python3.12版本

exo必须要求python3.12版本或以上,所以要安装python3.12版本。

安装python官方3.12版本

使用官方python安装,

下载地址:Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

找到符合自己操作系统的python3.12版本,下载安装

附加操作:

可以创建一个新环境并激活,使用命令:

python3.12 -m venv py312
source py312/bin/activate 

激活环境并安装uv

source py312/bin/activate 
pip install uv

 uv并不是必须要安装的。之所以安装uv,是因为uv安装ptyhon包更快,

别忘记添加pip加速镜像并更新pip

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install pip -U

安装miniconda python3.12版本

从清华源找到自己需要的版本:Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

比如Linux下就使用这个:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py312_25.1.1-1-Linux-x86_64.sh

下载后安装:

sh download/Miniconda3-py312_25.1.1-1-Linux-x86_64.sh

一般我习惯把它安装py312目录。安装好后激活环境

source ~/py312/bin/activate

 添加pip加速镜像并更新pip

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install pip -U

这样就算完成了。如果学有余力,还有安装uv

pip install uv

感觉uv安装的时候快,但是下载软件的时候慢,所以我用uv的时候都会加上pip的-i参数:

-i https://pypi.tuna.tsinghua.edu.cn/simple

 以安装numpy为例,最终命令如下:

uv pip install numpy ​-i https://pypi.tuna.tsinghua.edu.cn/simple

安装llvmlite库和clang

在实践中发现这两个库需要手动安装。

pip安装llvmlite库

pip install llvmlite

ubuntu下apt安装clang 

sudo apt install clang

如果有关于libfl的报错,安装这个库

​
sudo apt install libgl1-mesa-glx libglu1-mesa

 

安装exo

直接使用如下命令安装即可

git clone https://github.com/exo-explore/exo.git
cd exo
pip install -e .
# alternatively, with venv
source install.sh

注意,pip install -e . 和 source install.sh 执行其中一条即可,不用两个都执行。

也可以使用uv来安装:

uv pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成,直接执行exo即可启动服务!国内用户,启动前可以设置hugging face的镜像:

export HF_ENDPOINT=https://hf-mirror.com

启动服务

exo

 启动后,提示:Web Chat URL (tinychat): http://192.168.0.16:52415

用web浏览器打开这个网址,就可以配置和使用exo啦!

比如下载模型:

以下是三种操作系统的实践记录。 

 Ubuntu下安装

安装好python3.12版本,然后就执行上面的安装命令即可。

中间碰到了这个问题:ubuntu22启动exo报错OSError: /home/skywalk/py312/lib/libgcc_s.so: invalid ELF header

解决方法见调试部分。

MAC下的安装

不明白为什么git clone的时候老报错,没有解决问题。只好采用其它方法解决。一种是直接在github下载源代码压缩文件,再pip install -e . 安装。但是mac下安装的时候,还是报git clone错误。后来发现是mac的github无法下载大文件,会报错:git-lfs: command not foundmac下git clone的时候报错:git-lfs: command not found-CSDN博客

后来是到github的repo页面,发现有mac版本exo的,下载,然后执行

./install.sh 

再执行(这里重复了,其实这两句执行任何一句即可)

source install.sh 

安装完成!显示:

Detected system: Intel Mac

Inference engine name after selection: tinygrad

Using inference engine: TinygradDynamicShardInferenceEngine with shard downloader: HFShardDownloader

[]

Chat interface started:

- http://127.0.0.1:52415

- http://192.168.0.101:52415

ChatGPT API endpoint served at:

- http://127.0.0.1:52415/v1/chat/completions

- http://192.168.0.101:52415/v1/chat/completions

has_read=True, has_write=True

竟然启动了呢!

最后mac可以安装运行,但是执行的时候还有问题,也许是这台机器太老的缘故,是2015版的air ,内存8G。

FreeBSD下的安装(失败)

FreeBSD下python库的安装可是非常复杂的,感觉比windows下和Linux下都坑!

先手工安装tinygrad

pip install tinygrad

好不容易装上了,后来是pip install -e .的时候,有个库(pydantic-core)死活装不上,只好放弃。这个库python3.11的时候勉强能装上,3.12的实在没装上。

使用的命令:

uv pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple

总结

跌跌撞撞,终于安装完成,后面怎么应用还是一道坎!

反正现在怎么用deepseek,还需要研究研究!

最新发现,x86版本暂时还不支持DeepSeek,需要Mac M芯片的才行,关于怎么调试使用Llama型,也是颇废了一些功夫的,具体见:尝试在exo集群下使用deepseek模型:第一步,调通llama-CSDN博客 

调试

mac下git clone 报错:git-lfs: command not found

接收对象中: 100% (9665/9665), 12.17 MiB | 5.15 MiB/s, 完成.

处理 delta 中: 100% (5876/5876), 完成.

git-lfs filter-process: git-lfs: command not found

fatal: 远端意外挂断了

warning: 克隆成功,但是检出失败。

您可以通过 'git status' 检查哪些已被检出,然后使用命令

'git checkout -f HEAD' 重试

用'git checkout -f HEAD' 没成功。

pip install git-lfs没成功

尝试用brew安装git-lfs

brew install git-lfs

也没成功。

最后是直接从github下载exo源码,没有用git clone命令,然后安装成功的。

pip install -e .

后来找到这个报错的解决方法,是从github下载了git-lfs安装文件,手工安装成功的,具体见:mac下git clone的时候报错:git-lfs: command not found-CSDN博客

pip install -e . 报错fatal: unable to access 'https://github.com/tinygrad/tinygrad.git/

这个github抽风啊

手工pip安装

~/py312/bin/pip3 install tinygrad

不行

最后总算过去了,也不知道是不是github抽风正好那段时间好了。

后来在ubuntu22版本下安装tinygrad是很顺利的。

最后看exo的setup.py文件里的包依赖关系,tinygrad用的是这句:

  "uvloop==0.21.0",
  "tinygrad @ git+https://github.com/tinygrad/tinygrad.git@ec120ce6b9ce8e4ff4b5692566a683ef240e8bc8",

不明白为什么别的包都是直接名字+版本号,只有tinygrad是使用了github安装。

FreeBSD下pip 安装exo报错numpy等安不上

无法安装xoe, numpy都安不上,报错

  × Failed to download and build `numpy==2.2.3`

  ├─▶ Failed to install requirements from `build-system.requires`

  ├─▶ Failed to download and build `ninja==1.11.1.3`

  ├─▶ Failed to install requirements from `build-system.requires`

  ├─▶ Failed to build `cmake==3.31.4`

  ├─▶ The build backend returned an error

  ╰─▶ Call to `backend.build_wheel` failed (exit status: 1)

我这个系统里只有cmake 3.31.3 ,要重新编译cmake吗? 

ninja倒是有1.11.1.4 

numpy是pkg里只有1.x版本啊。 这回好么,FreeBSD反而拖了后腿啦。

pkg 安装cmake 和ninja

安装好后,pip 安装oxe不管用。不过numpy确实能装上了。

想办法,修改源代码setup.py文件,把tinygrad这句给注释掉了,因为已经用pip装好tinygrad了。

# "tinygrad @ git+https://github.com/tinygrad/tinygrad.git@ec120c

e6b9ce8e4ff4b5692566a683ef240e8bc8",

修改后,能往下跑了,但是cmake那块没过去

FreeBSD pip安装exo,cmake报错

      *** CMake build failed

      hint: This usually indicates a problem with the package or

      the build environment.

  help: `opencv-python` (v4.10.0.84) was included because `exo`

        (v0.0.1) depends on `opencv-python`

缺opencv? 那我直接装上试试? 

使用pkg 安装

sudo pkg install opencv 

 然后再pip安装opencv

uv pip install opencv-python  -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

失败。

更新curl试试

sudo pkg install curl

最后好像opencv就是没装成,导致FreeBSD下exo无法使用。

另外还有个库:pydantic-core ,这个库也非常难装。如果是python3.11,还可以装上,python3.12,目前是没装成功!

exo运行后无法下载模型

点下载模型就卡住,原来是huggingface网站访问问题,运行oex前加入huggingface加速镜像即可

export HF_ENDPOINT=https://hf-mirror.com 

ubuntu22启动exo报错OSError: /home/skywalk/py312/lib/libgcc_s.so: invalid ELF header

^^^^^^^^^^
  File "/home/skywalk/py312/lib/python3.12/ctypes/__init__.py", line 379, in __init__
    self._handle = _dlopen(self._name, mode)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: /home/skywalk/py312/lib/libgcc_s.so: invalid ELF header

安装libgcc试试

sudo apt install libgcc-12-dev

管用不? 

还有ai说:sudo apt-get install --reinstall libgcc1
还是没解决。

最终,发现是python3.12自带的lib/libgcc_s.so库文件有问题,把它覆盖一下就行了

到目录/home/skywalk/py312/lib/执行:

cp libgcc_s.so.1 libgcc_s.so

问题解决! 

具体见:https://blog.csdn.net/skywalk8163/article/details/145736598

ubuntu22启动exo报错None of PyTorch

None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used. 

安装torch

pip install torch

也可以用uv快一点 

uv pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple

ubuntu22启动exo报错libGL.so.1: cannot open shared object file:

  File "/home/skywalk/py312/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ImportError: libGL.so.1: cannot open shared object file: No such file or directory

AI说:安装OpenGL库:sudo apt install libgl1-mesa-glx libglu1-mesa 

于是安装库

sudo apt install libgl1-mesa-glx libglu1-mesa 

果然搞定这个报错。

观察到每次启动地址不一样

好像如果大约同时启动,每个服务器都有公开ip

如果等一段时间再启动,那么后来启动的只有127.0.0.1地址。

Web Chat URL (tinychat): http://192.168.0.16:52415

Web Chat URL (tinychat): http://192.168.0.103:52415

有时候是192,有时候是127,这个到底也没明白怎么回事.....有明白的朋友请留言讲一下。

exo启动后报错No such file or directory: \'clang\'"}"

Failed to fetch completions: Error processing prompt (see logs with DEBUG>=2): <AioRpcError of RPC that terminated with: status = StatusCode.UNKNOWN details = "Unexpected <class 'FileNotFoundError'>: [Errno 2] No such file or directory: 'clang'" debug_error_string = "UNKNOWN:Error received from peer {created_time:"2025-02-19T12:29:26.877872737+00:00", grpc_status:2, grpc_message:"Unexpected <class \'FileNotFoundError\'>: [Errno 2] No such file or directory: \'clang\'"}"

刚不明白问题所在,走了弯路,

后来得知apt安装clang即可,具体见:尝试在exo下使用deepseek模型:第一步,调通llama-CSDN博客

sudo apt install clang

### EXO 集群本地电脑部署方法 要将 EXO 集群部署到本地电脑,可以按照以下说明操作: #### 准备环境 确保每台参与集群的设备都安装了 Python 和必要的依赖项。具体来说,推荐使用 Python 3.8 或更高版本[^1]。 #### 下载并配置 EXO 源码 访问项目的官方 GitHub 地址 `https://github.com/exo-explore/exo` 并克隆仓库至本地计算: ```bash git clone https://github.com/exo-explore/exo.git cd exo ``` 随后,创建虚拟环境并激活它以隔离项目所需的库文件: ```bash python -m venv env_exo source env_exo/bin/activate pip install --upgrade pip setuptools wheel ``` 接着,依据 README 文件中的指导完成依赖包的安装过程。通常情况下会有一个 `requirements.txt` 文件用于指定所需模块及其版本号: ```bash pip install -r requirements.txt ``` #### 启动服务端与客户端节点 EXO 的核心理念在于构建由不同性能等级硬件组成的异构网络来进行协同运算[^3]。因此,在实际设置过程中需分别初始化服务器角色(负责协调整个流程)和服务者角色(承担具体的子任务计算职责)。 对于充当主控单元即服务端的角色而言,执行如下命令即可开启监听状态等待其他成员加入: ```bash python server.py --port=50051 ``` 这里假设采用默认 gRPC 端口 50051 进行通讯连接;如果存在防火墙规则或者冲突情况,则应调整参数适应特定场景需求。 与此同时,让其余作为辅助处理器存在的器运行下面脚本成为参与者之一: ```bash python client.py --server_address="localhost:50051" ``` 注意替换 `"localhost"` 成真实 IP 地址以便跨主互联形成完整的分布式架构体系结构[^2]。 当所有组成部分均已上线之后,整体系统便具备了接收外部输入并通过内部制拆解分发给各个终端再汇总输出结果的能力。 ```python import grpc from concurrent import futures import time import exo_pb2_grpc as pb2_grpc import exo_pb2 as pb2 class ExoService(pb2_grpc.ExoServicer): def ProcessTask(self, request, context): result = f'Processed {request.task}' return pb2.TaskResponse(result=result) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) pb2_grpc.add_ExoServicer_to_server(ExoService(), server) server.add_insecure_port('[::]:50051') server.start() try: while True: time.sleep(60 * 60 * 24) except KeyboardInterrupt: server.stop(0) if __name__ == '__main__': serve() ``` 上述代码片段展示了基于 GRPC 构建的服务接口定义及其实现类样例。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值