TinkerLab
跳转可下载配置
01 // HOMELABNVIDIA 独显Docker 容器流式 API阅读与复现约 14 分钟

单张 12GB–24GB 消费级显卡 + 双通道 DDR5 跑通 30B 与 80B MoE 大模型:llama.cpp 原生 --n-cpu-moe 专家卸载实测与 RTX 5070 SUPER (18GB) / 5080 SUPER (24GB) 显存选型

无需昂贵的 EPYC 服务器或万元工作站卡,普通家用台式机(单张 12GB/16GB/24GB 独显 + 64GB 双通道 DDR5 内存)现在就能流畅跑通 Qwen3-30B-A3B(18.6GB)与 Qwen3-Next-80B-A3B(48.2GB)!借助主线 llama.cpp 原生支持的 `--n-cpu-moe N`(简写 `-ncmoe N`)参数,可将 100% 注意力层与 KV Cache 焊死在 GDDR6/GDDR7 显存内,仅把前 N 层的稀疏专家卸载至双通道 DDR5,在 16GB 显卡上实测跑出 46–55 tok/s(30B-A3B)与 26.4 tok/s(80B-A3B)。本文同时按单颗 3GB GDDR7 颗粒规格推算了 RTX 5070 SUPER (18GB) 与 RTX 5080 SUPER (24GB) 对卸载层数的改变。

[核心实测结论 / TL;DR]在 Tinker AI 实测工坊针对「单张 12GB–24GB 消费级显卡 + 双通道 DDR5 跑通 30B 与 80B MoE 大模型:llama.cpp 原生 --n-cpu-moe 专家卸载实测与 RTX 5070 SUPER (18GB) / 5080 SUPER (24GB) 显存选型」的复现测试中(实测环境:实测平台:AMD Ryzen 9 9900X + 64GB 双通道 DDR5-6400 CL30(实测读取 ~84 GB/s)+ RTX 4070 (12GB) / RTX 5060 Ti (16GB) / RTX 5070 Ti (16GB) / RTX 4090 (24GB) | 规格推算对照:NVIDIA RTX 5070 SUPER (18GB GDDR7 192-bit · ~672 GB/s) 与 RTX 5080 SUPER (24GB GDDR7 256-bit 32 Gbps · ~1,024 GB/s),软件版本:llama.cpp b4920+ (upstream native `--n-cpu-moe` / `-ncmoe` & `--cpu-moe` / `-cmoe` support) / CUDA 12.8 (`GGML_CUDA=1` + Flash Attention `-fa`) / Models: Qwen3-30B-A3B-Q4_K_M.gguf (18.6 GB, 48 layers) & Qwen3-Next-80B-A3B-Q4_K_M.gguf (48.2 GB, 48 layers),验证日期:2026-11-06):无需昂贵的 EPYC 服务器或万元工作站卡,普通家用台式机(单张 12GB/16GB/24GB 独显 + 64GB 双通道 DDR5 内存)现在就能流畅跑通 Qwen3-30B-A3B(18.6GB)与 Qwen3-Next-80B-A3B(48.2GB)!借助主线 llama.cpp 原生支持的 `--n-cpu-moe N`(简写 `-ncmoe N`)参数,可将 100% 注意力层与 KV Cache 焊死在 GDDR6/GDDR7 显存内,仅把前 N 层的稀疏专家卸载至双通道 DDR5,在 16GB 显卡上实测跑出 46–55 tok/s(30B-A3B)与 26.4 tok/s(80B-A3B)。本文同时按单颗 3GB GDDR7 颗粒规格推算了 RTX 5070 SUPER (18GB) 与 RTX 5080 SUPER (24GB) 对卸载层数的改变。 离线边界为「100% 本地台式机独显 + DDR5 内存离线运行」(所有 GGUF 权重与 `--n-cpu-moe` 异构张量切分均在本地 PCIe 与系统内存间完成,无任何外部网络依赖。),关键限制包括:表 1 中 RTX 4070 (12GB)、RTX 5060 Ti (16GB)、RTX 5070 Ti (16GB) 与 RTX 4090 (24GB) 为本站 Ryzen 9 9900X + DDR5-6400 平台实测数据;而 **RTX 5070 SUPER (18GB)** 与 **RTX 5080 SUPER (24GB)** 两行为基于单颗 3GB (24Gb) GDDR7 显存规格的**理论推算值**,在表中已明确标注 `[规格推算]`。
REPRODUCIBILITY MANIFEST // 实测环境与边界清单
最后实测验证日期:2026-11-06
实测硬件与操作系统 (Tested Hardware & OS)

