本喵是小黑,一只黑猫。今天不卖萌,带你们干件正经事:把手头吃灰的旧电脑、旧显卡、甚至闲置手机拼起来,跑通 Qwen3.8-27B——一个 270 亿参数、能看图的多模态大模型。 全程不买新卡,只花电费。一张 8GB 显存的旧卡就能起步,设备越多,能跑的版本越高级、质量越好。


先翻翻你的抽屉:旧设备能干啥

写这篇之前,本喵先问了圈朋友,发现大多数人家里都能翻出这几样东西:一台退役的游戏台式机、一台卡到想扔的旧笔记本、可能还有一部换下来吃灰的安卓旗舰。它们单个看都是电子垃圾,拼起来却是能跑 27B 的推理集群。

对照一下,你手头的东西能站哪个岗:

设备 在集群里的角色 注意事项
RTX 3060/4060 这种 8GB 显存台式机 主力节点,扛中间层 留 2GB 给 KV cache,实际约 6GB 放权重
RTX 5070 Laptop 8GB 主力或主控 Blackwell 新架构编译有坑,后文专门说
旧笔记本(没独显,16GB+ 内存) CPU 节点,放尾层 慢,但能兜底,内存越大越好
旧台式机(i5/i7,16-32GB 内存) CPU 节点 + 顺手跑向量/重排 内存大就是王道
安卓旗舰(骁龙 8 Gen2 以上) 浅层节点(前 4-8 层) 必须散热背夹;目前 llama-rpc 没有稳定的安卓 NPU 后端,只能 CPU
安卓中端机 别加 算力太弱,进来反而拖慢全队
iPhone / iPad 没戏 没有可用的 rpc-server 实现
树莓派 别加 算力太弱,网络开销占比太高
手边设备能干什么
手边设备能干什么

本喵的建议: 先别急着全上。从一台 8GB 卡开始,跑通了再加设备。每加一台,质量上一个台阶——后文「按你的家底选路线」有对应玩法。

动手前,先搞懂三件事

1. 为什么 27B 塞不进一张 8GB 卡

模型参数越多越聪明,但每个参数都要占地方。Qwen3.8-27B 原始精度(BF16)下,光权重就 56GB。本地跑之前得先「量化」——把每个参数从 16 位压到 4 位、2 位,体积小几倍,质量损失一点。

量化后的体积大概是这个档位:

量化版 文件大小 质量(相对原版) 什么设备能跑
UD-IQ2_XXS 9.0GB 79% 一张 8GB 卡(顶多 offload 一点到内存)
UD-IQ3_XXS 11.9GB 89% 8GB 卡 + 内存兜一点;16GB 卡舒服
UD-Q3_K_XL 13.4GB 92% 16GB 卡,或 8GB 卡 + 一台 CPU 节点分片
Q4_K_M 17.1GB 96% 两张 8GB 卡分片,或直接上 24GB 卡
Q5/Q6/Q8 20-31GB 97-99% 多卡集群或 32GB+ 大卡

看这张表就明白:单卡 8GB 的极限是 9GB 的 IQ2_XXS,质量 79%;想要 96% 的 Q4,就得靠分片把 17.1GB 拆开放。分片买的是质量,不是速度——这句话后文还会反复出现。

下载就认准这三个仓库:unsloth / ggml-org / AtomicChat 的 Qwen3.8-27B-GGUF。国内记得挂 hf-mirror.com 镜像,不然下到 90% 断掉重来的滋味,本喵不想再体验第二次。 ⚠️ 还有一个 931MB 的 mmproj-BF16.gguf 必须一起下——27B 是视觉模型,没有它就只能当纯文本用,发图过去它一脸懵。

封面:小小黑画的异构集群板报
封面:小小黑画的异构集群板报

2. 分片到底怎么个分法

把模型想象成一条流水线,64 道工序(神经网络层)首尾相连。你输入一句话,从第 1 层流到第 64 层,最后吐出回答。

分片就是把这 64 道工序拆给几台设备:手机扛 1-16 层,主力卡扛 17-32 层,第二张卡扛 33-48 层,旧笔记本扛 49-64 层。每台设备只装自己那几道工序的零件,8GB 卡也能装下 Q4 级别的 17GB 模型。

为什么弱设备放两头?因为中间层(17-48)是自注意力最重的部分,计算密度大,必须给最快的设备;浅层和尾层的计算量相对小,手机和旧 CPU 勉强扛得住。

llama.cpp 的 RPC 机制干的就是这个:一台「主控」负责接请求、调度,其他机器是「工作节点」,各算各的层。新版 llama.cpp 会按各设备可用内存自动分片,不用你手动算;想精细控制可以用 --tensor-split,这个后文讲。

