MoE 模型本地运行指南:为什么 30B 的模型能像 3B 一样快 - MoE 模型

MoE 模型本地运行指南:为什么 30B 的模型能像 3B 一样快

浏览模型列表时,你会看到 Qwen3-30B-A3B 或 gpt-oss-20b 这样的名字,似乎同时宣称自己又大又小。它们就是 MoE 模型,即混合专家模型,会改变本地大模型对硬件的通常规则。它们需要为所有参数准备内存,但每个 token 只读取其中一小部分,所以生成速度可以比同样文件大小的稠密模型快得多,尤其是在内存很大、带宽一般的机器上。这篇指南解释这个思路,给出你今天就能运行的模型的数字,展示推算的速度上限,并介绍让 MoE 在家用硬件上变得实用的选项。

核对说明:参数量来自 Hugging Face 上 gpt-oss(OpenAI)、Qwen3-30B-A3B(Qwen)和 DeepSeek-V3 的模型卡;下载大小来自 Ollama 模型库;llama.cpp 的选项来自其服务器文档,均于 2026-10-30 核对。速度上限是我们根据内存带宽推算的估计,不是基准测试,写这篇文章时我们没有运行这些模型。

要点速览(更新于 2026-10-30)

  • MoE 模型把所有专家都存在内存里,但每个 token 只激活几个:gpt-oss-20b 有 21B 参数、激活 3.6B,Qwen3-30B-A3B 有 30.5B、激活 3.3B,gpt-oss-120b 有 117B、激活 5.1B。
  • 内存容量仍然要装下整个模型,在 Ollama 模型库里 gpt-oss-20b 约 14GB,gpt-oss-120b 约 65GB,但速度取决于激活的权重,所以 MoE 模型在系统内存上也跑得不错。

  • llama.cpp 可以用 --cpu-moe 或 --n-cpu-moe 把专家权重留在 CPU,把共享层放在 GPU;这是对“普通显卡加大量内存”最好的利用方式。

一段话讲清稠密模型与 MoE

在 Llama 3.1 70B 这样的稠密模型里,每个参数都参与产生每个 token,所以每个 token 都要读完 Q4_K_M 文件的全部 43GB。在混合专家模型里,每一层的前馈部分被拆成许多小的专家网络,由路由器为每个 token 挑选其中几个。例如按模型卡所说,Qwen3-30B-A3B 每层有 128 个专家,每个 token 只用其中少数几个。注意力层和路由器是共享的,始终被使用。结果就是:一个拥有大型网络的知识容量、却只有小型网络的单 token 计算量的模型。

gpt-oss-20b、Qwen3-30B-A3B 和 gpt-oss-120b 总参数与激活参数的分组柱状图
图 1:MoE 模型存储很多参数,但每个 token 只用其中一小部分

你能运行的模型的数字

模型 总参数 每个 token 激活 Ollama 下载大小
gpt-oss-20b 21B 3.6B 14GB
Qwen3-30B-A3B 30.5B 3.3B 19GB
gpt-oss-120b 117B 5.1B 65GB
DeepSeek-V3 671B 37B 大多数家用环境装不下

OpenAI 把 gpt-oss-120b 描述为可以装进单张 80GB GPU,把 gpt-oss-20b 描述为面向本地使用,这与上面的文件大小一致。DeepSeek-V3 的模型卡写的是总共 671B 参数、每个 token 激活 37B,这在最大规模上展示了同样的规律:它每个 token 的计算量相当于 37B 的模型,而内存需求却是 671B 的。我们关于 gpt-oss 的文章讲了实际运行,最佳模型清单则比较了 MoE 与稠密模型的选择。

MoE 对内存与速度的影响

先说容量。整个模型必须存放在某处,所以同样文件大小的 MoE 模型所需内存与稠密模型相同。14GB 的 gpt-oss-20b 放不进 8GB 的显卡,65GB 的 gpt-oss-120b 需要大容量统一内存的机器或者很多内存。我们的显存计算指南对容量的规则完全适用,照常为上下文留出空间。

