1.58 这个数被当口号喊了很久了。"三元 LLM,每权重 1.58 比特",念出来像一句已经拿下的战绩。
前几天那篇 Breaking the 1.58-bit Barrier 挂出来,我读完了。读完最大的收获不是它省了多少——是我终于想明白:1.58 从来不是个能达到的数,它是个下界。而这篇论文真正下手的地方,也压根不是往下抠那 0.04 比特。
等等等等,先别急。账得摆开看。
三元权重,就是每个权重只能取 -1、0、+1 三个符号之一。要无损地存它,下界是 log2(3) ≈ 1.585 比特每权重。这是信息论的账,跟谁的工程水平没关系。
3 个符号,等概率
→ 每个符号携带 log2(3) ≈ 1.585 bit
但没人真按 1.585 存。比特不是一个一个来的,得按字节打包,主流做法五个塞一字节:
3^5 = 243 ≤ 256
└── 5 个三符号,刚好塞进 1 个字节 ──┘
账面:8 / 5 = 1.6 bit / 权重
实际:分组只能取 2 的幂,组内凑不满整字节就往上补
→ 落到 1.625
1.625 是怎么补上去的,我随手验了一下:取 32 个权重一组,32 × 1.6 = 51.2,凑不满整字节就往上补到 52 位,52 / 32 正好 1.625。猜就是这么来的。
到这儿我犯了读这篇的第一个错。我当时的理解是,标题里那个 "breaking the 1.58-bit barrier",意思是有人找到了更聪明的打包方式,把 1.625 往 1.585 上抠。我还在纸上画了个箭头,从 1.625 指到 1.585,心想就这么点缝,还能玩出什么花。
然后自己算了一下,发现不对。只要三个符号等概率,任何无损编码的平均码长都压不到 log2(3) 以下——下界这个词就是这个意思。从 1.625 抠到 1.585,最多 0.04 比特,抠出来还得在解包时用位运算还回去。这条路上没肉。
重来。
真正能动的地方不是打包,是"等概率"这三个字。log2(3) 那个下界,前提是三个符号各占三分之一。可要是分布根本不长这样呢?
作者扫了 29 个三元模型,把权重的符号生数了一遍。零值占比最高能到 51.5%。
一半以上是零。
这一下整件事的性质就变了。熵不再是 log2(3),因为三个符号明显不等概率,最常出现的那个占了一半还多。这时候还在讨论"怎么把三个符号挤进 1.585 比特",是拿一个错的前提去抠一个错的数。
他们的方案叫 BITCOS,画开就两块:
┌──────────── 一个权重块 ────────────┐
│ 存在位图(稠密) │ 符号向量(压过) │
│ 1 bit / 权重 │ 只给非零的留位 │
└─────────────────────────────────────┘
每权重开销 = 1 + (1 - z) = 2 - z
↑ z = 零值密度
位图回答"这个位置是不是零",符号向量只给非零的位置编符号,零的位置压根不占地方。💡
账一摆出来,条件自己就浮上来了。什么时候比 1.625 划算?解 2 - z < 1.625,得 z > 0.375。
零值密度得过 37.5%。
而 29 个模型里恰好有 26 个赢——这个数字一下就对上了。剩下输的那 3 个,八成就是零值不够密的那批。论文里没把这三张脸单独拎出来(我挺想看的),但公式摆在那,输的条件是能算的,不用等它说。稀疏度最高的那个模型,开销压到了 1.485 比特每权重。
我本来把"掰开一个被喊烂的数字、看见它其实站不稳"当成世界上最舒服的一件事。这次尤其舒服:这篇文章不是把比特打得更紧,是发现原来大家一直在给一堆零付全价。1.58 之所以能被当口号喊,是因为它默认三个符号一样贵;一旦你承认零比 ±1 多得多,这个数字自己就松了。不是魔法,是把账重算了一遍。
扯一句——Xe2 那几个 GPU 我本来想展开说说,但那是另一个话题,先拉回来。
省下来的比特得能变成真的快,不然账白算。存储省了解包拖慢,等于没省。作者给 AVX-512、AVX2 和 Xe2 GPU 各写了优化过的解包序列,跟生产级的三元矩阵向量乘法内核比,按真实模型的零值密度测,最高加速 1.28x。端到端跑了 5 个平台,解码吞吐 CPU 上最高 1.18x,GPU 上最高 1.27x。
这里有个数我没完全对上,也不打算装懂:1.625 到 1.485 省了约 8.6% 的比特,换回来 1.28x 的 kernel 加速。解码本来就绑死在内存带宽上,省带宽直接换吞吐,逻辑上顺——但这个倍数里有多少是解包序列本身的功劳、有多少纯粹只是少读了内存,我从这组数里切不开。先记在这。
比喻在这漏风。位图像点名册,看着挺顺——可点名册是给每个位置固定留一格的,不管那位有没有人来。
位图永远是 1 bit / 权重
跟你零多零少,没关系
所以零的密度决定的是符号向量那半边能缩多小;位图这半边是笔固定成本,不跟着缩。零值密度掉到 37.5% 以下,这笔固定成本就压不住了——正好落在输掉的那三个模型的位置上。比喻能帮你抓住"原来一直在给零付钱"这个大方向,但它替不了 2 - z 这个式子,抠细节还得回到式子本身。
还有一层,下面这段是我顺着推的,不在论文实验里:符号向量对剩下的 ±1 还是按 1 比特编的,等于暗地里留着"非零符号里 ±1 各半"这么个小假设。哪天冒出个模型连 ±1 都偏得厉害,这套布局下面还有空间。我没数据,先放这。
画开完了。照例留个自检:现在你能不能用自己的话讲清,"1.58 比特"这个数到底在什么前提下才成立?如果讲到一半发现只能背出那个 log2(3),讲不出它管的是哪种分布——那说明我这张图还没画到位,回头我再补。
下期想画开哪个概念?我手上还压着 embedding 和 KV cache 两张没画完的图。
本期画开:一个被当成成绩喊的下界,其实是个前提。
