第 1 章 · 01 Colibrì 命题与 MoE 稀疏性洞见 本节摘要:本节讲清 Colibrì 的核心命题——一个纯 C 的"tiny engine, immense model"推理引擎,要把 744B 到 2.8T 参数的前沿 MoE 模型搬到消费级和异构硬件上跑。关键洞见是 MoE 稀疏性:744B 模型每个 token 只激活约 5.4% 的参数,真正随 token 变化的"路由专家"只有约 11GB。模型不需要"塞进"高速内存,而需要被"智能放置"——稠密部分常驻 RAM,19456 个路由专家放磁盘按需流式加载。Colibrì 把这叫"权重的 JIT",与编译器 JIT 只编译热点代码同理。读完本节,你理解了为什么万亿参数模型能在你的笔记本上跑。
本节摘要:本节讲清 Colibrì 的核心命题——一个纯 C 的"tiny engine, immense model"推理引擎,要把 744B 到 2.8T 参数的前沿 MoE 模型搬到消费级和异构硬件上跑。关键洞见是 MoE 稀疏性:744B 模型每个 token 只激活约 5.4% 的参数,真正随 token 变化的"路由专家"只有约 11GB。模型不需要"塞进"高速内存,而需要被"智能放置"——稠密部分常驻 RAM,19456 个路由专家放磁盘按需流式加载。Colibrì 把这叫"权重的 JIT",与编译器 JIT 只编译热点代码同理。读完本节,你理解了为什么万亿参数模型能在你的笔记本上跑。
内容来源:原项目源码
README.md("The idea"/"How it works" 段)、docs/media/sparse.png测量结论。
⚠️ 注意:本节所有数字(5.4% 激活、约 11GB 路由专家、约 17B 稠密、约 370GB 专家盘、19456 个专家)都是 GLM-5.2 744B 这个具体模型的实测值,不是通用理论值。换一个 MoE 架构(如 DeepSeek V4 284B、Kimi K3 2.8T)数字会不同,但稀疏性的结构性洞见一致。
阅读完本节,你应当能够:
Colibrì 是蜂鸟(意大利语 colibrì),意指"小引擎、大模型"(tiny engine, immense model)。它是一个纯 C、零引擎依赖的 LLM 推理引擎,作者 JustVugg,Apache 2.0 协议,版本 1.4.0。它的命题写在 README.md 开头第一句:
Run frontier MoE models — 744B to 2.8T parameters — on consumer and heterogeneous hardware, in pure C with zero engine dependencies, by treating storage, RAM, and VRAM as a single inference hierarchy.
翻译过来就是:让前沿 MoE 模型——744B 到 2.8T 参数——在消费级和异构硬件上运行,用纯 C 实现、零引擎依赖,把存储、RAM、VRAM 当成同一个推理层级。 目前已经支持五个模型族,共用一套 coli chat/coli serve/coli web 前端:
c/colibri.c(9514 行)。c/inkling.c(2250 行)。c/kimi_k3.c(1938 行)。c/deepseek_v4.c(10993 行)。c/olmoe.c(1211 行)。注意这条架构红线:一个 .c 文件对应一个模型族(下一节详讲)。每个模型族都是独立的 C 文件,但都共享同一套头文件(st.h/quant.h/tok.h/expert_store.h)和同一个 coli 前端命令。
README.md 还给了一句定位的话值得记住:"Colibrì is an inference engine you can run today, and an open research platform."(它是一个你今天就能跑的推理引擎,也是一个开放研究平台)。这双重身份决定了它的很多设计取舍——既要有可用的默认行为(今天就能跑),又要保留机制的可证伪性(每个优化都能被测量、被推翻)。这条线索贯穿本章第三节。
万亿参数模型为什么能跑在消费硬件上?关键洞见是 MoE 模型的稀疏性。看 README.md "The idea" 段的测量结论:
A 744B Mixture-of-Experts model activates only ~40B parameters per token — and only ~11 GB of those change from token to token (the routed experts).
GLM-5.2 是 744B 总参数的 MoE,但每个 token 只激活约 40B 参数(约 5.4%)。这 40B 里还能进一步拆:
总参数 744B ──┬── 每 token 激活 40B(约 5.4%) │ ├── 路由专家 ~11GB(随 token 变化,放磁盘按需流式) │ └── 稠密部分 ~17B(attention/shared/embedding,常驻 RAM) └── 其余 ~704B 在本 token 完全用不到
配图 images/sparse.png 直观展示了这一点——只有约 5.4% 的参数在每个 token 上是激活的。这意味着:真正需要随 token 搬运的数据量极小,大约就是 11GB 量级,这恰好是消费硬件能玩转的规模。
基于稀疏性洞见,Colibrì 把模型拆成两块,分别用不同的存储策略:
模型不需要"塞进"内存,而需要被"放置"—— 稠密部分 ~17B → 常驻 RAM,int4 量化,约占 9.9GB 19456 个路由专家 → 放磁盘 ~370GB,按需流式加载
README.md 给出的精确拆解:
注意 19456 这个数字的来源:75 个 MoE 层,每层 256 个路由专家,再加上 MTP 头(多 token 预测头,推测解码用)。每个专家在 int4 下约 19MB——它内部是三个矩阵(gate/down/up),按 Colibrì 的存储约定这三个矩阵是相邻摆放的,可以一次 pread 读完(第 5 章详讲)。
💡 深潜要点:19456 个专家放 370GB 磁盘看似天文数字,但每个 token 真正需要读的只是当前层路由命中的那几个专家。如果一共有 75 层、每层平均激活 8 个专家,一个 token 也就读约 600 个专家 × 19MB ≈ 11GB——正好对应上面"随 token 变化的 11GB"。稀疏性把"必须随 token 搬运的数据量"从 TB 级压到了 GB 级。
这套拆解的工程意义还可以从启动开销看出。README.md 开头的 ./coli chat 启动日志写着 "ready in 32s · resident 9.9 GB"——这 32 秒主要在做什么?把稠密部分(约 9.9GB)从磁盘加载到 RAM。注意:启动只加载稠密部分,不加载路由专家。370GB 的路由专家留在磁盘,等推理时按需流式。这是"放置策略"的直接结果——启动快(只读 9.9GB),且峰值 RAM 只占稠密 + 缓存,不是整个模型。如果换成稠密模型范式(全权重常驻),744B 模型在消费硬件上根本启动不了。
⚠️ 注意:"约 9.9GB"是 GLM-5.2 在 int4 下的稠密部分实测。换模型族数字会变——DeepSeek V4 284B 的稠密部分大小不同,Kimi K3 2.8T 的稠密部分也不同。但结构性洞见一致:稠密部分常驻,路由专家按需流式。这也是为什么第 2 章 st.h 要做"只读需要的字节"——它就是这套策略在数据读取层的落地。
Colibrì 把上面这套策略叫**"权重的 JIT"**(a JIT, but for weights)。README.md 用编译器 JIT 做类比,极其精准:
Think of the core algorithm as a JIT, but for weights. A compiler JIT never compiles the whole program — it watches what actually runs and compiles the hot paths, just in time. colibrì makes the same bet about a 744B parameter space: parameters are not resident state to be held, they are data to be staged across a heterogeneous storage hierarchy (VRAM / RAM / NVMe), exactly when the router proves they are needed.
翻译关键句:"参数不是要被持有的常驻状态,而是当路由器证明需要它们时,跨异构存储层级(VRAM/RAM/NVMe)精确放置的数据。" 这句话的每个字都值得拆:
类比编译器 JIT 的精妙之处在于:编译器 JIT 不编译整个程序,只编译热点代码——因为大部分代码很少执行。MoE 也是——大部分专家在大部分 token 上不会被激活。Colibrì 的 LRU 缓存、学习型固定热存(pinned hot-store)、一层前瞻预取,都是把"热点专家"留在高速层,把冷专家放在磁盘,这与 JIT 编译器把热点循环编译成机器码、冷代码留解释执行,是同构的工程哲学。
稀疏性洞见 + 权重 JIT,推出 Colibrì 的第一性原理(也是贯穿全书的心法):
有限的高速内存只改变速度,绝不改变模型语义。
README.md 在 "Core techniques" 第一条就说清楚:"One hierarchy, not limited by tier capacity. VRAM, RAM, and NVMe are placement tiers for the same weights; limited fast memory changes speed, not model semantics."
也就是说:
这条原理贯穿后续所有章节:第 3 章的 LRU 缓存、第 4 章的多层放置、第 5 章的双 SSD,都在反复落实"放置只改速度"。它是 Colibrì 区别于"OOM 就报错退出"的传统推理引擎的根本所在。
⚠️ 注意:这里的"语义不变"是硬保证。Colibrì 自述"对速度没有 SLA,对语义有硬保证"——默认策略绝不静默改变模型精度或路由语义。高速内存不足可能降速,但绝不能悄悄重定义模型。后续章节你会看到很多优化(LRU 驱逐、预取、推测解码)都受这条硬约束管制,无法接受则必须默认关闭。
下一节,我们看 Colibrì 为什么选纯 C 零依赖,以及"一个
.c一个模型族"加"共享头文件"的架构红线。