模型量化--int8量化

文章目录

  • 一、什么是模型量化?
  • 二、常见的模型量化方法
    • 1.权重量化(Weight Quantization)
    • 2.激活量化(Activation Quantization)
    • 3.混合精度量化(Mixed Precision Quantization)
    • 4. 剪枝和量化(Pruning and Quantization)
  • 三、什么是int8量化
    • 1. int8量化步骤
    • 2. int8量化计算公式
      • 2.1 确定缩放因子(Scale)和零点(Zero Point)
      • 2.2 应用量化
      • 2.3 整数裁剪
      • 2.4 一个线性、非对称、int8后量化的例子
      • 3.代码


一、什么是模型量化?

  在深度学习领域,模型通常采用float32这种数据格式进行训练和存储,每个参数占据32比特(即4字节)的空间。例如,一个大小为7b的模型会需求28b的显存或内存资源。但如果能够将参数所需的存储空间压缩至16比特、8比特甚至4比特,那么就能显著减少所需的存储容量,并可能加快模型的推理速度。量化可以应用在模型的参数(即权重)、激活值,甚至是在训练过程中更新的梯度上。参数的量化通常相对容易实施,因为模型的参数分布通常比较稳定。
  模型量化的主要目标是在尽可能保持模型性能的前提下,减少模型的存储空间、内存带宽和计算资源消耗。较小的模型可以更轻松地部署在资源受限的设备上,例如移动设备、嵌入式系统和边缘设备等。

二、常见的模型量化方法

1.权重量化(Weight Quantization)

  将模型中的权重参数转换为较低比特的整数或浮点数表示。例如,将32位浮点数权重量化为8位整数或4位浮点数。

2.激活量化(Activation Quantization)

  将模型中的激活值转换为较低比特的整数或浮点数表示。类似于权重量化,激活量化可以将32位浮点数激活值量化为8位整数或4位浮点数。

3.混合精度量化(Mixed Precision Quantization)

  结合使用不同精度的数据表示,例如使用低精度整数表示权重和激活值,同时保持某些操作的高精度表示(如矩阵乘法)。

4. 剪枝和量化(Pruning and Quantization)

  将模型中的冗余连接或不重要的权重剪枝(删除),然后将剩余的权重进行量化。这种方法结合了剪枝和量化两种技术,可以进一步减少模型的存储需求和计算复杂性。

  模型量化的实现通常需要进行训练和校准过程。在训练阶段,模型使用原始的高精度表示进行训练。在校准阶段,使用预定义的数据集或一部分训练数据集来收集模型在推理过程中的激活值统计信息,以便确定合适的量化范围。然后,通过量化算法将权重和激活值转换为较低比特的表示。最后,量化后的模型可以用于推理阶段,其中计算和存储都使用量化后的数据格式。

三、什么是int8量化

  在深度学习模型中,通常使用32位浮点数(FP32)来表示权重和激活值。然而,FP32的存储需求和计算复杂性较高,特别是在边缘设备和嵌入式系统等资源有限的环境中运行时,会造成显著的性能瓶颈。INT8量化通过将这些浮点数值量化为8位整数,可以大幅度地减少模型的存储空间和内存带宽,并加速模型的推理过程。

1. int8量化步骤

  1. 训练模型:首先,使用常规的训练方法和数据集对深度学习模型进行训练,得到FP32精度的模型。
  2. 收集统计信息:使用预先定义的校准数据集或一部分训练数据集来收集模型在推理过程中的激活值统计信息。这些统计信息可以用于确定合适的量化范围,以便将浮点数值映射到8位整数。
  3. 量化权重和激活值:根据收集的统计信息,将模型的权重和激活值量化为8位整数。通常使用量化算法(如最大/最小值量化、均匀量化等)来将浮点数映射到8位整数。
  4. 构建量化模型:使用量化后的权重和激活值,重新构建量化模型。这个模型在推理过程中只使用8位整数进行计算。
  5. 推理过程:使用量化模型进行推理。输入数据经过量化模型,推理过程中的计算都使用8位整数进行,从而提高推理效率和性能。

2. int8量化计算公式

2.1 确定缩放因子(Scale)和零点(Zero Point)

缩放因子(scale):用于将浮点数映射到整数范围。
零点(Zero Point):确保浮点数0可以被准确地表示为整数。

计算scale和zero_point通常需要最大值(max_val)和最小值(min_val):

scale = (max_val - min_val) / (2^7 - 1)  # 127是int8的最大值 
zero_point = round(-min_val / scale) #zero_point需要在-128到127的范围内,因为这是8位有符号整数的范围

2.2 应用量化

