在8GB内存的单CPU上运行2.78万亿参数的大语言模型
了解如何使用便携式C99和巧妙的内存流式处理,在仅8.24 GB内存的单CPU上运行2.78万亿参数的Kimi K3模型。
AI世界痴迷于规模,但如果你能在自己已有的机器上运行一个2.78万亿参数的模型会怎样?这正是kimi-k3-in-c项目所实现的:一个2.78万亿参数的Kimi K3模型在单个CPU上进行推理,仅使用8.24 GB内存,无需GPU、无需BLAS、无需框架。整个引擎是一个176 KB的C99二进制文件,从磁盘流式加载模型,使得在远非最先进的硬件上运行最先进的AI成为可能。
这不是一个玩具或重度量化的近似。无论你是在8 GB内存的笔记本电脑还是224 GB内存的工作站上运行,输出都是字节完全相同的。唯一的区别是速度:低端每token 32.69秒,高端每token 19.21秒。该项目通过巧妙的工程、对模型架构的深入理解以及挑战关于LLM推理必要条件的传统假设来实现这一目标。
问题:模型太大无法容纳
Kimi K3是一个混合专家(MoE)模型,拥有2.78万亿参数,以1.56 TB的检查点形式发布。没有消费级机器能将此模型完全加载到内存中。朴素的方法——将所有内容加载到RAM中——在bfloat16精度下需要5.56 TB。这不仅不切实际;对于没有数据中心的人来说,这是不可能的。
关键洞察在于MoE模型不需要所有参数同时激活。对于任何给定的token,每层896个专家中只有16个被激活。这大约是2.78万亿参数中的1040亿个活跃参数——仅占3.7%。其余参数可以留在磁盘上,只要在需要时能够访问到。
四项缩减
该项目通过四项关键缩减实现了其内存占用:
- MXFP4专家:路由专家以4位浮点格式存储,每个权重仅占用0.53125字节,而bfloat16需要2字节。仅此一项就将专家权重从5.45 TB减少到1.447 TB。
- KDA注意力:Kimi Delta Attention使用固定大小的循环状态,不随上下文长度增长。这意味着93层中的69层无论输入多少文本,其内存占用都是恒定的。
- MLA注意力:多头潜在注意力为每个位置缓存一个576维的潜在向量,而不是96个独立的键/值头,将KV缓存减少了53倍。
- 流式传输主干:密集层(“主干”)逐层从磁盘流式传输,使用固定的前缀和单个环形缓冲区。这将内存需求从固定的下限变成了可调节的旋钮。
工作原理:架构
引擎使用可移植的C99编写,除了libm和OpenMP外没有外部依赖。代码库非常小:六个C文件编译成一个176 KB的二进制文件。这之所以可能,是因为项目避免了任何框架开销,并从头实现了每个内核。
读取检查点
1.56 TB的检查点由96个safetensors文件组成。引擎读取JSON头以构建所有497,220个张量的索引,然后按需仅读取所需的字节。这通过O_DIRECT读取完成,完全绕过页缓存,项目发现在其测试硬件上这比缓冲读取更快。
专家缓存
路由专家被加载到具有可配置大小的LRU缓存中。然而,项目发现了一个令人惊讶的结果:专家缓存在小尺寸下几乎无用。由于模型的Quantile Balancing训练,专家使用在池中被均匀化,因此没有热点子集可供缓存利用。缓存只有在竞技场大小超过约36 GB时才开始有帮助。
主干流式传输
密集主干(108.81 GB)逐层读取。引擎固定尽可能多的层以适应预算,并通过单个环形缓冲区流式传输其余层。由于引擎按固定顺序遍历层,固定的前缀实现了N/93的确定性命中率,这比LRU缓存在循环扫描中能达到的效果要好得多。
验证:证明其正确性
该项目不仅声称有效;它通过严格的验证阶梯证明了这一点:
- 无权重测试:一个13层的oracle模型,具有与真实模型相同的张量图,与PyTorch参考进行核对。所有三种执行路径(teacher forcing、贪心解码、增量解码)产生相同的token ID。
- 层一致性:完整模型的所有93层都通过PyTorch参考验证,最坏情况误差为舍入预算的0.00倍。
- Logit一致性:C引擎的logits与torch参考在完整的163,840词汇表输出上逐元素匹配,最大差异为7.87e-6。
- 内存阶梯:从8 GB到224 GB的十二种不同内存预算,都产生字节完全相同的token ID。
性能:预期效果
在单个CPU(AMD EPYC 7763,124核)上,引擎实现:
- 8 GB RAM:32.69秒/token
- 32 GB RAM:31.44秒/token
- 64 GB RAM:28.60秒/token
- 128 GB RAM:29.40秒/token(注意噪声)
- 224 GB RAM:19.21秒/token
性能严重受I/O限制。41%到61%的墙钟时间花在等待磁盘上。这意味着存储设备比CPU更重要。快速的NVMe驱动器对于良好性能至关重要。
开始使用
要自己运行,你需要:
- Linux x86-64,支持AVX2和FMA
- 至少8 GB RAM
- 约1.7 TB可用磁盘空间
- GCC ≥ 9或Clang ≥ 10
- Python 3.9+(用于下载和打包工具)
克隆仓库,使用make -j构建,并运行make test以在下载1.56 TB检查点之前验证引擎是否正常工作。然后下载模型,打包主干,并运行:
./bin/k3 ~/k3model --trunk ~/k3trunk --preset laptop \
--tok ~/k3model --prompt "The capital of France is" --gen 8 --incremental
结论
kimi-k3-in-c项目是系统工程的杰作。它证明了通过正确的方法,即使是最大的AI模型也可以让普通硬件访问。关键要点:
- 内存是一个旋钮,而不是下限:通过流式传输主干,你可以用速度换取内存使用。
- 理解你的模型:架构选择(KDA、MLA、MXFP4)被充分利用。
- 测量一切:项目严格的验证和测量方法确保每个声明都有数据支持。
这不仅仅是技术上的好奇心;它是让AI更易访问的蓝图。如果你曾经想在自己的机器上运行一个万亿参数模型,这个项目表明这是可能的——而且是开源的。
来源
FareedKhan-dev/kimi-k3-in-c: 一个2.78万亿参数的Kimi K3在8.24 GB RAM的单CPU上运行推理。可移植C99:无BLAS、无框架、无GPU。