
结论先行:在 RTX 4090 上用 bitsandbytes 的 LLM.int8() 做 7B 以下模型的解码推理,每一个模型尺寸都没有省电,反而多耗 50%–242% 的每 token 能量。原因不是功率高——INT8 的瞬时功率其实更低——而是吞吐崩了。同卡上的 NF4 则呈现完全不同的画像:小尺寸亏电、大尺寸省钱,盈亏平衡点约在 3.7B。
"量化省电"几乎是社区共识:权重从 FP16 压到 8 bit 或 4 bit,显存占用和带宽需求都降了,能耗理应跟着降。但这个直觉有一个隐藏前提——吞吐不能掉。每 token 能量约等于平均功率除以吞吐,如果量化把功率压低了 20%,却把吞吐压低了 60%,结果反而是更费电。
我们想搞清楚的就是这件事:在消费级卡上,INT8 和 NF4 到底落在哪一边?
先交代测量条件,后面所有数字都基于这套配置:
LLM.int8();NF4 同样走 bitsandbytes(4 bit);诚实声明:多数点是单轮试验(n = 1),柱状图上没有误差棒可画。其中 1.1B 的 INT8 我们后来在另一张 RTX 4090 实例上复测过一次,+138% 对第一次的 +146%,两次独立单测相差 8 个百分点——量级可信,个位数精度不可信。本文所有结论都限定在"这张卡、这个后端"的范围内。
左图(绝对解码能量):纵轴是每 token 能量(mJ/token),横轴是模型尺寸。三条线里 INT8(橙色)在每个尺寸上都是最高的——0.5B 时约 5300 mJ/token,3B 时冲到 8500 mJ/token 以上;而 FP16(灰)和 NF4(绿)在同样的 3B 位置只有约 3600 mJ/token。INT8 不但没省电,还是三条线里最耗电的一条。
右图(解码吞吐):解释了左图。FP16 的吞吐在 39–62 tok/s 之间,NF4 在 13–44 tok/s 之间,而 INT8 崩到了 9–19 tok/s——只有 FP16 的四分之一到三分之一。
两张图放在一起,机制就清楚了:INT8 量化确实压低了瞬时功率,但它的解量化路径(权重反量化 + 尺寸校准的开销)把每步解码拖慢得太多,功率的节省远远追不上时间的膨胀,每 token 能量反而翻倍。
下面这张柱状图给出 INT8 相对同卡 FP16 的每 token 能量增幅:
模型尺寸 | INT8 相对 FP16 的能量增幅 |
|---|---|
0.5B | +242% |
1.1B | +146% |
1.5B | +181% |
3B | +135% |
7B | +50% |
三个值得注意的细节:
同一张卡上,NF4 的曲线是 crossings 型的:
对实测点做拟合,盈亏平衡点约在 3.7B。也就是说,"量化省电"这句话在 NF4 身上、在 4B 以上模型身上,是成立的;在 INT8 身上,至少在这张卡的这个后端身上,是不成立的。
结论:
边界(同样重要):
一句话带走:下次想"量化省电"之前,先量一下你自己的栈上的吞吐——功率低不等于能量省。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。