Quantization:模型量化,通过把浮点数转为定点数、降低访存来在引入较少误差的情况下,降低模型大小,推理时延,大幅提升模型性能。
Calibration Set:校准集,少量的训练数据,用于在量化过程中校准评估量化误差
PTQ:Post-Training Quantization 训练后量化,量化过程中不会进行权重训练。
QAT: Quantization Aware Training 在量化的过程中会进行梯度反传更新权重。
OBD&OBS: 模型裁剪方法,利用Loss二阶导数信息,对权重删除进行补偿得到较好的裁剪结果。
强烈建议补全前置知识 OBD&OBS:给神经网络做个外科手术
核心要点
-
OBQ:把OBS推广到量化领域,同时加上分行运算的方式。
-
GPTQ:使用相同顺序,各行并行计算,分批BatchUpdate,分组量化的方式提升量化速度
和学术界刷SOTA不一样,工业界更在意ROI,如何把研究用的大模型在低工作量的情况下转移到工业部署上,保证精度的同时最大程度节省资源,这个是很重要的一个话题。
OBS
把权重直接展开,计算对应的海森矩阵,然后按照顺序进行量化。时间复杂度:
OBQ
权重分行计算,但是贪心算法,每次找量化误差最小的进行量化。时间复杂度:
GPTQ
使用相同顺序,各行并行计算,分批BatchUpdate,分组量化。时间复杂度:
- 相同顺序:在量化的过程中,以贪心算法来每次以最小的误差量化权重的方法表现良好,但相比固定顺序并没有明显提升,尤其是在大模型上可能固定顺序更好。所以我们使用固定顺序进行量化。
- 并行计算:因为量化权重在行间没有影响,所以我们可以并行量化多行来加速计算。
- 分批更新:如果我们每次量化一个参数就进行一次权重更新的话,更多的时间都被花到访存,不能充分利用GPU的算力,所以我们可以分批进行更新,批内完成后再更新全局的矩阵。
- 数值稳定:对海森矩阵的逆来增强数值稳定性。
- 分组量化:相对于采用相同的Scale,Zero对整个矩阵进行量化,选择一个小点的Groupsize在组内计算特定的量化参数可以应对全局的异常值,取得更好的量化效果。
目前我们用的模型可能在体积和性能上还是有很大的优化空间,GPTQ只是从量化这个角度,假如我们组合多种技术来实验会怎么样。现在看170B这个水平的模型很大,但是或许我们目前的方法已经能把它们塞进4080这样的消费级显卡上了,只不过我们尚且没有找到好的工程组合方法,如果能把蒸馏-剪枝-量化等技术有效的统一起来,或许已经可以实现。
GPTQ 代码流程图
相关链接
QAT&PTQ: Quantization aware training(神经网络量化训练)_哔哩哔哩_bilibili
SenseTime HPC Dalao: zz123211的个人空间-zz123211个人主页-哔哩哔哩视频
LokLok Dalao:GPTQ: 模型量化,穷鬼救星-知乎
OBD&OBS Video: OBD&OBS:给神经网络做个外科手术【论文粗读·3】_哔哩哔哩_bilibili
OBQ: Optimal Brain Compression A Framework for Accurate Post-Training Quantization and Pruning.pdf
GPTQ: Accurate Post-Training Quantization for Generative Pre-Trained Transformers.pdf
AutoGPTQ: GitHub - PanQiWei/AutoGPTQ GPTQ4LLaMa:GitHub - qwopqwop200/GPTQ-for-LLaMa
Available Time: 22:00-24:00(workday) 14:00-20:00(non-working day)