先说结论,省得看到最后才发现不是自己要的。
一台普通台式机,一张 24GB 显存的显卡,跑总参 125B 的 MoE 模型:输出 21 tokens/s 上下,预填充 364 t/s,上下文能顶到 25 万 token。
反常的地方在体积。这个模型量化后 111.4GB,分四个 GGUF 分片。按以前的经验,24GB 显存连零头都放不下,更别提 25 万 token 的上下文。
跑它的机器本身不特殊:Ubuntu 22、CUDA 13、PCIe 4.0 x16,显卡就是那张 24GB 的 4090。真正不像家用机的是内存,110GB DDR4。显存反倒没吃满,最省的配置只占 11.66GB。
所以“消费级硬件跑大模型”这句话要打个折,折扣打在哪,后面说。
125B 为什么不等于 125B 显存
关键在 MoE。125B 是总参数量,A6B 说的是每个 token 真正激活的参数量,大概 6B。模型里堆着几十上百个专家,路由器每一轮只挑一小撮上场,剩下的这一轮完全不动。
这就带来一个很实际的后果:算力按 6B 算,存储却还得按 125B 算。算得动的部分不大,但权重得老老实实待着,随时能被取到。
问题于是从“显存放不放得下”变成“取权重够不够快”。显存放不下的那部分,可以放到内存里,用速度换容量。前提是这部分本来就不是每轮都要用,比如那些没被选中的专家。
把专家层交给内存
llama.cpp 里有两个参数干这件事。一个是 -cmoe,把全部专家层的权重留在内存,注意力部分仍在显卡上算;另一个是 -ncmoe N,混合模式,把 N 个专家层留在显卡,其余交给内存。
为什么注意力层不跟着一起挪走?因为它的权重每个 token 都要用到,而且要参与一次覆盖全序列的矩阵运算,扔进内存会直接把每一步都拖慢。专家层是稀疏的,一轮只用一小撮,用不到的那些完全可以慢慢躺着。这两类权重的脾气不一样,处理方式自然也该不一样。
一次前向大概是这样分工的:
- 1张量进显卡,注意力层先算
- 2路由器从专家池里挑出本轮要用的那几个
- 3选中的专家在内存侧算完权重不搬上显卡,只把结果送回去
- 4结果合回显卡,接着走下一层
- 5逐层重复,最后出第一个词
被选中之外的那些专家,这一轮从头到尾没被碰过,它们在内存里躺着就行。这条链的关键不是把 111GB 塞进 24GB,而是让每一轮真正要动的权重少到算得过来。
四组配置,数据长这样
| 配置 | 上下文 | 预填充 | 解码 | 显存 | 内存 |
|---|---|---|---|---|---|
| 混合,40 层专家留在显卡 | 80k | 383.85 t/s | 22.52 t/s | 23.85GB | 97GB |
| 专家层全交给内存 | 80k | 355.72 t/s | 20.84 t/s | 11.66GB | 110GB |
| 专家层全交给内存 | 180k | 357.75 t/s | 20.98 t/s | 15.6GB | 110GB |
| 专家层全交给内存 | 250k | 364.29 t/s | 20.97 t/s | 18.3GB | 110GB |
最值得琢磨的是第一行和第二行的差:显存从 23.85GB 掉到 11.66GB,空出一半还多,解码速度只从 22.52 掉到 20.84 t/s。省显存几乎不花速度,这才让 25 万 token 的上下文变得可行。
上下文从 8 万拉到 25 万,显存从 11.66GB 涨到 18.3GB,速度基本不动,还剩 5.7GB 余量。这条曲线比那几个速度数字本身更让人踏实。
值钱的是两行 batch 参数
同一套权重,-b 4096 -ub 4096 把预填充从 150 t/s 左右提到 364 t/s 以上。
预填充是“读 prompt”的成本,prompt 越长越疼。很多人只盯解码速度,可长上下文场景里第一步慢才是真难受:等半天才吐第一个字。这两行参数改起来没什么成本,收益却是翻倍级的。
另一头是把更多专家层留在显卡上。有人用更激进的量化,只留 12/48 个专家在显卡上,解码跑到 26 到 30 t/s,代价是上下文从 25 万缩回 4 万左右,模型也因为量化更狠而变糊。快和聪明,短时间里只能先挑一个。
上手之前先看清门槛
内存是硬门槛,110GB 起步。内存不够,直接退回 27B 级的稠密模型,别硬撑。
内存带宽决定成败。权重活在内存里,每一步都得从内存读,DDR4 还是 DDR5、单通道还是双通道,差出来的就是解码速度。这也解释了一个怪现象:显卡换成更强的,速度未必涨多少。
要自己编译。这套架构当时只在实验分支上,不是装个正式版就能跑,得拉源码、开 CUDA、按本机架构编一遍,中间翻车的点不少。
量化有代价。Q4 档位能跑通,不代表智力够用;上下文拉得越长,KV cache 也越吃资源,显存和内存都要重新算一笔账。另外别忘了磁盘,量化后仍有 111GB,第一次加载和反复重启的等待时间,都是要付的。
门槛正从显卡挪到内存条上
把这几组数字连起来看,本地能跑多大规模的模型,决定权正在从显卡往内存转移。24GB 显存已经不太算瓶颈,一摞内存条才是。
所以下回想升级机器,先别急着看显卡。数数机箱里的内存插槽,可能更接近问题的答案。