速度才是 MoE 的好处所在。我们在内存与显存的文章里得出的规则是:每个 token 都需要从内存里读取激活的权重,所以速度上限等于内存带宽除以每个 token 读取的字节数。对稠密模型,这就是整个文件;对 MoE 模型,大致是激活的那部分。我们把每个 token 的读取量估算为文件大小乘以激活参数再除以总参数,这只是近似,因为注意力权重总是被读取,不同的 token 也会用到不同的专家。

稠密模型与 MoE 模型在双通道 DDR5-6000 上的速度上限推算柱状图
图 2:系统内存上的速度上限推算,MoE 模型远远领先于稠密模型

在约 96 GB/s 的双通道 DDR5-6000 上,稠密 70B 的 Q4_K_M 模型上限约为每秒 2.2 个 token,稠密 32B 约为 4.9。相比之下,我们对 gpt-oss-20b 的估算约为 40,对 Qwen3-30B-A3B 约为 47,即使是 gpt-oss-120b,只要模型放得进内存,也约为 34。这些是理论上限,实际速度更低,但稠密和 MoE 之间的差距是真实而且很大的。这解释了为什么人们反映 MoE 模型在没有强力 GPU 的机器上,包括笔记本和迷你主机上,用起来很快;请看我们的迷你主机指南。

提示处理是另一回事。当你粘贴一份长文档时,模型要先读完它才开始回答,这一阶段受计算能力的限制比受内存带宽的限制更大,所以慢速 CPU 上的 MoE 模型,在长提示的前几秒仍然可能显得迟钝。处理共享层的 GPU 在这里帮助最大,这也是为什么要把普通显卡与大量内存搭配,而不是只依靠 CPU。

在普通硬件上运行 MoE 模型

有三种实用的配置。

  1. 全部放在 GPU 上:如果整个模型能放进显存,MoE 模型就是非常快。16GB 的显卡可以放下 14GB 的 gpt-oss-20b 下载文件,并留有适度的上下文。
  2. 共享层在 GPU,专家在内存:llama.cpp 有 --cpu-moe,把所有专家权重留在 CPU;还有 --n-cpu-moe N,只对前 N 层这样做。注意力和共享部分留在显存里,因为每个 token 都会用到;庞大的专家权重放在便宜的系统内存里,每个 token 只读取其中几个。这种配置让 12GB 或 16GB 的卡能以出人意料的可用速度运行比显存大得多的模型。llama.cpp 文档还列出了一个针对留在 CPU 上的专家的缓存选项。
  3. 全部放在内存里:在有 64GB 或更多高速内存的机器上,仅靠 CPU 就能以可读的速度运行 gpt-oss-120b,不过比有 GPU 帮忙时更慢。

无论哪种配置,都要记住上下文也需要内存。我们的上下文长度指南解释了 KV 缓存,对于 MoE 模型,缓存与相同层宽的稠密模型相近,所以长上下文仍然可能用光显存。

一份算好的内存方案

以一台配有 12GB 显卡和 64GB 系统内存的台式机为例,假设你想试 gpt-oss-120b,它在 Ollama 的下载大小是 65GB。模型本身就略大于内存,所以这台机器没法靠大量使用磁盘来运行它,那样太慢了。更合理的目标是 19GB 的 Qwen3-30B-A3B。12GB 的显卡放不下全部,但专家可以放在内存里,占据这 19GB 的大部分,而共享层和适度上下文的 KV 缓存则使用显卡。操作系统和其他程序仍需要几个 GB,所以 64GB 的机器空间绰绰有余。如果升级到 128GB 内存,例如在统一内存的迷你主机上,gpt-oss-120b 就变得现实了,我们推算的 DDR5 级带宽上约 34 token/s 的上限说明了为什么大家觉得它可用。

同样的算术也告诉你什么不该买。一套 64GB 的内存救不了 117B 的模型,而放在内存里的专家,换更快的 GPU 帮助也不大,因为这些层的速度由内存带宽决定。如果想在这个方案里提高速度,更快的双通道内存,或者内存通道更多的平台,比换更大的显卡更有用。