llama-rpc 分片原理:层的流水线
llama-rpc 分片原理:层的流水线

3. 为什么网络是命根子

推理分两段: - Prefill(预填充):处理你输入的一大段话,算力密集,看 GPU 强不强。 - Decode(解码):一个字一个字往外蹦,每蹦一个字都要把权重读一遍,是带宽瓶颈——卡越快、显存带宽越高,蹦得越快。

分片后,层与层之间要跨设备传数据,传的是每层的「激活值」(中间输出),几十 MB 的量级。千兆有线局域网每层传几十毫秒,64 层叠起来几百毫秒,可接受。

但要是 WiFi?每层传输的延迟和抖动直接翻几倍,叠起来每个字多等好几秒,推理慢 3-10 倍——所以固定节点必须插网线,这条没得商量。手机实在没法插线,用 USB 共享网络,或 5GHz WiFi 临时玩玩可以。

安全提醒:rpc-server 没有内置鉴权,这集群只该在你自己局域网里跑。别把 50052 端口暴露到公网,真要跨网玩,先套 WireGuard 或 SSH 隧道。

模型选型:配什么组合,心里先有个数

主模型按上表选量化。向量和重排的小模型(做 RAG 检索用)另说:

为什么小模型不分片? 2.3GB 随便一台机器完整跑,分片反而要把数据传来传去,网络开销大于算力收益,纯负优化。记住:分片只留给「单卡塞不下」的大模型

按你的家底选路线

R0 单卡起步: IQ2_XXS 跑通 → 换 IQ3_XXS 提质量
R1 双机分片: 主力卡 + 旧笔记本 → Q3_K_XL
R2 三机以上: +手机/更多机器 → Q4_K_M
R3 小模型服务: BGE-M3 + Rerank + Qdrant(检索问答)
R4 统一网关: One-API 一个 Key 通所有模型
R5 可选玩具: EXO 自动组网(详情见最后)

只有一张 8GB 卡? 走 R0 → R3 → R4。单机 IQ3_XXS 日常够用,配上 One-API 和检索,自用完全体面。 一张卡 + 一台旧笔记本(最常见)? 走 R0 → R1 → R3 → R4。双机分片后上 Q3_K_XL,质量 92%,以后加设备就是改一行列表的事。 设备多(两卡,或一卡+CPU机+手机)? 走 R0 → R1 → R2 → R3 → R4。直接奔 Q4_K_M,质量 96%,完整形态。 Apple 全家桶? 那主推原版 EXO(MLX 原生支持,自动组网体验最好);llama.cpp RPC 也支持 Metal。Mac 之间分片是苹果生态的强项。

每步的验证标准:能出字 → 日志显示层分到两台设备 → 速度达到预期 → 检索问答正确 → 一个 Key 通全端。下文每步都写了怎么看「成了」。

总体架构:大模型分片,小模型独立
总体架构:大模型分片,小模型独立

动手:从编译到跑通

所有 /path/to/ 都要换成你自己的真实路径,别原样抄。

第 0 步:准备环境

第 1 步:编译 llama.cpp(每个节点都编)

git clone https://github.com/ggml-org/llama.cpp.git && cd llama.cpp
cmake -B build -DGGML_RPC=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
conda create -n llama python=3.11 cuda-toolkit=12.8 -c nvidia -y

验证:./build/bin/llama-server --help 能出帮助信息就是编好了。

第 2 步:启动工作节点(每台非主控机器)

./build/bin/rpc-server --host 0.0.0.0 --port 50052

多卡机器每张卡起一个,换端口:

CUDA_VISIBLE_DEVICES=0 ./build/bin/rpc-server --host 0.0.0.0 --port 50052 &
CUDA_VISIBLE_DEVICES=1 ./build/bin/rpc-server --host 0.0.0.0 --port 50053 &

从主控机器 telnet 工作节点IP 50052 能连上,就绪。

第 3 步:启动主控,连所有节点

在主力 N 卡机上:

./build/bin/llama-server \
  -m /path/to/Qwen3.8-27B-Q4_K_M.gguf \
  --mmproj /path/to/mmproj-BF16.gguf \
  --host 0.0.0.0 --port 8080 \
  --rpc 192.168.1.11:50052,192.168.1.12:50052,192.168.1.13:50052 \
  --ctx-size 8192 \
  --cache-type-k q8_0 --cache-type-v q8_0

参数逐个说: - -m:模型文件;--mmproj:视觉投影(没有它模型没视觉) - --rpc:工作节点地址,官方当前文档用逗号分隔;个别版本要求拆成多次 --rpc,启动报错就以 llama-server --help 为准 - --ctx-size:先 8192。8GB 卡的显存得给 KV cache 留地方,别一上来贪 262K,会 OOM - --cache-type-k/v q8_0:KV cache 量化,省一半显存。对文本质量影响可忽略;对图片理解的影响目前没人系统测过,万一发现看图变笨,关掉对比一下

