bitbrick_k1集群使用prima_cpp分布式部署大模型推理

prima.cpp是llama.cpp的分布式实现。

首先准备好集群。然后先下载模型。

目前支持的模型列表如下,目前只支持三种量化格式:Q4KM、Q6K、Q80。目前不推荐下载Q4KM量化格式模型,加载 Q4_K_M(Q4KM) 模型时,框架在检查 tensor 的 ftype 枚举后发现后端无对应算子,直接触发异常断言"ggml_blck_size(type) == 0″,会直接core dumped。

这里使用 Qwen3-14B Q80 量化的模型。

1 用fping和arp工具找出集群的IP地址
bash 复制代码
sudo apt install fping
### 用fping来扫描局域网段的客户端
fping -a 192.168.5.1 192.168.5.255 -g -q
### 随后用arp查看ip对于的mac地址
arp

根据mac地址可以找到地址为

bash 复制代码
192.168.5.145
192.168.5.146
192.168.5.147
192.168.5.148

我们把 147 当做 master 节点 其余的都为 worker 节点。

2 环境安装
2.1 在 master 节点上:
bash 复制代码
sudo apt update -y && sudo apt install -y gcc-9 make cmake fio git wget libzmq3-dev
  • 下载模型:
bash 复制代码
wget https://www.modelscope.cn/models/Qwen/Qwen3-14B-GGUF/resolve/master/Qwen3-14B-Q8_0.gguf
  • 安装fio:

prima.cpp提出Halda算法,在调度之前需要使用去检测算力、GPU 性能、网络带宽、disk等。k1开发板上的 fio 工具缺少 libaio,需要克隆 fio 仓库,重新编译:

bash 复制代码
sudo apt-get install build-essential pkg-config
git clone https://github.com/axboe/fio.git
cd fio
./configure --prefix=/usr
make -j$(nproc)
sudo make install
  • 安装HIGHS

HIGHS是一个高性能线性优化库,在 prima.cpp 里主要是用于规划每个节点分几层,模型哪些层放到GPU,模型哪些层卸载CPU等

bash 复制代码
git clone https://github.com/ERGO-Code/HiGHS.git
cd HiGHS
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install

克隆 prima.cpp 仓库:

bash 复制代码
git clone https://github.com/Lizonghang/prima.cpp.git
cd prima.cpp
make USE_HIGHS=1 -j$(nproc)

其他的三个worker节点都需要按这个步骤来安装环境。

3 部署大模型

在四台主机上分别运行如下命令,把 147 当做 master 节点,其他的三个为 worker,结构如下

各节点启动命令如下:

bash 复制代码
# 192.168.5.147: rank0
./llama-cli -m ../llm/models/Qwen3-14B-Q8_0.gguf -c 1024 --world 4 -p "what is edge AI?" --rank 0 --master 192.168.5.147 --next 192.168.5.145

# 192.168.5.145: rank1
./llama-cli -m ../llm/models/Qwen3-14B-Q8_0.gguf -c 1024 --world 4 --rank 1 --prefetch --master 192.168.5.147 --next 192.168.5.146

# 192.168.5.146: rank2
./llama-cli -m ../llm/models/Qwen3-14B-Q8_0.gguf -c 1024 --world 4 --rank 2 --prefetch --master 192.168.5.147 --next 192.168.5.148

# 192.168.5.148: rank3
./llama-cli -m ../llm/models/Qwen3-14B-Q8_0.gguf -c 1024 --world 4 --rank 3 --prefetch --master 192.168.5.147 --next 192.168.5.147

qwen3 目前还没有支持,执行会报错:

bash 复制代码
terminate called after throwing an instance of 'std::runtime_error'
  what():  error loading model: error loading model architecture: unknown model architecture: 'qwen3'

那么换个模型吧:Qwen2.5-Coder-14B-Instruct-128K-GGUF

bash 复制代码
wget https://www.modelscope.cn/models/unsloth/Qwen2.5-Coder-14B-Instruct-128K-GGUF/resolve/master/Qwen2.5-Coder-14B-Instruct-Q8_0.gguf

效果:

在跑的过程中,硬件没有跑满,内存占用也不高,最终的速度很慢:

可以看到,大概就只有 0.3 token/s 的速度,还需要进一步的优化。

那么试试更小的模型呢,会不会效果好点?

Qwen2.5-Coder-3B-Instruct-GGUF:

bash 复制代码
wget https://www.modelscope.cn/models/prithivMLmods/Qwen2.5-Coder-3B-Instruct-GGUF/resolve/master/Qwen2.5-Coder-3B-Instruct.Q8_0.gguf

可以看到,3B 模型大概是 1.5 token/s 的速度。

通义千问2.5-代码-0.5B-Instruct-GGUF:

bash 复制代码
wget https://www.modelscope.cn/models/Qwen/Qwen2.5-Coder-0.5B-Instruct-GGUF/resolve/master/qwen2.5-coder-0.5b-instruct-q8_0.gguf

可以看到,0.5B 模型大概是 5 token/s 的速度。

看起来硬件加速用的不是很好,只有一个 RISCV_VECT 用到了:

另外,对于负载分配也不合理:

4 使用 ollama 单节点部署对比
  • 安装 ollama 套件
bash 复制代码
sudo apt install spacemit-ollama-toolkit
  • 使用本地 gguf 模型创建 ollama model

创建一个Modelfile格式的文件,文件名随意,文件内容就写一句话,如下,表示模型文件的路径。

bash 复制代码
FROM ./your-model-path.gguf 

创建ollama的本地模型,下面的命令中you-model-name是自己起的名字,随便写。-f 指定刚才创建的Modelfile的路径

bash 复制代码
ollama create your-model-name -f Modelfile

创建完成后,我们就可以运行刚才创建的模型:

bash 复制代码
ollama run your-model-name --verbose
  • Qwen2.5-Coder-3B-Instruct-GGUF

看到 decode 的生成速度为 1.21 tokens/s

  • 通义千问2.5-代码-0.5B-Instruct-GGUF

看到 decode 的生成速度为 6.99 tokens/s

使用 ollama 的时候,硬件占用比例较高,几乎占用都在 90% 以上,内存占用也比较多。相比 prima.cpp,其实总的占比差不多,只是 prima.cpp 负载分配不均匀,整体的硬件占比不高。

相关推荐
大G的笔记本2 天前
分布式事务
分布式
weixin_419658312 天前
RabbitMQ 的高级特性
java·分布式·rabbitmq
_F_y2 天前
仿RabbitMQ实现消息队列-服务端核心模块实现(1)
分布式·rabbitmq
.柒宇.2 天前
RabbitMQ入门教程
分布式·rabbitmq
代码漫谈2 天前
RabbitMQ 单节点部署指南
分布式·消息队列·rabbitmq
aLTttY2 天前
Spring Boot + Redis 实战分布式锁:从入门到精通
spring boot·redis·分布式
weixin_419658312 天前
RabbitMQ 应用问题
java·分布式·中间件·rabbitmq
爱艺江河2 天前
HarmonyOS智慧风控:基于分布式架构的安全与创新实践
分布式·架构·harmonyos
juniperhan2 天前
Flink 系列第18篇:Flink 动态表、连续查询与 Changelog 机制
java·大数据·数据仓库·分布式·flink
juniperhan2 天前
Flink 系列第19篇:深入理解 Flink SQL 的时间语义与时区处理:从原理到实战
java·大数据·数据仓库·分布式·sql·flink