使用scale和zero_point,量化一个浮点数(float_val)成一个8位整(int_val)。

int_val = round(float_val / scale) + zero_point #round"指的是将一个浮点数四舍五入到最接近的整数

2.3 整数裁剪

如果量化后的整数超出了-128到127的范围,它需要被裁剪以保持在有效范围内。

int_val = min(127, max(-128, int_val)) 

这样,量化过程就可以将32位浮点数数组转换为能够在8位整数范围内表示的数组,这减少了内存占用,同时可能提高了执行速度。

2.4 一个线性、非对称、int8后量化的例子

假设我们有下面这个列表的模型权重作为浮点数:

weights = [0.15, -0.8, 0.2, -0.5] 

量化到8位整数涉及以下步骤:

(1)确定量化范围:

在Int8量化中,值的范围通常是[-128, 127](对于有符号整数)。找到浮点列表中的最小和最大值:

min_val = min(weights)  # -0.8 
max_val = max(weights)  # 0.2 

(2)计算缩放系数(scale)和零点(zero point):

计算缩放系数,将浮点数范围映射到整数范围。举例来说,可以简单选择max(abs(min_val), abs(max_val))作为分母,然后以[-128, 127]为分子进行缩放计算。因为0可能不在浮点数的范围内,我们需要一个零点来表示量化值0对应的浮点数。通常,零点是通过缩放原始的浮点数零值来确定的。

scale = (max_val - min_val) / (127 - (-128)) 
#缩放系数 (0.2 - (-0.8)) / (127 - (-128))
#scale = 1.0 / 255
zero_point = 127-max_val / scale
#zero_point = 76

(3)应用量化转换:

将每个浮点数权重转换为整数表示。

quantized_weights = [round((w / scale) + zero_point) for w in weights] 

应用上面的公式,具体计算:

quantized_weights = [round(0.15 / scale) + zero_point,round(-0.8 / scale) + zero_point,round(0.2 / scale) + zero_point,round(-0.5 / scale) + zero_point
]
#根据scale,四舍五入并加上zero_point
quantized_weights = [round(38.4) + 76,round(-204.8) + 76,round(51.2) + 76,round(-128.0) + 76
]
得到的quantized_weights是: [114, -129, 127, -52]

(4)做截断,使得数据落在[-128,127]范围

量化后的权重如下所示:

quantized_weights = [114, -128, 127, -52] 

3.代码

model = AutoModelForCausalLM.from_pretrained("Llama-2-7b-ms", 
low_cpu_mem_usage=True, 
load_in_8bit=True, 
device_map="auto")

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

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

相关文章

Vue监听器(上)之组合式watch

1. 定义监听器 //要监视的属性被改变时触发 watch(要监视的属性, (更改后的心值, 更改前的旧值) > {具体操作}, );//监视对象为getter的时候 //表达式内任意响应式属性被改变时触发 watch(() > return表达式, (表达式的新值, 表达式的旧值) > {具体操作} );//数组中任…

【MySQL】多表操作、事务、索引

