模型量化之AWQ和GPTQ

什么是模型量化

模型量化(Model Quantization)是一种通过减少模型参数表示的位数来降低模型计算和存储开销的技术。一般来说,模型参数在深度学习模型中以浮点数(例如32位浮点数)的形式存储,而模型量化可以将这些参数转换为较低位宽的整数或定点数。这有几个主要的作用:

减小模型大小: 通过减少每个参数的位数,模型占用的存储空间变得更小。这对于在移动设备、嵌入式系统或者边缘设备上部署模型时尤其有用,因为这些设备的存储资源通常有限。

加速推理: 量化可以降低模型推理时的计算开销。使用较低位宽的整数或定点数进行计算通常比使用浮点数更高效,因为它可以减少内存带宽需求,提高硬件的并行计算能力。这对于实时推理和响应时间敏感的应用程序非常重要。

减少功耗: 量化可以降低模型在部署环境中的能耗,因为计算和存储操作通常是耗电的。通过减少模型参数的位数,可以减少在部署设备上执行推理时的功耗。

提高模型在资源受限环境中的可用性: 在一些场景中,设备的存储和计算资源可能非常有限,例如在边缘设备或物联网设备上。模型量化使得在这些资源受限的环境中部署深度学习模型更加可行。

总体而言,模型量化是一种权衡计算、存储和功耗的技术,可以使得深度学习模型更适应于各种不同的部署场景。

常用的模型量化技术

Round nearest quantization:(最近整数量化)

是一种常见的模型量化技术,它用于将浮点数参数量化为整数或定点数。在这种量化中,每个浮点数参数被四舍五入到最接近的整数或定点数。这种方法旨在保留尽可能多的信息,同时将参数映射到有限的整数或定点值上。

AWQ(Activation-aware Weight Quantization)-激活感知权重量化:

激活感知权重量化(AWQ),一种面向LLM低比特权重量化的硬件友好方法。我们的方法基于这样一个观察:权重并非同等重要,仅保护1%的显著权重可以大大减少量化误差。然后,我们建议通过观察激活而不是权重来搜索保护显著权重的最佳通道缩放。AWQ不依赖于任何反向传播或重构,因此可以很好地保留LLMs在不同领域和模态中的泛化能力,而不会过度拟合校准集。AWQ在各种语言建模和特定领域基准上优于现有工作。由于更好的泛化能力,它在面向指令调整的LMs上实现了出色的量化性能,并且首次在多模态LMs上取得了成功,论文地址。

GPTQ:Generative Pretrained Transformer Quantization

GPTQ 的思想最初来源于 Yann LeCun 在 1990 年提出的 OBD 算法,随后 OBS、OBC(OBQ) 等方法不断进行改进,而 GPTQ 是 OBQ 方法的加速版。简单来说,GPTQ 对某个 block 内的所有参数逐个量化,每个参数量化后,需要适当调整这个 block 内其他未量化的参数,以弥补量化造成的精度损失。GPTQ 量化需要准备校准数据集,论文地址。

Transformers量化技术BitsAndBytes

BitsAndBytes 通过将模型参数量化为较低比特位宽的整数表示,从而在不显著影响任务性能的前提下减小了模型的存储需求和计算复杂度。然而,需要仔细选择位宽度,以平衡性能和信息损失之间的权衡。

大模型占用显存粗略计算公式

上面的推导公式中1GB=1024MB=2的10次方MB,1MB=1024KB,1KB=1024B,所以1GB=2的30次方B,1GB=1024*1024*1024B=1073741824B,约等于10亿B,所以约等于10的9次方B。通过上面的计算公式,可以粗略计算出对于6B的大模型,需要12G的显存,当然这只是对模型参数需要占用的显存的粗略计算,实际加载一个大模型,还需要更多的显存。这也是为什么有这些量化技术来缩小模型的大小。

采用AWQ量化模型代码例子

下面的代码例子来源于AWQ官网,在实际运行过程,如果选择加载vicuna-7b-v1.5-awq,一直在报“Token indices sequence length is longer than the specified maximum sequence length for this model (8322 > 4096). Running this sequence through the model will result in indexing errors”,换成了量化“facebook/opt-125m-awq”,量化成功,但是用量化后的模型尝试运行benchmark的脚本,也报错了。错误提示是“/home/ubuntu/python/opt-125-awq is not a folder containing a `.index.json` file or a pytorch_model.bin file”。但是这些错误不影响我们对AWQ量化模型的理解

from awq import AutoAWQForCausalLM
from transformers import AutoTokenizermodel_path = 'lmsys/vicuna-7b-v1.5'
quant_path = 'vicuna-7b-v1.5-awq'
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM" }# Load model
# NOTE: pass safetensors=True to load safetensors
model = AutoAWQForCausalLM.from_pretrained(model_path, **{"low_cpu_mem_usage": True, "use_cache": False}
)
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)# Quantize
model.quantize(tokenizer, quant_config=quant_config)# Save quantized model
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)print(f'Model is quantized and saved at "{quant_path}"')

