大家好,我是何三,独立开发者

1.56TB 的模型,塞进 8.24GB 内存,单 CPU、零 GPU,跑起来了。 输出和用 224GB 内存跑出来的结果,逐字节一模一样。

这个项目叫 kimi-k3-in-c,一个用纯 C99 写的推理引擎,把 Kimi K3 这个 2.78 万亿参数的巨兽,硬生生塞进了普通笔记本的内存里。上线四天,Star 冲到近 2500(精确 2413),GitHub 上一片"这不科学"的评论。

先说下这玩意儿为什么离谱。Kimi K3 是 2.78T 参数的 MoE 模型,checkpoint 就有 1.56TB。按常识,这种规模的模型得靠一堆 A100 的显存才喂得下,普通人的电脑想都别想。结果作者反手甩出一个 176KB 的二进制,说:不用,我 8GB 内存就能跑。

怎么做到的?核心就四个字:别全放内存

模型是 MoE(混合专家),每一层有 896 个专家,但处理一个 token 只会唤醒其中 16 个,剩下 880 个根本不用动。这 880 个专家平时干嘛?睡在硬盘上。要用的时候,从 NVMe 流式读进来,用完就扔,靠一个 LRU 缓存兜底。

大白话就是:以前你请了 896 个专家坐满会议室,其实每次提问只有 16 个人开口。现在作者让那 880 个回家待命,会议室只留 16 个,谁被点名谁再进来。

1.56TB 的 checkpoint——算了,先别被这个数字吓到,往下看。顺着这个思路,作者做了四步削减:全量 bf16 是 5.56TB,官方打包后 1.56TB,专家不常驻后只剩 113.5GB,最后主干也改成流式读取,实测峰值压到 8.24GB。前后 675 倍。

同一个模型,四种内存预算

MoE 稀疏路由:为什么不用全进内存

这里我得说句实话,里面有个细节我一开始没看懂:为什么 AVX2 就够,作者特意不要 AVX-512?后来才反应过来,他的三条执行路径(标量、OpenMP、AVX2)必须算出一模一样的 bit,编译器默认的 FMA 融合反而会改变舍入,所以干脆关掉。这种强迫症级别的严谨,用 C99 写出这玩意儿,真的服。

对了,说到按需读取,我突然想起个事。以前玩老游戏机模拟器,也有人用"把卡带当硬盘、按需加载"的思路,几十 MB 的游戏也能跑在当年 64MB 内存的电脑上。物理限制从来挡不住聪明人,缺内存就盘外招,这事儿真是一脉相承。

跑起来难吗?分两步看。

想先验证引擎对不对,一分钟搞定,连模型都不用下:

git clone https://github.com/FareedKhan-dev/kimi-k3-in-c.git
cd kimi-k3-in-c
make -j
make test

测试会用一个 13 层的小模型跑完整张量图,跟 PyTorch 参考实现逐位对比,输出 ENGINE MATCHES THE REFERENCE EXACTLY 才算过。没有网络、没有 Python,纯本地就能跑完这一套。

想真的跑 Kimi K3 本体,那得先掂量掂量:checkpoint 1.56TB,加打包后的 trunk 109GB,硬盘至少腾 1.7TB,还得去 HuggingFace 申请 token 下载(支持断点续传)。下完之后:

./scripts/pack-trunk.sh ~/k3model ~/k3trunk
./bin/k3 ~/k3model --trunk ~/k3trunk --preset laptop \
         --tok ~/k3model --prompt "The capital of France is" --gen 8 --incremental

效果嘛,laptop 预设大概 32 秒一个 token,慢得能泡碗面,但人家确实跑出来了,峰值内存 8.24GB。你要是机器内存大,server 预设能到 10 秒左右一个 token。速度不是卖点,"8GB 内存能跑 2.78T 模型"这件事本身才是。

这个项目让我想起之前写的《大模型不再需要服务器》那篇,本地推理这条路是越走越宽了。同类项目里,llama.cpp 是纯 C/C++ 推理的祖师爷,值得一起看。

项目地址放这儿了,感兴趣的自己去围观:

https://github.com/FareedKhan-dev/kimi-k3-in-c

最后说点实际的。这东西是给硬核玩家准备的:1.7TB 硬盘 + 耐心下载 + 32 秒一个 token,普通人看着图个乐就行,装不装随你,反正我先把 Star 点了。但作者证明了一件事——内存不够,从来不是不跑大模型的理由。

本文使用 MGO 编辑并发布

关注“何三笔记”,回复“mgo” 免费下载使用