同一个 1B 模型,我上了三种压缩方案:无损的、4bit 的、还有没跑通的

📅 2026/8/9 2:56:21
同一个 1B 模型,我上了三种压缩方案:无损的、4bit 的、还有没跑通的
真正的工程不是追求最好而是知道自己要什么。量化大模型所有人都默认精度要打折。但今天这个项目里有一种压缩连一个比特都不差——而且同一个模型上还同时躺着另外两种完全不同的玩法。一个模型三种死法不三种活法先交代背景。我手头有一个 1B 的小模型MiniCPM5-1BLlama 架构权重 2.16GB。在 4090 上跑得好好的——36 毫秒一次前向2.2GB 显存。但我做量化的目的从来不是为了在 4090 上跑得快。我的目标是让它在更小的地方活着。手机、平板、边缘盒子——这些地方的内存是以GB为单位心疼的。2.16GB 的权重对它们来说是奢侈品。于是同一份权重我试了三种思路。第一种叫完美主义一个比特都不能错。第二种叫实用主义可以损失一点但必须压得狠。第三种叫探索主义我也不知道行不行先试试。这三种思路最后变成了同一个仓库里的三套方案BF16X、DG 4-bit、TDM-PTQ。它们之间没有谁赢谁输——因为它们的目标根本不一样。先看第一剑。它是我上一次视频的主角但今天我会用一个更扎心的角度讲它。第一剑·完美主义BF16X一个比特都不差BF16X无损压缩压缩比 2.08 倍2161MB 压到 1041MB解压出来和原始权重逐比特完全一致。它干的事一句话就能说清bf16 的权重相邻元素的指数往往差不多。那就别重复存了——每 16 个权重共享一个最大指数每个权重只存 3 位差值。小部分差得太远的刺头单独放溢出表。原理就这么朴素。难的是工程全 Triton 内核实时解码单层 20 微秒168 层全部由 GPU 上的自定义内核扛下来没有一行 PyTorch 后处理。我为了这一个比特都不差的承诺修了三个 Triton 内核的 bug符号扩展、跨字边界、位重解释——每一个都足以让权重悄悄变错。最终成绩推理 105 毫秒显存 2.0GB困惑度 56.02和原始一模一样。完美的代价是它只省了 2 倍因为它在和信息论较劲——真正零冗余的压缩下限就在那。但如果你想要更大的空间收益呢那就轮到第二剑了。第二剑·实用主义DG 4-bit把模型塞进四分之一第二剑叫 DyadicGumbel 4-bit。名字很拗口拆开看就懂了Dyadic二进制Gumbel一种让选择可以学习的技术。它把每个权重压到 4 比特——理论上是 bf16 的四分之一。168 层、6.79 亿个权重全部量化。显存从 2.2GB 直接掉到 1.4GB打包之后磁盘上更夸张一个 2GB 的模型能被塞进 170MB 左右。代价呢诚实说有。零样本直接量化困惑度从 56.02 涨到 61.50大概损失 10%。但这个故事的关键词不是损失是可微调。和传统量化一刀切不同DG 的码本在训练阶段是可以跟着权重一起学的——每个权重组共享一个可学习的尺度用 Gumbel-softmax 软赋值前向走硬编码、和部署完全一致反向走真梯度。所以它有后悔药微调几步精度就能往回收。这就像一个厨师先让菜变难吃一点点但他告诉你——调料还能调回来。不过为了让这个后悔药真的生效我差点把模型训成乱码。这个故事值得单独讲。翻车现场一个梯度公式把模型干成 2237DG 4-bit 的开发过程里有一个非常典型的自信翻车。第一版 QAT 微调用纯 Python 写软赋值——逻辑对但慢慢到训练没法忍。于是我想上 Triton 内核。把距离计算、softmax、硬编码全塞进两个融合内核数学上和 Python 版本完全等价还能拿到闭式反向传播。内核写好了训练启动了。然后困惑度开始失控。零样本 78 还算正常微调之后不但没降反而一路冲到了2237。2237 是什么概念模型已经不是变笨了是嘴里开始喷乱码。我盯着 loss 曲线看了很久第一反应是学习率炸了第二反应是数据坏了第三反应才是——我的梯度公式在 Triton 里写错了。数学上等价实现上不等价闭式求导里有一个项被我简化掉了Python 的自动求导能兜底手写内核不会。而更讽刺的是这个 bug 在训练初期完全不显眼——loss 还在缓慢下降你甚至会以为自己在进步。这就是低比特量化的恐怖之处它失败得很礼貌。修法也很憋屈v3 回退到 Python 直通估计温度从 5 退火到 0.3跑 1000 步。慢但稳。从 2237 回到正常靠的不是聪明是承认我不如自动求导。第三剑·探索主义TDM-PTQ没跑通的那把剑第三套方案TDM-PTQ——时分复用加训练后量化。它的想法很性感让每个权重组在不同的时间片里轮流醒着配合量化把压缩率再往上顶一层。结果呢没跑通。我在仓库里老老实实写着TDM-PTQ探索中24 层的架构需要重新设计。为什么不删掉它因为负向结果是最便宜的研究。它告诉后来的人这条路24 层的结构走不通别在这上面浪费三个月。这比我写三千字为什么我的方案很厉害值钱得多。有人会问没跑通的东西也放进项目里放进。就像地图上标注此路不通——这不是失败这是给所有赶路人的礼物。到这儿三把剑都出鞘了。现在该看那张总结表了。单元6 | 一张表看懂三种压缩哲学RTX 4090MiniCPM5-1B同一份权重三种方案方案推理显存困惑度质量状态bf16 原始36ms2.2GB56.02100%—BF16X 无损105ms2.0GB56.02100% 无损✅BF16X CPU流式128ms0.9GB56.02100% 无损✅DG 4-bit112ms1.4GB61.5010% 可微调✅DG 4-bit QAT——微调中恢复中TDM-PTQ———— 重构注意最后一列没有一行写着已放弃。完美的在跑实用的在调没跑通的在等。这三行就是工程世界真实的日常。没有银弹怎么选比选什么更重要把三套方案放在一起你会看到一个反直觉的事实省显存最多、压缩最狠的反而不是那个无损的。BF16X 追求完美但它赢的是可信——交付、审计、逐比特一致这是它的战场。DG 4-bit 追求实用它赢的是空间——端侧设备、冷启动、下载流量这是它的主场。TDM-PTQ 还在路上但它赢的是上限——如果有一天成了前面两把剑都会被重新洗牌。而那个 2237 的翻车也在提醒所有做量化的人当你手写任何加速时先问一句——它和我的自动求导真的等价吗很多教程会告诉你量化就该选 4bit。但真实的世界没有标准答案只有条件答案你在意比特还是在意比特位你要交付还是要装进手机完美主义者的妥协不是放弃完美——是知道在哪一步妥协。结尾写这个仓库的时候我给自己定了一个规矩每个方案都要诚实。无损的我把三个 bug 原原本本写进文档有损的我把 10% 写在结果表第一行没跑通的我连为什么失败都写了理由。因为我慢慢想明白一件事做技术分享最值钱的不是我成功了而是我试过了这是结果包括坏的那部分。2.16GB 的权重三种压缩哲学一张诚实的成绩单。如果你也在做模型部署或者正纠结无损还是有损——先别急着选边站。问问自己你的模型接下来要住在哪里你的时间要花在完美上还是空间上评论区聊聊如果你是那 2.16GB你愿意住进 1GB 的无损之家还是 170MB 的四倍压缩小屋https://www.modelscope.cn/models/dfytensor/MiniCPM5-1B-DG-INT4