量化不是把模型压缩到爆表就完事,而是要在精度和速度之间找平衡点。INT8、INT4这些小比特数方案看似简单,实际坑比模型蒸馏还多。先抛开数学推导,直接说人话——为什么量化能让模型跑得更快?怎么选INT4还是INT8?又踩过哪些雷?
1. 量化本质:从FP32到整数的暴力降维
模型计算时,权重和激活值通常是32位浮点数(FP32),占内存空间的80%以上。量化就是把这些数强行转成整数(比如INT8)。INT8每个数用1字节存储,相比FP32的4字节,内存占用砍75%。但别高兴太早,整数运算硬件加速才是提速关键——现代GPU/NPU对INT8有原生指令集,而FP32需要软件模拟,性能差距能到10倍。实测ResNet-50在T4显卡上INT8推理速度是FP32的6倍,这还不算带宽优势。
2. INT8 vs INT4:精度与速度的拉锯战
INT8是主流选择,但INT4更激进。INT4每个参数只需1/4空间,速度理论上还能提升2倍(毕竟访存量减少)。问题来了:精度会崩!
-
典型情况:GPT-2用INT8损失1%困惑度,INT4直接飙到20%。
-
原因分析:低比特导致梯度消失,残差连接这类结构尤其敏感。
我的经验是:除非模型特别大(如百亿参数),否则优先INT8。INT4适合边缘设备,但必须配合校准和微调。某次实验发现,ViT-Tiny用INT4+动态量化,准确率只掉2%,速度却快了3倍——但这属于特例,不能推广。
3. 量化落地的真实陷阱
陷阱1:静态量化的幻觉
很多教程说“直接转INT8就行”,实际没那么简单。激活值的动态范围差异巨大,如果不对输入做校准,某些层的数值会被截断。解决方案是收集代表性数据训练缩放因子(scale factor),误差可能缩小到1e-3以下。
陷阱2:硬件依赖的玄学
同一套代码,在NVIDIA A100上INT8能跑1000QPS,换到AMD MI300X可能只有300QPS。这是因为不同厂商对INT8的指令集支持程度不同。建议量化前查硬件白皮书,或者用PyTorch的torch.backends.cuda.matmul.allow_tf32调整策略。
陷阱3:混合量化的必要性
全INT8未必最优。比如Transformer的FFN层对INT8敏感度高,但自注意力层相对稳健。PyTorch的torch.quantization允许逐层设置量化配置,某次实验中,混合INT8+FP16的LLaMA-7B比全INT8快15%且BLEU分只降0.5。
4. 实战技巧:从理论到落地
-
校准数据集要够脏:用真实用户输入而非均匀分布数据,避免“干净测试集骗高分”。
-
动态量化慎用:虽然能省内存,但运行时缩放因子计算开销可能抵消收益。
-
工具链选择:Intel QNN适合x86,TVM更适合异构部署,PyTorch原生工具最易上手但灵活性一般。
最后吐槽一句:量化社区总爱吹“INT4无损”,实际业务里敢用的人不超过1%。我的建议是——先INT8,再根据硬件需求评估INT4,永远记住:速度≠效果,省钱≠靠谱。