量化QAT QLoRA OBD OBS GPTQ

模型量化的思路可以分为PTQ(Post-Training Quantization,训练后量化)和QAT(Quantization Aware Training,在量化过程中进行梯度反传更新权重,例如QLoRA),GPTQ是一种PTQ的思路。

QAT(Quantization Aware Training)

BN需要先融合掉:
在这里插入图片描述
伪量化节点是根据融合图来决定的

量化过程中不可导的部分是Round函数,Hinton论文中把他的导数置为1,这就解决了量化框架中梯度反向传播的问题,图片截取自https://www.bilibili.com/video/BV13s4y1D73L/:
在这里插入图片描述
在这里插入图片描述
AdaRound和AdaQuant这些论文都是一层层训练的,QAT需要把某些层切成子图,对子图量化即可。

QLoRA

几个关键点:

  • 4bit NormalFloat 量化
  • 双重量化
  • Page Optimizer:Page Optimizer机制使得在GPU显存吃紧的时候可以把optimizer转移到内存上,在需要更新optimizer状态时再加载回来,据说可以有效减少GPU显存的峰值占用,文章称想要达到在24gb上训练33B 参数模型这个机制是必须的

QLoRA实现中用了bitsandbytes这个库

GPT

例如TensorRT的后量化,paddlepaddle的后量化,推理框架最清楚网络做哪些图融合,但是GPT不会训练,不会梯度反传。PPQ是商汤出的量化框架
在这里插入图片描述

OBD(Optimal Brain Damage)

截图自 https://readpaper.feishu.cn/docx/HaM7d7uGhoQ2VPxxZBacpduDny7
在这里插入图片描述

OBS(Optimal Brain Surgeon)

简单来说就是把权重直接展开,计算对应的海森矩阵,然后按照顺序进行量化。时间复杂度O((drow⋅dcol)3)O\left( \left( d_{\text{row}} \cdot d_{\text{col}} \right)^3 \right)O((drowdcol)3)
在这里插入图片描述
在这里插入图片描述
以下截图来自 https://readpaper.feishu.cn/docx/HaM7d7uGhoQ2VPxxZBacpduDny7
在这里插入图片描述

OBQ(Optimal Brain Quantization)

权重分行计算,但是贪心算法,每次找量化误差最小的进行量化。时间复杂度:
O(drow⋅dcol3)O\left( d_{\text{row}} \cdot d_{\text{col}}^3 \right)O(drowdcol3)
在这里插入图片描述

GPTQ(Gradient Post Training Quantization)

  • GPTQ并不是完全凭空头脑风暴出来的想法,而是经过OBD(Optimal Brain Damage)->OBS(Optimal Brain Surgeon,Second Order Derivatives for Network Pruning)-> OBQ(Optimal Brain Quantization)->GPTQ逐渐演化过来的。这一类思路基本的出发点在于先考虑一个单层的网络W,如何找到一个量化后的网络Wq,使得W和Wq之间的差别最小?OBD方法是Lecun在1989年就在搞的方法,主要思路用W和Wq之间的误差进行泰勒展开,展开后舍弃一些项,得到利用海森矩阵进行迭代更新;OBS方法发现OBD方法在进行权重剪切的过程中并不完全合理,所以新增了权重删除补偿的策略;OBS在执行中是直接把权重展开计算对应的海森矩阵,然后按照顺序进行量化;OBQ对量化的顺序进行了调整,将权重分行进行计算,利用贪心算法每次找到量化误伤最小的行进行量化,量化复杂度显著降低;GPTQ在OBQ基础上使用相同顺序,各行并行计算,分批 BatchUpdate,分组量化,时间复杂度O(max⁡{drow⋅dcol2,dcol3})O\left( \max \left\{ d_{\text{row}} \cdot d_{\text{col}}^2, d_{\text{col}}^3 \right\} \right)O(max{drowdcol2,dcol3})
  • GPTQ在实现中用Cholesky分解来稳定了数值计算

在这里插入图片描述

GPTQ的reorder原理(核心思想:​分组优化与权重删除补偿、并行)

