Colibrì:在 25GB 内存的消费级电脑上运行 744B MoE 大模型

开源推理引擎 Colibrì 用纯 C 语言实现、运行时零依赖,可以把 744B 参数的 MoE 模型 GLM-5.2 跑在一台内存 25GB、没有独立 GPU 的普通电脑上。它的办法不是把模型压得更小,而是改变权重的存放位置:约 9.9GB 的常驻参数留在内存,约 370GB 的专家权重放在磁盘、按需流式加载。仓库 JustVugg/colibri 以 Apache-2.0 协议开源,当前 26.1k Star,最新版本 v1.8.0(2026 年 8 月发布,仓库最新提交 2026 年 8 月 24 日)。

744B 参数量不等于 744B 内存需求

不是每生成一个 token 都要动用全部参数。GLM-5.2 是 Mixture-of-Experts(MoE)架构:总参数 744B,但每个 token 实际只激活约 40B 参数,其中真正随输入变化的只有被路由命中的专家。

Colibrì 的做法是把模型拆成两类:

  • 常驻部分——注意力、共享专家、嵌入层等约 17B 参数,int4 量化后约 9.9GB,全程留在内存;
  • 流式部分——共 19,456 个路由专家(75 个 MoE 层),int4 后每个约 19MB,合计约 370GB,放在 NVMe 磁盘上,路由命中时才读入。

这样「能不能跑」不再取决于内存总量,而取决于磁盘读取速度。常驻内存 9.9GB + 流式缓存,25GB 内存的机器即可满足。

核心思路:把权重当数据搬运,而不是当常驻状态

项目对自己的定位是一个「针对权重的 JIT」:就像编译器只编译真正运行的热路径,Colibrì 只在 router 证明某个专家需要时,才把它从磁盘搬进内存。为了让搬运尽量不卡顿,它做了四件事:

  • LRU 缓存:最近用过的专家留在内存,命中就直接计算;
  • 学习型热库:记录每次运行的专家使用历史,把高频专家自动钉在内存里——用得越多,越快;
  • router 超前预取:router 提前一层判断下一个可能需要哪些专家,PILOT 预取线程在计算当前层时就把下一层读出来,实测约 71.6% 的专家选择可以被提前一层预测;
  • 异步 I/O 池:缺失专家由有界异步线程池加载,与常驻专家的计算重叠执行。

对每层还做了针对性细节:单个专家的三张矩阵在磁盘上相邻存放、一次读入;同一批 token 需读同一专家时只读一次。设计原则是放置只决定速度,不决定结果——专家从磁盘读还是从 VRAM 读,输出的 token 完全一致。

一套机制应对三种硬件

同一个引擎、同一个 int4 模型容器,只改变「专家住在哪一层」:

  • 6× RTX 5090 全驻留:全部专家进 VRAM,实测 5.8–6.8 tok/s,首 token 延迟约 13 秒,磁盘完全退出解码路径;
  • 128GB CPU 纯内存:专家全驻留内存,约 1.8 tok/s;
  • 25GB 开发机(项目起点):全部从磁盘流式读,0.05–0.1 tok/s——大约每 10–20 秒才生成一个字,慢,但能跑,这正是项目宣称的「先让它跑起来,哪怕慢」的基线。

项目实测还验证了速度天花板来自磁盘。双 SSD 镜像(COLI_MODEL_MIRROR)把两个盘带宽相加,9GB/s + 3GB/s 的组合比单盘读专家快约 33%。开启 O_DIRECT 直接读写磁盘、绕过系统页缓存,在 Blackwell/Windows 机器上解码提速 34%;但换用不带 DRAM 缓存的 QLC 盘时可能反而变慢,需要实测取舍。

内存里的 KV 状态被压缩了 57 倍

长上下文推理的另一个内存大头是 KV cache。Colibrì 用压缩 MLA 注意力状态,每个 token 只用 576 个浮点数,而原始实现需要 32,768 个——缩小 57 倍,且跨重启持久化(.coli_kv),会话重开时零重新预填,恢复结果与不间断会话逐字节一致。GLM-5.2 的 DSA 稀疏注意力也做了忠实实现:通过让稀疏注意力临时退化为全量注意力、对比两种结果完全一致,来验证实现没有失真。

推测解码:速度与正确性分开记账

GLM-5.2 原生带 MTP 多头预测头:草稿 token 由 MTP 头生成、主模型一次批量前向验证,实测每个前向可多产出 2.2–2.8 个 token。两条默认规则值得注意:

  • MTP 头必须 int8:int4 会把接受率打到 0–4%,等于白算;
  • 草稿与验证必须用同一套计算函数(SPEC_PIN=1),避免两套 kernel 之间行为不一致。

取不取这个加速由硬件说了算:缓存热时是净收益,冷缓存时反而更慢。项目把实测数据连同取舍理由一起公开,不承诺固定加速比。

不止 GLM-5.2:一个引擎、六个模型家族

同一套流式方案还支持另外五个家族,每家族对应一个独立 C 文件,与 GLM-5.2 共用同一套 coli chat / coli serve / coli web 前端——体现的是同一种方案的可复用性:

模型权重体积内存(最低 / 推荐)GPU
OLMoE~7 GB8 GB / 8 GB不需要
GLM-5.2~372 GB16 GB / 24 GB不需要
Inkling~469 GB25 GB(int4 容器)/ 120 GB(无 int4)不需要
Kimi K3~1.6 TB32 GB+ / 32 GB+不需要
DeepSeek V4 Flash~167 GB16 GB / 32 GB可选(GTX 10 系起)
Qwen3.6-35B-A3B~20 GB24 GB / 24 GB可选

其中 DeepSeek V4 Flash 直接流式官方 checkpoint,无需转换:路由专家用原生 fp4、密集层用 fp8-e4m3 块缩放——都是低精度存储格式,能在不显著掉精度的情况下减小体积;43 层、256 个路由专家,CPU 即可运行。可选 CUDA 层覆盖到 Pascal/Turing 老卡(GTX 10 / RTX 20 系,CUDA_ARCH=portable-pre-ampere),实测 RTX 5080 + 双 NVMe 上约 1.6 tok/s。

引擎本身还提供多种部署形态:Tauri 桌面壳、115MB 的 Docker slim 镜像,以及 WebWire 仪表盘——后者可以实时查看 19,456 个专家中每个的路由热度和所在存储层级。

上手成本:程序几百 KB,模型 372 GB

引擎本体是几百 KB 的预编译二进制(Linux/macOS/Windows 免编译直接解压运行),模型则要准备 GLM-5.2 int4 容器(约 372GB,Hugging Face 官方转换版,gs64 分组量化 + int8 MTP 头)。开发者也可以从源码构建——纯 C,只需要 GCC/Clang 和 OpenMP。

一句话结论

Colibrì 把此前被认为需要云端或数块专业卡才能跑的 744B 模型,放到了 25GB 内存的单机上。代价是速度——上限取决于你的 NVMe 有多快。对想在本地跑前沿大模型、又不想为显存买单的开发者来说,这是一个值得实际跑一遍的开源方案;它的技术取舍(KV 压缩、双盘带宽、MTP 头精度)也被公开记录,可以作为本地推理优化的参考样本。