模型量化之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.mzph.cn/news/580199.shtml

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

相关文章

【R语言爬虫】使用rvest包爬取豆瓣读书Top 250,仅需50行代码(速度挺快)

【R语言爬虫】使用rvest包爬取豆瓣读书Top 250&#xff0c;仅需50行代码&#xff08;速度挺快&#xff09; 爬取目标 书名&#xff0c;作者&#xff0c;出版社&#xff0c;时间&#xff0c;价格 https://book.douban.com/top250?start0 发现需要爬取的内容就在<div cla…

Xshell连接不上本地虚拟机中的linux处理

0、连接不上虚拟机的原因 1、本地电脑未启用VMware网络。 2、连接协议选择错误。 3、防火墙屏蔽IP。 4、虚拟机网络连接模式不是桥接模式。 1、查看本地是否启用VMware的网络 2、连接协议选择 我们在新建会话时&#xff0c;可选的协议有FTP和SFTP两种&#xff0c;其中FTP采用21…

软件测试题常见版

1、python深浅拷贝 浅拷贝&#xff0c;指的是重新分配一块内存&#xff0c;创建一个新的对象&#xff0c;但里面的元素是原对象中各个子对象的引用。深拷贝&#xff0c;是指重新分配一块内存&#xff0c;创建一个新的对象&#xff0c;并且将原对象中的元素&#xff0c;以递归的…

高效资源分配:用CRM系统打造更优销售策略

CRM系统在销售团队中有着重要的应用&#xff0c;但很多销售人员可能对CRM系统存在一些负面的看法&#xff0c;认为它只是一种监管工具&#xff0c;操作空间单调枯燥。那么&#xff0c;如何让销售团队爱上CRM系统呢&#xff1f; 下面我们将分享几个方法&#xff0c;帮助销售经理…

Spring Boot国际化i18n配置指南

Spring Boot国际化i18n配置指南 一、配置 1、yml文件配置 spring:messages:basename: i18n/Messages,i18n/Messages_en_US,i18n/Messages_zh_CNencoding: UTF-8i18n&#xff1a;表示国际化文件的父目录 Messages&#xff1a;默认国际化文件 Messages_en_US&#xff1a;英文文…

关于MybatisPlus自动转化驼峰命名规则配置mapUnderscoreToCamelCase的个人测试和总结

关于MybatisPlus自动转化驼峰命名规则配置mapUnderscoreToCamelCase的个人测试和总结 测试一&#xff1a;没有添加 自动转化的配置&#xff0c;且domain中的属性名称和数据库的字段名称一致测试二&#xff1a;没有添加自动转化配置i&#xff0c;domain属性名userPassword和数据…

装饰模式(单一责任)

Decorator&#xff08;装饰模式&#xff1a;单一责任模式&#xff09; 链接&#xff1a;装饰模式实例代码 解析 目的 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c;由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff…

<JavaEE> TCP 的通信机制(三) -- 滑动窗口

目录 TCP的通信机制的核心特性 四、滑动窗口 1&#xff09;什么是滑动窗口&#xff1f; 2&#xff09;滑动窗口的作用是什么&#xff1f; 3&#xff09;批量传输出现丢包如何处理&#xff1f; 1> 接收端ACK丢包 2> 发送端数据包丢包 4&#xff09;适用性 TCP的通…

为什么深度学习神经网络可以学习任何东西

下图你所看到的&#xff0c;是著名的曼德尔布罗特集&#xff0c;我们可以见证这个集合呈现出的复杂形态&#xff1a; 要理解神经网络如何学习曼德尔布罗特集&#xff0c;我们首先需要从最基础的数学概念讲起&#xff1a;什么是函数&#xff1f;函数本质上是一个将输入转化为输出…

机器学习---adaboost二分类、回归

1. adaboost二分类 import numpy as np import matplotlib.pyplot as pltfrom sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import make_gaussian_quantiles# 几个关键参数有n_samples&#xff08;生…

