WARP容器格式深度解读:4KiB对齐、O_DIRECT友好布局与子4比特VQ存储
WARP容器格式深度解读4KiB对齐、O_DIRECT友好布局与子4比特VQ存储【免费下载链接】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/warpWARP 是一个零依赖、可嵌入的 C 语言推理引擎它的核心创新正是这套 WARP 容器格式把 2.78 万亿参数的 Kimi K3 这类超大模型以 4KiB 对齐的权重布局和子 4 比特 VQ 量化存储到 NVMe 上直接绕过内存限制流式加载运行。本文带你读懂这份格式设计背后的三个关键决策。为什么要把权重装进一种自定义容器MoE混合专家模型有个特点总参数巨大但每个 token 只激活约 4% 的参数。WARP 的思路是——共享部分常驻内存专家权重放在 NVMe 上按需读取。那么问题来了磁盘上的权重怎么摆才不浪费一次宝贵的 I/O答案写在格式规范 docs/FORMAT.md 里核心是四条设计目标设计目标一句话解释一个专家一次合并读gate/up/down 三个矩阵相邻存放一次pread读完摆放只影响速度不影响精度专家从缓存或磁盘来输出逐位一致O_DIRECT 友好每个可独立读取的记录都是 4KiB 对齐且 4KiB 整数倍子 4 比特不塌缩多阶段残差 VQ 量化3 比特就是最优点一个 WARP 容器不是单个大文件而是一个目录方便分片、断点续传、多盘分布model.waste/ manifest.json # 配置、trunk 张量索引、专家银行索引 trunk.bin # 常驻的稠密部分 experts-L{layer}.bin # 每层一个专家银行 codebooks.bin # VQ 码本常驻 usage.waste # 运行时追加的路由统计/热专家表 ...format_version字段会被强制校验缺失或版本不符的容器会被直接拒绝而不是用错误的规则硬读。4KiB对齐让 O_DIRECT 真正可用记录布局48 字节头 页对齐负载每个专家记录的定义在 src/waste_format.h 中。记录头固定48 字节全部小端、packed 结构并用static_assert锁死布局保证不同编译器下没有对齐陷阱ExpertRec { u32 magic WEXP # 魔数校验记录身份 u16 layer, u16 expert_id u8 fmt, u8 flags, u16 codebook_id u32 gate_off, up_off, down_off, correction_off # 记录内偏移 u32 record_4k_blocks # 总大小 4096 的整数倍 u32 crc32 # 负载校验和 -- gate 索引 | up 索引 | down 索引 | 通道修正 -- }关键不变量每个可独立读取的记录都 4KiB 对齐、大小取 4KiB 整数倍。为什么如此严格因为 O_DIRECTmacOS 上是 F_NOCACHEWindows 上是 FILE_FLAG_NO_BUFFERING拒绝一切不对齐的传输——不是变慢而是直接报EINVAL失败。K3 的一个专家记录恰好是 12 406 784 字节正好 3029 个页一次pread即可读出自包含的完整专家。引擎在打开银行时会校验对齐见 src/model.c 的bank_open而不是假设它成立——一条记录只要不是页的整数倍会让所有读请求失败。绕过页缓存还有另一个隐性收益在 64GB 内存的机器上放 17GB 容器如果走系统页缓存你测到的命中率其实是内核的而非引擎自己的。所以 WARP 默认开启直读让缓存命中率的统计真正反映引擎行为相关实现在 src/ecache.c。校验和crc32 是格式里唯一的完整性机制每条记录的负载都带 zlib 语义的crc32实现在 src/crc32.cARMv8 CRC 扩展下跑到 33 GB/s。但读路径上其实有两道检查永远执行头校验——魔数、专家 ID、stride、码本引用、偏移有序性O(1) 成本。这不是完整性功能而是防止损坏头里的偏移值流进下游算术按需执行crc32 校验——默认关闭因为每次缓存未命中全量过一遍的代价约 1%K3到 5%Kimi-Linear。下载、拷贝或来源不信任的容器建议开启WASTE_VERIFY1一次性审计则用 tools/verify_container.py。校验失败会以WASTE_E_IO终止生成并给出精确诊断——layer 37 的 expert 412checksum mismatch——而不是用损坏字节解码出的东西继续回答。子4比特VQ存储3 比特如何不塌缩为什么不是普通 int3传统逐位量化RTN在 4 比特以下质量急剧恶化。WARP 对专家权重改用多阶段残差向量量化把权重按 8 维向量分组每个向量依次用 N 本码本每本 256 项逼近后一阶段量化前一阶段留下的残差W_expert ≈ scale_per_channel * Σ_{s1..N} codebook_s[index_s]Gate 3 实测给出了明确的操作点3 比特19.4% 误差是可用线而 2 比特 VQ33% 误差比生产基线 int4 差了一倍多。编码器实现见 src/vq.c——256 个距离全留在寄存器里、8KB 码本驻留 L1只写回一个获胜字节比 torch 路径快几个数量级。VQ3R 与 VQ4P同样 3 比特解码速度差 3 倍多这是格式里最有意思的一对设计。两者比特率完全相同3.00 b/w记录大小逐字节一致区别在码本组织VQ3R (fmt4)VQ4P (fmt8)阶段 × 码本规模3 阶段 × 256 项4 阶段 × 64 项每向量索引3 个完整字节4×6 位压进 3 字节查表硬件256 项表 16 个向量寄存器NEON 装不下gather 只能标量64 项表 64 字节恰好一个vqtbl4q内核实测基线标量 gather3.32×VQ4P 的打包规则非常工程化——4 个 6 位域小端排列stage 0 的低位放在 byte0 的 bit 0byte0 s0 | s16 byte1 s12 | s24 byte2 s24 | s32解包每个阶段只需一次移位加掩码。刻意选这种不整齐的小端序就是为了引擎解包最快。为什么必须做成独立 fmt 而不能只是 manifest 里的一个标志因为 VQ4P 负载与 VQ3R 逐字节等长——如果读者把这三个字节误读成三个单字节索引解码会静默地错任何边界检查都不会触发。格式码存在的意义就是防止这类无声失败。引擎还会拒绝 fmt 字节与 manifestindex_bits不一致的记录。代价方面也很诚实Kimi-Linear 上 2.7% perplexity全部来自更小的码本整体加速 1.18×K3 上只有 1.09×——真实但不足以让你重新转换 982 GB 的容器。完整推导见 docs/LEARNED.md。打包正确性由 tests/test_vq4p_packing.py 把转换器和测试容器生成器交叉验证。索引布局的一个反直觉教训VQ 索引并非行主序而是按 64 行分块[row_block][vector_position][row_in_block][stage]让引擎按瓦片处理行时索引连续。有意思的是这个布局的加速理由后来被证伪了——独立基准测出 1.44× 的收益放进真实引擎却毫无变化因为微基准没有建模 12 个线程共享 L2 的场景。布局因为容器已按它写出、且并不更差而保留但文档特意警告不要引用 1.44× 这个数字。这是开源项目里少见的反结论记录值得参考。给格式贡献者的两个实用入口格式规格docs/FORMAT.md 是完整规范包括 manifest 字段表、量化格式表、以及两个已规格化但未实现的部分共享低秩块、SUB1 替补库的留档理由最小容器生成器tools/make_test_container.py 只用标准库就能生成一个结构合法、几 MB 大小的测试容器让缓存对比、内存预算等端到端测试无需下载 19GB 的最小真实模型即可运行python3 tools/make_test_container.py /tmp/tiny.waste ./waste run /tmp/tiny.waste hello -n 4 --budget 1G小结WARP 容器格式的三个决策层层相扣4KiB 对齐不是洁癖而是 O_DIRECT 的硬门槛——不对齐不是慢是直接失败单记录自包含一个pread读完一个专家的全部矩阵把能用的 NVMe 吞吐和理论吞吐之间的差距抹平残差 VQ 的子 4 比特存储让专家权重在 3 比特下不塌缩而 VQ4P 的 6 位打包又把解码成本从标量 gather 拉回到 NEON 查表指令。更值得学习的是它的工程文化每个设计决策都留下测量数字、每个失败的假设都写进 docs/LEARNED.md 并明确标注不要复述这个结果。如果你想深入引擎整体架构可以继续看 docs/ENGINE.md 和 docs/EFFICIENCY.md。【免费下载链接】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),仅供参考