都是 4 位量化,换一颗芯片为什么就变差
一句会被当成结论的话
「我们模型已经压到 4 位了,体积只有原来的四分之一。」
这句话在采购评审里几乎无往不利,因为它听起来是个硬指标:4 位就是 4 位,谁还能压得更低?但如果你接着问一句「哪种 4 位」,多数答不上来,或者答「就是 INT4 啊」。
问题就出在这里。4 位是一族格式,不是一种格式。同样叫 4 位,有的是一排等距的刻度,有的是大值稀疏、小值密集的刻度。模型文件一样大,压完之后坏在哪一段不一样。
4 位到底能表示多少个数
4 个比特,能表示 16 种状态。这是硬约束:无论怎么设计格式,一个数压到 4 位之后,只能落在 16 个候选值里(算上符号位,正负各一半,数量更少)。
于是设计者要做取舍:这 16 个值怎么排列。
- 排成等距的,就是整数 4 位。它需要先乘一个缩放因子,把权重的浮点范围搬进这 16 格。缩放因子按谁定?按最大值定,绝大多数数就挤在很窄的一段;按主体分布定,最大的那些数直接被截断。
- 排成不等距的,就是 4 位浮点。用几位比特表示「数量级」,剩下的表示「在这个数量级里的位置」。靠近零的格点密,越往大值越稀。它天然适应那种「大部分值很小、少数值很大」的分布,不需要一个缩放因子去覆盖整个跨度。
两种排列的差别,在你只看文件大小时完全看不出来。
换芯片为什么会变
格点形状是芯片的契约,不是模型的属性。
一颗芯片如果原生支持某种 4 位格式,它的算子就按那张表设计;换一颗芯片,即使也宣称支持 4 位,用的可能是另一张表,或者干脆只在读权重时接受 4 位、算的时候转成 8 位或 16 位再算。
第二种情况最常见,也最容易被忽略。文件确实小了、下载确实快了、内存占用确实降了——但每一层算之前都要把权重转回来,算力和带宽的账一分没省。这时候你得到的是一份「压缩过的模型」,不是「4 位推理」。
所以同一份模型、同一个精度指标,在两台设备上表现不同,不一定是模型的问题,也不一定是设备算力的问题。第一件要确认的是:权重是以什么格式进入算子的。
门店里最先坏的是哪几类货
低比特量化掉的精度不是均匀的。它最先吃掉的是那些本来就难分的东西:
- 透明包装、白底浅色包装,边界对比度低,量化误差一进来,轮廓先糊;
- 暗角货架、背光位,画面整体偏暗,有效动态范围被压掉一半;
- 小字价签、堆头里挤在一起的同类商品,需要的正是分辨率;
- 联名换装、季节性新品,包装形状变了,落在训练分布之外。
这些在整体准确率上看不出来——它们占比小。但门店的业务恰恰由这些长尾构成:一单错扫,客诉就从这里来。
该问供应商的五个问题
- 用的是哪种 4 位格式? 要具体名字,不要「4 位」两个字。
- 缩放因子的粒度是多少? 整张量一个、每通道一个、还是每几十个元素一组一个。粒度决定一个离群值会拉坏多少邻居。
- 反量化在哪一步发生? 在算子内部,还是在进算子之前先转回高精度。这一条决定了你买到的是存储收益还是算力收益。
- 校准数据是什么? 公开数据集、通用货架图,还是跟你的店型对得上的图。低比特下校准集分布偏了,误差不会被平均掉。
- 同一份模型换设备,精度掉在哪个品类? 愿意给分品类对比表的供应商,通常是真的测过。
三个可以自己做的动作
拿自家最难的照片测。 不用多,三十张:反光的、暗的、挤在一起的、新包装的。让供应商分别跑一遍,看错在哪几张。
看分品类,不看总分。 让他们把结果按品类拆开。如果只有整体数字,这个数字对你的意义接近于零。
换一台设备重跑一次。 同一份模型、同一批图,在两台候选设备上各跑一遍。差异会直接告诉你,格式和算子到底是不是同一回事。
什么时候不用管这些
模型还很小、8 位就够用的时候,不必往 4 位上凑。盒子算力有富余、路数不多、对帧率不敏感的时候,压缩带来的收益抵不上验证成本。
真正该较真的是那几种情况:多路摄像头、要跑连续视频、设备无风扇、单店要压成本。这几件事同时成立时,「4 位」这两个字背后那张格点表,值得你多问三轮。