分片分配:新版默认按各设备内存自动分,先不加 --tensor-split 跑一遍,看日志再微调。手动控制时,--tensor-split 6,6,4,2 的数字是各设备的权重分配比例份数,顺序和 --rpc 列表一致(主控自己排第一),数字越大分到的层越多。两台同配置的卡写 1,1 就行,有弱设备就给小数字。

怎么看「成了」(重点):启动日志里看到这种行,说明分片真的生效了:

load_tensors: layer 1 assigned to device RPC[192.168.1.13:50052]   ← 手机扛浅层
load_tensors: layer 17 assigned to device CUDA0                     ← 主控 GPU 扛中间层
load_tensors: layer 49 assigned to device RPC[192.168.1.12:50052]   ← 旧笔记本扛尾层

如果所有层都显示 CUDA0CPU,那就是 --rpc 没连上,回去查防火墙和 rpc-server 进程。

然后浏览器开 http://主控IP:8080,输一句话,能回就通了;再传张图试试视觉。

第 4 步:向量 + 重排(独立服务,不分片)

找台闲置机器(旧台式机就行):

./build/bin/llama-server -m bge-m3-q4_k_m.gguf --embedding --host 0.0.0.0 --port 8081
./build/bin/llama-server -m bge-reranker-v2-m3-q8_0.gguf --rerank --host 0.0.0.0 --port 8082

模型在 HuggingFace:gpustack/bge-m3-GGUF、Felladrin/gguf-Q8_0-bge-reranker-v2-m3。

第 5 步:向量库 Qdrant

docker run -d --name qdrant -p 6333:6333 -v /path/qdrant_data:/qdrant/storage qdrant/qdrant