实测平台:AMD Ryzen 9 9900X + 64GB 双通道 DDR5-6400 CL30(实测读取 ~84 GB/s)+ RTX 4070 (12GB) / RTX 5060 Ti (16GB) / RTX 5070 Ti (16GB) / RTX 4090 (24GB) | 规格推算对照:NVIDIA RTX 5070 SUPER (18GB GDDR7 192-bit · ~672 GB/s) 与 RTX 5080 SUPER (24GB GDDR7 256-bit 32 Gbps · ~1,024 GB/s)

锁定软件与模型版本 (Pinned Stack Versions)
llama.cpp b4920+ (upstream native `--n-cpu-moe` / `-ncmoe` & `--cpu-moe` / `-cmoe` support)CUDA 12.8 (`GGML_CUDA=1` + Flash Attention `-fa`)Models: Qwen3-30B-A3B-Q4_K_M.gguf (18.6 GB, 48 layers) & Qwen3-Next-80B-A3B-Q4_K_M.gguf (48.2 GB, 48 layers)
离线与外部连接核查 (Offline & Network Boundary)
100% 本地台式机独显 + DDR5 内存离线运行

所有 GGUF 权重与 `--n-cpu-moe` 异构张量切分均在本地 PCIe 与系统内存间完成,无任何外部网络依赖。

已知限制与失败案例 (Known Limits)
  • 表 1 中 RTX 4070 (12GB)、RTX 5060 Ti (16GB)、RTX 5070 Ti (16GB) 与 RTX 4090 (24GB) 为本站 Ryzen 9 9900X + DDR5-6400 平台实测数据;而 **RTX 5070 SUPER (18GB)** 与 **RTX 5080 SUPER (24GB)** 两行为基于单颗 3GB (24Gb) GDDR7 显存规格的**理论推算值**,在表中已明确标注 `[规格推算]`。
  • `--n-cpu-moe N` 仅对**稀疏混合专家模型(MoE)**有奇效(因为单 Token 仅激活约 3B 专家权重)。对于稠密模型(如 `Qwen3-32B`、`Llama-3.3-70B`),一旦溢出到双通道 DDR5(~84 GB/s),生成速度依然会跌至个位数。
遇到环境异常?打开排障诊断树 →

1. 为什么主线 `llama.cpp --n-cpu-moe N` 比传统按层切分 (`-ngl`) 快 3.4 倍?

假设你手里有一张主流的 **16GB 显卡(`RTX 5060 Ti` / `5070 Ti` / `4080`)**,想运行综合能力极强的 **`Qwen3-30B-A3B-Q4_K_M`(权重 `18.6 GB` + 32K 上下文 KV Cache 约 `1.8 GB` = 总计约 `21 GB`)**。如果用传统的按层切分(`-ngl 33`),`llama.cpp` 会把后 15 层的**注意力层(Attention)、KV Cache 和专家层全部扔给 CPU**,导致生成速度暴跌至 `16.1 tok/s`,预填充更是惨不忍睹。而现在,主线 `llama.cpp` 原生内置了 **`--n-cpu-moe N`(简写 `-ncmoe N`)** 参数!当你执行 **`-ngl 99 --n-cpu-moe 16`** 时,**全部 48 层的注意力层、路由门控与 32K KV Cache 100% 驻留在高速 GDDR7 显存内**,仅仅把前 16 层的稀疏路由专家权重(`ffn_*_exps.weight`)放进双通道 DDR5 系统内存。由于 `Qwen3-30B-A3B` 全部 48 层每次仅激活约 `2.0 GB` 专家权重,分摊到 DDR5 内存上的 16 层每次仅需读取 **约 `0.67 GB` 数据**——实测在 RTX 5070 Ti 16GB 上,生成速度直接从 `16.1 tok/s` 狂飙至 **`54.6 tok/s`(提速 3.4 倍)**,预填充高达 **`3,180 tok/s`**!
Run 30B-A3B (18.6GB) or 80B-A3B (48.2GB) on a 16GB GPU + 64GB DDR5 PC using native --n-cpu-moe
# Case A: Fit Qwen3-30B-A3B (18.6GB Q4_K_M) + 32K context on a 16GB GPU (~14.1 GB VRAM used)
./build/bin/llama-server \
  -m ./models/Qwen3-30B-A3B-Q4_K_M.gguf \
  -ngl 99 --n-cpu-moe 16 \
  -fa -ctk q8_0 -ctv q8_0 -c 32768 -t 12

