做大模型部署的人几乎都会做一件事:量化。把权重从 FP16 压到 NF4 或 INT8,显存降了,推理能跑了,皆大欢喜。显存的故事确实如此——但能耗的故事不是。
我在 4 种 NVIDIA 架构上跑了 360+ 组 NVML 直测数据,发现一个反直觉的规律:小模型量化之后,每 token 能耗反而更高。而且这个"小"的边界随 GPU 架构移动——T4 上大约 2.1B 开始省电,RTX 4090 上要到 3.7B,RTX 5090 上甚至要到 4.8B。
更扎心的是 INT8:bitsandbytes LLM.int8() 在我测过的所有消费级 GPU 上,一次都没省过电——能耗惩罚从 +50% 到 +242%。
这不是拍脑袋的结论,是 NVML 10Hz 采样、FP16 基线配对、每组跑 10 轮 decode 之后算出来的。下面展开讲。
Weight-only 量化(NF4/INT8)的原理是:权重用 4-bit 或 8-bit 存储,计算时实时反量化回 FP16。省了显存带宽——读的数据量小了。
但问题在于反量化不是免费的。每次矩阵乘法都要多一步"把 4-bit 拆回 16-bit"的计算,这个开销和模型大小无关,是固定的。
小模型的 decode 阶段本来就不完全是内存带宽瓶颈——计算量和数据量之比(arithmetic intensity)较高,所以带宽省下来的那点能量,不够弥补反量化多出来的计算开销。净效果:能耗上升。
随着模型变大,权重读取量在总能耗中的占比越来越高,带宽节省开始占上风。到了某个临界点,量化的净效果从"费电"翻转为"省电"。这个翻转点就是 crossover point。
一句话总结:量化省的是带宽,花的是反量化算力;谁大谁小,取决于模型尺寸和 GPU 架构。
NF4 vs FP16 解码能耗变化(正 = 量化更费电,负 = 量化省电):
GPU 架构 | ~1–3B(小模型) | 7B | crossover 点 |
|---|---|---|---|
RTX 4090D (Ada) | +25% ~ +56% | 未测 | 测量范围内无 crossover |
RTX 4090 (Ada, 2026.7) | +1% ~ +16% | −28% | ≈ 3.1B(此卡),≈ 3.7B(Ada 汇总拟合) |
RTX 5090 (Blackwell) | +12% ~ +29% | −11% | ≈ 4.8B |
T4 (Turing) | +0% ~ +5% | −14% | ≈ 2.1B |
A800 (Ampere) | 未测 | −4% | < 7B |
几个值得注意的点:
这是整批数据里最干净的一条结论。
我租了一张 RTX 4090 跑了自己的测量容器(ecocompute-mlcube),5 个模型 3 种精度,15 组配置全部拿回实测数据。INT8 的结果:
模型 | FP16 (mJ/token) | INT8 (mJ/token) | INT8 vs FP16 |
|---|---|---|---|
Qwen2-0.5B | 1550.9 | 5302.5 | +241.9% |
TinyLlama-1.1B | 1619.7 | 3986.2 | +146.1% |
Qwen2-1.5B | 2200.7 | 6177.9 | +180.7% |
Qwen2.5-3B | 3558.0 | 8354.9 | +134.8% |
Qwen2-7B | 5467.9 | 8176.8 | +49.5% |
从 0.5B 到 7B,INT8 在这张卡上没有一个尺寸省电。最小的惩罚也在 +49.5%(7B),最大的惩罚到了 +241.9%(0.5B)——量化之后能耗翻了 3.4 倍。
机制很简单:INT8 确实降低了瞬时功耗(73–95W vs FP16 的 88–269W),但吞吐也崩了——9–19 tok/s vs FP16 的 39–62 tok/s。能耗 = 功率 × 时间,跑得慢所以总能量更高。
A800 上的 INT8 同样不省电:7B–14B 范围内 INT8 惩罚 +107% ~ +131%。数据中心卡也没例外。
⚠️ 重要限定:这是 bitsandbytes LLM.int8() 在特定硬件上的测量结果,n=1,batch size=1。其他 INT8 实现(GPTQ、AWQ、TensorRT-LLM、融合内核)可能有不同表现。不要把这条结论泛化到"所有 INT8 都费电"——但至少在用 bitsandbytes 的时候,别默认 INT8 省电。
这里有一个必须诚实面对的矛盾:我的主数据集(RTX 4090D,batch size 8)显示 INT8 在 6B–9B 省电 −15%,但上面 RTX 4090 batch-size-1 的数据和 A800 batch-size-8 的数据都显示 INT8 惩罚。
这意味着 INT8 的能耗结果对 batch size 和 GPU 型号敏感。可能的原因包括:
我的处理方式:把这个 −15% 标记为 "observed but unvalidated finding",不纳入 "INT8 不省电" 的核心结论,同时在论文的 Limitation 里单独讨论。诚实比好看重要。
这篇文章不是叫你别量化。量化在以下场景是对的:
关键不是"量化或不量化",而是做有数据支撑的决策。
如果你想知道你的 GPU + 你的模型 + 你的精度组合到底省不省电,有三个路径:
打开 quantenergy.tech,选 GPU → 输入模型大小 → 看结果。每个数字都标注了 measured / interpolated / extrapolated,外推的我会告诉你这是外推。
示例链接:quantenergy.tech/?tab=estimate&arch=blackwell&size=3&prec=NF4
没有 GPU 也能跑——容器会返回数据集中的参考值,明确标注"这不是实测"。
点链接 → Run All → 等 15 分钟 → 拿到一行数据。自动检测 GPU、跑 FP16 基线 + 量化对照、输出 energy.json、生成 GitHub issue 模板。
不需要装 Docker、不需要租卡、不需要看懂 energy.json。
所有原始测量记录、CSV、energy.json 以 CC BY 4.0 发布:
每条数据都有溯源标签:basis(measured / interpolated / extrapolated / estimated)、measurement_source(direct-nvml)、certified_benchmark_result: false。我从不会把估算包装成实测。
在消费级 GPU 上:
最后一句:measure, don't assume.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。