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

模型量化之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))

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

相关文章:

模型量化之AWQ和GPTQ

什么是模型量化 模型量化(Model Quantization)是一种通过减少模型参数表示的位数来降低模型计算和存储开销的技术。一般来说,模型参数在深度学习模型中以浮点数(例如32位浮点数)的形式存储,而模型量化可以…...

一个简单的 HTTP 请求和响应服务——httpbin

拉取镜像 docker pull kennethreitz/httpbin:latest 查看本地是否存在存在镜像 docker images | grep kennethreitz/httpbin:latest 创建 deployment,指定镜像 apiVersion: apps/v1 kind: Deployment metadata:labels:app: httpbinname: mm-httpbinnamespace: mm-…...

2024黑龙江省职业院校技能大赛暨国赛选拔赛应用软件系统开发赛项(高职组)赛题第3套

2024黑龙江省职业院校技能大赛暨国赛选拔赛 应用软件系统开发赛项(高职组) 赛题第3套 目录: 需要竞赛源码资料可以私信博主。 竞赛说明 模块一:系统需求分析 任务1:制造执行MES—质量管理—来料检验(…...

云原生Kubernetes系列 | Kubernetes Secret及ConfigMap

云原生Kubernetes系列 | Kubernetes Secret及Configmap 1. Secret及Configmap使用背景简介2. Secret2.1. Secret创建方式2.1.1. 命令行方式2.1.2. 文件方式2.1.3. 变量方式2.1.4. YAML文件方式2.2. Secret使用方式2.2.1. 用于传递配置文件2.2.3. 用于传递变量3. ConfigMap1. Se…...

dev express 15.2图表绘制性能问题

dev express 15.2 绘制曲线 前端代码 <dxc:ChartControl Grid.Row"1"><dxc:XYDiagram2D EnableAxisXNavigation"True"><dxc:LineSeries2D x:Name"series" CrosshairLabelPattern"{}{A} : {V:F2}"/></dxc:XYDi…...

单链表的创建,插入及删除(更新ing)

1.单链表创建 ptr为头指针&#xff0c;指向头结点地址&#xff0c;即该指针变量的值为头结点地址&#xff1b; mov为一个辅助指针&#xff0c;用于将链表尾节点的指针域next指向新增节点的地址. search为一个辅助指针&#xff0c;用于遍历链表各节点地址&#xff0c;打印各节…...

C#/WPF 播放音频文件

C#播放音频文件的方式&#xff1a; 播放系统事件声音使用System.Media.SoundPlayer播放wav使用MCI Command String多媒体设备程序接口播放mp3&#xff0c;wav&#xff0c;avi等使用WindowsMediaPlayer的COM组件来播放(可视化)使用DirectX播放音频文件使用Speech播放(朗读器&am…...

如何使用宝塔面板+Discuz+cpolar内网穿透工具搭建可远程访问论坛服务

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…...

【HBase】——简介

1 HBase 定义 Apache HBase™ 是以 hdfs 为数据存储的&#xff0c;一种分布式、可扩展的 NoSQL 数据库。 2 HBase 数据模型 • HBase 的设计理念依据 Google 的 BigTable 论文&#xff0c;论文中对于数据模型的首句介绍。 Bigtable 是一个稀疏的、分布式的、持久的多维排序 m…...

JAVA 有关PDF文件和图片文件合并并生产一个PDF

情景&#xff1a; 1.文件列表包含多个图片和PDF时需要对文件进行合并 2.合并时保持文件顺序 开淦&#xff1a; 一、导入POM <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</ve…...

八股文打卡day10——计算机网络(10)

面试题&#xff1a;HTTP1.1和HTTP2.0的区别&#xff1f; 我的回答&#xff1a; 1.多路复用&#xff1a;HTTP1.1每次请求响应一次都得建立一次连接&#xff0c;HTTP1.1引入了持久连接Connection&#xff1a;Keep-Alive&#xff0c;可以建立一次连接&#xff0c;进行多次请求响…...

Spring Boot学习:Flyway详解

Flyway Flyway 是一款开源的数据库版本管理工具&#xff0c;用于管理和自动化数据库结构的变更。它可以跟踪和管理数据库的版本控制&#xff0c;并在应用程序启动时自动执行升级或回滚操作。 使用Flyway&#xff0c;你可以将数据库的变更以可重复且可控的方式应用到不同环境中…...

Spark编程实验三:Spark SQL编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、Spark SQL基本操作 2、编程实现将RDD转换为DataFrame 3、编程实现利用DataFrame读写MySQL的数据 四、结果分析与实验体会 一、目的与要求 1、通过实验掌握Spark SQL的基本编程方法&#xff1b; 2、熟悉RDD到DataFram…...

文献研读|Prompt窃取与保护综述

本文介绍与「Prompt窃取与保护」相关的几篇工作。 目录 1. Prompt Stealing Attacks Against Text-to-Image Generation Models&#xff08;PromptStealer&#xff09;2. Hard Prompts Made Easy: Gradient-Based Discrete Optimization for Prompt Tuning and Discovery&#…...

cfa一级考生复习经验分享系列(十四)

首先说一下自己的背景&#xff0c;一个和金融没有半毛钱关系的数据分析师&#xff0c;之前考出了FRM。这次用一个半月突击12月的1级考试拿到了9A1B的成绩&#xff0c;纯属运气。以下纯属经&#xff08;chě&#xff09;验&#xff08;dn&#xff09;&#xff0c;请看看就好&…...

vue本地缓存搜索记录(最多4条)

核心代码 //保存到搜索历史&#xff0c;最多存四个 item.name和item.code格式为&#xff1a;塞力斯000001var history uni.getStorageSync(history) || [];console.log("history", history)var index history.findIndex((items) > {return item.name items.nam…...

Linux创建Macvlan网络

最近在看Docker的网络&#xff0c;测试Macvlan部分时&#xff0c;发现Docker创建Macvlan与预期测试结果不一样。所以查阅了Linux下配置Macvlan&#xff0c;记录如下。 参考 1.Linux Macvlan 2.图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN 3.创建ma…...

从企业级负载均衡到云原生,深入解读F5

上世纪九十年代&#xff0c;Internet快速发展催生了大量在线网站&#xff0c;Web访问量迅速提升。在互联网泡沫破灭前&#xff0c;这个领域基本是围绕如何对Web网站进行负载均衡与优化。从1997年F5发布了BIG-IP&#xff0c;到快速地形成完整ADC产品线&#xff0c;企业级负载均衡…...

什么是redis雪崩

Redis雪崩是指在使用Redis作为缓存数据库时&#xff0c;由于某种原因导致Redis服务器不可用或性能严重下降&#xff0c;从而导致大量的请求集中到数据库服务器上&#xff0c;甚至直接导致数据库服务器崩溃。 当Redis服务器出现雪崩时&#xff0c;原本应该被缓存的数据无法从缓…...

[足式机器人]Part2 Dr. CAN学习笔记-Ch00 - 数学知识基础

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Ch00 - 数学知识基础 1. Ch0-1矩阵的导数运算1.1标量向量方程对向量求导&#xff0c;分母布局&#xff0c;分子布局1.1.1 标量方程对向量的导数1.1.2 向量方程对向量的导数 1.2 案例分析&#xf…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...

Element-Plus:popconfirm与tooltip一起使用不生效?

你们好&#xff0c;我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip&#xff0c;产品要求是两个需要结合一起使用&#xff0c;也就是鼠标悬浮上去有提示文字&#xff0c;并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...