
WARP权重分页核心技术解析一个专家一次对齐读NVMe流式加载MoE专家的完整设计【免费下载链接】warpRun the full 2.78-trillion-parameter Kimi K3 model, DeepSeek V4.1 Flash or GLM-5.3-Flash beyond available RAM by streaming activated weights directly from NVMe. A dependency-free, embeddable C inference engine.项目地址: https://gitcode.com/gh_mirrors/was/warpWARPWeight-Aware Runtime and Paging是一个零依赖的 C 语言推理引擎它用权重分页的思路解决了一个看似无解的问题把 2.78 万亿参数的 Kimi K3 大模型跑在 64 GB 内存的笔记本上。核心机制是——共享主干驻留内存MoE 专家权重按需从 NVMe 硬盘流式读取剩余内存充当有界专家缓存。理解这套一个专家一次对齐读的设计你就掌握了大模型本地推理中 I/O 工程的完整方法论。为什么需要分页传统推理引擎要求模型权重全部装进内存而 MoE混合专家模型恰好打破了这个前提事实数据Kimi K3 总参数量2.78 万亿每个 token 实际激活的专家参数仅约 4%转换后的 WARP 容器体积982 GB在 64 GB MacBook Pro 上运行约 0.6 token/s打开模型所需最低内存29.19 GB也就是说磁盘上躺着 982 GB 权重CPU 每个 token 只需要其中十几 GB。WARP 借鉴了操作系统虚拟内存分页的思想——内存放不下就放磁盘用到哪页读哪页。README.md 开篇就点明了这一设计目标把模型主干留在内存里选中的专家直接从磁盘流式读取剩余 RAM 作为有界的专家缓存。容器布局让每个专家只需一次对齐读 WARP 的模型不是单个文件而是一个精心编排的目录布局定义在 docs/FORMAT.mdmodel.waste/ manifest.json # 配置 主干张量索引 专家银行索引 trunk.bin # 常驻内存的稠密部分注意力、路由器、共享专家… experts-L{layer}.bin # 每层一个专家银行文件 codebooks.bin # 向量量化码本 tokenizer.model # 自包含的分词器这套布局的第一设计目标就写在文档里One coalesced read per expert一个专家一次合并读。具体做了三件事1. 一个专家 一条完整记录。专家的 gate/up/down 三个矩阵在磁盘上物理相邻一次pread就取回整个专家——在 K3 上这条记录是 12,406,784 字节恰好 3029 个页面。2. 4 KiB 对齐 整页大小。所有独立可读取的记录都对齐到 4 KiB 且大小为 4 KiB 整数倍这样才能用O_DIRECTLinux/F_NOCACHEmacOS绕过操作系统页缓存。打开专家银行文件时的对齐检查见 bank_open。3. 同层专家按 ID 排序且连续存放。于是第 e 号专家在磁盘哪个位置是一个纯乘法offset e × rec_bytes零查找直接定位。在精度侧专家权重用 3 位残差向量量化VQ3R压缩比 4 位整数量化省 1/4 空间且误差可控19.4%更敏感的主干权重保留 4~8 位。转换工具 tools/convert.py 负责把发布权重重编码成这种布局。有界专家缓存LFRU 策略与缓存旁路 磁盘再快同一个专家被反复读也不划算。WARP 把模型地板之外的全部内存划给专家缓存实现见 src/ecache.h 与 src/ecache.c淘汰策略用 LFRU频率优先、最近性作平局裁决。Gate 2 的测量证明小缓存占比下朴素 LRU 命中率崩到 5%而 LFRU 仍能拿到 29%。刻意绕过系统页缓存F_NOCACHE/O_DIRECT/FILE_FLAG_NO_BUFFERING。源码注释解释得很直白引擎自己管理缓存如果让内核也缓存一份测出来的命中率就是虚构的。内存预算有硬顶。waste plan先算出地板主干 27.28 GB 状态 KV 最小缓存剩余空间按一个 token 工作集的整数倍分配给缓存且总预算不超过进程可用内存的 3/4。这里有个反直觉的分页悬崖实测数据来自 README.md专家缓存命中率解码速度3.32 GB29.1%0.56–0.58 tok/s17.32 GB36.2%0.63 tok/s29.32 GB41.3%0.07–0.08 tok/s缓存越大命中率越高但超过机器能驻留的上限后每次缓存命中都变成缺页中断——给进程更多内存反而可能慢 8 倍。这就是为什么默认预算按工作集整档递减而不是把内存吃满。流水线预读读盘与计算同时进行 ⚡即使磁盘随机读已达 10.73 GB/s同步读完再算的串行模式仍浪费了约一半时间。关键洞察是MoE 层的路由器先于读取运行16 个专家 ID 在第一笔读发生前就已全部确定。于是 moe_layer 在选完 top-16 后立即调用 waste_ecache_hint把这批 ID 交给缓存后台读线程WASTE_IO_THREADS提前发起pread矩阵乘法消费时数据多半已就位。效果是把读 1.41s 算 1.03s的加法变成了取最大值的流水线。测量结果docs/EFFICIENCY.md §4AK3 解码0.33 → 0.49–0.53 tok/s约 1.6 倍Kimi-Linear 约 1.21 倍两路读在途时磁盘带宽从 10.73 提到 12.89 GB/s输出与同步路径逐位一致——tests/run.sh会字节级比对预读只改变字节移动的时间不改变结果。路由器前瞻预测下一层要读谁 层内预读是确定的跨层就得猜。一个朴素猜测历史共现表只召回 29%被项目直接否决而真正奏效的做法是去问路由器本身用下一层的真实路由权重、在当前层的隐藏状态上跑一遍得到下一层最可能需要的专家predict_next_moe源码见 src/model.c。实测 top-6 前瞻召回率59%命中约四分之三配合 waste_ecache_prefetch 在层边界发出推测性预取——真实路由器随后仍做最终决策因此 logits 依然逐位不变。这就是只改时序、不改结果的又一例。其他值得了解的工程细节 ✨完整性校验每条专家记录带 CRC32src/crc32.cARM CRC 扩展下 33 GB/s默认关闭约 1% 开销校验失败会指名道姓地报错如expert 412 of layer 37: checksum mismatch。学习热榜--learn把真实工作负载命中的专家写进usage.waste下次打开预热加载Kimi-Linear 上命中率 61% → 72%。多盘分片WASTE_BANK_SHARDS/mnt/a,/mnt/b让专家e落到e % N号盘一个 token 的 16 个专家散列到多块设备并行读分片工具见 tools/split_banks.py。分块预填充chunk 内 token 路由到高度重叠的专家集去重后读盘量降 3.3 倍且 logits 不变。存储是硬约束内置 NVMe 持续 12.78 GB/s而一块 USB 盒装盘只有 0.94 GB/s——容器务必放内置 NVMe。快速上手三步体验权重分页 git clone https://gitcode.com/gh_mirrors/was/warp cd warp make make checkmake check会用合成小模型跑完全部引擎测试含预读 vs 同步读的比特一致性检查无需下载权重。想跑真实模型内存门槛最低的是 Kimi-Linear19 GB 容器、1.32 GB 内存、约 14 tok/sGLM-5.3-Flash 则只需 16 GB 内存 112 GB NVMe完整步骤在 README.md 的 Quick start 一节。跑起来后留意输出行的专家命中统计——比如 GLM 的[56 tokens ... experts 17327 hit / 1489 miss 92%]这就是整套分页系统工作状态的直接读数。总结WARP 的权重分页设计可以浓缩成四条可迁移的原则格式为 I/O 服务一个专家一条 4 KiB 对齐记录一次pread取回全部权重引擎自管缓存绕过系统页缓存用 LFRU 做有界专家缓存预算按工作集分档用时间换空间路由结果先于读取可知 → 预读流水线再往前一步 → 路由器前瞻一切机制必须比特一致只调度字节移动的时刻绝不改变模型输出。这套设计的完整测量与推导散布在 docs/FORMAT.md磁盘布局、docs/EFFICIENCY.mdI/O 优化账本、docs/ENGINE.md内存预算与 docs/LEARNED.md含所有被否决方案的负结果是研究大模型推理系统 I/O 工程时少有的连失败实验都公开的参考资料。【免费下载链接】warpRun the full 2.78-trillion-parameter Kimi K3 model, DeepSeek V4.1 Flash or GLM-5.3-Flash beyond available RAM by streaming activated weights directly from NVMe. A dependency-free, embeddable C inference engine.项目地址: https://gitcode.com/gh_mirrors/was/warp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考