本喵是小黑,一只黑猫。今天不卖萌,带你们干件正经事:把手头吃灰的旧电脑、旧显卡、甚至闲置手机拼起来,跑通 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,这个后文讲。
3. 为什么网络是命根子
推理分两段: - Prefill(预填充):处理你输入的一大段话,算力密集,看 GPU 强不强。 - Decode(解码):一个字一个字往外蹦,每蹦一个字都要把权重读一遍,是带宽瓶颈——卡越快、显存带宽越高,蹦得越快。
分片后,层与层之间要跨设备传数据,传的是每层的「激活值」(中间输出),几十 MB 的量级。千兆有线局域网每层传几十毫秒,64 层叠起来几百毫秒,可接受。
但要是 WiFi?每层传输的延迟和抖动直接翻几倍,叠起来每个字多等好几秒,推理慢 3-10 倍——所以固定节点必须插网线,这条没得商量。手机实在没法插线,用 USB 共享网络,或 5GHz WiFi 临时玩玩可以。
安全提醒:rpc-server 没有内置鉴权,这集群只该在你自己局域网里跑。别把 50052 端口暴露到公网,真要跨网玩,先套 WireGuard 或 SSH 隧道。
模型选型:配什么组合,心里先有个数
主模型按上表选量化。向量和重排的小模型(做 RAG 检索用)另说:
- BGE-M3 GGUF(~2.3GB,多语言):llama.cpp
--embedding原生支持,独立部署,别分片 - BGE-Reranker-v2-M3 GGUF(~568MB):
--rerank原生支持,同样独立部署
为什么小模型不分片? 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 步:准备环境
- 固定节点:千兆有线、静态 IP(路由器后台绑 MAC,或设备里设——Linux 用
nmtui,Windows 在「网络设置→更改适配器选项→IPv4」,安卓在「WiFi→IP设置→静态」),互相ping通,防火墙放行 50052 - Linux 节点:
sudo apt install build-essential cmake git python3-pip;N 卡节点装好驱动 - Windows 节点:装 WSL2(Ubuntu 22.04),显卡驱动在 Windows 装,WSL 里直通
- 安卓手机:装 Termux。注意从 F-Droid 官网下安装包(f-droid.org),别用 Google Play 版(已停更)。装完先换国内镜像源(长按屏幕 → More → Select Mirror → 选中国镜像),再
pkg update && pkg install clang cmake git。手机 IP 在 WiFi 设置里看,或 Termux 里ip addr show wlan0。关键:设置里把 Termux 的电池优化设为「不限制」,不然手机一息屏进程就被杀了
第 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)
- N 卡节点:
cmake -B build -DGGML_RPC=ON -DGGML_CUDA=ON -DCMAKE_BUILD_TYPE=Release - RTX 50 系(Blackwell)的坑在这:必须用 CUDA 12.8 工具链,再显式指定架构
-DCMAKE_CUDA_ARCHITECTURES=120。CUDA 12.4 编不了这个架构;CUDA 13.x 有代码生成 bug,跑起来会崩 SOFT_MAX。社区 Issue(ggml-org/llama.cpp#22696)里全是血泪。CUDA 12.8 用 conda 装最省事:
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] ← 旧笔记本扛尾层
如果所有层都显示 CUDA0 或 CPU,那就是 --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 | 处理整段输入 / 逐字生成输出 |