亚 1 比特的模型压缩,到底是什么。
简单说,就是把每个权重压到不到一个比特,模型还得跑出像样的结果。
SamsungLabs 把 LittleBit 的代码放出来了,一个仓库同时装着 LittleBit 和下一代 LittleBit-2。这期本来还收着别的,被我删了,只留这一条。
先说清楚为什么收它。
不是因为 1 bit 这个数字。这几年隔一阵就有人宣布把模型压到了多少分之一,标题一个比一个狠,点进去多半是在某个特定评测上撑着,换个模型就散架。看多了会麻。
收它是因为另一件事。它把“初始化”单独拎出来,当成一代版本要解决的问题。
LittleBit 那套做法没什么玄的。把每个稠密权重矩阵拆成低秩的因子,再把因子二值化,最后靠一个可学习缩放把幅度信息捞回来。低秩加二值加 scale,这个配方在压缩圈里不新鲜。
新鲜的是它盯住的区间:1.0 到 0.1 bits-per-weight。还有一句更关键,推理时不动模型架构。
后面这半句对普通人才是实话。架构不变,意味着你不用为它换一套推理框架,不用重写 kernel,加载进去就是个正常模型。一个压缩方案能不能落地,一半卡在这儿。
然后说 LittleBit-2。
它解决的是初始化阶段的潜在几何错位。这句话我第一次读也没读懂,讲我现在理解的那部分。
SVD 拆出来的低秩因子住在连续空间里,二值化的权重住在超立方体的顶点上。这两套几何从一开始就不对付。你把前者直接投到后者身上,量化感知训练还没开始,方向已经歪了。后面再怎么训,都是在歪掉的地基上往回拉。
LittleBit-2 的办法是训练之前先对齐一次:内部潜在旋转,加上联合迭代量化,把 SVD 出来的因子转到跟二进制超立方体咬得上的位置。
一个开关控制,--use_itq。推理阶段不加任何开销。
插一句。我一开始以为 ITQ 是训练里的某种技巧,翻了两遍才反应过来它动的是初始化那一步。这个转向是我觉得这份工作里最值得看的地方。量化这件事,很多人默认损失是训练里补回来的。实际上有一部分损失,在你按下训练之前就已经发生了。
凡是拿 bits-per-weight 当标题的工作,九成是在做指标。这份不是。
代码放出来,不等于你能跑。
环境卡得挺死。Python 3.12,CUDA 12.4.1,PyTorch 2.8.0+cu124。想复现论文里的数,transformers 得用 4.51.x。这几个版本号凑在一起,本身就是一道筛子。
模型的覆盖面倒是比我想的宽。OPT,Llama 一直到 2 和 3,Phi-4,Qwen2.5 和 QwQ,Gemma 2 和 3,还有 Qwen3。
训练入口单卡能跑,也给了 DeepSpeed 的多卡路子。示例配置写得很具体:Llama-2-7b-hf,c4_wiki 数据集,5 个 epoch,批大小 4,学习率 4e-5,有效比特 1.0。想动手的人照着这个先跑一遍,比自己瞎调靠谱。
评估脚本能算 wikitext2 和 c4 的困惑度,也带了一串零样本任务,boolq、piqa、hellaswag 这些。旧检查点里缺 littlebit_config.json 的时候,量化参数得显式传,加载优先级是命令行参数、模型目录里的配置、最后回退到旧的 config.json。
两个坑得提前说。
许可证是 CC BY-NC 4.0,非商用。想拿它做产品的人,看到这儿可以停了。
还有一个更现实的。仓库五次提交,两百多个 star。这个量级的意思是,踩过坑的人还不多。你现在去抄作业,出问题大概率得自己看源码。这不一定是坏事,但别指望搜一下就有答案。
最后算账,对普通人意味着什么。
短期内没什么。
1 bit 不等于模型小八倍就能塞进你手机。0.1 bit 那个区间是在论文设定下成立的,不是你随便丢个模型进去按一下就动。真要让本地小模型可用,卡住你的通常是内存带宽和上下文长度,不是权重占了多少比特。
最近被问得最多的是“我是不是该等模型压得更小再用”。我的看法是先别等。你手上那个今天跑得动的模型,现在就能用。等来的那版,你还是得重新学怎么用。
值得关注的是另一件事:这套东西摆出来了,虽然非商用,愿意折腾的人可以自己去验一遍论文里的数。这比多一篇解读有用。
上面有一条我确实只看懂了一半。残差分解那个可选开关,我还没搞明白什么场景下该开。先放在这里,搞懂了再补。
本周就这些。
上面有任何一条你试过、或者觉得我讲错了,欢迎告诉我。讲错的我补,没讲清的我改。
下周见。
