Prima.cpp :低成本,低延迟,低内存压力,超大LLM模型私有化分布式推理部署方案
项目地址:https://github.com/Lizonghang/prima.cpp
论文地址:https://arxiv.org/abs/2504.08791
最近,一个面向低资源场景的分布式推理框架 prima.cpp 开源了,该项目由 穆罕默德·本·扎耶德人工智能大学 和 电子科技大学信通学院 的研究人员联合开发。旨在在资源有限的普通设备上高效运行更大的模型,根据实验显示,该项目极大加速了边缘部署70B 大模型 DeepSeek R1的推理速度。
lama.cpp 方案相比,推理速度最大提升了15倍,在内存管理上也有了明显进步,告别了OOM和设备卡顿。
Prima.cpp目前支持的热门模型:
DeepSeek系列
- DeepSeek R1-7B (Q4K, Q6K, Q80): deepseek-ai.DeepSeek-R1-Distill-Qwen-7B
- DeepSeek R1-8B (Q4K, Q6K, Q80): deepseek-ai.DeepSeek-R1-Distill-Llama-8B
- DeepSeek R1-14B (Q4K, Q6K, Q80): deepseek-ai.DeepSeek-R1-Distill-Qwen-14B
- DeepSeek R1-32B (Q4K, Q6K, Q80): deepseek-ai.DeepSeek-R1-Distill-Qwen-32B
- DeepSeek R1-70B (Q4K, Q6K, Q80, IQ1): DeepSeek-R1-Distill-Llama-70B
未来将支持更多的极低bit量化模型,包括iq2、iq3等
Llama系列
- Llama 3-8B (Q4K, Q6K, Q80): Meta-Llama-3-8B-Instruct
- Llama 3-14B (Q4K, Q6K, Q80): Llama-3-14B-Instruct-v1
- Llama 1-30B (Q4K, Q6K, Q80): upstage-llama-30b-instruct-2048
- Llama 3-45B (Q4K, Q6K, Q80): Llama-3-pruned-45B-Drobeta-Turnu-Severin
- Llama 3-60B (Q4K, Q6K, Q80): nyun-llama3-60B
- Llama 1-65B (Q4K, Q6K, Q80): llama-65b
- Llama 3-70B (Q4K, Q6K, Q80): Meta-Llama-3-70B-Instruct
Qwen 2.5 / QwQ系列
- Qwen 2.5-7B (Q4K, Q6K, Q80): Qwen2.5-7B-Instruct
- Qwen 2.5-14B (Q4K, Q6K, Q80): Qwen2.5-14B-Instruct
- Qwen 2.5-32B (Q4K, Q6K, Q80): Qwen2.5-32B-Instruct
- Qwen 2.5-72B (Q4K, Q6K, Q80): Qwen2.5-72B-Instruct
- QwQ-32B (Q4K, Q6K, Q80): qwq-32b
prima.cpp 性能表现
测试设备:
D1 | D2 | D3 | D4 | |
---|---|---|---|---|
设备 | Mac M1 | Laptop | Desktop | Mate40Pro |
操作系统 | MacOS(UMA) | Linux | Linux | Linux(基于 HarmonyOS) |
中央处理器 | 苹果 M1 | 英特尔 i9 | 英特尔 i9 | 麒麟9000 |
CPU 核心 | 8 | 8 | 16 | 8 |
RAM(可用) | 2.4 GiB | 4.1 GiB | 9.7 GiB | 1.9 GiB |
磁盘读取速度 | 0.72 GB/秒 | 2.98 GB/秒 | 3.17 GB/秒 | 1.37 GB/秒 |
GPU 类型 | Apple Metal | 3070 | 2080TI | - |
VRAM(可用) | - | 8 GiB | 11 GiB | - |
在 llama.cpp与prima.cpp 上部署的模型推理速度比较,可以看到prima.cpp在超大模型处理上领先,随着模型参数的增大,推理时间变化更为平稳。
模型 | llama.cpp / 1Token | prima.cpp / 1Token |
---|---|---|
Llama 3-8B | 15 ms | 54 ms |
Llama 3-14B | 20 ms | 65 ms |
Llama 1-30B | 202 ms | 72 ms |
Llama 3-45B | 328 ms | 233 ms |
Llama 3-60B | 7965 ms | 468 ms |
Llama 1-65B | 8807 ms | 569 ms |
Llama 3-70B | 10120 ms | 674 ms |
Qwen-2.5-7B | 14 ms | 44 ms |
DeepSeek-R1-Distill-Qwen-7B | 14 ms | 52 ms |
DeepSeek-R1-Distill-Llama-8B | 14 ms | 59 ms |
Qwen-2.5-14B | 23 ms | 65 ms |
DeepSeek-R1-Distill-Qwen-14B | 24 ms | 76 ms |
Qwen-2.5-32B and QwQ-32B | 224 ms | 89 ms |
DeepSeek-R1-Distill-Qwen-32B | 232 ms | 93 ms |
DeepSeek-R1-Distill-Llama-70B | 10978 ms | 724 ms |
Qwen-2.5-72B | 12227 ms | 867 ms |
对于更大规模的LLM,prima.cpp的推理速度明显优于llama.cpp
部署教程:
由于项目刚刚开源,目前只支持Linux和macOS操作系统进行部署(安卓手机需要模拟linux)。目前 prima.cpp 仅支持基于 CUDA 的 GPU,未来将支持更多的计算后端(如Vulkan、blas等)
注意:请用固态硬盘进行操作,机械硬盘太慢。
如果不能使用huggingface下载模型,也可以使用国内的 modelscope魔塔社区
运行环境依赖准备:
以下第三方库都可以直接通过apt、apt-get直接下载,但注意版本限制。
- gcc >= 9.4.0 下载地址:https://ftp.gnu.org/gnu/gcc/gcc-9.5.0/
- make> = 4.2.1 下载地址:https://ftp.gnu.org/gnu/make/
- cmake >= 3.16.3 下载地址: https://cmake.org/files/v3.18/
- fio >= 3.16 下载地址:https://sourceforge.net/projects/fio/files/fio-3.16-amd64-jessie/download
- zmq >= 4.3.2(设备间通信库,设备间传递中间结果)下载地址: https://zeromq.org/languages/cplusplus/
- HiGHS >= 1.9.0(高性能线性规划求解器)下载地址:https://github.com/ERGO-Code/HiGHS/releases
- CUDA(可选,如果你有 NVIDIA 显卡)
在Linux(Ubuntu) 上可以执行安装依赖,HiGHS需要自己下:
sudo apt update -y && sudo apt install -y gcc-9 make cmake fio git wget libzmq3-dev
------单独下载HiGHS---------------
git clone https://github.com/ERGO-Code/HiGHS.git
cd HiGHS
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
在macOS 上可以直接下载:
brew install gcc make cmake fio git wget highs zeromq
下载prima.cpp并初始化构建:
git clone https://github.com/Lizonghang/prima.cpp.git
cd prima.cpp
# 进入目录 "prima.cpp",这个目录可能包含项目源码
make -j$(nproc)
# 默认构建,使用所有 CPU 核心
------------------------个性化需求构建----------------------------------------
# 如果你在 rank 0 的设备上构建,需要添加 USE_HIGHS=1:
make USE_HIGHS=1 -j$(nproc)
# USE_HIGHS=1 表示启用 HIGHS 求解器(用于数学优化)
# -j$(nproc) 表示使用所有可用的 CPU 核心并行构建,提高构建速度
# 如果你安装了 CUDA,可使用 GPU 加速,添加 GGML_CUDA=1:
make GGML_CUDA=1 -j$(nproc)
# GGML_CUDA=1 启用 CUDA 后端,加速部分操作
# macOS 用户如果模型很大,可能禁用 Metal 会更稳定:
make LLAMA_NO_METAL=1 -j$(nproc)
# LLAMA_NO_METAL=1 禁用 macOS 的 Metal 图形加速,可能有助于大模型运行
# 如果要启用调试模式,可以加上 LLAMA_DEBUG=1:
make LLAMA_DEBUG=1 -j$(nproc)
# LLAMA_DEBUG=1 会开启调试输出,有助于开发和排错
下载一个兼容的模型:比如官方推荐的https://huggingface.co/Qwen/QwQ-32B-GGUF模型进行测试
mkdir download
wget https://huggingface.co/Qwen/QwQ-32B-GGUF/resolve/main/qwq-32b-q4_k_m.gguf -P download/
分布式多设备部署(prima.cpp项目特色)
官方测试设备:
设备名 | 序号 | 大致型号/说明 | 分配地址 |
---|---|---|---|
Mac M1 | D0 | MacBook Air/Pro M1(2020-2021 款) | 192.168.1.2 |
**Laptop ** | D1 | 普通 Windows 笔电(中端配置) | 192.168.1.3 |
**Desktop ** | D2 | 中端台式机(含独显) | 192.168.1.4 |
Mate40 Pro | D3 | 华为旗舰手机(2020 年发布) | 192.168.1.5 |
为了满足通信要求,需要一个 WIFI 局域网, 测试时可以考虑关闭防火墙,开放9000、10000等端口,避免设备之间通信失败。手机需要软件 Termux 模拟Linux系统,下载地址:https://github.com/termux/termux-app/releases
注意:每台设备都需要预先编译得到llama-cli可执行文件。
在每台设备上执行启动命令:
# D0:
./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 -n 256 -p "what is edge AI?" --world 4 --rank 0 --master 192.168.1.2 --next 192.168.1.3 --prefetch
# D1:
./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 --world 4 --rank 1 --master 192.168.1.2 --next 192.168.1.4 --prefetch --gpu-mem 8
# D2:
./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 --world 4 --rank 2 --master 192.168.1.2 --next 192.168.1.5 --prefetch --gpu-mem 11
# D3:
./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 --world 4 --rank 3 --master 192.168.1.2 --next 192.168.1.2 --prefetch
主设备为D0,一旦启动,prima.cpp 将分析每个设备并决定分配多少工作负载,例如,每个设备应该处理多少个模型 layer,以及其中有多少个应该在 GPU 上运行。
数据的通信是有顺序的环形结构,例如D0->D1->D2->D3->D0 ,下图为对应topo。
如果需要手动控制 layer 分布,可以使用-lw
(或--layer-window
、--n-layer-window
)和-ngl
选项:
-lw
设置每个设备应处理的模型 layer 总数。格式为逗号分隔的列表,每个设备一个值,按顺序排列。可以设置"8,8,8,8"
、"4,4,4,4"
、"16,16,24,8"
。-ngl
设置有多少个模型 layer 应该在 GPU 上运行。
# on head device without a GPU, rank 0, use the option "-lw":
./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 -n 256 -p "what is edge AI?" --world 4 --rank 0 --master 192.168.1.2 --next 192.168.1.3 --prefetch -lw "16,16,16,16"
# on worker device with 8 GiB VRAM, rank 1, use the option "-ngl":
./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 --world 4 --rank 1 --master 192.168.1.2 --next 192.168.1.4 --prefetch -ngl 16
# on worker device with 11 GiB VRAM, rank 2, use the option "-ngl":
./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 --world 4 --rank 2 --master 192.168.1.2 --next 192.168.1.5 --prefetch -ngl 16
# on worker device without a GPU, rank 3:
./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 --world 4 --rank 3 --master 192.168.1.2 --next 192.168.1.2 --prefetch
Optional:容器部署(Nvidia显卡需要使用nvidia Docker)
官方测试设备:一台至少配备 32 个 CPU 核心、32 GiB RAM 和 32 GiB VRAM 的主机。
使用 Docker 容器模拟 4 个同构节点,每个节点分配 8 个 CPU 核心、8 GiB RAM 和 8 GiB VRAM。拉取4个镜像:
sudo docker run -dit --name prima-v1 --memory=8gb --memory-swap=8gb --cpus 8 --cpuset-cpus="0-7" --network host --gpus all prima.cpp:1.0.1-cuda
sudo docker run -dit --name prima-v2 --memory=8gb --memory-swap=8gb --cpus 8 --cpuset-cpus="8-15" --network host --gpus all prima.cpp:1.0.1-cuda
sudo docker run -dit --name prima-v3 --memory=8gb --memory-swap=8gb --cpus 8 --cpuset-cpus="16-23" --network host --gpus all prima.cpp:1.0.1-cuda
sudo docker run -dit --name prima-v4 --memory=8gb --memory-swap=8gb --cpus 8 --cpuset-cpus="24-31" --network host --gpus all prima.cpp:1.0.1-cuda
# 没有GPU , 去除 --gpus all
分别复制模型到4个容器:
cd prima.cpp/download
sudo docker cp qwq-32b-q4_k_m.gguf prima-v1:/root/prima.cpp/download/
sudo docker cp qwq-32b-q4_k_m.gguf prima-v2:/root/prima.cpp/download/
sudo docker cp qwq-32b-q4_k_m.gguf prima-v3:/root/prima.cpp/download/
sudo docker cp qwq-32b-q4_k_m.gguf prima-v4:/root/prima.cpp/download/
没有GPU需要在4个容器中重新构建 prima.cpp
cd ./prima.cpp && make clean
make -j$(nproc) # If not rank 0
make USE_HIGHS=1 -j$(nproc) # If rank 0
启动推理
cd ./prima.cpp
(prima-v1) ./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 -n 256 -p "what is edge AI?" --world 4 --rank 0 --prefetch --gpu-mem 8
(prima-v2) ./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 --world 4 --rank 1 --prefetch --gpu-mem 8
(prima-v3) ./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 --world 4 --rank 2 --prefetch --gpu-mem 8
(prima-v4) ./llama-cli -m download/qwq-32b-q4_k_m.gguf -c 1024 --world 4 --rank 3 --prefetch --gpu-mem 8
#没有GPU 去除--gpu-mem 8
llama-cli 常用参数速查表
其余参数可参考https://github.com/ggml-org/llama.cpp/blob/master/examples/main/README.md
参数名 | 示例值 | 说明 |
---|---|---|
-m | download/qwq-32b-q4_k_m.gguf | 指定模型路径(.gguf 格式) |
-c | 1024 | 上下文窗口大小(token 数),影响模型的“记忆范围” |
-p | "what is edge AI?" | 提示词(Prompt),模型将基于此生成内容 |
-n | 256 | 要生成的最大 token 数量 |
-ngl | 30 | 分配到 GPU 的层数(越多越快,但显存要够) |
--temp | 0.8 | 温度参数,控制生成的多样性(越低越稳定) |
--top-k | 40 | 从概率前 K 个词中随机抽取 |
--top-p | 0.95 | 从累计概率大于 P 的词中采样 |
--repeat_penalty | 1.1 | 惩罚重复词,避免输出重复 |
--seed | 42 | 随机种子,保证结果可复现 |
--threads | 8 | 使用的 CPU 线程数 |
--color | (无参数) | 启用彩色输出,提升可读性 |
--interactive | (无参数) | 启用交互模式,支持多轮对话 |
--keep | 0 | 保留多少 token 不被截断(对上下文管理有用) |
⚠️注意:prima.cpp 建议操作系统预取即将到来的层权重,实际的预取操作由操作系统调度和处理,这可能会带来一些不确定性。要在计算后立即显式触发预取,强制预取需要可以添加 --force参数。这会实现更积极的重叠,但也会引入额外的内存访问延迟。--force
请仅在测试后使用,因为其效果取决于硬件和操作系统行为。
prima.cpp 应用场景
-
用户可以在普通设备上部署先进的 30B 至 70B 大模型,实现本地化的智能助手功能,如自然语言对话、日程管理、家庭自动化控制等。
-
中小企业可以在内部部署大型语言模型,应用于客户服务、文档生成、数据分析等场景,提高工作效率,保护企业数据的安全性。
交流与合作
如果你对prima.cpp项目及LLM分布式推理有兴趣,欢迎邮件与我们进行交流,或者在github主页提出issue。