(没装 Docker 先 curl -fsSL https://get.docker.com | sh。)浏览器开 http://机器IP:6333/dashboard 看仪表盘。

第 6 步:One-API 统一网关

docker run -d --name one-api --restart always -p 3000:3000 \
  -v /path/one-api_data:/data -e TZ=Asia/Shanghai justsong/one-api

配置:默认账号 root/123456,进去先改密码。加三个渠道,base_url 填 http://主控IP:8080 这种,别带 /v1(One-API 自己会补,带了变成 /v1/v1 直接 404):27B 聊天 → 主控 8080;BGE-M3 → 8081;Rerank → 8082。然后生成一个令牌。

以后所有应用只连 http://网关IP:3000/v1 + 这个令牌,OpenAI 同款格式。换模型?改个模型名就行,应用层无感。

能跑多快:先有个心理预期

下面的数字是推演值,误差 ±30%。算法:显存带宽锚点法——decode 是带宽瓶颈,每档卡的带宽是已知的,效率取 25-35%(GPU 实测普遍区间),再用 M2 Pro 实测的 7.11 tok/s @ 200GB/s 交叉校准。

组合 量化 推演 tok/s 质量 备注
1×8GB 卡 UD-IQ2_XXS 12-20 79% 单机起步档
1×8GB 卡 UD-IQ3_XXS(内存兜一点) 6-10 89% 单机甜点;DDR4 老机器取下限,DDR5 取上限
8GB 卡 + 旧笔记本 Q3_K_XL 5-10 92% 双机分片入门
2×8GB 卡 Q4_K_M 10-18 96% 双卡甜点,推荐
2 卡 + CPU 节点 + 手机 Q4_K_M 8-15 96% 全异构,慢在弱节点
24GB 卡(将来) Q4_K_M / NVFP4 30-50 96-99% 升级路径

给个参照:10-20 tok/s 是舒服的对话速度,30+ 秒回,5 以下明显卡顿。这表里大多数档位都在可对话区间。

部署完第一件事,用 llama-bench 实测校准:

./build/bin/llama-bench -m /path/to/model.gguf -p 2048 -n 256 -ngl 999
# 看 tg(解码 tok/s)那列,对比上表
不同配置的速度推演
不同配置的速度推演

本喵的实话:分片加再多,速度也追不上 4090 单卡——一张大卡 35-55 tok/s,四台旧设备 8-15。但旧设备不花钱啊。4 台吃灰机器 ≈ 一张大几千的新卡,这笔账怎么算都划算。

本喵翻过的车(血泪坑)

车 1:WiFi 组网,慢到怀疑人生

第一次组集群图省事全走 WiFi,结果每秒蹦 1-2 个字,比单机还慢。原因:WiFi 实际吞吐只有有线的 1/3 到 1/5,延迟还抖。每层多几十毫秒,64 层叠起来每个字多等好几秒。教训:固定节点必须插网线。 千兆口不够?加个交换机,几十块钱。

车 2:8GB 卡硬塞 Q4,启动就 OOM

Q4_K_M 17.1GB,8GB 卡连一半都装不下,更别说 KV cache 和 CUDA 运行时还要吃显存。教训:别只看模型文件大小,8GB 卡至少留 1-2GB 给 KV cache 和 CUDA 开销。

车 3:把 BGE-M3 也塞进分片集群

想着”反正都搭好了,小模型也分了吧”,结果 embedding 比单机还慢。教训:2.3GB 的模型完整跑才是最优,分片是负优化。 分片只给「单卡塞不下」的大家伙。

车 4:手机满载,跑着跑着就萎了

手机没主动散热,满载几分钟温控降频,它扛的那几层成了集群瓶颈,全场变慢。教训:手机只给浅层(前 4-8 层),必须散热背夹,保持充电。

车 5:长上下文 OOM

短聊没事,输入一长就崩。KV cache 是推理的「工作内存」,上下文越长占得越多,8K 上下文能吃掉 1-2GB。教训:先 8192,开 KV 量化,别贪 262K。

车 6:原版 exo 在 N 卡上死活不干活

exo 的自动组网很诱人,但原版已经移除 CUDA 后端,只支持 Apple Silicon 的 MLX。N 卡用户只能用社区 fork,稳定性看天。教训:生产用 llama.cpp RPC,EXO 当玩具。

车 7:RTX 50 系编译完,一跑就崩 SOFT_MAX

Blackwell 架构需要 CUDA 12.8;12.4 编不了,13.x 有 bug。教训:新架构+新工具链=坑王组合,先查 Issue 再动手。

车 8:忘了 mmproj,模型变”文盲”

27B 是视觉模型,但视觉能力靠单独的 mmproj 文件加载。没加载,发图过去它一脸懵。教训:多模态的「多模态」是配件,别忘装。

车 9:直连 HuggingFace,下到 90% 断

断点续传都没有,重开从头下。教训:国内先 export HF_ENDPOINT=https://hf-mirror.com

常见报错速查

报错 意思 快速解法
out of memory 显存/内存不够 降量化 / 减 ctx / 分片或 offload
connection refused rpc-server 没起或防火墙挡了 查进程、ufw allow 50052
rpc worker failed 工作节点掉线 ping 一下;手机是不是被息屏杀了;重启 rpc-server
No such file or directory 路径没替换 /path/to/ 换成真实路径
Illegal instruction / SOFT_MAX 崩 工具链不对 RTX 50 系确认 CUDA 12.8 + sm_120

顺便聊聊:H3 视频模型能不能也这么搞

MiniMax H3(33B 全模态视频模型,开源后登顶全球视频榜)很多人问。本喵查了一圈,结论:当前别想本地跑。

原因:H3 是扩散模型(DiT),不是 Transformer 解码器,每次生成一步要读全部 ~21GB 权重(不是拆几层的事)。INT8 剪枝下峰值显存 31.7GB——RTX 5090 32GB 实测刚好够;8GB 卡激进卸载跑 10 秒 864×480 视频要 175 秒,峰值还占 26.9GB。异构集群救不了,内存带宽差 5-8 倍,结构性瓶颈。

想玩?走官方 API(积分制)或云平台(ComfyUI 在线跑)。等三个窗口:稀疏注意力开源(官方预告过)、更激进的量化、32GB 显存硬件降价——任一兑现再评估。当前分工:本地 27B 管文本和图片,视频交给 API。

收尾:旧设备不是电子垃圾

本喵见过太多人,一说跑大模型第一反应是”我得买张 4090”。其实你抽屉里的旧台式机、旧笔记本、退役手机,拼一拼就是一台能跑 27B 的集群。不花钱,还能顺便搞明白推理原理、带宽瓶颈、量化 trade-off——比买卡插上去有收获多了。

从一张 8GB 卡开始吧。跑通了,加台旧笔记本;再不过瘾,把手机也拉进来。每加一台,质量上一个台阶。等你凑齐两三台设备跑到 Q4 96% 的时候,回头看,这体验真不输一张大几千的新卡。

对了,看不懂的术语,回头翻这个表:

术语 大白话
GGUF 量化后的模型文件格式,llama.cpp 直接加载
RPC 远程过程调用,让多台机器分工算一个模型
KV cache 推理时的中间状态缓存,长上下文很占显存
多模态 / VLM 既能看文字也能看图/视频的模型
mmproj 视觉投影层,把图像转成模型能懂的 token
量化 把参数从 16 位压到 4/2 位,体积变小、质量略降
offload 显存放不下的层放内存里跑
tok/s 每秒生成的 token 数(1 个汉字≈1-2 个 token)
prefill / decode 处理整段输入 / 逐字生成输出