将model_path=‘facebook/opt-125m’可以量化成功。接下来再看看官网的benchmark脚本具体如何对量化后的模型做评估。官网完整的benchmark脚本。整个代码的目的是通过测试不同条件下的生成性能,包括速度和内存使用,以便评估模型的效果。

TimeMeasuringLogitsProcessor 类:在模型前向传播之后调用,用于测量模型生成的时间。通过记录每个时间点,计算了预填充和生成阶段的时间差,以及每个生成步骤的时间差。主要用于测量模型的速度,包括预填充和生成阶段的速度。
warmup 函数:通过进行矩阵乘法来对模型进行预热,以确保模型的权重已经加载到 GPU 中。
generate_torch 和 generate_hf 函数:generate_torch 函数使用 PyTorch 的 model 对象生成 tokens。generate_hf 函数使用 Huggingface Transformers 库的 model.generate 方法生成 tokens。这两个函数都会测量生成的时间,并返回上下文时间和每个生成步骤的时间。
run_round 函数:通过加载模型、进行预热、生成 tokens 等步骤来运行测试的一个循环。
测试了模型在不同上下文长度和生成步骤数下的性能。输出测试结果,包括上下文时间、生成时间、内存使用等。
main 函数:设置不同的上下文长度和生成步骤数的测试轮次。使用给定的生成器(PyTorch 或 Huggingface)运行测试。
运行脚本的时候,参数包括:model_path:模型路径。
quant_file:量化权重的文件名。
batch_size:生成时的批量大小。
no_safetensors:是否禁用安全张量。
generator:生成器类型,可以是 "torch" 或 "hf"。
pretrained:是否使用预训练模型。

采用GPTQ量化模型代码例子

下面的例子来源于gptq官网例子,这个例子中量化的也是opt-125m模型,gptq进行模型量化时,需要传递数据集,这里传递的数据集很简单,就是一句话。

模型量化成功后,用量化后的模型生成内容,可以看到,如果是数据集中的信息,模型能正确生成内容,如果是其他问题,例如“woman works as”,模型就无法输出内容了。所以,如果采用gptq进行模型量化,输入的数据集是非常关键的。

当然也支持一些默认数据集,例如:(包括['wikitext2','c4','c4-new','ptb','ptb-new'])。这些数据集都可以在huggingface上找到。如果采用默认数据集,在初始化GPTQConfig的时候设置dataset参数即可,代码如下所示:

quantization_config = GPTQConfig(bits=4, # 量化精度group_size=128,dataset="c4",desc_act=False,
)

实际在gptq的github上提供了很多example的代码,包括量化后评估模型性能的脚本,更多信息可查看这里。

BitsAndBytes代码例子

BitsAndBytes的量化代码例子非常简单,在from_pretrained()方法中初始化三个参数即可。调用量化后的模型,让其生成内容“Merry Chrismas! I am glad to”,量化后的模型生成的内容也比较ok。具体如下图所示:

from transformers import AutoModelForCausalLMmodel_id = "facebook/opt-2.7b"model_4bit = AutoModelForCausalLM.from_pretrained(model_id,device_map="auto",load_in_4bit=True)# 获取当前模型占用的 GPU显存(差值为预留给 PyTorch 的显存)
memory_footprint_bytes = model_4bit.get_memory_footprint()
memory_footprint_mib = memory_footprint_bytes / (1024 ** 2)  # 转换为 MiBprint(f"{memory_footprint_mib:.2f}MiB")from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained(model_id)
text = "Merry Christmas! I'm glad to"
inputs = tokenizer(text, return_tensors="pt").to(0)out = model_4bit.generate(**inputs, max_new_tokens=64)
print(tokenizer.decode(out[0], skip_special_tokens=True))

以上就是对于一些常用的模型量化技术的介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/228770.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV-Python(21):轮廓特征及周长、面积凸包检测和形状近似

2. 轮廓特征 轮廓特征是指由轮廓形状和结构衍生出来的一些特征参数。这些特征参数可以用于图像识别、目标检测和形状分析等应用中。常见的轮廓特征包括: 面积:轮廓所包围的区域的面积。周长:轮廓的周长,即轮廓线的长度。弧长&…

Docker自建文件快递柜系统

Docker自建文件快递柜系统。 软件特色: 轻量简洁:FastapiSqlite3Vue2ElementUI 轻松上传:复制粘贴,拖拽选择 多种类型:文本,文件 防止爆破:错误次数限制 防止滥用:IP限制上传次数…

GO语言基础笔记(七):网络编程

目录 Go语言网络协议基础 协议 实现 跨平台网络抽象 简单代码展示 服务端 客户端 服务端客户端通信实战 Go Linux服务端 Go Linux客户端 Windows C 客户端 总结 Go语言网络协议基础 在 Go 语言中,net/http 包提供了强大的工具来创建 HTTP 服务器。…

新产品推广选品牌外包广州迅腾文化传播多渠道传播能力

在当今激烈的市场竞争中,新产品推广已成为企业发展的关键。选择具备多渠道传播能力的品牌外包服务提供商,有助于快速提升品牌知名度和市场占有率。作为行业领先者,迅腾文化凭借卓越的多渠道传播能力,成为企业新产品推广的理想合作…

