在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%。其余参数可以留在磁盘上,只要在需要时能够访问到。

四项缩减

该项目通过四项关键缩减实现了其内存占用:

  1. MXFP4专家:路由专家以4位浮点格式存储,每个权重仅占用0.53125字节,而bfloat16需要2字节。仅此一项就将专家权重从5.45 TB减少到1.447 TB。
  2. KDA注意力:Kimi Delta Attention使用固定大小的循环状态,不随上下文长度增长。这意味着93层中的69层无论输入多少文本,其内存占用都是恒定的。
  3. MLA注意力:多头潜在注意力为每个位置缓存一个576维的潜在向量,而不是96个独立的键/值头,将KV缓存减少了53倍。
  4. 流式传输主干:密集层(“主干”)逐层从磁盘流式传输,使用固定的前缀和单个环形缓冲区。这将内存需求从固定的下限变成了可调节的旋钮。

工作原理:架构

引擎使用可移植的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。