当前位置: 首页 > news >正文

量化QAT QLoRA 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是商汤出的量化框架
在这里插入图片描述

GPTQ

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方法在进行权重剪切的过程中并不完全合理,所以新增了权重删除补偿的策略(参考https://readpaper.feishu.cn/docx/HaM7d7uGhoQ2VPxxZBacpduDny7);OBS在执行中是直接把权重展开计算对应的海森矩阵,然后按照顺序进行量化,OBQ对量化的顺序进行了调整,将权重分行进行计算,利用贪心算法每次找到量化误伤最小的行进行量化,量化复杂度显著降低;GPTQ在OBQ基础上进行顺序量化+组内联合,进一步降低了量化的复杂度(参考https://readpaper.feishu.cn/docx/OPP2dTuXAoaO0oxWhQAcC05Wnpc)
在这里插入图片描述
GPTQ在实现中用Cholesky分解来稳定了数值计算

http://www.lryc.cn/news/140172.html

相关文章:

  • CentOS下查看 ssd 寿命
  • Node基础--npm相关内容
  • Python图片爬虫工具
  • 制造执行系统(MES)在汽车行业中的应用
  • Spring与Mybatis集成且Aop整合
  • 【nonebot-plugin-mystool】快速安装使用nonebot-plugin-mystool
  • js实现数据关联查找更新。数据求和验证
  • 区块链上地址与银行账户有什么区别?
  • CF 148 D Bag of mice(概率dp求概率)
  • 引入本地 jar 包教程
  • 优维产品最佳实践第5期:什么是持续集成?
  • 空时自适应处理用于机载雷达——元素空间空时自适应处理(Matla代码实现)
  • 聚观早报 | 青瓷游戏上半年营收3.34亿元;如祺出行冲击IPO
  • 硅谷的魔法:如何塑造了全球技术的未来
  • (三)行为模式:4、迭代器模式(Iterator Pattern)(C++示例)
  • React Antd form.getFieldsValue() 和 form.getFieldsValue(true) 有区别吗?
  • 浅谈Java中的观察者模式
  • C++:命名空间,缺省参数,函数重载,引用,内联函数
  • 2.Vue报错Cannot read properties of undefined (reading ‘then‘)
  • 【LeetCode 】数组简介
  • 一文解析block io生命历程
  • Python爬虫学习之旅:从入门到精通,要学多久?
  • HarmonyOS/OpenHarmony(Stage模型)卡片开发应用上下文Context使用场景一
  • MAE 论文精读 | 在CV领域自监督的Bert思想
  • C++中内存的分配
  • Qt中的垂直布局QVBoxLayout和水平布局QHBoxLayout
  • 【C#学习笔记】委托和事件
  • 堆排序简介
  • React Diff算法
  • 07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s