在量化过程中,GPTQ 将权重矩阵按列划分为多个子块(Block),例如每组 128 列。其核心目标是通过调整量化顺序和参数更新方式,减少量化误差的累积。具体来说:

  • ​分组优化:将权重矩阵按列分组,逐个子块量化。例如,先量化当前子块中的某一列,再调整该子块内其他未量化的列以补偿误差。
  • 权重删除补偿:量化某一列后,通过数学方法(如 Cholesky 分解)计算量化误差对后续列的影响,并动态更新剩余权重,以最小化整体输出误差。
  • 并行:GPTQ在OBQ基础上使用相同顺序,各行并行计算,分批 BatchUpdate,分组量化

参考文档

  1. https://readpaper.feishu.cn/docx/HaM7d7uGhoQ2VPxxZBacpduDny7
  2. https://readpaper.feishu.cn/docx/OPP2dTuXAoaO0oxWhQAcC05Wnpc
### QAT(Quantization Aware Training)模型量化实现方法 QAT(Quantization Aware Training)是一种在训练过程中引入伪量化的技术,用于模拟量化过程带来的误差[^3]。这种方法通过在训练阶段模拟量化操作,使得模型能够在训练期间考虑量化过程、损失计算权重更新[^4]。 #### 1. 核心原理 QAT的核心思想是通过在训练阶段引入伪量化操作,来模拟实际量化过程中的误差。具体而言,在前向传播中,模型的权重激活值会被量化为低精度格式(如INT8),然后反量化回浮点数进行后续计算[^1]。这种方式允许模型学习到如何适应量化后的参数分布,从而减少量化后的精度损失。 #### 2. STE近似 在QAT中,通常会使用Straight Through Estimator(STE)来近似量化函数的导数[^1]。由于量化函数本身是非可微的,STE通过在反向传播时忽略量化操作的影响,直接将梯度传递给输入,从而实现训练过程的连续性。 #### 3. 实现步骤 以下是QAT的一般实现方法: - **伪量化操作**:在模型的每一层中,插入伪量化节点,对权重激活值进行量化量化。例如,可以使用以下代码实现: ```python import tensorflow as tf from tensorflow_model_optimization.python.core.quantization.keras import quantize_annotate_layer from tensorflow_model_optimization.python.core.quantization.keras import quantize_aware_activation # 定义伪量化层 def fake_quantize(x, num_bits=8): min_val = tf.reduce_min(x) max_val = tf.reduce_max(x) scale = (max_val - min_val) / (2**num_bits - 1) return tf.round((x - min_val) / scale) * scale + min_val ``` - **模型改造**:使用框架提供的工具(如TensorFlow Model Optimization Toolkit)对模型进行改造,插入伪量化操作。例如: ```python import tensorflow_model_optimization as tfmot # 应用QAT quantize_annotate_model = tfmot.quantization.keras.quantize_annotate_model(model) quantized_model = tfmot.quantization.keras.quantize_apply(quantize_annotate_model) ``` - **训练过程**:在训练过程中,模型会自动应用伪量化操作,并根据STE近似调整权重。训练完成后,模型可以被导出为量化模型。 #### 4. 优势与局限性 QAT相比训练后量化具有更高的精度保持能力[^2],因为它在训练阶段就考虑了量化误差的影响。然而,QAT的实现复杂度较高,且需要更多的训练时间[^4]。 ### 示例代码 以下是一个简单的QAT实现示例: ```python import tensorflow as tf import tensorflow_model_optimization as tfmot # 加载模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)), tf.keras.layers.Dense(10, activation='softmax') ]) # 应用QAT quantize_model = tfmot.quantization.keras.quantize_model q_aware_model = quantize_model(model) # 编译模型 q_aware_model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy']) # 训练模型 q_aware_model.fit(train_dataset, epochs=5) # 导出量化模型 converter = tf.lite.TFLiteConverter.from_keras_model(q_aware_model) converter.optimizations = [tf.lite.Optimize.DEFAULT] quantized_tflite_model = converter.convert() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值