MySQL MYSQL 多表设计 一对多插入测试数据外键约束(物理外键)使用逻辑外键 MYSQL 多表设计 一对一表结构 MYSQL 多表设计 多对多 MYSQL 多表设计 一对多 建表语句 员工表 CREATE TABLE tb_emp (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT ID,username VARCHAR(20) N…

图片大了怎么缩小上传?30秒解决图片大小问题

在上传图片到网站、社交媒体、电子邮件或其他在线平台时,压缩图片可以减小文件大小,加快上传速度,并节省带宽和存储空间,许多网站和应用程序都有对上传图片大小的限制,因此利用在线图片压缩工具(https://ww…

WordPres Bricks Builder 前台RCE漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

Jetpack Compose 架构层

点击查看:Jetpack Compose 架构层 官网 本页面简要介绍了组成 Jetpack Compose 的架构层,以及这种设计所依据的核心原则。 Jetpack Compose 不是一个单体式项目;它由一些模块构建而成,这些模块组合在一起,构成了一个完…

VSCODE include错误 找不到 stdio.h

解决办法: Ctrl Shift P 打开命令面板, 键入 “Select Intellisense Configuration”(下图是因为我在写文章之前已经用过这个命令,所以这个历史记录出现在了第一行) 再选择“Use gcc.exe ”(后面的Foun…

【OpenAI官方课程】第六课:ChatGPT文本扩展Expending

欢迎来到ChatGPT 开发人员提示工程课程(ChatGPT Prompt Engineering for Developers)!本课程将教您如何通过OpenAI API有效地利用大型语言模型(LLM)来创建强大的应用程序。 本课程由OpenAI 的Isa Fulford和 DeepLearn…

C语言-数组指针与指针数组

一、简介 对于使用C语言开发的人来说,指针,大家都是非常熟悉的。数组,大家也同样熟悉。但是这两个组合到一起的话,很多人就开始蒙圈了。这篇文章,就详细的介绍一下这两个概念。 指针数组和数组指针,听起来非…

PyTorch概述(二)---MNIST

NIST Special Database3 具体指的是一个更大的特殊数据库3;该数据库的内容为手写数字黑白图片;该数据库由美国人口普查局的雇员手写 NIST Special Database1 特殊数据库1;该数据库的内容为手写数字黑白图片;该数据库的图片由高…

互联网广告投放与IP地理位置定位

随着互联网的发展和普及,互联网广告投放成为各行业推广营销的重要方式之一。而结合IP地理位置定位技术,可以实现精准定向,提高广告投放的效果和精准度。IP数据云将探讨互联网广告投放与IP地理位置定位的关系,分析其优势和应用场景…

logback日志回滚原理

日志输出主要依赖RollingFileAppender、TimeBasedRollingPolicy、SizeAndTimeBasedFNATP。 RollingFileAppender 主要用于生成日志文件,格式化内容再输出到日志文件TimeBasedRollingPolicy 设置回滚策略,如果发现日志输出的时间超过单位时间&#xff0c…

c入门第二十二篇: 学生成绩管理系统查询优化(二分查找)

前言 师弟: “经过几轮优化之后,我的学生成绩管理系统,感觉已经非常不错了,是我学习以来做的最好的系统了。没想到,还是被嘲笑了。” 我:“怎么被嘲笑了?” 师弟:“程夏她说: 你在录入学生的时…

跟我学C++中级篇——C++17标准后的std::invoke系列

一、函数调用方式 在学习编程的开始,就接触到了函数和函数的调用。可以这样讲,不会调用函数,那么最基础的语言功能便无法使用了。无论是低级到汇编或者高级到哪个语言,函数仍然是其重要的基础一环。可能随便一个学习过编程的都可…

动态规划算法学习(基础)

做题步骤: 确定dp数组的含义(一维或者二维) 获取递推公式 dp数组如何初始化 确定遍历顺序 打印dp数组(检查) 题目: 1. 斐波那契数 509 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 …

留子厨房开发日志

以下记录了使用go语言框架Beego,Mysql数据库,Redis数据库实现一个点菜/菜谱应用API的全过程。 技术方案 github地址 数据库设计 新建数据库: CREATE DATABASE menu;新建数据表: CREATE TABLE menu ( id int(10) unsigned NOT …

2024 CKS 题库 | 11、AppArmor

不等更新题库 CKS 题库 11、AppArmor Context: APPArmor 已在 cluster 的工作节点node02上被启用。一个 APPArmor 配置文件已存在,但尚未被实施。 Task: 在 cluster 的工作节点node02上,实施位于 /etc/apparmor.d/nginx_apparmor 的现有APPArmor 配置…

Python 实现 ADTM 指标计算:股票技术分析的利器系列(9)

Python 实现 ADTM 指标计算:股票技术分析的利器系列(9) 介绍算法解释 核心代码rolling函数介绍计算 DTMnp.where 使用介绍np.maximum 计算 DBM计算 STM计算 SBM计算 ADTM 完整代码 介绍 ADTM(动态买卖气指标)是一种用…

C++奇怪的 ::template

答疑解惑 怎么会有::template的写法 起初 在阅读stl的源码的时候&#xff0c;发现了一条诡异的代码 // ALIAS TEMPLATE _Rebind_alloc_t template<class _Alloc,class _Value_type> using _Rebind_alloc_t typename allocator_traits<_Alloc>::template rebind…

【misc | CTF】攻防世界 simple_transfer

天命&#xff1a;这题其实不简单啊 拿到流量包&#xff0c;丢进去wireshare&#xff0c;题目都说了flag在里面 ctrl f 直接搜索字符串 右键&#xff0c;追踪流 -> TCP流 查找 .pdf 文件&#xff0c;其实这里思路是比较奇怪的&#xff0c;毕竟是的确比较多内容&#xff0c…

基于PostGIS的慢查询引起的空间索引提升实践

目录 前言 一、问题定位 1、前端接口定位 2、后台应用定位 3、找到问题所在 二、空间索引优化 1、数据库查询 2、创建空间索引 3、geography索引 4、再看前端响应 总结 前言 这是一个真实的案例&#xff0c;也是一个新入门的工程师很容易忽略的点。往往在设计数据库的…