# Case B: Fit Qwen3-Next-80B-A3B (48.2GB Q4_K_M) on a 16GB GPU + 64GB DDR5 RAM (~14.4 GB VRAM + ~36 GB DDR5)
./build/bin/llama-server \
  -m ./models/Qwen3-Next-80B-A3B-Q4_K_M.gguf \
  -ngl 99 --n-cpu-moe 38 \
  -fa -ctk q8_0 -ctv q8_0 -c 32768 -t 12

2. 12GB / 16GB / 24GB 实测吞吐对比表 + 3GB 颗粒 SUPER 新卡(18GB / 24GB 规格推算)边界分析

不同显存容量到底该设多少层 `--n-cpu-moe N`(以总计 48 层的 `Qwen3-30B-A3B` 与 `Qwen3-Next-80B-A3B` 为例)?如果换上采用单颗 **3GB (24Gb) 高密度 GDDR7 显存颗粒**的 **RTX 5070 SUPER (18GB · 192-bit)** 与 **RTX 5080 SUPER (24GB · 256-bit 32 Gbps)**,又会带来怎样的质变?算一笔精确的显存账:`Qwen3-30B-A3B Q4_K_M` 每一层的路由专家约占 **`0.35 GB`**。在 16GB 显卡上设 `--n-cpu-moe 16` 可省出 `5.6 GB` 显存;而在 **18GB 的 RTX 5070 SUPER** 上只需设 `--n-cpu-moe 6`(若换用 `16.2 GB` 的 `IQ4_XS` 甚至可以设 `0` 全进显存!);到了 **24GB 的 RTX 5080 SUPER(1,024 GB/s 带宽)**,原本在 RTX 5080 16GB 上溢出的 `Qwen3-30B-A3B` 与 `Qwen3-32B` 稠密模型均可 **100% 装入 GDDR7 显存(`--n-cpu-moe 0`)**!
表 1:双通道 DDR5-6400 下 llama.cpp --n-cpu-moe 实测吞吐表(32K 上下文,Q8_0 KV)与 18GB/24GB SUPER 规格推算
显卡档位 (+ 64GB DDR5-6400)测试模型 (`Q4_K_M`)最佳卸载参数显存 / 内存占用预填充 (`pp2048`)生成速度 (`tg128`)
RTX 4070 (12GB · 504 GB/s) [实测]Qwen3-30B-A3B (18.6 GB)`-ngl 99 --n-cpu-moe 26`10.4 GB / 9.8 GB1,640 tok/s**34.8 tok/s** (传统 `-ngl` 仅 14.2)
RTX 5060 Ti (16GB · 448 GB/s) [实测]Qwen3-30B-A3B (18.6 GB)`-ngl 99 --n-cpu-moe 16`14.1 GB / 6.2 GB1,890 tok/s**46.2 tok/s**
RTX 5070 Ti (16GB · 896 GB/s) [实测]Qwen3-30B-A3B (18.6 GB)`-ngl 99 --n-cpu-moe 16`14.1 GB / 6.2 GB3,180 tok/s**54.6 tok/s**
**RTX 5070 SUPER (18GB · 672 GB/s) [规格推算]**Qwen3-30B-A3B (18.6 GB)`-ngl 99 --n-cpu-moe 6`约 16.4 GB / 约 2.5 GB约 2,900 tok/s (估)**约 78–86 tok/s (估)**
**RTX 5080 SUPER (24GB · 1024 GB/s) [规格推算]**Qwen3-30B-A3B (18.6 GB)`-ngl 99 --n-cpu-moe 0` (全进显存)约 20.6 GB / 0 GB约 4,400 tok/s (估)**约 120–135 tok/s (估)**
RTX 5070 Ti (16GB) + 64GB DDR5 [实测]Qwen3-Next-80B-A3B (48.2 GB)`-ngl 99 --n-cpu-moe 38`14.4 GB / 36.2 GB1,420 tok/s**26.4 tok/s**
RTX 4090 (24GB · 1008 GB/s) [实测]Qwen3-Next-80B-A3B (48.2 GB)`-ngl 99 --n-cpu-moe 30`21.6 GB / 28.5 GB2,190 tok/s**32.8 tok/s**

3. 零盲猜速算公式:30 秒算出你显卡专属的 `--n-cpu-moe N` 层数

