parameter-golf 极致压缩技巧清单:zlib、brotli、lrzip-ZPAQ 与 Base-3 打包,谁最省空间?
【免费下载链接】parameter-golfTrain the smallest LM you can that fits in 16MB. Best model wins!项目地址: https://gitcode.com/gh_mirrors/pa/parameter-golf
parameter-golf是 OpenAI 发起的模型压缩挑战:在 8×H100 上 10 分钟内训练一个语言模型,最终产物(代码 + 压缩后的模型权重)必须塞进16,000,000 字节(十进制 16MB),按 FineWeb 验证集的 bits-per-byte(bpb)计分。由于权重、代码、量化 scale 全部要挤进同一个字节预算,压缩算法的选择直接决定你能塞下多大的模型——这正是本清单的主题:zlib、brotli、lrzip-ZPAQ 和 Base-3 打包,到底谁最省空间。
先看懂规则:为什么"省空间"能换"好成绩" 🎯
比赛规则写得很清楚:artifact 大小 = 代码字节 + 压缩模型字节,上限是十进制 16,000,000 字节(不是 16MiB),任何一项超了都不合格(详见 README.md 的 FAQ 部分)。
这意味着压缩率就是隐形的"模型容量":
- 同样 70M 参数,压缩后 15.5MB 的方案有 500KB 预算去做更大的 MLP;
- 压缩后 15.95MB 的方案就只能反复做超参微调。
所以排行榜头部选手几乎都在"量化位宽 × 压缩器"这个二维空间里做极限搜索。
入门基线:int8 + zlib,一行代码就能上手
仓库默认的 train_gpt.py 给出了最朴素的方案:把模型量化到 int8,然后zlib.compress(quant_raw, level=9)直接压整个权重 blob,评测前再解压还原,并用final_int8_zlib_roundtrip日志验证解压后的权重与打分完全一致。
适合谁:第一次提交、想先跑通全流程的选手。zlib 优点是快、零依赖;缺点是它只看短程重复,对"分布相似但不完全相同"的权重块几乎无能为力,压缩率明显落后于后面的选手。
主流方案:brotli(zstd)与量化参数的化学反应 🧪
翻一遍records/track_10min_16mb/下的记录,brotli(多为 quality=11)是绝大多数 record 提交的首选压缩器,不少队伍还搭配了 zstd-22。两条来自真实提交的经验非常值钱:
1. 量化位宽 ≠ 压缩大小。在 2026-04-05_SP8192_GPTQ-Embeddings_SDClip_Loop45x2/README.md 里,作者指出:int5 网络完全可以比 int4 压得更小——因为 brotli 压缩效果取决于数据熵,放宽 clip range 能显著降低熵。位宽是"名义成本",熵才是"实际成本"。
2. 训练细节反哺压缩率。2026-04-03_MuonEqR_DepthRecurrence_WD090_AllInt6/README.md 的洞察是:weight decay 从 0.085 提到 0.090,权重幅度变小,brotli-11 压缩率直接提升约 5%,换来的 280KB 空间足以把全部 66 层都保持 int6 精度。训练目标里加一项"让权重更好压",是这类比赛特有的思路。
三值模型的杀手锏:Base-3 打包 + LZMA
当权重被约束到 {-1, 0, +1}(BitNet b1.58 三值量化)时,通用压缩器就浪费在"按字节思考"上了。74M 三值 U-Net 提交 的做法是:
- Base-3 打包:每个权重只有 3 种取值(trit),5 个 trit 恰好塞进 1 字节,理论 1.6 bit/参数;
- LZMA preset=9做二次压缩;
- 自动与 bitmask 方案二选一:另设"是否为 0 + 非零时是否为 +1"两个位掩码的编码,每轮训练自动挑更小的(零占比 17–29% 时两者几乎打平)。
最终效果:比 int8+zlib 基线再省 39% 空间,73.7M 参数压进 15.99MB。打包/解包函数可以直接参考 train_gpt_cuda_ternary.py 中的pack_ternary与pack_ternary_bitmask(约 112–138 行)。
榜首配方:lrzip + ZPAQ 分组压缩流水线 🔬
当前排行榜第一(1.0611 bpb)的提交把压缩做成了流水线,其完整设计见 2026-04-27 提交的 README:
- 按角色分组:把 int6 权重按
qo_bank、kv_bank、mlp_up_bank等分桶,让分布相似的权重挤在一起压; - L1 相似度重排:对"热点" 2D 张量按行做最近邻排序,让序列化流中相邻行数值接近,熵编码器能吃到更长的"小差值"连续段(排列索引用 uint16 存储、随组一起压缩);
- lrzip -z -L 9(ZPAQ 后端):ZPAQ 的上下文混合 + 长程去重能抓住 brotli 24-bit 窗口之外的跨张量重复;
- brotli 兜底:state dict 骨架、scale、LQER 因子、gate 张量及代码壳继续用 brotli。
代价与收益都写得很直白:比纯 brotli 方案小约 280KB,但序列化多花约 75 秒(ZPAQ 很慢),解压速度仍在评测预算内。依赖只需系统装一个lrzip(见该目录 requirements.txt)。
终极对比:谁最省空间?
| 方案 | 适用场景 | 压缩效果 | 主要代价 |
|---|---|---|---|
| zlib (level 9) | 入门基线、快速验证 | 基准线 | 压缩率最低 |
| brotli (q11) / zstd-22 | int6/int7 常规量化 | 优于 zlib 一截 | 中速;对"相似但不同"数据乏力 |
| Base-3 打包 + LZMA | 三值(±1/0)模型 | 比 int8+zlib再省 39% | 需要专门写打包/解包与自动择优逻辑 |
| lrzip + ZPAQ 分组流水线 | 冲榜头部方案 | 比 brotli再省 ~280KB | 序列化慢 ~75s,需系统安装 lrzip |
一句话结论:通用场景用 brotli,权重极端稀疏/低位用 Base-3 类专用打包,冲榜时用"分组 + 重排 + ZPAQ"流水线把每一 KB 都榨干。
实用检查清单 ✅
- 压缩后必须做 roundtrip 校验(解压 → 打分 → 比对 loss),仓库脚本末尾的
final_int8_zlib_roundtrip就是范例; - 把 clip range、weight decay 当"压缩超参"一起调,别只看量化误差;
- 相似分布的权重分组再压,打散混压等于自废武功;
- 准备 A/B 两套编码(如 Base-3 vs bitmask),每次运行自动选小的;
- 算好账:慢压缩器的序列化时间不能挤占 600 秒训练/评测预算。
把压缩当模型架构的一部分来设计,是 parameter-golf 教给新手最反直觉、也最值钱的一课。
【免费下载链接】parameter-golfTrain the smallest LM you can that fits in 16MB. Best model wins!项目地址: https://gitcode.com/gh_mirrors/pa/parameter-golf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考