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

LLM 量化算法AutoRound 0.3 发布及原理浅析

这里写自定义目录标题

      • AutoRound V0.3 特性
      • 原理浅析
        • 其他工作
        • AutoRound 原理

AutoRound(https://github.com/intel/auto-round)在Llama3.1-8B-Instruct上效果明显优于AWQ/GPTQ等方法,在10个任务的平均准确率上我们以63.93%由于AWQ的63.15%和GPTQ的63.04%,具体数据可参考在 低比特开源LLM排行榜。

AutoRound V0.3 特性

支持了更多的设备

AutoRound格式支持CPU、HPU和CUDA推理,并且解决了2-bit kernel精度问题

模型量化recipe

在低比特开源LLM排行榜上发布了,另外发布了少量QWEN2的量化模型。由于公司政策问题,发布模型都要很长时间的审核,因此大部分的量化模型不能发布。

实验性功能

引入了包括激活量化和mx_fp数据类型在内的多个实验性功能,但是目前不支持实际部署。我们发现AutoRound这这些场景中也有很大的作用。

多模态模型支持

支持了Llava, phi3-vision, Qwen-vl的tuning和推理

其他

另外我们也实现了对low_cpu_mem_usageauto_awq格式、校准数据集连接以及带有chat_template的校准数据集的支持。

接下来我们也会尝试整合不同的算法来提升类似2bit和W4A4等场景的精度,欢迎关注。

觉得我们的工作有帮助的话, 麻烦github上加个小星星

原理浅析

其他工作

post traning量化如GPTQ和AWQ在业界已经非常出名了,但是在有些模型上还是有不小的损失,另外各有各的缺点(所有算法都有自己的缺点,包括AutoRound). GPTQ相当于伤了左脑补右脑,并且由于hessian矩阵的存在,有时候会不正定。 AWQ相当于转移问题,将量化的难度转移到activation或者不敏感的weight上,它需要插入一个op,这个op大部分可以融合到 layernorm,但是有些只能融合到其他weight上或者只能放弃处理,对精度有一定的影响。此外一些框架会为提速支持compute_dtype为int8,也就是说激活也会量化,AWQ模型一般在这些上面就容易掉点。最后 GPTQ/AWQ共有的缺点就是标定数据不能很多,不然会很慢,因为基本上是相当于batch_size等于数据集大小。

类似于QAT的方法也有很多,不少论文证明的效果非常好。但是个人不太喜欢这样的算法,主要有两点原因,

1 一般速度明显更慢并且需要调学习率和epoch. 虽然我个人也有点训练的经验,但是在调学习率和epoch上感觉还是门外汉,如果大家有好的调参资料可以分享一下。

2 有overfit的风险。一般QAT用的微调数据其实也不是很多,但是大模型训练的数据明显要高几个数量级并且instruct模型或者chat模型都是经过特殊数据(一般拿不到)训练过的来提升安全性等能力。 而QAT的算法或者其他的训练算法一般都会用Adam 优化器,但是Adam优化器对weight的调整是不可空的,有可能经过训练后模型跟原来的差别很大。大部分的论文只会报少量任务的数据,我个人理解就是就算在这些任务上表现比较好,如果模型改动挺大,那没测的一些能力有可能跟原始模型差别比较大。

AutoRound 原理

AutoRound主要是用signSGD也就是在梯度上去正负号来微调网络,微调的参数主要包括两个部分,一个是rouding的值,一个是weight clip,用来控制scale和zp

请添加图片描述

这里引入一点简单的公式来说明
W ~ = s ∗ c l i p ( ⌊ W s + z p ⌉ , n , m ) , n , m ∈ N \widetilde{W} = s*clip(\left\lfloor\frac{W}{s}+zp \right\rceil,n,m),n,m \in \mathbb{N} W =sclip(sW+zp,n,m),n,mN

s = m a x ( W ) − m i n ( W ) 2 b i t − 1 s = \frac{max(W)-min(W)}{2^{bit}-1} s=2bit1max(W)min(W)

如上面的公式,一般想把一个浮点的权重W量化成一个整数的公式如上,搜一下网上资料很多,不赘述。

我们综合之前的工作在这上面加了两个可调整的参数,一个是V用来控制up-down rounding值,V一般是在[-0.5,0.5],一个是alpha/beta用来控制s和zp , 一般是在[0.5, 1], 有些模型用[0,1]更好些
W ~ = s ∗ c l i p ( ⌊ W s + z p + V ⌉ , n , m ) , n , m ∈ N s = m a x ( W ) ∗ α − m i n ( W ) ∗ β 2 b i t − 1 \widetilde{W} = s*clip(\left \lfloor\frac{W}{s}+zp +V \right \rceil,n,m),n,m \in \mathbb{N} \\ s = \frac{max(W)*\alpha-min(W)*\beta}{2^{bit}-1} W =sclip(sW+zp+V,n,m),n,mNs=2bit1max(W)αmin(W)β
区别于其他的工作,我们采用signSGD来微调这么参数而不是常用的Adam.

为什么这么设计

1 为什么只允许调up-down rounding

一个是为了防止overfit的问题,让调整后的模型还是接近原始模型;另外一个我们也测过放开这个限制,印象中在我们测试的场景中没有优势;第三个是如果范围扩大用SignSGD不好微调,具体原因可以看下面。

2 为什么用SignSGD

2.1 上面提到了,V/alpha/beta都是有界的,所以用SignSGD可以快速的为每一个参数快速的探索整个空间。因为SignSGD是这么调整权重的
W = W − S i g n ( g r a d ) ∗ l r W = W-Sign(grad)*lr W=WSign(grad)lr
如果我们控制所有iter下lr的和, 那在一定步数下,我们就能遍历整个空间。比如我们的默认参数是200步,然后初始lr是1.0/200, 然后用的是linear decay,那这200步lr的和是200*1.0/200 *0.5 = 0.5,刚好是0.5, 由于sign有正负,所有它搜索的范围是[-0.5, 0.5]刚好是我们想要的区间。

2.2 搜索精度够足够用

V: V的最优解空间很大,比如原始是4.6,本来是要往上rounding,如果最优解是向下rounding,那么V的取值可以是[-0.5, -0.1),所以只要搜到其中的任何一个值就可以,因此不需要很精确的搜索

alpha, beta:由于我们的lr是线性下降的,虽然没有数学证明或者实际测过,我们用signround能搜到理论的解还是很多的,所以两点的间隔应该不会很大,就算最优解刚好落到这两点之间,实际上损失也不大。

2.3 节省显存和提速。

Adam会存下不少的state,有momentum和variance. 不要小看这些临时变量,因为在AMP训练中,这些都是FP32的,具体可以参考ZeRO: Memory Optimizations Toward Training Trillion Parameter Models

相关文章:

LLM 量化算法AutoRound 0.3 发布及原理浅析

这里写自定义目录标题 AutoRound V0.3 特性原理浅析其他工作AutoRound 原理 AutoRound(https://github.com/intel/auto-round)在Llama3.1-8B-Instruct上效果明显优于AWQ/GPTQ等方法,在10个任务的平均准确率上我们以63.93%由于AWQ的63.15%和GP…...

汽车免拆诊断案例 | 2013款北京现代悦动车发动机偶尔无法起动

故障现象 一辆2013款北京现代悦动车,搭载G4FC发动机,累计行驶里程约为13.9万km。车主反映,发动机偶尔无法起动着机,断开点火开关,等待一会儿又可以起动着机。 故障诊断 接车后反复试车,当发动机无法起动着…...

React、AntD,封装动态表单

在React中使用Ant Design(简称AntD)来封装动态表单是一个常见的需求,特别是在需要灵活配置表单字段的场景下。以下是一个基本的步骤和示例代码,展示如何使用React和AntD来封装一个动态表单。 步骤 1: 安装必要的库 首先,确保你的项目中已经安装了react和antd。如果还没有…...

【Linux基础】Linux中的开发工具(3)--make/makefile和git的使用

目录 前言一,Linux项目自动化构建工具-make/makefile1. 背景2. 依赖关系和依赖方法3. 项目清理4. 使用方法和原理5. .PHONY的作用6. makefile中符号的使用 二,进度条的实现1. 理解回车换行2. 理解行缓冲区3. 版本14. 版本2 三,Linux上git的使…...

过滤了字母、数字、_、$的webshell命令执行技巧

目录 对于php5以上首先要解决的问题有 解决技巧 1.code长度小于35位 2.没有字母、数字、_ 、$ 3.怎么把文件放进服务器 4.怎么执行文件里面的内容 1.执行Linux命令 2.执行文件里面的shell命令 5.构造完整的code参数 6.我们还可以通过修改文件里面shell命令,…...

python-A+B again

[题目描述] 小理有一个非常简单的问题给你,给你两个整数 A 和 B,你的任务是计算 AB。输入格式: 输入共 2∗T1 行。 输入的第一行包含一个整数 T 表示测试实例的个数,然后 2∗T 行,分别表示 A 和 B 两个正整数。注意整数…...

C语言—函数递归

一、递归概念 递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。下面举一个例子: 上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问题,代码最终…...

结构开发笔记(四):solidworks软件(三):绘制36x36方块摄像头示意体

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/141187797 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...

【机器学习】Caltech-101的基本概念和使用方法以及Caltech-101和ImageNet的联系和区别

引言 Caltech-101数据集是一个广泛用于对象识别任务的数据库,它包含了大约9,000张图像,这些图像来自101个不同的对象类别。每个类别包含的图像数量大约在40到800张之间,大多数类别大约有50张图像。图像的分辨率大致为300200像素 文章目录 引言…...

mysql Ubuntu安装与远程连接配置

一、安装(Ubuntu22环境安装mysql8) 这里使用Xshell链接Ubuntu和mysql windows进行操作,特别提醒:安装之前建议对Ubuntu快照处理备份,避免安装中出错导致Ubuntu崩溃。 查看是否安装的有可以用指令:ps -ef|…...

c语言中比较特殊的输入格式

目录 一.%[ ] 格式说明符 1.基本用法 (1)读取字母字符: (2)读取数字字符: (3)读取所有字符直到遇到空格: (4)读取直到换行符: 2.使用范围和组合: 3.^ 取反操作 4.注意事项 (1). 字符范围的正确表示 (2). 避免字符集中的特殊字符冲突 (3).避免空字符集 (4). 输入长…...

远程命令行控制SSH

第一次接触SSH是ROS小车作为服务端,通过ubuntu电脑客户端访问。因为机器人接键盘和屏幕操作起来不方便,所以使用SSH进行连接,方便对小车的操作。 1.服务端安装 打开终端查看ssh是否安装 sudo service ssh status 如果未安装 sudo apt upd…...

钢铁百科:A572Gr60和SA572Gr60材质分析、A572Gr60和SA572Gr60简介

A572Gr60和SA572Gr60是两种常用的结构钢板,它们在材质、执行标准、化学成分、力学性能、交货状态、应用范围和常用规格方面有所不同。 材质: A572Gr60:属于美国材料与试验协会(ASTM)标准下的A572系列高性能结构钢&…...

一次sql请求,返回分页数据和总条数

日常搬砖,总少不了需要获取分页数据和总行数。 一直以来的实践是编码两次sql请求,分别拉分页数据和totalCount。 最近我在思考: 常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新,显而易见的优势: ① 能…...

2.5 pyautogui 实现微信自动回复

第四节:实战微信自动回复 课程目标 学习如何通过pyautogui完成微信自动回复 课程内容 编码实现 import pyautogui as pg import time from pyautogui import ImageNotFoundException import pyperclip from cnocr import CnOcr import random ocr CnOcr() msg…...

观存储历史,论数据未来

数据存储 这几天我反复观看了腾讯云社区的《中国数据库前世今生》纪录片,每次的感受都大相径庭。以下是我在这段时间里对纪录片的两个不同感想,希望感兴趣的小伙伴们也能去观看一番。 一个是关于国产数据库的发展趋势的探讨:https://blog.c…...

linux:对目录的操作

一、对目录操作 1,打开目标目录 2.读取目录,, 3.关闭目录 目录 当文件看,只不过操作函数和操作文件函数不一样。 *1.opendir DIR *opendir(const char *name); 功能:打开一个目录获得一个目录流指针 参数:name:目录名 返回值&#xf…...

详解Redis 高可用的方式 Redis Cluster

Redis 高可用方式 Redis 提供了多种高可用性方案,主要包括以下几种方式: 主从复制(Replication) 主从复制是最基本的高可用性方案,通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…...

$clog2(1)=0

项目场景: 写ip 时, 使用参数化的方式实现2w1r 时,出现计算读返回index 时,减下溢! 问题描述 verilog中会使用parameter 参数化,例如使用dpth 和$clog2(dpth)addr 。 常见的写法没有什么问题。 module …...

开发学习日记1

用这个系列博客记录下学习开发的一些小收获 git的使用: 说来惭愧,学到了大二,git的使用还是一团糟,记录一下如何使用git进行团队合作开发 当要加入其他人的项目时首先你要创建自己的分支(克隆一下其他分支&#xff…...

孙宇晨领航波场TRON:引领数字资产迈向崭新纪元

​ 在风起云涌的数字资产领域,孙宇晨这个名字始终与创新、突破和引领紧密相连。作为波场TRON的创始人,他不仅是一位远见卓识的领导者,更是推动数字资产迈向新纪元的坚实力量。 自波场TRON诞生以来,孙宇晨便以其敏锐的洞察力…...

python运维(twenty-four day)

一、python基础 1、环境python2、python3 [rootpython ~]# yum list installed | grep python #检查是否有python包 [rootpython ~]# yum list installed | grep epel #检查是否有epel包 [rootpython ~]# yum -y install epel-release [rootpython ~]# yum -y instal…...

Eureka原理实践

1. 简介 1.1. 概述 Eureka是Netflix开源的一个服务注册与发现框架,它在微服务架构中扮演着至关重要的角色。 Eureka由两个核心组件组成: Eureka Server(服务注册中心):负责存储、管理和提供服务实例信息,如服务名、IP地址、端口号等。Eureka Server通常采用集群部署以保…...

Ant-Design-Vue快速上手指南+排坑

1. 简介 1.1. 概述 Ant-Design-Vue是由阿里巴巴开源的一个基于Vue.js框架的企业级UI设计语言。它旨在帮助开发者构建设计优雅、体验流畅的企业级应用。Ant-Design-Vue提供了一系列高质量的Vue组件,包括表单、表格、布局、导航、图标等,可以帮助开发者快速搭建应用程序界面。…...

mysql5.7安装

1.创建一个software文件 2.先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 3安装源包 rpm -ivh mysql-community-release-el7-5.noarch.rpm 可能会报错 改成命令 rpm -ivh mysql-community-release-el7-5.noarch.rpm --nodeps…...

UE开发中的设计模式(三) —— 对象池模式

在FPS游戏中,射击会生成子弹,在命中敌人后子弹会被销毁,那么会导致子弹对象频繁地创建和销毁,会造成运行效率降低且会产生内存碎片问题,而对象池模式可以很好地解决这个问题。 文章目录 问题提出概述问题解决总结 问题…...

Mocha测试框架:JavaScript自动化测试的瑞士军刀

在JavaScript开发中,自动化测试是确保代码质量和可靠性的关键环节。Mocha是一个广泛使用的JavaScript测试框架,它支持多种断言库,允许开发者编写简洁、灵活的测试用例。Mocha特别适用于Node.js环境,但也可以在浏览器中运行。本文将…...

flask实现Streaming内容传输

当传输大量内存,以至于超出内存大小,一般http服务器会报500错误,这时可以使用Streaming流的方式来传输内容,类似ChatGPT和视频流那样的输出方式,flask里要用到生成器和直接响应。 from flask import stream_with_cont…...

seata的使用(SpringBoot项目整合seata)

文章目录 1、解压 seata-server-1.7.1.zip2、启动 双击 seata-server.bat3、启动 seata 控制台用户界面4、所有分布式事务相关数据库要有undo-log5、项目引入seata依赖6、项目添加seata配置7、代码实现: 1、解压 seata-server-1.7.1.zip 2、启动 双击 seata-server.…...

docker容器和宿主机网络不通

防火墙未开启,检查网络配置无异常 解决: [rootlocalhost ~]# vim /etc/sysctl.confnet.bridge.beidge-nf-call-iptables 1 net.bridge.beidge-nf-call-ip6tables 1[rootlocalhost ~]# sysctl -p [rootlocalhost ~]# systemctl restart docker 如果网…...