怎样确认它在正常工作

用正常的日志启动 llama.cpp 并阅读加载信息:它会报告有多少层被卸载到 GPU 以及每个缓冲区的大小,所以你能看到有多少在显存、有多少在 CPU 内存。模型生成时用 nvidia-smi 观察显存。如果显存几乎是空的,说明你的参数让太多内容留在了 CPU;如果显存已满并且程序报错,就减小上下文,或把更多专家移到 CPU。然后生成一段长回答并记下速度。每次只改一个参数并做好记录,因为最佳设置取决于你的模型、内存条和上下文长度。用 Ollama 时选择是自动的,ollama ps 会显示 CPU 与 GPU 的分配。

稠密还是 MoE:怎么选

情况 更好的选择 原因
12GB 到 16GB 显卡,内存很多 专家放内存的 MoE 快,知识容量更大
显存充足,想要同等大小下最好质量 稠密模型 每存储一个 GB 往往更强
只有 CPU 的笔记本或迷你主机 小型 MoE 速度取决于激活的权重
总内存紧张 量化后的小型稠密模型 MoE 仍要存储全部权重
在家做微调 小型稠密模型 工具更简单

公平地总结:MoE 是用内存换速度。你付出的是容量,因为 30B 的 MoE 文件和 30B 稠密文件一样大,而节省的是带宽。如果你的瓶颈是内存容量,MoE 帮不上忙;如果你的瓶颈是廉价硬件上的速度,它能彻底改变体验。

质量、量化与注意事项

不要假定某个总大小的 MoE 模型在质量上等同于同样大小的稠密模型,也不要假定它等同于与激活大小相同的稠密模型。实际上,MoE 模型的质量介于两者之间,取决于训练,也随任务而异,所以请用你自己的提示去测试。量化同样适用于 MoE 模型,我们的 Q4_K_M 指南里讲的各种缩减对它们同样适用;gpt-oss 系列以紧凑的原生格式发布,所以它们的文件比参数量所暗示的要小。各个程序的工具支持仍然不均衡,所以在下载大文件前,请确认你运行时的版本支持该架构。

常见错误

  • 把“A3B”当成 3B 的内存需求:整个模型都要存储,只有速度取决于激活的部分。
  • 把专家放在慢速硬盘上还期待 MoE 的速度:专家要放内存或显存,不要放在交换空间。
  • 忽视上下文内存:KV 缓存仍然随上下文长度增长。
  • 只用激活参数比较质量:总大小和训练同样重要。
  • 忘了运行时版本:新架构需要较新的 llama.cpp 或 Ollama。

常见问题

Qwen3-30B-A3B 里的 A3B 是什么意思?

按模型卡,它表示总共 30.5B 参数里,每个 token 约有 3B 参数处于激活状态(3.3B)。

MoE 模型需要的显存更少吗?

不是。它们需要为全部权重准备内存,是更快,而不是更小,不过你可以把专家留在系统内存里,从而使用更少的显存。

gpt-oss-20b 是 MoE 模型吗?

是。OpenAI 把它描述为 21B 参数、激活 3.6B,面向本地使用。

cpu-moe 是做什么的?

它让 llama.cpp 把专家权重留在 CPU,而其他层可以使用 GPU,这样能节省显存,速度损失不大。

MoE 模型比稠密模型更好吗?

不一定。它们对于相同大小来说每个 token 更快,但稠密模型在相同内存占用下往往更强,请在你自己的任务上测试。

我能在家里运行 gpt-oss-120b 吗?

如果你有约 65GB 或更多可用内存,再加上上下文的空间,就可以运行,速度取决于你的带宽。

和我们聊聊

在为你的硬件选稠密模型还是 MoE 模型?欢迎加入社区,或发邮件到 admin@microaione.com。

参考资料:gpt-oss-20b 模型卡、Qwen3-30B-A3B 模型卡、DeepSeek-V3 模型卡、llama.cpp 服务器文档。

类似文章