我的512天创作者纪念日总结:高效、高现

文章目录 512天创作者纪念日:2023年的12月31日CSDN的512天消息提醒第一篇文章,最后一篇文章总计847篇文章,每月发文分布512天,各专栏文章统计512天,互动总成绩 512天创作者纪念日:2023年的12月31日 2023年…

微服务(1)

目录 1.什么是微服务?谈谈你对微服务的理解? 2.什么是Spring Cloud? 3.Springcloud中的组件有哪些? 3.具体说说SpringCloud主要项目? 5.SpringCloud项目部署架构? 1.什么是微服务?谈谈你对微…

前端开发新趋势:Web3、区块链与虚拟现实

文章目录 Web3:下一代互联网区块链技术去中心化应用程序(DApps) 区块链:重塑数字世界数字钱包NFT(非同质化代币) 虚拟现实:沉浸式体验WebVR和WebXR三维图形 新挑战与机会性能与复杂性安全性创新…

【网络面试(2)】DNS原理-域名和IP地址的查询转换

从上一篇博客我们得知浏览器是如何生成了HTTP消息了,但是浏览器作为应用程序,是不具备向网络中发送请求的能力,而是需要委托给操作系统的内核协议栈来发送请求。在委托协议栈之前,浏览器还要做的一件事情就是将域名转换为IP地址。…

lambda表达式和包装器

正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 我们在使用库里的排序算法时如果排序的是自定义类型或者库里默认的排序不能满足我们则需求&…

Apache DolphinScheduler 3.1.9 版本发布:提升系统的稳定性和性能

🚀我们很高兴宣布,Apache DolphinScheduler 的最新版本 3.1.9 已正式发布!此版本在 3.1.8 的基础上进行了关键的 bug 修复和文档更新,共计修复了 14 个 bug 和改进了 3 个文档。 主要更新亮点 本次更新重点解决了以下几个关键问题…

磁盘阵列raid

一、服务器硬件 cpu 、 主板 、内存、硬盘、网卡、电源、raid卡、风扇、远程管理卡 二、硬盘尺寸 目前生产环境中主流的两种类型硬盘 3.5寸 和 2.5寸 硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器,但是3.5寸没法转换成2.5寸 三、服务器常见故…

[每周一更]-(第43期):Golang版本的升级历程

从1.13接触go语言开始更新我们公司内第一个Go项目,直至现在go版本已经发展到1.20(20230428),我们从go发版开始认识go语言,有利于我们更深入 了解这门语言,洞悉一些深层方式,加深我们学习的动力&…

看懂基本的电路原理图(入门)

文章目录 前言一、二极管二、电容三、接地一般符号四、晶体振荡器五、各种符号的含义六、查看原理图的顺序总结 前言 电子入门,怎么看原理图,各个图标都代表什么含义,今天好好来汇总一下。 就比如这个电路原理图来说,各个符号都…

JDBC->SpringJDBC->Mybatis封装JDBC

一、JDBC介绍 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们…

03 团队研究进一步详细介绍

一、印第安纳大学邢璐祎课题组 【团队网站】 https://www.xing-luyi.com/ 【团队介绍】 研究以形式化方法为特色,并保证系统中的安全性和隐私合规性,特别是物联网、云、移动和软件供应链。 【团队成果汇总】 物联网系统:[Oakland24][Se…

合伙企业法关于合伙企业的要求

合伙协议可以载明合伙企业的经营期限和合伙人争议的解决方式。 合伙协议经全体合伙人签名、盖章后生效。合伙人依照合伙协议享有权利,承担责任。 经全体合伙人协商一致,可以修改或者补充合伙协议。 申请合伙企业设立登记,应当向企业登记机关提…

TecoGAN视频超分辨率算法

1. 摘要 对抗训练在单图像超分辨率任务中非常成功,因为它可以获得逼真、高度细致的输出结果。因此,当前最优的视频超分辨率方法仍然支持较简单的范数(如 L2)作为对抗损失函数。直接向量范数作损失函数求平均的本质可以轻松带来时…

Linux自定义shell编写

Linux自定义shell编写 一.最终版本展示1.动图展示2.代码展示 二.具体步骤1.打印提示符2.解析命令行3.分析是否是内建命令1.shell对于内建名令的处理2.cd命令3.cd函数的实现4.echo命令的实现5.export命令的实现6.内建命令函数的实现 4.创建子进程通过程序替换执行命令5.循环往复…

微软开源,全平台通用:Shell 自动补全工具 | 开源日报 No.132

microsoft/inshellisense Stars: 7.6k License: MIT inshellisense 是一个为 Shell 提供 IDE 风格自动补全的工具。它是一个终端本地运行时自动完成,支持 600 多个命令行工具,并且可以在 Windows、Linux 和 macOS 上使用。主要功能包括安装后可通过运行…

30 UVM Adder Testbench Example

1 Adder Design 加法器设计在时钟的上升沿产生两个变量的加法。复位信号用于clear out信号。注:加法器可以很容易地用组合逻辑开发。引入时钟和重置,使其具有测试台代码中时钟和重置的样子/风格。 module adder(input clk, reset, input [7:0] in1, in…