大模型量化实战:GPTQ、AWQ与量化感知训练的效果对比与选型建议
大模型部署时最常遇到的一个问题就是显存不够。模型越来越大,硬件却不可能无限升级,量化因此成了工程落地绕不开的一环。这两年接触过的量化方案里,GPTQ、AWQ和量化感知训练(QAT)算是三种比较有代表性的路线,各有各的适用场景,也各有各的坑。
三种方法各是什么路数
GPTQ和AWQ都属于后训练量化,也就是模型训练完成之后再做压缩,不需要重新训练模型,这个特点让它们在工程上非常讨喜。
GPTQ的核心思路是逐层做量化补偿,最小化量化前后每一层输出的误差。它会把权重分组,每组单独计算缩放因子,然后通过类似牛顿迭代的方法调整量化参数,让精度损失尽量小。LLaMA Factory的文档里提到,GPTQ可以把FP16精度的模型量化到4-bit,显存节省大约75%,同时推理速度明显提升。
AWQ的出发点不太一样,它关注的是激活值。实际观察发现,模型里只有一小部分权重真正重要——那些对应着大激活值幅度的通道,对量化误差特别敏感。AWQ的做法是保留这些关键通道不量化,或者给它们更高的精度,其余部分正常量化。一个比较明显的优势是,AWQ需要的校准数据集比GPTQ小,在指令微调过的模型和多模态模型上表现更好。
量化感知训练(QAT)则是另一条路。它不是训练完再量化,而是在训练或微调的过程中就模拟量化效果,让模型自己适应低精度表示。代价是需要重新训练或微调,成本高不少,但精度损失通常也是最小的。
实际效果怎么对比
从一些公开的实验数据来看,不同量化方法的表现差异还是挺明显的。有一份针对LLaMA系列模型的评测显示,在4-bit量化的场景下,几种主流方法的表现都还算不错,但AWQ普遍有轻微的优势。当量化到3-bit时,差距就开始拉大了——AWQ在LLaMA-3 8B上还能保持9.83的困惑度和54.65%的准确率,而同样条件下OmniQuant已经掉到了17.53和36.09%。
MT-Bench的多轮对话评测也反映了类似的趋势。在Vicuna-7B模型上,AWQ量化后的平均分是6.03,非常接近FP16原版的6.00;而GPTQ降到了5.71。在Llama-2-7B-Chat上,AWQ的表现甚至比原版还好一点(6.62 vs 6.54),GPTQ则是5.83。
还有一个值得注意的现象是,训练越充分的模型,量化时信息损失往往越大。LLaMA-3的训练数据比LLaMA-2多了好几倍,模型学到的信息更密集,压缩成低比特时丢掉的东西也就更多。这在2-bit这种极限场景下尤其明显,GPTQ在LLaMA-3-8B上2-bit量化后的困惑度直接飙到了647,基本没法用了。
什么时候该用哪个
GPTQ和AWQ都是后训练量化,不需要重新训练,部署成本低,适合绝大多数需要快速上线的场景。两者之间的选择取决于具体需求和模型类型:如果模型是通用的预训练模型,且硬件对GPU计算优化要求较高,GPTQ通常是更稳妥的选择,因为它对GPU的利用更充分;如果模型是指令微调过的,或者需要处理多模态任务,AWQ往往表现更好,而且校准数据需求更少。
下面是简单的代码示例,分别展示GPTQ和AWQ的加载方式。
GPTQ 4-bit量化加载:
from auto_gptq import AutoGPTQForCausalLM model = AutoGPTQForCausalLM.from_quantized( "TheBloke/Llama-3-8B-GPTQ", use_safetensors=True, device_map="auto" )
AWQ 4-bit量化加载:
from awq import AutoAWQForCausalLM model = AutoAWQForCausalLM.from_pretrained( "TheBloke/Llama-3-8B-AWQ", device_map="auto" )
QAT则更适合对精度要求极高的场景——比如医疗、金融等领域,几个百分点的准确率下降都不可接受。虽然训练成本高,但这是把精度损失降到最低的有效手段。PyTorch官方提供了QAT的支持,可以在训练过程中插入量化模拟节点,让模型在低精度下学会更鲁棒的表示。
选型建议
梳理一下,大致可以按这个思路来决策:
如果追求快速部署,对精度损失容忍度尚可,优先考虑后训练量化路线。GPTQ和AWQ的选型上,可以先用模型做一个小规模的校准实验:用同样的校准数据集分别量化,然后在验证集上看看效果,哪个好就用哪个——毕竟不同模型架构和任务类型对量化方法的偏好确实存在差异。
如果对精度有极致要求,或者模型将在资源受限的边缘设备上长期运行,QAT值得投入训练成本。特别是在模型本身就需要微调的场景下,顺势做QAT并不会增加太多额外开销,但效果比后训练量化要稳不少。
量化这件事说到底是个取舍的艺术。没有绝对的好坏,只有适合不适合。把几种方法的原理和适用边界搞清楚,到具体项目里该用什么自然就有数了。