基于JSP+Servlet+Mysql的宠物管理系统(简单增删改查)

基于JSPServletMysql的宠物管理系统_简单增删改查 一、系统介绍二、功能展示1.主页2.增加3.修改4.查询5.删除 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于JSPServletMysql的宠物管理系统(简单增删改查) 项目架构&#xff1a;B/S架构 开发语言…

FonePaw iOS Transfer for Mac: 让您的IOS设备数据无忧传输

在数字世界里&#xff0c;随着我们的生活与科技越来越紧密&#xff0c;数据传输成为了我们日常生活中的重要部分。尤其对于广大的苹果用户来说&#xff0c;如何方便、快速地传输数据成为了他们关注的焦点。今天&#xff0c;我要为大家介绍一款专门为Mac用户设计的IOS数据传输工…

60.0/PhotoShop制作简单的网页效果

目录 60.1 网页的页面元素 60.1.1 网页的概念 60.2网站设计的步骤 60.2.1草案 ​编辑 60.2.2 丰富内容 60.2.3 利用切片划分功能区域 60.3.0 Gif动画的制作 60.1 网页的页面元素 60.1.1 网页的概念 是指通过浏览器能访问到的 Web 页面&#xff0c;是一种超文本文件&am…

SpringBoot3 核心原理

1. 事件和监听器 1. 生命周期监听 场景&#xff1a;监听应用的生命周期 1. 监听器-SpringApplicationRunListener 自定义SpringApplicationRunListener来监听事件&#xff1b; 编写SpringApplicationRunListener 实现类在 META-INF/spring.factories 中配置 org.springfram…

同城配送小程序解决方案

前言 同城配送小程序解决方案。 一、用户用车 用户打开小程序后发货地址自动定位到用户当前位置&#xff0c;用户可通过地址后的>号在地图上选择新的发货地址和卸货地址&#xff0c;小程序会自动规划出行线路&#xff0c;计算距离和运费价格。 用户仅用简单操作后就可以…

冒泡排序(C语言)

void BubbleSort(int arr[], int len) {int i, j, temp;for (i 0; i < len; i){for (j len - 1; j > i; j--){if (arr[j] > arr[j 1]){temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}} } 优化&#xff1a; 设置标志位flag&#xff0c;如果发生了交换flag设置…

C++ 文件操作篇

C 文件操作篇 文章目录 C 文件操作篇1 简介1.1 继承关系1.2 流1.3 缓冲区输入输出流中的缓冲streambuf 2 文件操作步骤2.1 头文件2.2 创建流对象2.3 打开文件2.4 读取数据第一种&#xff1a;**按元素直接读**第二种&#xff1a;**使用getline按行读**第三种&#xff1a;**使用*…

软文发稿:雅虎媒体套餐投放内容有哪些

在当今数字时代&#xff0c;软文发稿成为企业推广的重要手段之一。雅虎媒体套餐作为软文发稿的一个独特平台&#xff0c;吸引了众多企业的关注。本文将深入探讨雅虎媒体套餐投放的内容&#xff0c;以揭示其在软文推广中的独特价值。 雅虎作为全球著名的互联网公司之一&#xf…

ubuntu多用户环境dockerbug,卸载重装docker流程

之前不小心误操作删除重装docker&#xff0c;结果删除没成功&#xff0c;更没法重装&#xff0c;每次apt install都会报一个docker错误&#xff0c;虽然不影响软件的常规安装&#xff5e;但是现在还是需要装一个完整docker&#xff0c;还是选择删除一下&#xff0c;重点是关闭服…

探索中国制造API接口:解锁无限商机,引领制造业数字化转型

一、概述 中国制造API接口是一种应用程序接口&#xff0c;专门为中国制造行业提供数据和服务。通过使用API接口&#xff0c;开发者可以轻松地获取中国制造的商品信息、供应商数据、生产能力等&#xff0c;从而为他们的应用程序或网站提供更加丰富的内容和功能。 二、API接口的…