不用反复试错等到爆显存崩溃,只需记住一条针对 48 层 MoE 模型的两步速算公式(在 `Q4_K_M` 下,`Qwen3-30B-A3B` 每层路由专家约 **`0.35 GB`**;`Qwen3-Next-80B-A3B` 每层路由专家约 **`0.94 GB`**):**第一步,扣除必须常驻 GPU 显存的固定开销(全部 48 层 Attention + 共享层 + 32K Q8_0 KV Cache)**,`30B-A3B` 约为 **`3.8 GB`**,`80B-A3B` 约为 **`5.1 GB`**。**第二步,用你的显卡剩余可用显存除以单层专家体积**,得出 GPU 能装下的专家层数 `L_gpu`,然后令 **`--n-cpu-moe = 48 - L_gpu`** 即可!如果你懒得计算,甚至可以直接传 **`--cpu-moe`(简写 `-cmoe`)**,将全部 48 层路由专家放进 DDR5 内存、将全部注意力层留在 GPU。
[提示]可使用下方内嵌的参数化脚本 `launch-llama-cpp-n-cpu-moe.sh`,自动核验显卡剩余显存并携带 `--n-cpu-moe` 与 `Q8_0` KV Cache 启动服务。
FIELD Q&A // 常见实测疑问与边界解答

复现常见疑问与深层原理解答

Q: 主线 `llama.cpp` 的 `--n-cpu-moe N` 与第 33 篇指南中 `ik_llama.cpp` 的 `-ot` 正则卸载有什么区别?

`--n-cpu-moe N` 直接集成在**官方主线 `llama.cpp`** 中,无需写复杂的正则表达式就能精确指定**仅把前 `N` 层的专家卸载到内存**(让你的 16GB/24GB 显卡依然全速承担剩余 `48 - N` 层专家的计算!)。对于在普通 12GB–24GB 家用台式机上跑 30B–80B MoE 模型,主线 `--n-cpu-moe N` 开箱即用、简单得多。

Q: 在 Ollama 中也能使用类似 `--n-cpu-moe` 的专家卸载功能吗?

新版 Ollama 虽已逐步跟进底层 `llama.cpp` 的 MoE 卸载机制,但当显存临界时仍可能把整层 Attention 一起退回 CPU。直接使用 `llama-server --n-cpu-moe N` 可以 100% 强制锁定全部注意力层在 GPU 内,性能更可控。

REPRODUCIBLE ARTIFACT // 配套可参数化附件

llama.cpp 原生 --n-cpu-moe 消费级独显 + 双通道 DDR5 异构 MoE 启动脚本(12GB–24GB 显存)

通过 nvidia-smi 检测可用显存,将 100% 注意力层与 Q8_0 KV Cache 锁定在独显内(-ngl 99 -fa),并通过原生 --n-cpu-moe 将指定层数的稀疏专家权重卸载至双通道 DDR5 内存。

launch-llama-cpp-n-cpu-moe.sh ↗
修改上方参数将实时更新下方配置内容
#!/usr/bin/env bash
# Tinker AI — Mainstream 12GB–24GB GPU + Dual-Channel DDR5 MoE Offload Launcher (Guide #40)
set -euo pipefail

MODEL="./models/Qwen3-30B-A3B-Q4_K_M.gguf"
NCMOE="16"
THREADS="12"
CTX="32768"

echo "=== [1/3] Checking GPU Free VRAM & PCIe Link State ==="
if command -v nvidia-smi >/dev/null 2>&1; then
  nvidia-smi --query-gpu=name,memory.total,memory.free,pcie.link.gen.current,pcie.link.width.current --format=csv
fi

echo "=== [2/3] Verifying llama-server Supports Native --n-cpu-moe ==="
./build/bin/llama-server --help 2>&1 | grep -E -- "--n-cpu-moe|-ncmoe" | head -n 2

echo "=== [3/3] Starting Hybrid MoE Server (-ngl 99 --n-cpu-moe $NCMOE, Attention+KV on GPU, $NCMOE Expert Layers in DDR5) ==="
./build/bin/llama-server \
  -m "$MODEL" \
  -ngl 99 \
  --n-cpu-moe "$NCMOE" \
  -fa -ctk q8_0 -ctv q8_0 \
  -c "$CTX" -t "$THREADS" \
  --host 0.0.0.0 --port 8080

更多可复现工程指南

查看全部 42 篇指南 →